diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 1dc40c64..3c52212f 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,14 +1,16 @@ ## Expected Behavior + ## Actual Behavior + ## Steps to Reproduce the Problem 1. -2. -3. +1. +1. ## Specifications - Version: -- Platform: +- Platform: \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d86bf2a5..00550b6b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@ -Fixes #\ +Fixes # > It's a good idea to open an issue first for discussion. - [ ] Tests pass -- [ ] Appropriate changes to documentation are included in the PR +- [ ] Appropriate changes to documentation are included in the PR \ No newline at end of file diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index fb0069fb..a6ee779b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -14,49 +14,32 @@ on: jobs: test: + runs-on: ubuntu-latest # Use an Ubuntu runner for the job + strategy: matrix: - # there is no 3.10.15 on mac - # see: https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json - os: [ubuntu-latest] - python-version: ['3.10.15', '3.11'] - - include: - - os: macos-15-intel # updated intel-based - python-version: '3.11' - - - os: macos-latest # arm-based - python-version: '3.11' - - runs-on: ${{ matrix.os }} + python-version: [3.10.12, 3.10.15, 3.11] # Python versions to test steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v4 # Checks out the repository's code - name: Set up Python uses: actions/setup-python@v4 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-version }} # Use Python version from the matrix - - name: Install system dependencies (on Linux) - if: runner.os == 'Linux' + - name: Install system dependencies run: | sudo apt update - sudo apt install -y protobuf-compiler ffmpeg - - - name: Install system dependencies (on Mac) - if: runner.os == 'macOS' - run: | - brew update - brew install protobuf@21 ffmpeg + sudo apt install -y protobuf-compiler ffmpeg # Install both protobuf and ffmpeg in one step - name: Install Python dependencies run: | python -m pip install --upgrade pip python -m venv .venv source .venv/bin/activate - pip install poetry==2.1.2 + pip install poetry poetry install --with dev - name: Run the Python formatter @@ -77,7 +60,7 @@ jobs: - name: Run the Markdown formatter run: | source .venv/bin/activate - mdformat README.md docs/*.md --check + mdformat README.md --check - name: Run tests run: | diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml deleted file mode 100644 index be3a0374..00000000 --- a/.github/workflows/deploy-docs.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Deploy Documentation to GitHub Pages - -on: - push: - branches: - - master - - main - - copybara_push - -permissions: - contents: write - -jobs: - deploy: - name: Deploy docs - runs-on: ubuntu-latest - steps: - - name: Checkout main - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install Poetry - uses: snok/install-poetry@v1 - with: - virtualenvs-create: true - virtualenvs-in-project: true # creates .venv dir in project root - - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v4 - with: - path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} - - - name: Install dependencies - if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root --with dev,docs - - - name: Deploy to GitHub Pages - run: | - # Configure Git user for mkdocs gh-deploy - git config --global user.name "${{ github.actor }}" - git config --global user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com" - # Deploy - poetry run mkdocs gh-deploy --force --clean diff --git a/.mdformat.toml b/.mdformat.toml deleted file mode 100644 index 817b887e..00000000 --- a/.mdformat.toml +++ /dev/null @@ -1,14 +0,0 @@ -# .mdformat.toml -# -# See: https://mdformat.readthedocs.io/en/stable/users/configuration_file.html -# - -wrap = 80 # options: {"keep", "no", INTEGER} -number = true # for ordered lists (true: consecutive numbering) -end_of_line = "lf" # options: {"lf", "crlf", "keep"} -validate = true # options: {false, true} - -# Python 3.13+ only: -#exclude = [ -# ".venv/**" -#] # options: a list of file path pattern strings diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 695a9804..00000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,40 +0,0 @@ -fail_fast: true -repos: -- repo: local - hooks: - - - id: pyink - name: pyink - entry: poetry run pyink - language: system - types: [file, python] - files: '^smart_control/' - exclude: '^smart_control/Dockerfile' - - - id: isort - name: isort - entry: poetry run isort - language: system - types: [file, python] - files: '^smart_control/' - exclude: '^smart_control/proto/' - - # NOTE: running `pylint` against all files is prohibitively slow - # ... so we omit passing the `smart_buildings` directory, - # ... which allows pre-commit to run against staged / changed files only - - id: pylint - name: pylint - #entry: pylint --rcfile=.pylintrc --ignore=proto smart_control - #entry: pylint --rcfile=.pylintrc --ignore=proto $(git diff --name-only --staged | grep -E '\.py$') - entry: pylint --rcfile=.pylintrc --ignore=proto - language: system - types: [file, python] - files: '^smart_control/' - exclude: '^smart_control/proto/' - -# See: https://mdformat.readthedocs.io/en/stable/users/installation_and_usage.html#usage-as-a-pre-commit-hook -- repo: https://github.com/hukkin/mdformat - rev: 0.7.22 - hooks: - - id: mdformat - exclude: ^docs/api/ diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index 66296374..00000000 --- a/.pylintrc +++ /dev/null @@ -1,408 +0,0 @@ -# This Pylint rcfile contains a best-effort configuration to uphold the -# best-practices and style described in the Google Python style guide: -# https://google.github.io/styleguide/pyguide.html -# -# Its canonical open-source location is: -# https://google.github.io/styleguide/pylintrc - -[MAIN] - -# Files or directories to be skipped. They should be base names, not paths. -ignore=third_party - -# Files or directories matching the regex patterns are skipped. The regex -# matches against base names, not paths. -ignore-patterns= - -# Pickle collected data for later comparisons. -persistent=no - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins=pylint_per_file_ignores - -# Use multiple processes to speed up Pylint. -jobs=4 - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED -confidence= - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -#enable= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once).You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use"--disable=all --enable=classes -# --disable=W" -disable=R, - abstract-method, - apply-builtin, - arguments-differ, - attribute-defined-outside-init, - backtick, - bad-option-value, - basestring-builtin, - buffer-builtin, - c-extension-no-member, - consider-using-enumerate, - cmp-builtin, - cmp-method, - coerce-builtin, - coerce-method, - delslice-method, - div-method, - eq-without-hash, - execfile-builtin, - file-builtin, - filter-builtin-not-iterating, - fixme, - getslice-method, - global-statement, - hex-method, - idiv-method, - implicit-str-concat, - import-error, - import-self, - import-star-module-level, - input-builtin, - intern-builtin, - invalid-str-codec, - locally-disabled, - long-builtin, - long-suffix, - map-builtin-not-iterating, - misplaced-comparison-constant, - missing-function-docstring, - metaclass-assignment, - next-method-called, - next-method-defined, - no-absolute-import, - no-init, # added - no-member, - no-name-in-module, - no-self-use, - nonzero-method, - oct-method, - old-division, - old-ne-operator, - old-octal-literal, - old-raise-syntax, - parameter-unpacking, - print-statement, - raising-string, - range-builtin-not-iterating, - raw_input-builtin, - rdiv-method, - reduce-builtin, - relative-import, - reload-builtin, - round-builtin, - setslice-method, - signature-differs, - standarderror-builtin, - suppressed-message, - sys-max-int, - trailing-newlines, - unichr-builtin, - unicode-builtin, - unnecessary-pass, - unpacking-in-except, - useless-else-on-loop, - useless-suppression, - using-cmp-argument, - wrong-import-order, - xrange-builtin, - zip-builtin-not-iterating, - - -# Ignore certain errors in certain files -# see: https://github.com/christopherpickering/pylint-per-file-ignores -per-file-ignores = - .*_test\.py:protected-access # ignore "protected-access" errors in test files - - -[REPORTS] - -# Set the output format. Available formats are text, parseable, colorized, msvs -# (visual studio) and html. You can also give a reporter class, eg -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages -reports=no - -# Activate the evaluation score. -score=no - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details -#msg-template= - - -[BASIC] - -# Good variable names which should always be accepted, separated by a comma -good-names=main,_ - -# Bad variable names which should always be refused, separated by a comma -bad-names= - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Include a hint for the correct naming format with invalid-name -include-naming-hint=no - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl - -# Regular expression matching correct function names -function-rgx=^(?:(?PsetUp|tearDown|setUpModule|tearDownModule)|(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$ - -# Regular expression matching correct variable names -variable-rgx=^[a-z][a-z0-9_]*$ - -# Regular expression matching correct constant names -const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ - -# Regular expression matching correct attribute names -attr-rgx=^_{0,2}[a-z][a-z0-9_]*$ - -# Regular expression matching correct argument names -argument-rgx=^[a-z][a-z0-9_]*$ - -# Regular expression matching correct class attribute names -class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ - -# Regular expression matching correct inline iteration names -inlinevar-rgx=^[a-z][a-z0-9_]*$ - -# Regular expression matching correct class names -class-rgx=^_?[A-Z][a-zA-Z0-9]*$ - -# Regular expression matching correct module names -module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$ - -# Regular expression matching correct method names -method-rgx=(?x)^(?:(?P_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P_{0,2}[a-z][a-z0-9_]*))$ - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$ - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=12 - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules= - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members= - - -[FORMAT] - -# Maximum number of characters on a single line. -max-line-length=80 - -# Regexp for a line that is allowed to be longer than the limit. -# see: https://github.com/google/sbsim/issues/43 -ignore-long-lines=(?x)( - ^\s*(\#\ )??$| # Ignore long URLs - ^.*\[[^\]]+\]\(\s*(?:https?://|\/|(?:\.{1,2}\/|\S+\/)*)\S*\s*\).*$| # Ignore long markdown links in docstrings (including relative links) - ^\s*(from\s+\S+\s+)?import\s+.+$| # Ignore import statements - .*(pytype:|pylint:|fmt:|TODO:).* # Ignore lines containing pragma comments - ) - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=yes - -# Maximum number of lines in a module -max-module-lines=99999 - -# String used as indentation unit. The internal Google style guide mandates 2 -# spaces. Google's externaly-published style guide says 4, consistent with -# PEP 8. -indent-string=' ' - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=TODO - - -[STRING] - -# This flag controls whether inconsistent-quotes generates a warning when the -# character used as a quote delimiter is used inconsistently within a module. -check-quote-consistency=yes - - -[VARIABLES] - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# A regular expression matching the name of dummy variables (i.e. expectedly -# not used). -dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_) - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_,_cb - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools - - -[LOGGING] - -# Logging modules to check that the string format arguments are in logging -# function parameter format -logging-modules=logging,absl.logging,tensorflow.io.logging - - -[SIMILARITIES] - -# Minimum lines number of a similarity. -min-similarity-lines=4 - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=no - - -[SPELLING] - -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package. -spelling-dict= - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. -spelling-store-unknown-words=no - - -[IMPORTS] - -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=regsub, - TERMIOS, - Bastion, - rexec, - sets - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled) -import-graph= - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled) -ext-import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled) -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant, absl - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls, - class_ - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=mcs diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index a33e9af9..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - // when a contributor opens this project in VS Code, - // ... they will be prompted to install these extensions - "recommendations": [ - "ms-python.black-formatter", - "ms-python.isort" - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 37ab6e1c..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "editor.detectIndentation": false, - "editor.formatOnSave": true, - "editor.tabSize": 2, - "editor.rulers": [ - 80 - ], - "files.insertFinalNewline": true, - "files.trimFinalNewlines": true, - "files.trimTrailingWhitespace": true, - "[python]": { - // using pyink to perform formatting on file save... - // requires installation of the "ms-python.black-formatter" extension: - // https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter - "editor.defaultFormatter": "ms-python.black-formatter", - // using isort to perform import sorting on file save... - // requires installation of the "ms-python.black-formatter" extension: - // https://marketplace.visualstudio.com/items?itemName=ms-python.isort - "editor.codeActionsOnSave": { - "source.organizeImports": "explicit" - }, - }, - "black-formatter.path": [ - // using pyink instead of black: - ".venv/bin/pyink" - ], - "[dockerfile]": { - "editor.formatOnSave": false, - "editor.defaultFormatter": null - } -} diff --git a/BUILD b/BUILD deleted file mode 100644 index 2725ff8f..00000000 --- a/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# BUILD File for Smart Buildings - -load("//tools/build_defs/license:license.bzl", "license") - -# Description: -# Smart Buildings Monitoring and Controls -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -license( - name = "license", - package_name = "sbsim", -) - -licenses(["notice"]) - -exports_files(["LICENSE"]) diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 5ba19fb2..00000000 --- a/Dockerfile +++ /dev/null @@ -1,83 +0,0 @@ -# Use an x86_64 specific base image -FROM --platform=linux/amd64 ubuntu:20.04 - -# Set up environment -ENV DEBIAN_FRONTEND=noninteractive -ENV PYTHONUNBUFFERED=1 -WORKDIR /workspace - -# Install system dependencies -RUN apt-get update && apt-get install -y \ - software-properties-common && \ - add-apt-repository ppa:deadsnakes/ppa && \ - apt-get update && apt-get install -y \ - python3.10 python3.10-venv python3.10-distutils \ - protobuf-compiler ffmpeg git curl build-essential libffi-dev libssl-dev \ - pkg-config libhdf5-dev openjdk-11-jdk wget gnupg unzip && \ - rm -rf /var/lib/apt/lists/* - -# Create virtual environment -RUN python3.10 -m venv /opt/venv - -# Install pip properly -RUN curl -sS https://bootstrap.pypa.io/get-pip.py | /opt/venv/bin/python - -# Upgrade pip and install essential packages -RUN /opt/venv/bin/pip install --upgrade pip setuptools wheel - -# Install Poetry -RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry /opt/venv/bin/python - && \ - cd /usr/local/bin && \ - ln -s /opt/poetry/bin/poetry - -# Add virtual environment and Poetry to PATH -ENV PATH="/opt/venv/bin:/opt/poetry/bin:$PATH" - -# Install Bazel (required for some dependencies) -RUN wget https://github.com/bazelbuild/bazel/releases/download/5.1.1/bazel-5.1.1-installer-linux-x86_64.sh && \ - chmod +x bazel-5.1.1-installer-linux-x86_64.sh && \ - ./bazel-5.1.1-installer-linux-x86_64.sh && \ - rm bazel-5.1.1-installer-linux-x86_64.sh - -# Clone the repository to a temporary location -RUN git clone https://github.com/google/sbsim.git /tmp/sbsim - -# Configure poetry -RUN cd /tmp/sbsim && \ - poetry config virtualenvs.create false && \ - poetry config installer.max-workers 10 - -# Install base dependencies first -RUN /opt/venv/bin/pip install \ - jupyter \ - notebook \ - dm-reverb==0.14.0 \ - urllib3 \ - html5lib \ - requests - -# Install dependencies from the temporary location -RUN cd /tmp/sbsim && \ - poetry lock && \ - poetry install --no-root - -# Build .proto files -RUN cd /tmp/sbsim/smart_control/proto && \ - protoc --python_out=. smart_control_building.proto \ - smart_control_normalization.proto \ - smart_control_reward.proto - -# Create a startup script that copies files on container start -RUN echo '#!/bin/bash\n\ -source /opt/venv/bin/activate\n\ -if [ ! -d "/workspace/sbsim/.git" ]; then\n\ - cp -r /tmp/sbsim/. /workspace/sbsim/\n\ -fi\n\ -cd /workspace/sbsim\n\ -jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root --NotebookApp.token="" --no-browser --notebook-dir=/workspace/sbsim' > /start.sh && \ - chmod +x /start.sh - -# Set up environment variables for Jupyter Notebook -EXPOSE 8888 - -CMD ["/start.sh"] diff --git a/MAINTAINING.md b/MAINTAINING.md new file mode 100644 index 00000000..342e1772 --- /dev/null +++ b/MAINTAINING.md @@ -0,0 +1,234 @@ +# Maintainer's Guide + +This internal document provides instructions for Google employees to maintain +the open source "sbsim" codebase. + +## Codebase Location + +Navigating to the repo: + +```sh +# read-only version: +cd /google/src/files/head/depot/google3/third_party/py/smart_buildings/ + +# editable version (using a CitC workspace): +cd /google/src/cloud///google3/third_party/py/smart_buildings/ +# or: +cd third_party/py/smart_buildings/ +``` + +## VS Code + +We are encouraging open source contributors to use VS code as their default text +editor for working on this project. + +For Google employees who would also like to use VS Code as their default editor, +see go/vscode/remote_development_via_web#serve-web for setup instructions. +This involves setting up a "~/.config/systemd/user/code.service" file +with the provided contents. + +After setting up the "~/.config/systemd/user/code.service" file, +or after editing it, reload the service to have the changes take effect: + +```sh +systemctl --user daemon-reload +``` + +Then you can use the following commands to manage the service: + +```sh +# checking the status of the service: +systemctl --user status code + +# stopping the service: +systemctl --user stop code + +# starting the service: +systemctl --user start code + +# restarting the service: +systemctl --user restart code +``` + +> NOTE: if you stop and start the service too quickly, it might cause an error, +> so it might help to wait a few seconds in between starting and stopping. + +Once the service is running, to open VS Code, it might sometimes be possible +to visit the localhost address through the browser on your Chromebook, using a +port forwarding approach (see SSH connection below), +however this may not work reliably: + +```sh +ssh @.c.googlers.com -L 59005:localhost:59005 +``` + +In practice it may be more reliable to visit the localhost address +on your Cloudtop machine, through Chrome Remote Desktop. + +Once you have accessed VS Code through the browser, it may be helpful to install +it as a progressive web app, so you can use it through its own dedicated +application window. + +## Google-specific Style Checking + +Google uses [`gpylint`](https://goto.google.com/gpylint) (a wrapper +around `pylint`) to check for `pylint`-related errors as well as additional +Google-specific code formatting errors that `pylint` does not handle. These +Google-specific errors begin with "g-" and can be ignored / disabled using the +usual `pylint` pragma comments (see README). + +The `gpylint` checks are performed automatically by internal Google tools, +including during a Copybara sync (see "Copybara Sync" section below). Since +open source contributors are currently unable to run these checks, we need to +run them ourselves. + +To run the style checker manually: + +```sh +# check all files: +gpylint smart_control --ignore=proto + +# check a specific file: +gpylint smart_control/path/to/file.py +``` + +This may produce verbose outputs, which may be helpful for specific errors but +which may be overwhelming when there are many errors. To control and reduce the +format of the error messages: + +```sh +gpylint smart_control --ignore=proto --msg-template="{path}:{line}: [{msg_id}({symbol})]" +``` + +To ignore and/or check for certain messages, using the corresponding +[message name(s)](https://goto.google.com/gpylint-faq#rules): + +```sh +# disabling certain messages (this is our default run command): +gpylint smart_control --ignore=proto --disable=g-bad-import-order,g-bad-todo --msg-template="{path}:{line}: [{msg_id}({symbol})]" + +# checking for a specific message: +gpylint smart_control --ignore=proto --disable=all --enable=g-doc-args +``` + +The `gpylint` tool doesn't use the existing ".pylintrc" +config file, so we have [created](https://critique.corp.google.com/cl/758181505) our own [custom `gpylint` configuration](https://source.corp.google.com/piper///depot/google3/devtools/gpylint/config/oss_smart_buildings/), which ignores certain +messages such as "g-bad-import-order", which allows us to group local imports +in their own section at the bottom. + +To apply our custom `gpylint` config, run it in "oss_smart_buildings" mode. This +is the mode that gets run on CL pre-submit: + +```sh +gpylint smart_control --ignore=proto --mode=oss_smart_buildings +``` + +## Copybara Sync + +We are using [Copybara](https://github.com/google/copybara) to manage the code +sync process between GitHub (open source) and Google (internal) codebases. + +### Setup Copybara + +Follow the [Copybara Setup](https://goto.google.com/copybara-setup) instructions +to setup Copybara on your Google machine. + +This involves setting a bash alias for the `copybara` CLI. + +If successful, these commands should resolve without error: + +```sh +copybara version + +copybara help +``` + +### Configure Copybara + +Ensure the "copy.bara.sky" file in the root directory of the repository is up to +date. This file exists in the Google codebase only. + +Navigate to the repository from the command-line before running any of the +Copybara commands below that reference the "copy.bara.sky" config file. + +See more information about the existing workflows: + +```sh +copybara info copy.bara.sky +``` + +You will need to use your judgement about which workflow needs to be run, +and the order in which to run them. + +### GitHub to Google + +Run the "default" workflow to perform a dry run sync from GitHub to Google: + +```sh +# sync from the default branch: +copybara copy.bara.sky --init-history --dry-run + +# sync from a specific branch: +copybara copy.bara.sky --init-history --dry-run default + +# sync from a specific commit: +copybara copy.bara.sky --init-history --dry-run default +``` + +This creates a CL on the Google side, pulling in all the changes from GitHub to +Google. + +> NOTE: the GitHub to Google sync process updates the "METADATA" file +> automatically, flipping the "Piper" block's `primary_source` setting to +> be `false`, and adding a "Git" block with a `primary_source` setting of +> `true`. + +> NOTE: the "Git" block includes information related to the latest release, +> so it may be helpful to create a new release tag on GitHub before +> performing a sync. Although, a sync was performed before we made any +> releases, and we have anecdotal evidence that a release was being referenced +> even after it was deleted on GitHub, so additional investigation into the +> relationship between Copybara and the release tags may be helpful. + +> NOTE: any changes made to the "METADATA" file from GitHub will be +> overridden, so if you need to make updates to that file, you will need to +> update it on the Google side. + +### Google to GitHub + +#### Setup GitHub Credentials + +When pushing code to GitHub, it will ask you to provide your username and +password, or use a personal access token. + +Obtaining a Personal Access Token: + + + Go to your GitHub settings, then "Developer settings," and then "Personal access tokens (classic)". + + Click "Generate new token". + + Give the token a descriptive name (e.g. "Copybara Sync"). + + Grant the `public_repo` permission under the repo scope. + + Copy the generated token. + +Create or update the "~/.googlekeys/copybara_git_credentials" file on your +Cloudtop to include your token in the following format: + +``` +https://:@github.com +``` + +#### Running the Workflow + +Once your credentials are in place, you can run the "piper_to_github_pr" +workflow: + +```sh +copybara copy.bara.sky piper_to_github_pr --ignore-noop + +# if the last change was to a file not included in GitHub: +copybara copy.bara.sky piper_to_github_pr --ignore-noop --last-rev + +# to use the last n=8 Google commits: +copybara copy.bara.sky piper_to_github_pr --ignore-noop --iterative-limit-changes 8 +``` + +This will create a Pull Request the GitHub repository. diff --git a/METADATA b/METADATA deleted file mode 100644 index 25a96117..00000000 --- a/METADATA +++ /dev/null @@ -1,82 +0,0 @@ -# Format: google3/devtools/metadata/metadata.proto (go/google3metadata) - -name: "sb-sim" -language: PYTHON -description: "Smart Buildings Control Environment" - -third_party { - identifier { - type: "Piper" - value: "http://google3/third_party/py/smart_buildings" - primary_source: true - } - - identifier { - type: "PyPI" - omission_reason: "Package doesn't have an upstream repo." - } -} - -presubmit: { - path_expression: "//depot/google3/third_party/py/smart_buildings/..." - - check_description: { - failure_message: - "\n" - "CL descriptions for changes to third_party/py/smart_buildings\n" - "must contain one or more sections delimited as follows:\n" - "\n" - "BEGIN_PUBLIC\n" - "...text exposed to open source public git repo...\n" - "END_PUBLIC\n" - "\n" - "If your change affects only files that you know are not " - "opensourced, you may write something like 'Internal " - "change'. You may not leave the section empty. \n" - - required_regexp: - "(^|\\n)\\s*BEGIN_PUBLIC\\s*?\\n" - "(.*\\n)*" - "\\s*\\S+.*(\\n.*)*\\n" - "\\s*END_PUBLIC\\s*?\\n" - required_for_cleanup: true - } -} - -presubmit: { - path_expression: "//depot/google3/third_party/py/smart_buildings/..." - - check_do_not_submit: { - failure_status: ERROR - } - check_tabs: { - failure_status: ERROR - } - check_trailing_whitespace: { - failure_status: ERROR - } - check_lint: { - action: REVIEW - failure_status: WARNING - } - check_lint: { - action: SUBMIT - failure_status: ERROR - } -} - -presubmit: { - include_presubmit: "//depot/google3/corp/ml/smart_buildings/METADATA" -} - -exported { - copybara { - config_path: "//depot/google3/third_party/py/smart_buildings/copy.bara.sky" - } - owning_team_email: "ce-ml-team@google.com" - path_expression: "//depot/google3/third_party/py/smart_buildings/..." - request_url: "https://launch.corp.google.com/launch/4284362" - remote_location: "https://github.com/google/sbsim" - reason: OPEN_SOURCE - description: "Open sourcing the Smart Buildings Control Simulation, Reward Function, and Custom Environment for training RL agents." -} diff --git a/Makefile b/Makefile deleted file mode 100644 index b5905d8f..00000000 --- a/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# NOTE: you have to use tabs (not spaces) to define commands in the Makefile - -# these are commands to be run, not files to be created: -.PHONY: venv-activate docs docs-build docs-quiet mdformat pyink isort pylint lint test - -# -# ENVIRONMENT -# - -# https://stackoverflow.com/questions/33839018/activate-virtualenv-in-makefile -# this command uses a different shell, so you must run it manually: -# bash -c "source .venv/bin/activate" -# or consider setting as a bash alias: -# alias make-env='source .venv/bin/activate' -activate: - @echo "Run this command to activate the environment: source .venv/bin/activate" - -# -# LINTING AND FORMATTING -# - -mdformat: - poetry run mdformat README.md docs/* - -pyink: - poetry run pyink . - -isort: - poetry run isort . - -pylint: - poetry run pylint --rcfile=.pylintrc --ignore=proto smart_control - -# mega-command for running all formatters: -format: mdformat pyink isort pylint - -# -# TESTING -# - -test: - poetry run pytest --disable-pytest-warnings - -# -# DOCS -# - -docs: - poetry run mkdocs serve - -docs-quiet: - poetry run mkdocs serve --quiet - -docs-build: - poetry run mkdocs build diff --git a/OWNERS b/OWNERS deleted file mode 100644 index 273b520e..00000000 --- a/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -sipple -aneeshbhat -judahg \ No newline at end of file diff --git a/README.md b/README.md index 2649542a..3ad6c6ee 100644 --- a/README.md +++ b/README.md @@ -7,56 +7,284 @@ review at Neurips 2024, and builds off of Goldfeder, J., Sipple, J., (2023). [A Lightweight Calibrated Simulation Enabling Efficient Offline Learning for Optimal Control of Real Buildings](https://dl.acm.org/doi/10.1145/3600100.3625682), BuildSys '23, November 15–16, 2023, Istanbul, Turkey -## Real World Data +## Getting Started -In addition to our calibrated simulator, we have released six years of data from -three buildings. This data can be used for further simulator calibration, and -for training and evaluating reinforcement learning (RL) models. +The best place to jump in is the Soft Actor Critic Demo notebook, available in +`smart_control/notebooks/SAC_Demo.ipynb`. -The dataset is available for download from -[Tensorflow Datasets](https://www.tensorflow.org/datasets/catalog/smart_buildings). +This will walk you through: -Alternatively, a smaller version of the dataset can be downloaded as a -[zip file](https://storage.googleapis.com/gresearch/smart_buildings_dataset/tabular_data/sb1.zip) -from cloud storage. +1. Creating an RL (gym compatible) environment -## Documentation +2. Visualizing the env + +3. Training an agent using the + [Tensorflow Agents Library](https://www.tensorflow.org/agents) -View the official [Documentation Site](https://google.github.io/sbsim/) for a -complete auto-generated API reference. +Before you run this notebook, make sure to go through the setup instructions +below to ensure the notebook runs successfully. -There is also a legacy unofficial -[Community-run Documentation Site](https://gitwyd.github.io/sbsim_documentation/) -containing more information about the project and the codebase. We plan to merge -all this content into the official documentation site soon. +## Setup -## Getting Started +Follow these steps to setup locally before you run the +`smart_control/notebooks/SAC_Demo.ipynb` notebook. Note: this will only work on +linux, as some libraries are not supported by other operating systems. -A great place to start is by reviewing the -[Soft Actor Critic Demo notebook](smart_control/notebooks/SAC_Demo.ipynb). This -notebook will walk you through: +1. Clone the repository -1. Creating a gym-compatible Reinforcement Learning (RL) environment. +2. Ensure you have `protoc` and `ffmpeg` installed, as well as + `python >=3.10.12 and <3.12`. You can install these running + `sudo apt install -y protobuf-compiler` and `sudo apt install -y ffmpeg` -2. Visualizing the environment. +3. Create a virtual environment by running `python -m venv .venv`. Activate the + environment `source .venv/bin/activate`. Then, install poetry with + `pip install poetry` -3. Training an agent using the - [Tensorflow Agents Library](https://www.tensorflow.org/agents). +4. Install the dependencies by running `poetry install --with dev` -Alternatively, RL agents can be trained by running various scripts in the -"smart_control/reinforcement_learning/scripts" directory. +5. Build the `.proto` files at `smart_control/proto` into python files by + running: -Before running notebooks or scripts, make sure to complete the setup -instructions linked below. + ```bash + cd smart_control/proto + protoc --python_out=. smart_control_building.proto \ + smart_control_normalization.proto \ + smart_control_reward.proto + cd ../.. + ``` -## Setup +6. Modify the value of `VIDEO_PATH_ROOT` at + `smart_control/simulator/constants.py`. This is the path where simulation + videos will be stored -The [Setup Guide](docs/setup.md) provides all the information you need to run -the code locally. +7. Now in the `smart_control/notebooks/SAC_Demo.ipynb` notebook, modify the + values of `data_path`, `metrics_path`, `output_data_path` and `root_dir`. + In particular, `data_path` should point to the `sim_config.gin` file at + `smart_control/configs/sim_config.gin` + +8. Now you are ready to run the `smart_control/notebooks/SAC_Demo.ipynb` notebook. + +## Real World Data + +In addition to our calibrated simulator, we released 6 years of data on 3 +buildings, for further calibration, and to use, in conjunction with the +simulator, for training and evaluating RL models. The dataset is part of +[Tensorflow Datasets](https://www.tensorflow.org/datasets/catalog/smart_buildings). + +## Documentation + +Here is an +[Unofficial Community-run Documentation Site](https://gitwyd.github.io/sbsim_documentation/) +containing more information about the project and the codebase. ## Contributing -The [Contributor's Guide](docs/contributing.md) provides more information on how -to contribute to this repository. +We welcome your contributions to this repository! + +All open source contributors will need to sign Google's +[Contributor License Agreement (CLA)](https://cla.developers.google.com/). + +Contributors are encouraged to consult the sections below for more information +about code documentation, testing, and formatting. + +### Documentation + +We encourage you to document your code using docstrings. Specifically we use the +[Google Docstring Guidelines](https://google.github.io/styleguide/pyguide.html#381-docstrings) +outlined in the Google Python Style Guide. + +### Testing + +We encourage you to add tests to ensure your code is working as expected. + +Running tests: + +```sh +# run all tests: +pytest + +# disable warnings: +pytest --disable-pytest-warnings + +# run specific test files: +pytest --disable-pytest-warnings path/to/your/test.py + +# run specific tests: +pytest --disable-pytest-warnings -k your_test_name_here +``` + +### Linting + +#### Style Formatting + +We are using [`pyink`](https://github.com/google/pyink) to format Python code +according to +[Google Python Style Guidelines](https://google.github.io/styleguide/pyguide.html). +The formatter will automatically update files inplace. + +The formatter will run automatically as a pre-commit hook (see "Pre-commit +Hooks" section below for more information and setup instructions). + +Additionally, for contributors using the VS Code text editor, we have configured +a VS Code workspace settings file to run the formatter whenever a file is saved. +NOTE: this requires the +[`ms-python.black-formatter` extension](https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter) +for VS Code. + +If you would like to run the formatter manually: + +```sh +# format all the files: +pyink . + +# format a specific file or directory: +pyink /path/to/file/or/dir +``` + +If you would like to perform a dry run: + +```sh +# check if a file would be changed: +pyink . --check + +# see what changes would be made: +pyink . --diff +``` + +If you would like to prevent certain lines of code from being formatted (for +example to leave a long line as-is), it is possible to +[ignore formatting](https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html#ignoring-sections) +by adding a trailing comment of `# fmt: skip` to the right of the line / at the +end of the expression, or by wrapping multiple lines of code between +`# fmt: off` and `# fmt: on` comments. NOTE: `pyink` and `pylint` (see section +below) may each require their own separate set of comments, however `pyink` +respects many `pylint` comments, so you are recommended to try using a `pylint` +comment first, and then only also add a `pyink` comment as necessary. + +#### Import Sorting + +We are using [`isort`](https://pycqa.github.io/isort/) to control the sort order +of Python import statements, specifically grouping the "smart_control" local +module imports separately in their own section below the package imports. + +The import sorter will run automatically as a pre-commit hook (see "Pre-commit +Hooks" section below for more information and setup instructions). + +Additionally, for contributors using the VS Code text editor, we have configured +a VS Code workspace settings file to run the import sorter whenever a file is +saved. NOTE: this requires the +[`ms-python.isort` extension](https://marketplace.visualstudio.com/items?itemName=ms-python.isort) +for VS Code. + +If you would like to run the import sorter manually: + +```sh +# sort all the files: +isort . + +# sort a specific file: +isort /path/to/file.py + +# sort with verbose outputs (helpful for troubleshooting): +isort -v . +``` + +### Style Checking + +We are using [`pylint`](https://pylint.readthedocs.io/en/stable/index.html) to +check for Python style formatting issues that `pyink` doesn't fix, to more +closely follow +[Google Python style guidelines](https://google.github.io/styleguide/pyguide.html). +The style checker will NOT automatically update files inplace, but rather will +produce a report containing any errors that you will need to fix manually. + +The style checker will run automatically as a pre-commit hook (see "Pre-commit +Hooks" section below for more information and setup instructions). + +If you would like to run the style checker manually: + +```sh +# check all files: +pylint --rcfile=.pylintrc --ignore=proto smart_control + +# check a specific file: +pylint --rcfile=.pylintrc --ignore=proto smart_control/path/to/file.py +``` + +To check for a specific issue (e.g. "missing-module-docstring"), using the +corresponding +[message code](https://pylint.readthedocs.io/en/stable/user_guide/messages/messages_overview.html) +(e.g. "C0114"): + +```sh +pylint smart_control --rcfile=.pylintrc --ignore=proto --disable=all --enable=C0114 +``` + +If you would like to prevent certain lines of code from being checked (for +example to leave a long line as-is), it is possible to +[ignore formatting](https://pylint.readthedocs.io/en/stable/user_guide/messages/message_control.html#block-disables) +for a given message (e.g. "line-too-long") by adding a trailing comment of +`# pylint: disable=line-too-long` to the right of the line / at the end of the +expression, or by wrapping multiple lines of code between +`# pylint: disable=line-too-long` and `# pylint: enable=line-too-long` comments. + +### Markdown Formatting + +We are using [`mdformat`](https://github.com/hukkin/mdformat) to check for +formatting errors in markdown files. + +The markdown formatter will run automatically as a pre-commit hook (see +"Pre-commit Hooks" section below for more information and setup instructions). + +If you would like to run the markdown formatter manually: + +```sh +# format specific files: +mdformat README.md + +# check if a file would be changed: +mdformat README.md --check +``` + +> NOTE: it would be nice to check all markdown files, however this includes all +> markdown files in the ".venv" folder (not desired), and the functionality for +> ignoring certain directories is only supported in Python 3.13+. When we +> upgrade we can consider updating the approach, but right now we are only +> targeting specific files. + +The `mdformat` tool might not be able to format long lines containing code +fences, so some manual review may still be required. + +Long lines caused by links are OK to keep as-is. + +### Pre-commit Hooks + +We are using pre-commit hooks to perform code formatting, import sorting, and +style checking. These actions will take place on each commit. + +To enable the pre-commit hooks, you must perform a one-time setup by running +`pre-commit install`. This will update ".git/hooks/pre-commit". + +If you would like to run the pre-commit hooks without making a commit: + +```sh +# run against staged files only: +pre-commit run + +# run against all files: +pre-commit run --all-files + +# run against a specific set of file(s): +pre-commit run --files path/to/my_file.py path/to/other_file.py +``` + +If you encounter issues and need to clear the cache: + +```sh +pre-commit clean +``` + +If you would like to make a commit and skip the hooks (not recommended), use the +`--no-verify` flag with your `git commit` command. ## [License](LICENSE) diff --git a/data/.gitkeep b/data/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/api/config.md b/docs/api/config.md deleted file mode 100644 index d93b878f..00000000 --- a/docs/api/config.md +++ /dev/null @@ -1,4 +0,0 @@ -# Configuration - -The project uses Gin ("\*.gin") configuration files to manage simulation -settings, reward function parameters, and environment configurations. diff --git a/docs/api/dataset/dataset.md b/docs/api/dataset/dataset.md deleted file mode 100644 index d9ea9478..00000000 --- a/docs/api/dataset/dataset.md +++ /dev/null @@ -1,22 +0,0 @@ -# Building Dataset - -::: smart_control.dataset.dataset.BuildingDataset - options: - members_order: source - group_by_category: false - members: - - download - - building_dirpath - - floorplan - - floorplan_image_filepath - - display_floorplan - - device_layout_map - - device_infos - - devices_df - - actionable_fields - - actionable_field_counts - - observable_fields - - observable_field_counts - - fields_df - - zone_infos - - zones_df diff --git a/docs/api/dataset/partition.md b/docs/api/dataset/partition.md deleted file mode 100644 index 1c5ad805..00000000 --- a/docs/api/dataset/partition.md +++ /dev/null @@ -1,27 +0,0 @@ -# Building Dataset Partition - -::: smart_control.dataset.partition.BuildingDatasetPartition - options: - members: - #- data - #- metadata - - action_ids - #- action_ids_map - - action_timestamps - - action_value_matrix - - actions_df - - observation_ids - #- observation_ids_map - - observation_timestamps - - observation_value_matrix - - observations_df - - reward_info_ids - #- reward_info_ids_map - - reward_info_timestamps - - reward_info_value_matrix - - reward_infos_df - - reward_ids - #- reward_ids_map - - reward_timestamps - - reward_value_matrix - - rewards_df diff --git a/docs/api/environment.md b/docs/api/environment.md deleted file mode 100644 index 93c47e9e..00000000 --- a/docs/api/environment.md +++ /dev/null @@ -1,3 +0,0 @@ -# Environment - -::: smart_control.environment.environment diff --git a/docs/api/models.md b/docs/api/models.md deleted file mode 100644 index 68f8735b..00000000 --- a/docs/api/models.md +++ /dev/null @@ -1,11 +0,0 @@ -# Models - -::: smart_control.models.base_building - -::: smart_control.models.base_energy_cost - -::: smart_control.models.base_normalizer - -::: smart_control.models.base_occupancy - -::: smart_control.models.base_reward_function diff --git a/docs/api/reinforcement_learning/agents.md b/docs/api/reinforcement_learning/agents.md deleted file mode 100644 index 4e2c791e..00000000 --- a/docs/api/reinforcement_learning/agents.md +++ /dev/null @@ -1,9 +0,0 @@ -# Agents and Networks - -## Agents - -::: smart_control.reinforcement_learning.agents.sac_agent - -## Networks - -::: smart_control.reinforcement_learning.agents.networks.sac_networks diff --git a/docs/api/reinforcement_learning/observers.md b/docs/api/reinforcement_learning/observers.md deleted file mode 100644 index 4c1efceb..00000000 --- a/docs/api/reinforcement_learning/observers.md +++ /dev/null @@ -1,9 +0,0 @@ -# Observers - -::: smart_control.reinforcement_learning.observers.base_observer - -::: smart_control.reinforcement_learning.observers.print_status_observer - -::: smart_control.reinforcement_learning.observers.rendering_observer - -::: smart_control.reinforcement_learning.observers.composite_observer diff --git a/docs/api/reinforcement_learning/policies.md b/docs/api/reinforcement_learning/policies.md deleted file mode 100644 index e28ad07d..00000000 --- a/docs/api/reinforcement_learning/policies.md +++ /dev/null @@ -1,3 +0,0 @@ -# Policies - -::: smart_control.reinforcement_learning.policies.schedule_policy diff --git a/docs/api/reinforcement_learning/replay_buffer.md b/docs/api/reinforcement_learning/replay_buffer.md deleted file mode 100644 index 16b3d852..00000000 --- a/docs/api/reinforcement_learning/replay_buffer.md +++ /dev/null @@ -1,3 +0,0 @@ -# Replay Buffer - -::: smart_control.reinforcement_learning.replay_buffer.replay_buffer diff --git a/docs/api/reinforcement_learning/scripts.md b/docs/api/reinforcement_learning/scripts.md deleted file mode 100644 index 7cadbd22..00000000 --- a/docs/api/reinforcement_learning/scripts.md +++ /dev/null @@ -1,5 +0,0 @@ -# Scripts - -::: smart_control.reinforcement_learning.scripts.populate_starter_buffer - -::: smart_control.reinforcement_learning.scripts.train diff --git a/docs/api/reinforcement_learning/utils.md b/docs/api/reinforcement_learning/utils.md deleted file mode 100644 index ffa10f15..00000000 --- a/docs/api/reinforcement_learning/utils.md +++ /dev/null @@ -1,13 +0,0 @@ -# Utils - -::: smart_control.reinforcement_learning.utils.config - -::: smart_control.reinforcement_learning.utils.constants - -::: smart_control.reinforcement_learning.utils.data_processing - -::: smart_control.reinforcement_learning.utils.environment - -::: smart_control.reinforcement_learning.utils.metrics - -::: smart_control.reinforcement_learning.utils.time_utils diff --git a/docs/api/reward.md b/docs/api/reward.md deleted file mode 100644 index 6ca033c3..00000000 --- a/docs/api/reward.md +++ /dev/null @@ -1,11 +0,0 @@ -# Reward Functions - -::: smart_control.reward.base_setpoint_energy_carbon_reward - -::: smart_control.reward.electricity_energy_cost - -::: smart_control.reward.natural_gas_energy_cost - -::: smart_control.reward.setpoint_energy_carbon_reward - -::: smart_control.reward.setpoint_energy_carbon_regret diff --git a/docs/api/simulator/building.md b/docs/api/simulator/building.md deleted file mode 100644 index 1ed23ef9..00000000 --- a/docs/api/simulator/building.md +++ /dev/null @@ -1,7 +0,0 @@ -# Buildings - -::: smart_control.simulator.building - -::: smart_control.simulator.rejection_simulator_building - -::: smart_control.simulator.simulator_building diff --git a/docs/api/simulator/devices.md b/docs/api/simulator/devices.md deleted file mode 100644 index 034b6abe..00000000 --- a/docs/api/simulator/devices.md +++ /dev/null @@ -1,15 +0,0 @@ -# Devices - -::: smart_control.simulator.smart_device - -::: smart_control.simulator.air_handler - -::: smart_control.simulator.boiler - -::: smart_control.simulator.hvac - -::: smart_control.simulator.hvac_floorplan_based - -::: smart_control.simulator.thermostat - -::: smart_control.simulator.vav diff --git a/docs/api/simulator/occupancy.md b/docs/api/simulator/occupancy.md deleted file mode 100644 index 2ecdf0bd..00000000 --- a/docs/api/simulator/occupancy.md +++ /dev/null @@ -1,7 +0,0 @@ -# Occupancy - -::: smart_control.simulator.randomized_arrival_departure_occupancy - -::: smart_control.simulator.step_function_occupancy - -::: smart_control.simulator.stochastic_occupancy diff --git a/docs/api/simulator/simulator.md b/docs/api/simulator/simulator.md deleted file mode 100644 index 4ecac4ff..00000000 --- a/docs/api/simulator/simulator.md +++ /dev/null @@ -1,24 +0,0 @@ -# Simulator - -::: smart_control.simulator.simulator.Simulator - options: - # Ensure single-underscore private members are included. - filters: - # excludes dunder methods: - - "!^__" - # includes everything else: - - ".*" - members: - # Use "*" to include all standard public methods/attributes - - "*" - # Explicitly list the specific private method you want to show - - _get_interior_cv_temp_estimate - - -::: smart_control.simulator.simulator_flexible_floor_plan - -::: smart_control.simulator.base_convection_simulator - -::: smart_control.simulator.stochastic_convection_simulator - -::: smart_control.simulator.tf_simulator diff --git a/docs/api/simulator/solar_radiation.md b/docs/api/simulator/solar_radiation.md deleted file mode 100644 index 0484fafa..00000000 --- a/docs/api/simulator/solar_radiation.md +++ /dev/null @@ -1,3 +0,0 @@ -# Solar Radiation - -::: smart_control.simulator.solar_radiation diff --git a/docs/api/simulator/utils.md b/docs/api/simulator/utils.md deleted file mode 100644 index c6a55add..00000000 --- a/docs/api/simulator/utils.md +++ /dev/null @@ -1,11 +0,0 @@ -# Utilities - -::: smart_control.simulator.constants - -::: smart_control.simulator.building_utils - -::: smart_control.simulator.building_radiation_utils - options: - members_order: source - -::: smart_control.simulator.thermal_diffuser_utils diff --git a/docs/api/simulator/weather.md b/docs/api/simulator/weather.md deleted file mode 100644 index 499f649c..00000000 --- a/docs/api/simulator/weather.md +++ /dev/null @@ -1,3 +0,0 @@ -# Weather - -::: smart_control.simulator.weather_controller diff --git a/docs/assets/images/favicon.ico b/docs/assets/images/favicon.ico deleted file mode 100644 index ec22aa06..00000000 Binary files a/docs/assets/images/favicon.ico and /dev/null differ diff --git a/docs/assets/images/google-open-source-logo-large.png b/docs/assets/images/google-open-source-logo-large.png deleted file mode 100644 index 9688fa09..00000000 Binary files a/docs/assets/images/google-open-source-logo-large.png and /dev/null differ diff --git a/docs/assets/images/google-open-source-logo.png b/docs/assets/images/google-open-source-logo.png deleted file mode 100644 index caa6ffcd..00000000 Binary files a/docs/assets/images/google-open-source-logo.png and /dev/null differ diff --git a/docs/assets/images/sb1_floorplan.png b/docs/assets/images/sb1_floorplan.png deleted file mode 100644 index e7bb92ef..00000000 Binary files a/docs/assets/images/sb1_floorplan.png and /dev/null differ diff --git a/docs/assets/javascripts/mathjax_config.js b/docs/assets/javascripts/mathjax_config.js deleted file mode 100644 index 74df83f8..00000000 --- a/docs/assets/javascripts/mathjax_config.js +++ /dev/null @@ -1,12 +0,0 @@ -window.MathJax = { - tex: { - inlineMath: [['\\(', '\\)']], - displayMath: [['\\[', '\\]']], - processEscapes: true, - processEnvironments: true - }, - options: { - ignoreHtmlClass: ".*|", - processHtmlClass: "arithmatex" - } -}; diff --git a/docs/assets/stylesheets/google-style.css b/docs/assets/stylesheets/google-style.css deleted file mode 100644 index 0021edeb..00000000 --- a/docs/assets/stylesheets/google-style.css +++ /dev/null @@ -1,18 +0,0 @@ -/* Custom Google Color Scheme */ - -/* You can also define custom CSS classes to apply these colors to other elements */ -.google-blue-text { - color: #4285F4; -} - -.google-red-text { - color: #EA4335; -} - -.google-yellow-text { - color: #FBBC05; -} - -.google-green-text { - color: #34A853; -} diff --git a/docs/code-of-conduct.md b/docs/code-of-conduct.md index 019ea60c..c8d68a23 100644 --- a/docs/code-of-conduct.md +++ b/docs/code-of-conduct.md @@ -14,22 +14,22 @@ race, religion, or sexual identity and orientation. Examples of behavior that contributes to creating a positive environment include: -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members Examples of unacceptable behavior by participants include: -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting ## Our Responsibilities @@ -89,4 +89,5 @@ harassment or threats to anyone's safety, we may take action without notice. ## Attribution This Code of Conduct is adapted from the Contributor Covenant, version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct/ +available at +https://www.contributor-covenant.org/version/1/4/code-of-conduct/ \ No newline at end of file diff --git a/docs/contributing.md b/docs/contributing.md index 9f2c7b1d..ea731693 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -1,11 +1,10 @@ -# Contributor's Guide +# How to Contribute -We welcome your contributions to this repository! +We would love to accept your patches and contributions to this project. -Consult the sections below for more information about the contribution process, -including guidelines about code documentation, testing, and formatting. +## Before you begin -## Contributor License Agreement +### Sign our Contributor License Agreement Contributions to this project must be accompanied by a [Contributor License Agreement](https://cla.developers.google.com/about) (CLA). @@ -19,261 +18,15 @@ was for a different project), you probably don't need to do it again. Visit to see your current agreements or to sign a new one. -## Community Guidelines +### Review our Community Guidelines -This project follows -[Google's Open Source Community Guidelines](https://opensource.google/conduct/). +This project follows [Google's Open Source Community +Guidelines](https://opensource.google/conduct/). -See also the [Code of Conduct](./code-of-conduct.md). +## Contribution process -## Code Reviews and Pull Request Workflow +### Code Reviews All submissions, including submissions by project members, require review. We use [GitHub pull requests](https://docs.github.com/articles/about-pull-requests) -for this purpose. - -## Documentation - -We encourage you to document your code using docstrings and type hints. -Specifically we use the -[Google Docstring Guidelines](https://google.github.io/styleguide/pyguide.html#381-docstrings) -outlined in the Google Python Style Guide. - -Here are some additional -[examples of Google-formatted docstrings](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html). - -The content of the [documentation site](./docs-site.md) is automatically -generated based on these docstrings. - -## Testing - -We encourage you to add tests to ensure your code is working as expected. - -Tests should be placed in a new file next to the file under test. The test file -name should be the same as the name of the file under test, with "\_test.py" -appended at the end. For example, if you are testing a file called -"my_library.py", the test file should be named "my_library_test.py". - -We primarily leverage the `unittest`, `absltest`, and `tf.test` frameworks for -writing tests, and we use the `pytest` tool for running tests. - -See existing test files for example structure. Here is a simplified example: - -```py -# this is an example "_test.py" file... - -from absl.testing import absltest - -class CalculatorTest(absltest.TestCase): - - def test_addition(self): - self.assertEqual(2+2, 4) - -if __name__ == "__main__": - absltest.main() -``` - -Running tests: - -```sh -# run all tests: -pytest - -# disable warnings: -pytest --disable-pytest-warnings - -# show print statements: -pytest --disable-pytest-warnings -s - -# run specific test files: -pytest --disable-pytest-warnings path/to/your/test.py - -# run specific test class: -pytest --disable-pytest-warnings path/to/your/test.py::YourUnittestClass - -# run specific tests: -pytest --disable-pytest-warnings -k your_test_name_here - -# ignore specific test files and directories: -pytest --ignore=path/to/your/test.py --ignore=path/to/other/ - -``` - -## Linting - -### Python Style Formatting - -We are using [`pyink`](https://github.com/google/pyink) to format Python code -according to -[Google Python Style Guidelines](https://google.github.io/styleguide/pyguide.html). -The formatter will automatically update files inplace. - -The formatter will run automatically as a pre-commit hook (see "Pre-commit -Hooks" section below for more information and setup instructions). - -Additionally, for contributors using the VS Code text editor, we have configured -a VS Code workspace settings file to run the formatter whenever a file is saved. -NOTE: this requires the -[`ms-python.black-formatter` extension](https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter) -for VS Code. - -If you would like to run the formatter manually: - -```sh -# format all the files: -pyink . - -# format a specific file or directory: -pyink /path/to/file/or/dir -``` - -If you would like to perform a dry run: - -```sh -# check if a file would be changed: -pyink . --check - -# see what changes would be made: -pyink . --diff -``` - -If you would like to prevent certain lines of code from being formatted (for -example to leave a long line as-is), it is possible to -[ignore formatting](https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html#ignoring-sections) -by adding a trailing comment of `# fmt: skip` to the right of the line / at the -end of the expression, or by wrapping multiple lines of code between -`# fmt: off` and `# fmt: on` comments. NOTE: `pyink` and `pylint` (see "Python -Style Checking" section below) may each require their own separate set of -comments, however `pyink` respects many `pylint` comments, so you are -recommended to try using a `pylint` comment first, and then only also add a -`pyink` comment as necessary. - -### Python Import Sorting - -We are using [`isort`](https://pycqa.github.io/isort/) to control the sort order -of Python import statements, specifically grouping the "smart_control" local -module imports separately in their own section below the package imports. - -The import sorter will run automatically as a pre-commit hook (see "Pre-commit -Hooks" section below for more information and setup instructions). - -Additionally, for contributors using the VS Code text editor, we have configured -a VS Code workspace settings file to run the import sorter whenever a file is -saved. NOTE: this requires the -[`ms-python.isort` extension](https://marketplace.visualstudio.com/items?itemName=ms-python.isort) -for VS Code. - -If you would like to run the import sorter manually: - -```sh -# sort all the files: -isort . - -# sort a specific file: -isort /path/to/file.py - -# sort with verbose outputs (helpful for troubleshooting): -isort -v . -``` - -### Python Style Checking - -We are using [`pylint`](https://pylint.readthedocs.io/en/stable/index.html) to -check for additional Python style formatting issues that `pyink` doesn't fix, to -more closely follow -[Google Python style guidelines](https://google.github.io/styleguide/pyguide.html). -The style checker will NOT automatically update files inplace, but rather will -produce a report containing any errors that you will need to fix manually. - -The style checker will run automatically as a pre-commit hook (see "Pre-commit -Hooks" section below for more information and setup instructions). - -If you would like to run the style checker manually: - -```sh -# check all files: -pylint --rcfile=.pylintrc --ignore=proto smart_control - -# check a specific file: -pylint --rcfile=.pylintrc --ignore=proto smart_control/path/to/file.py -``` - -To check for a specific issue (e.g. "missing-module-docstring"), using the -corresponding -[message code](https://pylint.readthedocs.io/en/stable/user_guide/messages/messages_overview.html) -(e.g. "C0114"): - -```sh -pylint smart_control --rcfile=.pylintrc --ignore=proto --disable=all --enable=C0114 -``` - -If you would like to prevent certain lines of code from being checked (for -example to leave a long line as-is), it is possible to -[ignore formatting](https://pylint.readthedocs.io/en/stable/user_guide/messages/message_control.html#block-disables) -for a given message (e.g. "line-too-long") by adding a trailing comment of -`# pylint: disable=line-too-long` to the right of the line / at the end of the -expression, or by wrapping multiple lines of code between -`# pylint: disable=line-too-long` and `# pylint: enable=line-too-long` comments. - -### Markdown Formatting - -We are using [`mdformat`](https://github.com/hukkin/mdformat) to check for -formatting errors in markdown files. - -The markdown formatter will run automatically as a pre-commit hook (see -"Pre-commit Hooks" section below for more information and setup instructions). - -If you would like to run the markdown formatter manually: - -```sh -# format specific file(s): -mdformat README.md docs/*.md - -# check if a file would be changed: -mdformat README.md --check -``` - -> NOTE: we are ignoring markdown files in the "docs/api" directory because they -> contain [auto-documentation](./docs-site.md) formatting directives like `:::` -> that get improperly formatted if those directives contain additional -> configuration options. - -> NOTE: it would be nice to check all markdown files, however this currently -> includes all files in the ".venv" folder (not desired), and the functionality -> for ignoring certain directories is only supported in Python 3.13+. When we -> upgrade, we can consider updating the approach, but right now we are only -> targeting specific files. - -The `mdformat` tool might not be able to format certain long lines containing -code fences, so some manual review may still be required. Long lines caused by -links are OK to keep as-is. - -## Pre-commit Hooks - -We are using pre-commit hooks to perform code formatting, import sorting, and -style checking. These actions will take place on each commit. - -To enable the pre-commit hooks, you must perform a one-time setup by running -`pre-commit install`. This will create or update ".git/hooks/pre-commit". - -If you would like to run the pre-commit hooks without making a commit: - -```sh -# run against staged files only: -pre-commit run - -# run against all files: -pre-commit run --all-files - -# run against a specific set of file(s): -pre-commit run --files path/to/my_file.py path/to/other_file.py -``` - -If you encounter issues and need to clear the cache: - -```sh -pre-commit clean -``` - -If you would like to make a commit and skip the hooks (not recommended), use the -`--no-verify` flag with your `git commit` command. +for this purpose. \ No newline at end of file diff --git a/docs/docs-site.md b/docs/docs-site.md deleted file mode 100644 index 5ac48624..00000000 --- a/docs/docs-site.md +++ /dev/null @@ -1,61 +0,0 @@ -# Documentation Site Guide - -This document outlines how to set up the documentation site locally and how to -maintain it. The site is built using [MkDocs](https://www.mkdocs.org/) with the -[mkdocstrings](https://mkdocstrings.github.io/) plugin to generate documentation -from Python docstrings. - -## Setup - -Follow the instructions in the [Setup Guide](./setup.md) before moving on. - -Also install packages from the "docs" group: - -```sh -poetry install --with docs -``` - -## Building and Serving Locally - -First, navigate to the project root directory: - -```sh -cd path/to/sbsim -``` - -### Previewing - -Start a local server that auto-reloads when changes are detected: - -```bash -poetry run mkdocs serve - -# suppress warnings: -poetry run mkdocs serve --quiet -``` - -While the server is running you can view the site at -[http://localhost:8000](http://localhost:8000). - -> NOTE: the server hot reloads after configuration changes, however if you -> change a docstring in one of the documented Python files, you may need to -> restart the server for the changes to take effect. - -### Building - -Build the static site including HTML files (for deployment purposes): - -```bash -poetry run mkdocs build -``` - -The output will be placed in the "docs_site/" directory. - -## GitHub Actions Deployment - -A GitHub Actions workflow is set up in ".github/workflows/deploy-docs.yml". This -workflow automatically builds and deploys the documentation to GitHub Pages -whenever changes are pushed to the default branch. - -You can view the hosted site at -[https://google.github.io/sbsim](https://google.github.io/sbsim/). diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index f949fbc2..00000000 --- a/docs/index.md +++ /dev/null @@ -1,10 +0,0 @@ -# Smart Control Project Documentation - -The -[Smart Control Project](https://opensource.googleblog.com/2024/09/google-open-sources-smart-buildings-simulator-and-dataset-accelerate-sustainable-innovation.html) -is a reinforcement learning (RL) environment designed for controlling building -HVAC (Heating, Ventilation, and Air Conditioning) systems to optimize energy -efficiency, operational costs, and occupant comfort. - -This project is an open source collaboration between Google and partner -organizations in academia and industry. diff --git a/docs/setup.md b/docs/setup.md deleted file mode 100644 index bda63099..00000000 --- a/docs/setup.md +++ /dev/null @@ -1,48 +0,0 @@ -# Local Development Setup Guide - -This document provides instructions for getting the project set up for local -development. - -## Prerequisites - -This project requires the following system dependencies: - -- Git -- [Protocol Buffer Compiler](https://grpc.io/docs/protoc-installation/) - (`v 3.21.12`) -- [FFmpeg](https://ffmpeg.org/) (`v 7.1.1`) -- Python (`>=3.10.12 and <3.12`) - -## Repository Setup - -To download the codebase, you can clone the repository (for example using an SSH -approach, however an HTTPS approach should be fine as well): - -```sh -git clone git@github.com:google/sbsim.git -``` - -After downloading the repository, navigate to the root directory from the -command line before continuing: - -``` -cd sbsim/ -``` - -## System-specific Setup - -By default, we use Linux OS for development. However it is also possible to -develop on Mac OS. We are also providing a "Dockerfile" to facilitate -development on non-Linux systems (Mac or Windows). Windows users can -alternatively use -[Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install). - -Consult one of the following system-specific setup guides, based on your -operating system and preferred tools: - -- [Linux OS Setup](./setup/linux.md) -- [Mac OS Setup](./setup/mac.md) -- [Docker Setup](./setup/docker.md) - -After completing the setup, you should be able to run notebooks or scripts as -desired. diff --git a/docs/setup/docker.md b/docs/setup/docker.md deleted file mode 100644 index a723adb9..00000000 --- a/docs/setup/docker.md +++ /dev/null @@ -1,127 +0,0 @@ -# Docker Setup Guide - -To get the repository set up on non-Linux environments, you can use the -pre-configured Docker environment ("Linux/amd64") specified by the "Dockerfile". - -## Installing Docker - -First, install -[Docker Desktop](https://www.docker.com/products/docker-desktop/), and accept -the terms. - -Open Docker Desktop, and wait until it is running before proceeding. - -Verify the installation: - -```sh -docker --version - -docker run hello-world -``` - -### Troubleshooting Installation Issues on Mac - -On Mac, if verification fails, try: - -```sh -/Applications/Docker.app/Contents/Resources/bin/docker --version -``` - -If that works, as a one time setup step, update the ".zshrc" file to add the -installed location to the path: - -```sh -# this is the "~/.zshrc" file... -export PATH="/Applications/Docker.app/Contents/Resources/bin:$PATH" -``` - -Remember to restart your shell afterwards: - -```sh -source ~/.zshrc -``` - -Now you should be able to verify the installation: - -```sh -docker --version - -docker run hello-world -``` - -## Image Operations - -Ensure you have navigated to the root directory of the repository, where the -"Dockerfile" is located, before proceeding. - -Build the image: - -```bash -docker build -t sbsim-docker-env . -``` - -Listing images: - -```sh -docker images -``` - -Removing the image, as necessary: - -```sh -docker rmi sbsim-docker-env -``` - -## Container Operations - -After the image is built, run the container (in interactive mode, with open -ports): - -```bash -docker run -it -p 8888:8888 -v $(pwd):/workspace sbsim-docker-env -``` - -> NOTE: the container will copy the repository into "/workspace/sbsim" on the -> first run. Use -v to persist changes. - -To access Jupyter notebooks, visit -[http://localhost:8888](http://localhost:8888) in the browser. - -To run scripts or tests inside the actively running docker container: - -```sh -# activate the virtual environment: -source /opt/venv/bin/activate - -# navigate to the repository: -cd /workspace/sbsim - -# running scripts: -python path/to/script.py - -# running tests: -pytest -``` - -To stop the container: - -```sh -docker stop sbsim-docker-env -``` - -Listing containers (to get their identifiers): - -```sh -docker ps -a -``` - -Removing a container: - -```sh -docker rm -``` - -> NOTE: in the future we would like to further update these instructions and -> improve the Dockerfile. See -> [issue #80](https://github.com/google/sbsim/issues/80) (contributions -> welcome)! diff --git a/docs/setup/linux.md b/docs/setup/linux.md deleted file mode 100644 index f758501e..00000000 --- a/docs/setup/linux.md +++ /dev/null @@ -1,169 +0,0 @@ -# Linux OS Setup Guide - -This guide helps you get the project setup on Linux OS. - -## System Package Installation - -Install Linux package dependencies: - -```sh -sudo apt install -y protobuf-compiler -sudo apt install -y ffmpeg -sudo apt install -y python3.12-venv -``` - -## Python Installation - -We are using Pyenv to manage and install specific versions of Python. - -First -[install and configure Pyenv](https://github.com/pyenv/pyenv?tab=readme-ov-file#installation). - -The configuration results in adding some lines like the following to your -"~/.bashrc" file: - -```sh -# this is the "~/.bashrc" file... - -# Load pyenv automatically: -export PYENV_ROOT="$HOME/.pyenv" -[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH" -eval "$(pyenv init - bash)" - -# Load pyenv-virtualenv automatically: -eval "$(pyenv virtualenv-init -)" -``` - -Remember to restart your shell afterwards. - -Then use Pyenv to install a compatible Python version (e.g. Python 3.11): - -```sh -pyenv install 3.11 -``` - -Listing the installed versions: - -```sh -pyenv versions -``` - -Use a specific version that was installed (e.g. 3.11.11): - -```sh -pyenv global 3.11.11 -``` - -## Virtual Environment Setup - -Create a Python virtual environment: - -```sh -python -m venv .venv -``` - -> NOTE: on Google machines you may need to use `python3` instead of `python`. - -Activate the virtual environment: - -```sh -source .venv/bin/activate -``` - -## Python Package Installation - -We are using [Poetry](https://python-poetry.org/) to manage, install, and -configure Python package dependencies. - -Install poetry: - -```sh -pip install poetry==2.1.2 -``` - -You may need to specify a Python version that is compatible with this project -(e.g. Python version 3.11): - -```sh -poetry env use 3.11 -``` - -Use poetry to install dependencies, including development dependencies: - -```sh -poetry install --with dev -``` - -## Protocol Buffer Compilation - -Build the ".proto" files defined in the "smart_control/proto" directory into -Python files: - -```bash -cd smart_control/proto - -protoc --python_out=. smart_control_building.proto -protoc --python_out=. smart_control_normalization.proto -protoc --python_out=. smart_control_reward.proto - -cd ../.. -``` - -> NOTE: the generated "\*pb2.py" files have been checked in to the repository to -> facilitate publishing this package on PyPI. - -> NOTE: contributors can skip this step and just use the current versions of the -> protos that have been checked in to the repository. Maintainers can run this -> step periodically to update the protos. - -## Environment Variable Setup - -By default, simulation videos are stored in the "simulator/videos" directory -(which is ignored from version control). If you would like to customize this -location, use the `SIM_VIDEOS_DIRPATH` environment variable. - -You can pass environment variable(s) at runtime, or create a local ".env" file -and set your desired value(s) there: - -```bash -# this is the ".env" file... - -# customizing the directory where simulation videos are stored: -SIM_VIDEOS_DIRPATH="/cns/oz-d/home/smart-buildings-control-team/smart-buildings/geometric_sim_videos/" -``` - -## Notebook Setup - -If you are running the Demo notebooks in the "smart_control/notebooks" -directory, you must modify the values of `data_path`, `metrics_path`, -`output_data_path` and `root_dir` in those notebooks. Specifically, the -`data_path` should point to the directory where the "sim_config.gin" file is -located (i.e. "smart_control/configs/sim_config.gin"). - -> NOTE: in the future we plan on refactoring notebook code to leverage the local -> module code and simplify this notebook setup experience. See -> [issue #83](https://github.com/google/sbsim/issues/83) (contributions -> welcome)! - -You can run the notebooks using Jupyter or VS Code. Either approach requires you -to first install Jupyter. We have defined a separate installation group for -notebook-related dependencies: - -```sh -poetry install --with notebooks -``` - -Create a kernel: - -```sh -poetry run python -m ipykernel install --user --name=sbsim-kernel -``` - -Finally you can run the notebook using Jupyter or VS Code: - -- A) Run the notebooks using Jupyter by running `poetry run jupyter notebook` - (then visit the resulting [localhost:8000](localhost:8000) URL in the browser, - and choose the "sbsim-kernel" from the kernel drop-down menu). - -- B) Run the notebooks using VS Code (choosing the "sbsim-kernel" kernel from - the kernel drop-down menu). diff --git a/docs/setup/mac.md b/docs/setup/mac.md deleted file mode 100644 index 04593a0b..00000000 --- a/docs/setup/mac.md +++ /dev/null @@ -1,170 +0,0 @@ -# Mac OS Setup Guide - -This guide helps you get the project setup on Mac OS. - -## System Package Installation - -First install [Homebrew](https://brew.sh/) (i.e. `brew`). - -Then use Homebrew to install system dependencies: - -```sh -brew install protobuf@21 -brew install ffmpeg -``` - -Checking installations: - -```sh -$(brew --prefix protobuf@21)/bin/protoc --version -#> libprotoc 3.21.12 - -ffmpeg -version -#> 7.1.1 -``` - -NOTE: by installing a pinned version of Protobuf, it may not be symlinked, so -normal `protoc` commands may not work without using a prefix of -`$(brew --prefix protobuf@21)/bin/protoc`. To avoid needing the prefix, as a one -time setup step, update the ".zshrc" file to add the installed location to the -path: - -```sh -# this is the "~/.zshrc" file: -export PATH="$(brew --prefix protobuf@21)/bin:$PATH" -``` - -Remember to restart your shell afterwards: - -```sh -source ~/.zshrc -``` - -Then you should be able to run normal `protoc` commands without the prefix: - -```sh -protoc --version -#> libprotoc 3.21.12 -``` - -## Anaconda Installation - -Install [Anaconda](https://www.anaconda.com/download), which we will use to -install Python and manage a virtual environment. - -The installation results in automatically adding some content to your "~/.zshrc" -file. You may need to run a `conda init zsh` command, if prompted to do so. - -Remember to restart your shell afterwards. - -## Virtual Environment Setup - -Create the virtual environment: - -```sh -conda create -n sbsim-env python=3.11 -``` - -Activate the virtual environment: - -```sh -conda activate sbsim-env -``` - -## Python Package Installation - -We are using [Poetry](https://python-poetry.org/) to manage, install, and -configure Python package dependencies. - -Install poetry: - -```sh -pip install poetry==2.1.2 -``` - -Use poetry to install dependencies, including development dependencies: - -```sh -poetry install --with dev -``` - -> NOTE: there may be issues with the `dm-reverb` package on Mac. See: -> [https://github.com/google/sbsim/issues/102](https://github.com/google/sbsim/issues/102). -> This issue only affects reinforcement learning functionality related to replay -> buffers, so you should still be able to run all other parts of the codebase. -> We welcome contributions to fix this issue and get all the functionality -> working on Mac! - -## Protocol Buffer Compilation - -Build the ".proto" files defined in the "smart_control/proto" directory into -Python files: - -```bash -cd smart_control/proto - -protoc --python_out=. smart_control_building.proto -protoc --python_out=. smart_control_normalization.proto -protoc --python_out=. smart_control_reward.proto - -cd ../.. -``` - -> NOTE: the generated "\*pb2.py" files have been checked in to the repository to -> facilitate publishing this package on PyPI. - -> NOTE: contributors can skip this step and just use the current versions of the -> protos that have been checked in to the repository. Maintainers can run this -> step periodically to update the protos. - -## Environment Variable Setup - -By default, simulation videos are stored in the "simulator/videos" directory -(which is ignored from version control). If you would like to customize this -location, use the `SIM_VIDEOS_DIRPATH` environment variable. - -You can pass environment variable(s) at runtime, or create a local ".env" file -and set your desired value(s) there: - -```bash -# this is the ".env" file... - -# customizing the directory where simulation videos are stored: -SIM_VIDEOS_DIRPATH="/cns/oz-d/home/smart-buildings-control-team/smart-buildings/geometric_sim_videos/" -``` - -## Notebook Setup - -If you are running the Demo notebooks in the "smart_control/notebooks" -directory, you must modify the values of `data_path`, `metrics_path`, -`output_data_path` and `root_dir` in those notebooks. Specifically, the -`data_path` should point to the directory where the "sim_config.gin" file is -located (i.e. "smart_control/configs/sim_config.gin"). - -> NOTE: in the future we plan on refactoring notebook code to leverage the local -> module code and simplify this notebook setup experience. See -> [issue #83](https://github.com/google/sbsim/issues/83) (contributions -> welcome)! - -You can run the notebooks using Jupyter or VS Code. Either approach requires you -to first install Jupyter. We have defined a separate installation group for -notebook-related dependencies: - -```sh -poetry install --with notebooks -``` - -Create a kernel: - -```sh -poetry run python -m ipykernel install --user --name=sbsim-kernel -``` - -Finally you can run the notebook using Jupyter or VS Code: - -- A) Run the notebooks using Jupyter by running `poetry run jupyter notebook` - (then visit the resulting [localhost:8000](localhost:8000) URL in the browser, - and choose the "sbsim-kernel" from the kernel drop-down menu). - -- B) Run the notebooks using VS Code (choosing the "sbsim-kernel" kernel from - the kernel drop-down menu). diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 989e6db0..00000000 --- a/mkdocs.yml +++ /dev/null @@ -1,171 +0,0 @@ -# -# MKDOCS CONFIGURATION FILE -# https://www.mkdocs.org/user-guide/configuration/ -# -# https://github.com/google/bayesnf/blob/main/mkdocs.yml -# https://github.com/google/ml-metadata/blob/master/mkdocs.yml -# https://github.com/google/temporian/blob/main/docs/mkdocs.yml -# https://github.com/mesop-dev/mesop/blob/main/mkdocs.yml -# - -site_name: Smart Control Project Documentation -site_description: "Google Open Source Smart Buildings Control" -site_dir: docs_site # NOTE: should not be within the docs dir -site_url: https://google.github.io/sbsim/ -repo_url: https://github.com/google/sbsim -repo_name: google/sbsim -edit_uri: edit/copybara_push/docs/ - -# -# THEME / STYLE -# - -theme: - name: material # default: (readthedocs / mkdocs), third-party: material - - features: - #- navigation.tabs # puts tabs under top navbar - - navigation.sections # splits left sidebar into sections - - navigation.path # breadcrumbs ? - - navigation.top # back to top button - - navigation.footer # next and back buttons - #- navigation.indexes # allows a directory to have an index.md - - content.action.edit # Enables the "Edit this page" button - - content.action.view # Enables the "View source of this page" button - - favicon: assets/images/favicon.ico - - # https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/ - #icon: - # logo: fontawesome/brands/google # material/glasses - - logo: assets/images/google-open-source-logo-large.png - - # https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/ - palette: - - # Light Mode - - media: "(prefers-color-scheme: light)" - scheme: default - primary: light blue - accent: light blue - toggle: - icon: material/weather-sunny # material/brightness-7 - name: Switch to dark mode - - # Dark Mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - primary: light blue - accent: light blue - toggle: - icon: material/weather-night # material/brightness-2 - name: Switch to light mode - -#extra_css: -# - assets/stylesheets/google-style.css - -# -# NAVIGATION / TOC -# - -nav: - - 'Home': index.md - - 'Local Development': - - 'Setup': - - 'Overview': setup.md - - 'Linux': setup/linux.md - - 'Mac': setup/mac.md - - 'Docker': setup/docker.md - - 'Contributing': contributing.md - - 'Documentation Site': docs-site.md - - 'API Reference': - - api/config.md - - 'Dataset': - - api/dataset/dataset.md - - api/dataset/partition.md - - api/environment.md - - api/models.md - - 'Reinforcement Learning': - - api/reinforcement_learning/agents.md - - api/reinforcement_learning/observers.md - - api/reinforcement_learning/policies.md - - api/reinforcement_learning/replay_buffer.md - - api/reinforcement_learning/scripts.md - - api/reinforcement_learning/utils.md - - api/reward.md - - 'Simulator': - - 'Overview': api/simulator/simulator.md - - api/simulator/building.md - - api/simulator/devices.md - - api/simulator/occupancy.md - - api/simulator/weather.md - - api/simulator/solar_radiation.md - - api/simulator/utils.md - -# -# PLUGINS / EXTENSIONS -# - -markdown_extensions: - - toc: - permalink: "#" # adds clickable link anchors for all headings - - # enable language-specific syntax highlighting: - - pymdownx.highlight: - anchor_linenums: true - #line_spans: __span - pygments_lang_class: true - #- pymdownx.inlinehilite # For inline code highlighting - #- pymdownx.snippets - - pymdownx.superfences - - # MATHJAX EQUATIONS CONFIG, PART 1 OF 2 - # https://mrkeo.github.io/reference/mathjax/ - # https://squidfunk.github.io/mkdocs-material/reference/math/#mathjax-mkdocsyml - # https://www.mathjax.org/ - - pymdownx.arithmatex: - generic: true - -extra_javascript: - # MATHJAX EQUATIONS CONFIG, PART 2 OF 2 - - assets/javascripts/mathjax_config.js - - https://polyfill.io/v3/polyfill.min.js?features=es6 - - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - -plugins: - - search - - - autorefs # enables linking to other methods (maybe not working?) - - # - # API DOCS - # https://mkdocstrings.github.io/python/usage/ - # - - mkdocstrings: - default_handler: python - handlers: - python: - paths: - - . # look in the current directory for the "smart_control" dir - options: - docstring_style: google - docstring_section_style: "table" # "table", "list", "spacy" - show_source: false - show_signature_annotations: true # type hints - show_root_heading: true # HTML heading for the import path - show_root_full_path: true # show full module import path - show_root_members_full_path: false - show_root_toc_entry: true - members_order: alphabetical # "alphabetical", "source", "__all__" - filters: ["!^_"] # exclude private / protected members - inherited_members: true - show_inheritance_diagram: true # paid feature? - line_length: 80 - show_category_heading: false # "Classes", "Functions" etc. - show_symbol_type_heading: true # "Class", "Function", etc - show_symbol_type_toc: true # "mod", "class", "meth", etc. - merge_init_into_class: true - show_if_no_docstring: false - separate_signature: true - annotations_path: "brief" # "brief", "source", or "full" diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index c04985c5..00000000 --- a/poetry.lock +++ /dev/null @@ -1,4900 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. - -[[package]] -name = "absl-py" -version = "2.3.0" -description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." -optional = false -python-versions = ">=3.8" -files = [ - {file = "absl_py-2.3.0-py3-none-any.whl", hash = "sha256:9824a48b654a306168f63e0d97714665f8490b8d89ec7bf2efc24bf67cf579b3"}, - {file = "absl_py-2.3.0.tar.gz", hash = "sha256:d96fda5c884f1b22178852f30ffa85766d50b99e00775ea626c23304f582fc4f"}, -] - -[[package]] -name = "anyio" -version = "4.9.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.9" -files = [ - {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, - {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} - -[package.extras] -doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] -trio = ["trio (>=0.26.1)"] - -[[package]] -name = "appnope" -version = "0.1.4" -description = "Disable App Nap on macOS >= 10.9" -optional = false -python-versions = ">=3.6" -files = [ - {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, - {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, -] - -[[package]] -name = "argon2-cffi" -version = "25.1.0" -description = "Argon2 for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741"}, - {file = "argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1"}, -] - -[package.dependencies] -argon2-cffi-bindings = "*" - -[[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -description = "Low-level CFFI bindings for Argon2" -optional = false -python-versions = ">=3.6" -files = [ - {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, -] - -[package.dependencies] -cffi = ">=1.0.1" - -[package.extras] -dev = ["cogapp", "pre-commit", "pytest", "wheel"] -tests = ["pytest"] - -[[package]] -name = "arrow" -version = "1.3.0" -description = "Better dates & times for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, - {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, -] - -[package.dependencies] -python-dateutil = ">=2.7.0" -types-python-dateutil = ">=2.8.10" - -[package.extras] -doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] -test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] - -[[package]] -name = "astroid" -version = "3.3.10" -description = "An abstract syntax tree for Python with inference support." -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "astroid-3.3.10-py3-none-any.whl", hash = "sha256:104fb9cb9b27ea95e847a94c003be03a9e039334a8ebca5ee27dafaf5c5711eb"}, - {file = "astroid-3.3.10.tar.gz", hash = "sha256:c332157953060c6deb9caa57303ae0d20b0fbdb2e59b4a4f2a6ba49d0a7961ce"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - -[[package]] -name = "asttokens" -version = "3.0.0" -description = "Annotate AST trees with source code positions" -optional = false -python-versions = ">=3.8" -files = [ - {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, - {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, -] - -[package.extras] -astroid = ["astroid (>=2,<4)"] -test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] - -[[package]] -name = "astunparse" -version = "1.6.3" -description = "An AST unparser for Python" -optional = false -python-versions = "*" -files = [ - {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, - {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, -] - -[package.dependencies] -six = ">=1.6.1,<2.0" -wheel = ">=0.23.0,<1.0" - -[[package]] -name = "async-lru" -version = "2.0.5" -description = "Simple LRU cache for asyncio" -optional = false -python-versions = ">=3.9" -files = [ - {file = "async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943"}, - {file = "async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb"}, -] - -[package.dependencies] -typing_extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "attrs" -version = "25.3.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.8" -files = [ - {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, - {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, -] - -[package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] - -[[package]] -name = "babel" -version = "2.17.0" -description = "Internationalization utilities" -optional = false -python-versions = ">=3.8" -files = [ - {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, - {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, -] - -[package.extras] -dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] - -[[package]] -name = "backrefs" -version = "5.8" -description = "A wrapper around re and regex that adds additional back references." -optional = false -python-versions = ">=3.9" -files = [ - {file = "backrefs-5.8-py310-none-any.whl", hash = "sha256:c67f6638a34a5b8730812f5101376f9d41dc38c43f1fdc35cb54700f6ed4465d"}, - {file = "backrefs-5.8-py311-none-any.whl", hash = "sha256:2e1c15e4af0e12e45c8701bd5da0902d326b2e200cafcd25e49d9f06d44bb61b"}, - {file = "backrefs-5.8-py312-none-any.whl", hash = "sha256:bbef7169a33811080d67cdf1538c8289f76f0942ff971222a16034da88a73486"}, - {file = "backrefs-5.8-py313-none-any.whl", hash = "sha256:e3a63b073867dbefd0536425f43db618578528e3896fb77be7141328642a1585"}, - {file = "backrefs-5.8-py39-none-any.whl", hash = "sha256:a66851e4533fb5b371aa0628e1fee1af05135616b86140c9d787a2ffdf4b8fdc"}, - {file = "backrefs-5.8.tar.gz", hash = "sha256:2cab642a205ce966af3dd4b38ee36009b31fa9502a35fd61d59ccc116e40a6bd"}, -] - -[package.extras] -extras = ["regex"] - -[[package]] -name = "beautifulsoup4" -version = "4.13.4" -description = "Screen-scraping library" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b"}, - {file = "beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"}, -] - -[package.dependencies] -soupsieve = ">1.2" -typing-extensions = ">=4.0.0" - -[package.extras] -cchardet = ["cchardet"] -chardet = ["chardet"] -charset-normalizer = ["charset-normalizer"] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "bidict" -version = "0.23.1" -description = "The bidirectional mapping library for Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5"}, - {file = "bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71"}, -] - -[[package]] -name = "black" -version = "24.10.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.9" -files = [ - {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, - {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, - {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, - {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, - {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, - {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, - {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, - {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, - {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, - {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, - {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, - {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, - {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, - {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, - {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, - {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, - {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, - {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, - {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, - {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, - {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, - {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.10)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "bleach" -version = "6.2.0" -description = "An easy safelist-based HTML-sanitizing tool." -optional = false -python-versions = ">=3.9" -files = [ - {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, - {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, -] - -[package.dependencies] -tinycss2 = {version = ">=1.1.0,<1.5", optional = true, markers = "extra == \"css\""} -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.5)"] - -[[package]] -name = "cachetools" -version = "5.5.2" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"}, - {file = "cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4"}, -] - -[[package]] -name = "certifi" -version = "2025.4.26" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, - {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, -] - -[[package]] -name = "cffi" -version = "1.17.1" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "cfgv" -version = "3.4.0" -description = "Validate configuration and produce human readable error messages." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, - {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7" -files = [ - {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, - {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, - {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, -] - -[[package]] -name = "click" -version = "8.2.1" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.10" -files = [ - {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, - {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "cloudpickle" -version = "3.1.1" -description = "Pickler class to extend the standard pickle.Pickler functionality" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e"}, - {file = "cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "comm" -version = "0.2.2" -description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -optional = false -python-versions = ">=3.8" -files = [ - {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, - {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, -] - -[package.dependencies] -traitlets = ">=4" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "contourpy" -version = "1.3.2" -description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false -python-versions = ">=3.10" -files = [ - {file = "contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934"}, - {file = "contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989"}, - {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d"}, - {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9"}, - {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512"}, - {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631"}, - {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f"}, - {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2"}, - {file = "contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0"}, - {file = "contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a"}, - {file = "contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445"}, - {file = "contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773"}, - {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1"}, - {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43"}, - {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab"}, - {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7"}, - {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83"}, - {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd"}, - {file = "contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f"}, - {file = "contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878"}, - {file = "contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2"}, - {file = "contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15"}, - {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92"}, - {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87"}, - {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415"}, - {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe"}, - {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441"}, - {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e"}, - {file = "contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912"}, - {file = "contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73"}, - {file = "contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb"}, - {file = "contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08"}, - {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c"}, - {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f"}, - {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85"}, - {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841"}, - {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422"}, - {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef"}, - {file = "contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f"}, - {file = "contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9"}, - {file = "contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f"}, - {file = "contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739"}, - {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823"}, - {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5"}, - {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532"}, - {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b"}, - {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52"}, - {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd"}, - {file = "contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1"}, - {file = "contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69"}, - {file = "contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c"}, - {file = "contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16"}, - {file = "contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad"}, - {file = "contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0"}, - {file = "contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5"}, - {file = "contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5"}, - {file = "contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54"}, -] - -[package.dependencies] -numpy = ">=1.23" - -[package.extras] -bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.15.0)", "types-Pillow"] -test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] - -[[package]] -name = "cycler" -version = "0.12.1" -description = "Composable style cycles" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, - {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, -] - -[package.extras] -docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] -tests = ["pytest", "pytest-cov", "pytest-xdist"] - -[[package]] -name = "debugpy" -version = "1.8.14" -description = "An implementation of the Debug Adapter Protocol for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "debugpy-1.8.14-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:93fee753097e85623cab1c0e6a68c76308cd9f13ffdf44127e6fab4fbf024339"}, - {file = "debugpy-1.8.14-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d937d93ae4fa51cdc94d3e865f535f185d5f9748efb41d0d49e33bf3365bd79"}, - {file = "debugpy-1.8.14-cp310-cp310-win32.whl", hash = "sha256:c442f20577b38cc7a9aafecffe1094f78f07fb8423c3dddb384e6b8f49fd2987"}, - {file = "debugpy-1.8.14-cp310-cp310-win_amd64.whl", hash = "sha256:f117dedda6d969c5c9483e23f573b38f4e39412845c7bc487b6f2648df30fe84"}, - {file = "debugpy-1.8.14-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:1b2ac8c13b2645e0b1eaf30e816404990fbdb168e193322be8f545e8c01644a9"}, - {file = "debugpy-1.8.14-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf431c343a99384ac7eab2f763980724834f933a271e90496944195318c619e2"}, - {file = "debugpy-1.8.14-cp311-cp311-win32.whl", hash = "sha256:c99295c76161ad8d507b413cd33422d7c542889fbb73035889420ac1fad354f2"}, - {file = "debugpy-1.8.14-cp311-cp311-win_amd64.whl", hash = "sha256:7816acea4a46d7e4e50ad8d09d963a680ecc814ae31cdef3622eb05ccacf7b01"}, - {file = "debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84"}, - {file = "debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826"}, - {file = "debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f"}, - {file = "debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f"}, - {file = "debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f"}, - {file = "debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15"}, - {file = "debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e"}, - {file = "debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e"}, - {file = "debugpy-1.8.14-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:d5582bcbe42917bc6bbe5c12db1bffdf21f6bfc28d4554b738bf08d50dc0c8c3"}, - {file = "debugpy-1.8.14-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5349b7c3735b766a281873fbe32ca9cca343d4cc11ba4a743f84cb854339ff35"}, - {file = "debugpy-1.8.14-cp38-cp38-win32.whl", hash = "sha256:7118d462fe9724c887d355eef395fae68bc764fd862cdca94e70dcb9ade8a23d"}, - {file = "debugpy-1.8.14-cp38-cp38-win_amd64.whl", hash = "sha256:d235e4fa78af2de4e5609073972700523e372cf5601742449970110d565ca28c"}, - {file = "debugpy-1.8.14-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:413512d35ff52c2fb0fd2d65e69f373ffd24f0ecb1fac514c04a668599c5ce7f"}, - {file = "debugpy-1.8.14-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c9156f7524a0d70b7a7e22b2e311d8ba76a15496fb00730e46dcdeedb9e1eea"}, - {file = "debugpy-1.8.14-cp39-cp39-win32.whl", hash = "sha256:b44985f97cc3dd9d52c42eb59ee9d7ee0c4e7ecd62bca704891f997de4cef23d"}, - {file = "debugpy-1.8.14-cp39-cp39-win_amd64.whl", hash = "sha256:b1528cfee6c1b1c698eb10b6b096c598738a8238822d218173d21c3086de8123"}, - {file = "debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20"}, - {file = "debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322"}, -] - -[[package]] -name = "decorator" -version = "5.2.1" -description = "Decorators for Humans" -optional = false -python-versions = ">=3.8" -files = [ - {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, - {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] - -[[package]] -name = "dill" -version = "0.4.0" -description = "serialize all of Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, - {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, -] - -[package.extras] -graph = ["objgraph (>=1.7.2)"] -profile = ["gprof2dot (>=2022.7.29)"] - -[[package]] -name = "distlib" -version = "0.3.9" -description = "Distribution utilities" -optional = false -python-versions = "*" -files = [ - {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, - {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, -] - -[[package]] -name = "dm-reverb" -version = "0.14.0" -description = "Reverb is an efficient and easy-to-use data storage and transport system designed for machine learning research." -optional = false -python-versions = ">=3" -files = [ - {file = "dm_reverb-0.14.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:1388aea4a58117d2d93d35078d249728f580c3d3295d1c0fcfa9b41c6874f931"}, - {file = "dm_reverb-0.14.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:a670622248e98b800dc410fac9dab907e38154c306c3be8cf3b4ede54fcb48c6"}, - {file = "dm_reverb-0.14.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:2cc773ad72b9bdf9fcf57fb706bb20d06476c04e7438fd055cbf7a8605dfb53a"}, -] - -[package.dependencies] -dm-tree = "*" -portpicker = "*" - -[package.extras] -tensorflow = ["tensorflow (>=2.15.0,<2.16.0)"] - -[[package]] -name = "dm-reverb-macos" -version = "0.11.0.dev0" -description = "Reverb is an efficient and easy-to-use data storage and transport system designed for machine learning research." -optional = false -python-versions = ">=3" -files = [ - {file = "dm-reverb-macos-0.11.0.dev0.tar.gz", hash = "sha256:75ce80a4f3fa4ad083aaf5d6875a9fa8cc53ae10daaa33d8c0e6cc3c98ed8918"}, - {file = "dm_reverb_macos-0.11.0.dev0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d4fa0ca15ae86fe922566de782c5eb7ba0afb0c557459d79cf9b0b4d29c9326e"}, -] - -[package.dependencies] -dm-tree = "*" -portpicker = "*" - -[package.extras] -tensorflow = ["tensorflow (>=2.12.0,<2.13.0)"] - -[[package]] -name = "dm-tree" -version = "0.1.9" -description = "Tree is a library for working with nested data structures." -optional = false -python-versions = ">=3.10" -files = [ - {file = "dm_tree-0.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5d5b28ee2e461b6af65330c143806a6d0945dcabbb8d22d2ba863e6dabd9254e"}, - {file = "dm_tree-0.1.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54d5616015412311df154908069fcf2c2d8786f6088a2ae3554d186cdf2b1e15"}, - {file = "dm_tree-0.1.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831699d2c60a1b38776a193b7143ae0acad0a687d87654e6d3342584166816bc"}, - {file = "dm_tree-0.1.9-cp310-cp310-win_amd64.whl", hash = "sha256:1ae3cbff592bb3f2e197f5a8030de4a94e292e6cdd85adeea0b971d07a1b85f2"}, - {file = "dm_tree-0.1.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7d7d784afaeb4b67d87d858261aaf02503939ddc1f09c4cca70728f9892ab004"}, - {file = "dm_tree-0.1.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e660d1779ddcbd1348410d08f67db4870d413a3ec4ba8b4b045bd5ce4bd8f35c"}, - {file = "dm_tree-0.1.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:294dc1cecf87552a45cdd5ddb215e7f5295a5a47c46f1f0a0463c3dd02a527d7"}, - {file = "dm_tree-0.1.9-cp311-cp311-win_amd64.whl", hash = "sha256:12f4cc6cd52a39aa38ff31577b6d79b6136a9a89273a876bf62335c9f65c27bf"}, - {file = "dm_tree-0.1.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a8d20eeab7fde77a3ed71f07716021eb0edfb4812a128eb381d108af3a310257"}, - {file = "dm_tree-0.1.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80c43417814b1181d3367b335460bfdd30b79ee187a64220e11f6ddd093a4b15"}, - {file = "dm_tree-0.1.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2334cfe9d2ed4293f9f1c7aefba0657deaab9ea74b5fadd966f6d01d9b6b42d9"}, - {file = "dm_tree-0.1.9-cp312-cp312-win_amd64.whl", hash = "sha256:9020a5ce256fcc83aa4bc190cc96dd66e87685db0a6e501b0c06aa492c2e38fc"}, - {file = "dm_tree-0.1.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cfa33c2e028155810ad1b4e11928707bf47489516763a86e79cab2954d23bf68"}, - {file = "dm_tree-0.1.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05622d074353cf434049206e53c12147903a048c4bd7d77f2800d427413ad78"}, - {file = "dm_tree-0.1.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68b0efad76703dd4648586c75618a48cdd671b68c3266fe980e323c15423607"}, - {file = "dm_tree-0.1.9-cp313-cp313-win_amd64.whl", hash = "sha256:e97c34fcb44941c36b7ee81dcdbceba0fbe728bddcc77e5837ab2eb665bcbff8"}, - {file = "dm_tree-0.1.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b06e7a5da1c31a82521a60060573527e8d24b9920fdd20b2ec86f08412737598"}, - {file = "dm_tree-0.1.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6893fcdc5cf1a4f459cfc383526d35d42e7c671ae565d7e429a2f2cb2cb93e89"}, - {file = "dm_tree-0.1.9-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1f5d1e96b3a7de22b25b13a5eb30f41f8cf9c02dd4479a24920de99e780903c"}, - {file = "dm_tree-0.1.9.tar.gz", hash = "sha256:a4c7db3d3935a5a2d5e4b383fc26c6b0cd6f78c6d4605d3e7b518800ecd5342b"}, -] - -[package.dependencies] -absl-py = ">=0.6.1" -attrs = ">=18.2.0" -numpy = [ - {version = ">=1.21.2", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, -] -wrapt = ">=1.11.2" - -[[package]] -name = "exceptiongroup" -version = "1.3.0" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, - {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "executing" -version = "2.2.0" -description = "Get the currently executing AST node of a frame, and other information" -optional = false -python-versions = ">=3.8" -files = [ - {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, - {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, -] - -[package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] - -[[package]] -name = "fastjsonschema" -version = "2.21.1" -description = "Fastest Python implementation of JSON schema" -optional = false -python-versions = "*" -files = [ - {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, - {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, -] - -[package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - -[[package]] -name = "filelock" -version = "3.18.0" -description = "A platform independent file lock." -optional = false -python-versions = ">=3.9" -files = [ - {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, - {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, -] - -[package.extras] -docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2)"] - -[[package]] -name = "flatbuffers" -version = "25.2.10" -description = "The FlatBuffers serialization format for Python" -optional = false -python-versions = "*" -files = [ - {file = "flatbuffers-25.2.10-py2.py3-none-any.whl", hash = "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051"}, - {file = "flatbuffers-25.2.10.tar.gz", hash = "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e"}, -] - -[[package]] -name = "flexcache" -version = "0.3" -description = "Saves and loads to the cache a transformed versions of a source object." -optional = false -python-versions = ">=3.9" -files = [ - {file = "flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32"}, - {file = "flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656"}, -] - -[package.dependencies] -typing-extensions = "*" - -[package.extras] -test = ["pytest", "pytest-cov", "pytest-mpl", "pytest-subtests"] - -[[package]] -name = "flexparser" -version = "0.4" -description = "Parsing made fun ... using typing." -optional = false -python-versions = ">=3.9" -files = [ - {file = "flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846"}, - {file = "flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2"}, -] - -[package.dependencies] -typing-extensions = "*" - -[package.extras] -test = ["pytest", "pytest-cov", "pytest-mpl", "pytest-subtests"] - -[[package]] -name = "fonttools" -version = "4.58.2" -description = "Tools to manipulate font files" -optional = false -python-versions = ">=3.9" -files = [ - {file = "fonttools-4.58.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4baaf34f07013ba9c2c3d7a95d0c391fcbb30748cb86c36c094fab8f168e49bb"}, - {file = "fonttools-4.58.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e26e4a4920d57f04bb2c3b6e9a68b099c7ef2d70881d4fee527896fa4f7b5aa"}, - {file = "fonttools-4.58.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0bb956d9d01ea51368415515f664f58abf96557ba3c1aae4e26948ae7c86f29"}, - {file = "fonttools-4.58.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40af8493c80ec17a1133ef429d42f1a97258dd9213b917daae9d8cafa6e0e6c"}, - {file = "fonttools-4.58.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:60b5cde1c76f6ded198da5608dddb1ee197faad7d2f0f6d3348ca0cda0c756c4"}, - {file = "fonttools-4.58.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f8df6dc80ecc9033ca25a944ee5db7564fecca28e96383043fd92d9df861a159"}, - {file = "fonttools-4.58.2-cp310-cp310-win32.whl", hash = "sha256:25728e980f5fbb67f52c5311b90fae4aaec08c3d3b78dce78ab564784df1129c"}, - {file = "fonttools-4.58.2-cp310-cp310-win_amd64.whl", hash = "sha256:d6997ee7c2909a904802faf44b0d0208797c4d751f7611836011ace165308165"}, - {file = "fonttools-4.58.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:024faaf20811296fd2f83ebdac7682276362e726ed5fea4062480dd36aff2fd9"}, - {file = "fonttools-4.58.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2faec6e7f2abd80cd9f2392dfa28c02cfd5b1125be966ea6eddd6ca684deaa40"}, - {file = "fonttools-4.58.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520792629a938c14dd7fe185794b156cfc159c609d07b31bbb5f51af8dc7918a"}, - {file = "fonttools-4.58.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12fbc6e0bf0c75ce475ef170f2c065be6abc9e06ad19a13b56b02ec2acf02427"}, - {file = "fonttools-4.58.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:44a39cf856d52109127d55576c7ec010206a8ba510161a7705021f70d1649831"}, - {file = "fonttools-4.58.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5390a67c55a835ad5a420da15b3d88b75412cbbd74450cb78c4916b0bd7f0a34"}, - {file = "fonttools-4.58.2-cp311-cp311-win32.whl", hash = "sha256:f7e10f4e7160bcf6a240d7560e9e299e8cb585baed96f6a616cef51180bf56cb"}, - {file = "fonttools-4.58.2-cp311-cp311-win_amd64.whl", hash = "sha256:29bdf52bfafdae362570d3f0d3119a3b10982e1ef8cb3a9d3ebb72da81cb8d5e"}, - {file = "fonttools-4.58.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c6eeaed9c54c1d33c1db928eb92b4e180c7cb93b50b1ee3e79b2395cb01f25e9"}, - {file = "fonttools-4.58.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbe1d9c72b7f981bed5c2a61443d5e3127c1b3aca28ca76386d1ad93268a803f"}, - {file = "fonttools-4.58.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85babe5b3ce2cbe57fc0d09c0ee92bbd4d594fd7ea46a65eb43510a74a4ce773"}, - {file = "fonttools-4.58.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:918a2854537fcdc662938057ad58b633bc9e0698f04a2f4894258213283a7932"}, - {file = "fonttools-4.58.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3b379cf05bf776c336a0205632596b1c7d7ab5f7135e3935f2ca2a0596d2d092"}, - {file = "fonttools-4.58.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99ab3547a15a5d168c265e139e21756bbae1de04782ac9445c9ef61b8c0a32ce"}, - {file = "fonttools-4.58.2-cp312-cp312-win32.whl", hash = "sha256:6764e7a3188ce36eea37b477cdeca602ae62e63ae9fc768ebc176518072deb04"}, - {file = "fonttools-4.58.2-cp312-cp312-win_amd64.whl", hash = "sha256:41f02182a1d41b79bae93c1551855146868b04ec3e7f9c57d6fef41a124e6b29"}, - {file = "fonttools-4.58.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:829048ef29dbefec35d95cc6811014720371c95bdc6ceb0afd2f8e407c41697c"}, - {file = "fonttools-4.58.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:64998c5993431e45b474ed5f579f18555f45309dd1cf8008b594d2fe0a94be59"}, - {file = "fonttools-4.58.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b887a1cf9fbcb920980460ee4a489c8aba7e81341f6cdaeefa08c0ab6529591c"}, - {file = "fonttools-4.58.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27d74b9f6970cefbcda33609a3bee1618e5e57176c8b972134c4e22461b9c791"}, - {file = "fonttools-4.58.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec26784610056a770e15a60f9920cee26ae10d44d1e43271ea652dadf4e7a236"}, - {file = "fonttools-4.58.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ed0a71d57dd427c0fb89febd08cac9b925284d2a8888e982a6c04714b82698d7"}, - {file = "fonttools-4.58.2-cp313-cp313-win32.whl", hash = "sha256:994e362b01460aa863ef0cb41a29880bc1a498c546952df465deff7abf75587a"}, - {file = "fonttools-4.58.2-cp313-cp313-win_amd64.whl", hash = "sha256:f95dec862d7c395f2d4efe0535d9bdaf1e3811e51b86432fa2a77e73f8195756"}, - {file = "fonttools-4.58.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f6ca4337e37d287535fd0089b4520cedc5666023fe4176a74e3415f917b570"}, - {file = "fonttools-4.58.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b269c7a783ec3be40809dc0dc536230a3d2d2c08e3fb9538d4e0213872b1a762"}, - {file = "fonttools-4.58.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1902d9b2b84cc9485663f1a72882890cd240f4464e8443af93faa34b095a4444"}, - {file = "fonttools-4.58.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a94a00ffacbb044729c6a5b29e02bf6f0e80681e9275cd374a1d25db3061328"}, - {file = "fonttools-4.58.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:25d22628f8b6b49b78666415f7cfa60c88138c24d66f3e5818d09ca001810cc5"}, - {file = "fonttools-4.58.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4bacb925a045e964a44bdeb9790b8778ce659605c7a2a39ef4f12e06c323406b"}, - {file = "fonttools-4.58.2-cp39-cp39-win32.whl", hash = "sha256:eb4bc19a3ab45d2b4bb8f4f7c60e55bec53016e402af0b6ff4ef0c0129193671"}, - {file = "fonttools-4.58.2-cp39-cp39-win_amd64.whl", hash = "sha256:c8d16973f8ab02a5a960afe1cae4db72220ef628bf397499aba8e3caa0c10e33"}, - {file = "fonttools-4.58.2-py3-none-any.whl", hash = "sha256:84f4b0bcfa046254a65ee7117094b4907e22dc98097a220ef108030eb3c15596"}, - {file = "fonttools-4.58.2.tar.gz", hash = "sha256:4b491ddbfd50b856e84b0648b5f7941af918f6d32f938f18e62b58426a8d50e2"}, -] - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] -graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "pycairo", "scipy"] -lxml = ["lxml (>=4.0)"] -pathops = ["skia-pathops (>=0.5.0)"] -plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] -symfont = ["sympy"] -type1 = ["xattr"] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] - -[[package]] -name = "fqdn" -version = "1.5.1" -description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -optional = false -python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" -files = [ - {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, - {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, -] - -[[package]] -name = "gast" -version = "0.6.0" -description = "Python AST that abstracts the underlying Python version" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "gast-0.6.0-py3-none-any.whl", hash = "sha256:52b182313f7330389f72b069ba00f174cfe2a06411099547288839c6cbafbd54"}, - {file = "gast-0.6.0.tar.gz", hash = "sha256:88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb"}, -] - -[[package]] -name = "ghp-import" -version = "2.1.0" -description = "Copy your docs directly to the gh-pages branch." -optional = false -python-versions = "*" -files = [ - {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, - {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, -] - -[package.dependencies] -python-dateutil = ">=2.8.1" - -[package.extras] -dev = ["flake8", "markdown", "twine", "wheel"] - -[[package]] -name = "gin-config" -version = "0.5.0" -description = "Gin-Config: A lightweight configuration library for Python" -optional = false -python-versions = "*" -files = [ - {file = "gin-config-0.5.0.tar.gz", hash = "sha256:0c6ea5026ded927c8c93c990b01c695257c1df446e45e549a158cfbc79e19ed6"}, - {file = "gin_config-0.5.0-py3-none-any.whl", hash = "sha256:bddb7ca221ea2b46cdb59321e79fecf02d6e3b728906047fcd4076c297609fd6"}, -] - -[package.extras] -pytorch-nightly = ["pytorch-nightly"] -tensorflow = ["tensorflow (>=1.13.0)"] -tensorflow-gpu = ["tensorflow-gpu (>=1.13.0)"] -testing = ["absl-py (>=0.1.6)", "mock (>=3.0.5)", "nose"] -tf-nightly = ["tf-nightly"] -torch = ["torch (>=1.3.0)"] - -[[package]] -name = "google-auth" -version = "2.40.3" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca"}, - {file = "google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0)", "requests (>=2.20.0,<3.0.0)"] -enterprise-cert = ["cryptography", "pyopenssl"] -pyjwt = ["cryptography (<39.0.0)", "cryptography (>=38.0.3)", "pyjwt (>=2.0)"] -pyopenssl = ["cryptography (<39.0.0)", "cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0)"] -testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "cryptography (<39.0.0)", "cryptography (>=38.0.3)", "flask", "freezegun", "grpcio", "mock", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"] -urllib3 = ["packaging", "urllib3"] - -[[package]] -name = "google-auth-oauthlib" -version = "1.2.2" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "google_auth_oauthlib-1.2.2-py3-none-any.whl", hash = "sha256:fd619506f4b3908b5df17b65f39ca8d66ea56986e5472eb5978fd8f3786f00a2"}, - {file = "google_auth_oauthlib-1.2.2.tar.gz", hash = "sha256:11046fb8d3348b296302dd939ace8af0a724042e8029c1b872d87fabc9f41684"}, -] - -[package.dependencies] -google-auth = ">=2.15.0" -requests-oauthlib = ">=0.7.0" - -[package.extras] -tool = ["click (>=6.0.0)"] - -[[package]] -name = "google-pasta" -version = "0.2.0" -description = "pasta is an AST-based Python refactoring library" -optional = false -python-versions = "*" -files = [ - {file = "google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e"}, - {file = "google_pasta-0.2.0-py2-none-any.whl", hash = "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954"}, - {file = "google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "google3" -version = "1.0.0" -description = "." -optional = false -python-versions = "*" -files = [ - {file = "google3-1.0.0-py2.py3-none-any.whl", hash = "sha256:f067267b90d7cb96635668feabdef2d2a17bce1375c46976834c64810cd8c4f0"}, - {file = "google3-1.0.0.tar.gz", hash = "sha256:7fb6799c8a8480fd73f950d820a30786f1edb5583e5c6e38a9da91bce9a66a81"}, -] - -[[package]] -name = "griffe" -version = "1.7.3" -description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." -optional = false -python-versions = ">=3.9" -files = [ - {file = "griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75"}, - {file = "griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b"}, -] - -[package.dependencies] -colorama = ">=0.4" - -[[package]] -name = "grpcio" -version = "1.73.0" -description = "HTTP/2-based RPC framework" -optional = false -python-versions = ">=3.9" -files = [ - {file = "grpcio-1.73.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d050197eeed50f858ef6c51ab09514856f957dba7b1f7812698260fc9cc417f6"}, - {file = "grpcio-1.73.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:ebb8d5f4b0200916fb292a964a4d41210de92aba9007e33d8551d85800ea16cb"}, - {file = "grpcio-1.73.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:c0811331b469e3f15dda5f90ab71bcd9681189a83944fd6dc908e2c9249041ef"}, - {file = "grpcio-1.73.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12787c791c3993d0ea1cc8bf90393647e9a586066b3b322949365d2772ba965b"}, - {file = "grpcio-1.73.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c17771e884fddf152f2a0df12478e8d02853e5b602a10a9a9f1f52fa02b1d32"}, - {file = "grpcio-1.73.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:275e23d4c428c26b51857bbd95fcb8e528783597207ec592571e4372b300a29f"}, - {file = "grpcio-1.73.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9ffc972b530bf73ef0f948f799482a1bf12d9b6f33406a8e6387c0ca2098a833"}, - {file = "grpcio-1.73.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d269df64aff092b2cec5e015d8ae09c7e90888b5c35c24fdca719a2c9f35"}, - {file = "grpcio-1.73.0-cp310-cp310-win32.whl", hash = "sha256:072d8154b8f74300ed362c01d54af8b93200c1a9077aeaea79828d48598514f1"}, - {file = "grpcio-1.73.0-cp310-cp310-win_amd64.whl", hash = "sha256:ce953d9d2100e1078a76a9dc2b7338d5415924dc59c69a15bf6e734db8a0f1ca"}, - {file = "grpcio-1.73.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:51036f641f171eebe5fa7aaca5abbd6150f0c338dab3a58f9111354240fe36ec"}, - {file = "grpcio-1.73.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d12bbb88381ea00bdd92c55aff3da3391fd85bc902c41275c8447b86f036ce0f"}, - {file = "grpcio-1.73.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:483c507c2328ed0e01bc1adb13d1eada05cc737ec301d8e5a8f4a90f387f1790"}, - {file = "grpcio-1.73.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c201a34aa960c962d0ce23fe5f423f97e9d4b518ad605eae6d0a82171809caaa"}, - {file = "grpcio-1.73.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:859f70c8e435e8e1fa060e04297c6818ffc81ca9ebd4940e180490958229a45a"}, - {file = "grpcio-1.73.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e2459a27c6886e7e687e4e407778425f3c6a971fa17a16420227bda39574d64b"}, - {file = "grpcio-1.73.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e0084d4559ee3dbdcce9395e1bc90fdd0262529b32c417a39ecbc18da8074ac7"}, - {file = "grpcio-1.73.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef5fff73d5f724755693a464d444ee0a448c6cdfd3c1616a9223f736c622617d"}, - {file = "grpcio-1.73.0-cp311-cp311-win32.whl", hash = "sha256:965a16b71a8eeef91fc4df1dc40dc39c344887249174053814f8a8e18449c4c3"}, - {file = "grpcio-1.73.0-cp311-cp311-win_amd64.whl", hash = "sha256:b71a7b4483d1f753bbc11089ff0f6fa63b49c97a9cc20552cded3fcad466d23b"}, - {file = "grpcio-1.73.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:fb9d7c27089d9ba3746f18d2109eb530ef2a37452d2ff50f5a6696cd39167d3b"}, - {file = "grpcio-1.73.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:128ba2ebdac41e41554d492b82c34586a90ebd0766f8ebd72160c0e3a57b9155"}, - {file = "grpcio-1.73.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:068ecc415f79408d57a7f146f54cdf9f0acb4b301a52a9e563973dc981e82f3d"}, - {file = "grpcio-1.73.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ddc1cfb2240f84d35d559ade18f69dcd4257dbaa5ba0de1a565d903aaab2968"}, - {file = "grpcio-1.73.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53007f70d9783f53b41b4cf38ed39a8e348011437e4c287eee7dd1d39d54b2f"}, - {file = "grpcio-1.73.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4dd8d8d092efede7d6f48d695ba2592046acd04ccf421436dd7ed52677a9ad29"}, - {file = "grpcio-1.73.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:70176093d0a95b44d24baa9c034bb67bfe2b6b5f7ebc2836f4093c97010e17fd"}, - {file = "grpcio-1.73.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:085ebe876373ca095e24ced95c8f440495ed0b574c491f7f4f714ff794bbcd10"}, - {file = "grpcio-1.73.0-cp312-cp312-win32.whl", hash = "sha256:cfc556c1d6aef02c727ec7d0016827a73bfe67193e47c546f7cadd3ee6bf1a60"}, - {file = "grpcio-1.73.0-cp312-cp312-win_amd64.whl", hash = "sha256:bbf45d59d090bf69f1e4e1594832aaf40aa84b31659af3c5e2c3f6a35202791a"}, - {file = "grpcio-1.73.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:da1d677018ef423202aca6d73a8d3b2cb245699eb7f50eb5f74cae15a8e1f724"}, - {file = "grpcio-1.73.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:36bf93f6a657f37c131d9dd2c391b867abf1426a86727c3575393e9e11dadb0d"}, - {file = "grpcio-1.73.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:d84000367508ade791d90c2bafbd905574b5ced8056397027a77a215d601ba15"}, - {file = "grpcio-1.73.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c98ba1d928a178ce33f3425ff823318040a2b7ef875d30a0073565e5ceb058d9"}, - {file = "grpcio-1.73.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a73c72922dfd30b396a5f25bb3a4590195ee45ecde7ee068acb0892d2900cf07"}, - {file = "grpcio-1.73.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:10e8edc035724aba0346a432060fd192b42bd03675d083c01553cab071a28da5"}, - {file = "grpcio-1.73.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f5cdc332b503c33b1643b12ea933582c7b081957c8bc2ea4cc4bc58054a09288"}, - {file = "grpcio-1.73.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:07ad7c57233c2109e4ac999cb9c2710c3b8e3f491a73b058b0ce431f31ed8145"}, - {file = "grpcio-1.73.0-cp313-cp313-win32.whl", hash = "sha256:0eb5df4f41ea10bda99a802b2a292d85be28958ede2a50f2beb8c7fc9a738419"}, - {file = "grpcio-1.73.0-cp313-cp313-win_amd64.whl", hash = "sha256:38cf518cc54cd0c47c9539cefa8888549fcc067db0b0c66a46535ca8032020c4"}, - {file = "grpcio-1.73.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:1284850607901cfe1475852d808e5a102133461ec9380bc3fc9ebc0686ee8e32"}, - {file = "grpcio-1.73.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:0e092a4b28eefb63eec00d09ef33291cd4c3a0875cde29aec4d11d74434d222c"}, - {file = "grpcio-1.73.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:33577fe7febffe8ebad458744cfee8914e0c10b09f0ff073a6b149a84df8ab8f"}, - {file = "grpcio-1.73.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60813d8a16420d01fa0da1fc7ebfaaa49a7e5051b0337cd48f4f950eb249a08e"}, - {file = "grpcio-1.73.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9c957dc65e5d474378d7bcc557e9184576605d4b4539e8ead6e351d7ccce20"}, - {file = "grpcio-1.73.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3902b71407d021163ea93c70c8531551f71ae742db15b66826cf8825707d2908"}, - {file = "grpcio-1.73.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1dd7fa7276dcf061e2d5f9316604499eea06b1b23e34a9380572d74fe59915a8"}, - {file = "grpcio-1.73.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2d1510c4ea473110cb46a010555f2c1a279d1c256edb276e17fa571ba1e8927c"}, - {file = "grpcio-1.73.0-cp39-cp39-win32.whl", hash = "sha256:d0a1517b2005ba1235a1190b98509264bf72e231215dfeef8db9a5a92868789e"}, - {file = "grpcio-1.73.0-cp39-cp39-win_amd64.whl", hash = "sha256:6228f7eb6d9f785f38b589d49957fca5df3d5b5349e77d2d89b14e390165344c"}, - {file = "grpcio-1.73.0.tar.gz", hash = "sha256:3af4c30918a7f0d39de500d11255f8d9da4f30e94a2033e70fe2a720e184bd8e"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.73.0)"] - -[[package]] -name = "gym" -version = "0.23.0" -description = "Gym: A universal API for reinforcement learning environments" -optional = false -python-versions = ">=3.7" -files = [ - {file = "gym-0.23.0.tar.gz", hash = "sha256:dbd3d0c50fc1260b57e6f12ba792152b73551730512623b7653d6dfb2f7a105d"}, -] - -[package.dependencies] -cloudpickle = ">=1.2.0" -gym_notices = ">=0.0.4" -numpy = ">=1.18.0" - -[package.extras] -accept-rom-license = ["autorom[accept-rom-license] (>=0.4.2,<0.5.0)"] -all = ["ale-py (>=0.7.4,<0.8.0)", "box2d-py (==2.3.5)", "box2d-py (==2.3.5)", "lz4 (>=3.1.0)", "lz4 (>=3.1.0)", "mujoco_py (>=1.50,<2.0)", "opencv-python (>=3.0)", "opencv-python (>=3.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "scipy (>=1.4.1)", "scipy (>=1.4.1)"] -atari = ["ale-py (>=0.7.4,<0.8.0)"] -box2d = ["box2d-py (==2.3.5)", "pygame (==2.1.0)"] -classic-control = ["pygame (==2.1.0)"] -mujoco = ["mujoco_py (>=1.50,<2.0)"] -nomujoco = ["box2d-py (==2.3.5)", "lz4 (>=3.1.0)", "opencv-python (>=3.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "scipy (>=1.4.1)"] -other = ["lz4 (>=3.1.0)", "opencv-python (>=3.0)"] -toy-text = ["pygame (==2.1.0)", "scipy (>=1.4.1)"] - -[[package]] -name = "gym-notices" -version = "0.0.8" -description = "Notices for gym" -optional = false -python-versions = "*" -files = [ - {file = "gym-notices-0.0.8.tar.gz", hash = "sha256:ad25e200487cafa369728625fe064e88ada1346618526102659b4640f2b4b911"}, - {file = "gym_notices-0.0.8-py3-none-any.whl", hash = "sha256:e5f82e00823a166747b4c2a07de63b6560b1acb880638547e0cabf825a01e463"}, -] - -[[package]] -name = "h11" -version = "0.16.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.8" -files = [ - {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, - {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, -] - -[[package]] -name = "h5py" -version = "3.14.0" -description = "Read and write HDF5 files from Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "h5py-3.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24df6b2622f426857bda88683b16630014588a0e4155cba44e872eb011c4eaed"}, - {file = "h5py-3.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ff2389961ee5872de697054dd5a033b04284afc3fb52dc51d94561ece2c10c6"}, - {file = "h5py-3.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:016e89d3be4c44f8d5e115fab60548e518ecd9efe9fa5c5324505a90773e6f03"}, - {file = "h5py-3.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1223b902ef0b5d90bcc8a4778218d6d6cd0f5561861611eda59fa6c52b922f4d"}, - {file = "h5py-3.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:852b81f71df4bb9e27d407b43071d1da330d6a7094a588efa50ef02553fa7ce4"}, - {file = "h5py-3.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f30dbc58f2a0efeec6c8836c97f6c94afd769023f44e2bb0ed7b17a16ec46088"}, - {file = "h5py-3.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:543877d7f3d8f8a9828ed5df6a0b78ca3d8846244b9702e99ed0d53610b583a8"}, - {file = "h5py-3.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c497600c0496548810047257e36360ff551df8b59156d3a4181072eed47d8ad"}, - {file = "h5py-3.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:723a40ee6505bd354bfd26385f2dae7bbfa87655f4e61bab175a49d72ebfc06b"}, - {file = "h5py-3.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:d2744b520440a996f2dae97f901caa8a953afc055db4673a993f2d87d7f38713"}, - {file = "h5py-3.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e0045115d83272090b0717c555a31398c2c089b87d212ceba800d3dc5d952e23"}, - {file = "h5py-3.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6da62509b7e1d71a7d110478aa25d245dd32c8d9a1daee9d2a42dba8717b047a"}, - {file = "h5py-3.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554ef0ced3571366d4d383427c00c966c360e178b5fb5ee5bb31a435c424db0c"}, - {file = "h5py-3.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cbd41f4e3761f150aa5b662df991868ca533872c95467216f2bec5fcad84882"}, - {file = "h5py-3.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:bf4897d67e613ecf5bdfbdab39a1158a64df105827da70ea1d90243d796d367f"}, - {file = "h5py-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa4b7bbce683379b7bf80aaba68e17e23396100336a8d500206520052be2f812"}, - {file = "h5py-3.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9603a501a04fcd0ba28dd8f0995303d26a77a980a1f9474b3417543d4c6174"}, - {file = "h5py-3.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8cbaf6910fa3983c46172666b0b8da7b7bd90d764399ca983236f2400436eeb"}, - {file = "h5py-3.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d90e6445ab7c146d7f7981b11895d70bc1dd91278a4f9f9028bc0c95e4a53f13"}, - {file = "h5py-3.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:ae18e3de237a7a830adb76aaa68ad438d85fe6e19e0d99944a3ce46b772c69b3"}, - {file = "h5py-3.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5cc1601e78027cedfec6dd50efb4802f018551754191aeb58d948bd3ec3bd7a"}, - {file = "h5py-3.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e59d2136a8b302afd25acdf7a89b634e0eb7c66b1a211ef2d0457853768a2ef"}, - {file = "h5py-3.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:573c33ad056ac7c1ab6d567b6db9df3ffc401045e3f605736218f96c1e0490c6"}, - {file = "h5py-3.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccbe17dc187c0c64178f1a10aa274ed3a57d055117588942b8a08793cc448216"}, - {file = "h5py-3.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f025cf30ae738c4c4e38c7439a761a71ccfcce04c2b87b2a2ac64e8c5171d43"}, - {file = "h5py-3.14.0.tar.gz", hash = "sha256:2372116b2e0d5d3e5e705b7f663f7c8d96fa79a4052d250484ef91d24d6a08f4"}, -] - -[package.dependencies] -numpy = ">=1.19.3" - -[[package]] -name = "holidays" -version = "0.56" -description = "Generate and work with holidays in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "holidays-0.56-py3-none-any.whl", hash = "sha256:19b6410c3ae899ad5746917f106c5f07c899eba3afa3f4ca82981d3ed677f4c4"}, - {file = "holidays-0.56.tar.gz", hash = "sha256:86e8550724d34f72b4db2292b2a70983067b2ee80eeaf18a30ea882d821814c5"}, -] - -[package.dependencies] -python-dateutil = "*" - -[[package]] -name = "httpcore" -version = "1.0.9" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, - {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.16" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.28.1" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, - {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "identify" -version = "2.6.12" -description = "File identification library for Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2"}, - {file = "identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6"}, -] - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.10" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, -] - -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - -[[package]] -name = "importlib-resources" -version = "6.5.2" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.9" -files = [ - {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, - {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] -type = ["pytest-mypy"] - -[[package]] -name = "iniconfig" -version = "2.1.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.8" -files = [ - {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, - {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, -] - -[[package]] -name = "ipykernel" -version = "6.29.5" -description = "IPython Kernel for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, - {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -comm = ">=0.1.1" -debugpy = ">=1.6.5" -ipython = ">=7.23.1" -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -matplotlib-inline = ">=0.1" -nest-asyncio = "*" -packaging = "*" -psutil = "*" -pyzmq = ">=24" -tornado = ">=6.1" -traitlets = ">=5.4.0" - -[package.extras] -cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] -pyqt5 = ["pyqt5"] -pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "ipython" -version = "8.37.0" -description = "IPython: Productive Interactive Computing" -optional = false -python-versions = ">=3.10" -files = [ - {file = "ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2"}, - {file = "ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} -prompt_toolkit = ">=3.0.41,<3.1.0" -pygments = ">=2.4.0" -stack_data = "*" -traitlets = ">=5.13.0" -typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} - -[package.extras] -all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] -black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] -kernel = ["ipykernel"] -matplotlib = ["matplotlib"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "ipython[test]", "jupyter_ai", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] - -[[package]] -name = "ipywidgets" -version = "8.1.7" -description = "Jupyter interactive widgets" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ipywidgets-8.1.7-py3-none-any.whl", hash = "sha256:764f2602d25471c213919b8a1997df04bef869251db4ca8efba1b76b1bd9f7bb"}, - {file = "ipywidgets-8.1.7.tar.gz", hash = "sha256:15f1ac050b9ccbefd45dccfbb2ef6bed0029d8278682d569d71b8dd96bee0376"}, -] - -[package.dependencies] -comm = ">=0.1.3" -ipython = ">=6.1.0" -jupyterlab_widgets = ">=3.0.15,<3.1.0" -traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.14,<4.1.0" - -[package.extras] -test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] - -[[package]] -name = "isoduration" -version = "20.11.0" -description = "Operations with ISO 8601 durations" -optional = false -python-versions = ">=3.7" -files = [ - {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, - {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, -] - -[package.dependencies] -arrow = ">=0.15.0" - -[[package]] -name = "isort" -version = "6.0.1" -description = "A Python utility / library to sort Python imports." -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, - {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, -] - -[package.extras] -colors = ["colorama"] -plugins = ["setuptools"] - -[[package]] -name = "jedi" -version = "0.19.2" -description = "An autocompletion tool for Python that can be used for text editors." -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, - {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, -] - -[package.dependencies] -parso = ">=0.8.4,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] - -[[package]] -name = "jinja2" -version = "3.1.6" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, - {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "joblib" -version = "1.5.1" -description = "Lightweight pipelining with Python functions" -optional = false -python-versions = ">=3.9" -files = [ - {file = "joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a"}, - {file = "joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444"}, -] - -[[package]] -name = "json5" -version = "0.12.0" -description = "A Python implementation of the JSON5 data format." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "json5-0.12.0-py3-none-any.whl", hash = "sha256:6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db"}, - {file = "json5-0.12.0.tar.gz", hash = "sha256:0b4b6ff56801a1c7dc817b0241bca4ce474a0e6a163bfef3fc594d3fd263ff3a"}, -] - -[package.extras] -dev = ["build (==1.2.2.post1)", "coverage (==7.5.4)", "coverage (==7.8.0)", "mypy (==1.14.1)", "mypy (==1.15.0)", "pip (==25.0.1)", "pylint (==3.2.7)", "pylint (==3.3.6)", "ruff (==0.11.2)", "twine (==6.1.0)", "uv (==0.6.11)"] - -[[package]] -name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, -] - -[[package]] -name = "jsonschema" -version = "4.24.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d"}, - {file = "jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} -jsonschema-specifications = ">=2023.03.6" -referencing = ">=0.28.4" -rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} -rpds-py = ">=0.7.1" -uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] - -[[package]] -name = "jsonschema-specifications" -version = "2025.4.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false -python-versions = ">=3.9" -files = [ - {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, - {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, -] - -[package.dependencies] -referencing = ">=0.31.0" - -[[package]] -name = "jupyter" -version = "1.1.1" -description = "Jupyter metapackage. Install all the Jupyter components in one go." -optional = false -python-versions = "*" -files = [ - {file = "jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83"}, - {file = "jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a"}, -] - -[package.dependencies] -ipykernel = "*" -ipywidgets = "*" -jupyter-console = "*" -jupyterlab = "*" -nbconvert = "*" -notebook = "*" - -[[package]] -name = "jupyter-client" -version = "8.6.3" -description = "Jupyter protocol implementation and client libraries" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, - {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, -] - -[package.dependencies] -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -python-dateutil = ">=2.8.2" -pyzmq = ">=23.0" -tornado = ">=6.2" -traitlets = ">=5.3" - -[package.extras] -docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] - -[[package]] -name = "jupyter-console" -version = "6.6.3" -description = "Jupyter terminal console" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, - {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, -] - -[package.dependencies] -ipykernel = ">=6.14" -ipython = "*" -jupyter-client = ">=7.0.0" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -prompt-toolkit = ">=3.0.30" -pygments = "*" -pyzmq = ">=17" -traitlets = ">=5.4" - -[package.extras] -test = ["flaky", "pexpect", "pytest"] - -[[package]] -name = "jupyter-core" -version = "5.8.1" -description = "Jupyter core package. A base package on which Jupyter projects rely." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0"}, - {file = "jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941"}, -] - -[package.dependencies] -platformdirs = ">=2.5" -pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = ">=5.3" - -[package.extras] -docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest (<9)", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyter-events" -version = "0.12.0" -description = "Jupyter Event System library" -optional = false -python-versions = ">=3.9" -files = [ - {file = "jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb"}, - {file = "jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b"}, -] - -[package.dependencies] -jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} -packaging = "*" -python-json-logger = ">=2.0.4" -pyyaml = ">=5.3" -referencing = "*" -rfc3339-validator = "*" -rfc3986-validator = ">=0.1.1" -traitlets = ">=5.3" - -[package.extras] -cli = ["click", "rich"] -docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8)", "sphinxcontrib-spelling"] -test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] - -[[package]] -name = "jupyter-lsp" -version = "2.2.5" -description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, - {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, -] - -[package.dependencies] -jupyter-server = ">=1.1.2" - -[[package]] -name = "jupyter-server" -version = "2.16.0" -description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -optional = false -python-versions = ">=3.9" -files = [ - {file = "jupyter_server-2.16.0-py3-none-any.whl", hash = "sha256:3d8db5be3bc64403b1c65b400a1d7f4647a5ce743f3b20dbdefe8ddb7b55af9e"}, - {file = "jupyter_server-2.16.0.tar.gz", hash = "sha256:65d4b44fdf2dcbbdfe0aa1ace4a842d4aaf746a2b7b168134d5aaed35621b7f6"}, -] - -[package.dependencies] -anyio = ">=3.1.0" -argon2-cffi = ">=21.1" -jinja2 = ">=3.0.3" -jupyter-client = ">=7.4.4" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -jupyter-events = ">=0.11.0" -jupyter-server-terminals = ">=0.4.4" -nbconvert = ">=6.4.4" -nbformat = ">=5.3.0" -overrides = ">=5.0" -packaging = ">=22.0" -prometheus-client = ">=0.9" -pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} -pyzmq = ">=24" -send2trash = ">=1.8.2" -terminado = ">=0.8.3" -tornado = ">=6.2.0" -traitlets = ">=5.6.0" -websocket-client = ">=1.7" - -[package.extras] -docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] -test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] - -[[package]] -name = "jupyter-server-terminals" -version = "0.5.3" -description = "A Jupyter Server Extension Providing Terminals." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, - {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, -] - -[package.dependencies] -pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} -terminado = ">=0.8.3" - -[package.extras] -docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] -test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] - -[[package]] -name = "jupyterlab" -version = "4.4.3" -description = "JupyterLab computational environment" -optional = false -python-versions = ">=3.9" -files = [ - {file = "jupyterlab-4.4.3-py3-none-any.whl", hash = "sha256:164302f6d4b6c44773dfc38d585665a4db401a16e5296c37df5cba63904fbdea"}, - {file = "jupyterlab-4.4.3.tar.gz", hash = "sha256:a94c32fd7f8b93e82a49dc70a6ec45a5c18281ca2a7228d12765e4e210e5bca2"}, -] - -[package.dependencies] -async-lru = ">=1.0.0" -httpx = ">=0.25.0" -ipykernel = ">=6.5.0" -jinja2 = ">=3.0.3" -jupyter-core = "*" -jupyter-lsp = ">=2.0.0" -jupyter-server = ">=2.4.0,<3" -jupyterlab-server = ">=2.27.1,<3" -notebook-shim = ">=0.2" -packaging = "*" -setuptools = ">=41.1.0" -tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} -tornado = ">=6.2.0" -traitlets = "*" - -[package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.11.4)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.2.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.5.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)", "vega-datasets (==0.9.0)"] -test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] -upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] - -[[package]] -name = "jupyterlab-pygments" -version = "0.3.0" -description = "Pygments theme using JupyterLab CSS variables" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, - {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, -] - -[[package]] -name = "jupyterlab-server" -version = "2.27.3" -description = "A set of server components for JupyterLab and JupyterLab like applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, - {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, -] - -[package.dependencies] -babel = ">=2.10" -jinja2 = ">=3.0.3" -json5 = ">=0.9.0" -jsonschema = ">=4.18.0" -jupyter-server = ">=1.21,<3" -packaging = ">=21.3" -requests = ">=2.31" - -[package.extras] -docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] -openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] - -[[package]] -name = "jupyterlab-widgets" -version = "3.0.15" -description = "Jupyter interactive widgets for JupyterLab" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyterlab_widgets-3.0.15-py3-none-any.whl", hash = "sha256:d59023d7d7ef71400d51e6fee9a88867f6e65e10a4201605d2d7f3e8f012a31c"}, - {file = "jupyterlab_widgets-3.0.15.tar.gz", hash = "sha256:2920888a0c2922351a9202817957a68c07d99673504d6cd37345299e971bb08b"}, -] - -[[package]] -name = "keras" -version = "2.15.0" -description = "Deep learning for humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "keras-2.15.0-py3-none-any.whl", hash = "sha256:2dcc6d2e30cf9c951064b63c1f4c404b966c59caf09e01f3549138ec8ee0dd1f"}, - {file = "keras-2.15.0.tar.gz", hash = "sha256:81871d298c064dc4ac6b58440fdae67bfcf47c8d7ad28580fab401834c06a575"}, -] - -[[package]] -name = "kiwisolver" -version = "1.4.8" -description = "A fast implementation of the Cassowary constraint solver" -optional = false -python-versions = ">=3.10" -files = [ - {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, - {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, - {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"}, - {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"}, - {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"}, - {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"}, - {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"}, - {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"}, - {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"}, - {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"}, - {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"}, - {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"}, - {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"}, - {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"}, - {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"}, - {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, - {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, - {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, - {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, - {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"}, - {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, -] - -[[package]] -name = "libclang" -version = "18.1.1" -description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." -optional = false -python-versions = "*" -files = [ - {file = "libclang-18.1.1-1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:0b2e143f0fac830156feb56f9231ff8338c20aecfe72b4ffe96f19e5a1dbb69a"}, - {file = "libclang-18.1.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5"}, - {file = "libclang-18.1.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8"}, - {file = "libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b"}, - {file = "libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592"}, - {file = "libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe"}, - {file = "libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f"}, - {file = "libclang-18.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb"}, - {file = "libclang-18.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8"}, - {file = "libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250"}, -] - -[[package]] -name = "markdown" -version = "3.8" -description = "Python implementation of John Gruber's Markdown." -optional = false -python-versions = ">=3.9" -files = [ - {file = "markdown-3.8-py3-none-any.whl", hash = "sha256:794a929b79c5af141ef5ab0f2f642d0f7b1872981250230e72682346f7cc90dc"}, - {file = "markdown-3.8.tar.gz", hash = "sha256:7df81e63f0df5c4b24b7d156eb81e4690595239b7d70937d0409f1b0de319c6f"}, -] - -[package.extras] -docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] -testing = ["coverage", "pyyaml"] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -optional = false -python-versions = ">=3.8" -files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "markupsafe" -version = "3.0.2" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.9" -files = [ - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, - {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, -] - -[[package]] -name = "matplotlib" -version = "3.10.3" -description = "Python plotting package" -optional = false -python-versions = ">=3.10" -files = [ - {file = "matplotlib-3.10.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:213fadd6348d106ca7db99e113f1bea1e65e383c3ba76e8556ba4a3054b65ae7"}, - {file = "matplotlib-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3bec61cb8221f0ca6313889308326e7bb303d0d302c5cc9e523b2f2e6c73deb"}, - {file = "matplotlib-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21ae75651c0231b3ba014b6d5e08fb969c40cdb5a011e33e99ed0c9ea86ecb"}, - {file = "matplotlib-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e39755580b08e30e3620efc659330eac5d6534ab7eae50fa5e31f53ee4e30"}, - {file = "matplotlib-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf4636203e1190871d3a73664dea03d26fb019b66692cbfd642faafdad6208e8"}, - {file = "matplotlib-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:fd5641a9bb9d55f4dd2afe897a53b537c834b9012684c8444cc105895c8c16fd"}, - {file = "matplotlib-3.10.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0ef061f74cd488586f552d0c336b2f078d43bc00dc473d2c3e7bfee2272f3fa8"}, - {file = "matplotlib-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96985d14dc5f4a736bbea4b9de9afaa735f8a0fc2ca75be2fa9e96b2097369d"}, - {file = "matplotlib-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5f0283da91e9522bdba4d6583ed9d5521566f63729ffb68334f86d0bb98049"}, - {file = "matplotlib-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfa07c0ec58035242bc8b2c8aae37037c9a886370eef6850703d7583e19964b"}, - {file = "matplotlib-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c0b9849a17bce080a16ebcb80a7b714b5677d0ec32161a2cc0a8e5a6030ae220"}, - {file = "matplotlib-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:eef6ed6c03717083bc6d69c2d7ee8624205c29a8e6ea5a31cd3492ecdbaee1e1"}, - {file = "matplotlib-3.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ab1affc11d1f495ab9e6362b8174a25afc19c081ba5b0775ef00533a4236eea"}, - {file = "matplotlib-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a818d8bdcafa7ed2eed74487fdb071c09c1ae24152d403952adad11fa3c65b4"}, - {file = "matplotlib-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748ebc3470c253e770b17d8b0557f0aa85cf8c63fd52f1a61af5b27ec0b7ffee"}, - {file = "matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed70453fd99733293ace1aec568255bc51c6361cb0da94fa5ebf0649fdb2150a"}, - {file = "matplotlib-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbed9917b44070e55640bd13419de83b4c918e52d97561544814ba463811cbc7"}, - {file = "matplotlib-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05"}, - {file = "matplotlib-3.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84"}, - {file = "matplotlib-3.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e"}, - {file = "matplotlib-3.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15"}, - {file = "matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7"}, - {file = "matplotlib-3.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d"}, - {file = "matplotlib-3.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93"}, - {file = "matplotlib-3.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2"}, - {file = "matplotlib-3.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d"}, - {file = "matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566"}, - {file = "matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158"}, - {file = "matplotlib-3.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d"}, - {file = "matplotlib-3.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5"}, - {file = "matplotlib-3.10.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:86ab63d66bbc83fdb6733471d3bff40897c1e9921cba112accd748eee4bce5e4"}, - {file = "matplotlib-3.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a48f9c08bf7444b5d2391a83e75edb464ccda3c380384b36532a0962593a1751"}, - {file = "matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014"}, - {file = "matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0"}, -] - -[package.dependencies] -contourpy = ">=1.0.1" -cycler = ">=0.10" -fonttools = ">=4.22.0" -kiwisolver = ">=1.3.1" -numpy = ">=1.23" -packaging = ">=20.0" -pillow = ">=8" -pyparsing = ">=2.3.1" -python-dateutil = ">=2.7" - -[package.extras] -dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] - -[[package]] -name = "matplotlib-inline" -version = "0.1.7" -description = "Inline Matplotlib backend for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, - {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, -] - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - -[[package]] -name = "mdformat" -version = "0.7.22" -description = "CommonMark compliant Markdown formatter" -optional = false -python-versions = ">=3.9" -files = [ - {file = "mdformat-0.7.22-py3-none-any.whl", hash = "sha256:61122637c9e1d9be1329054f3fa216559f0d1f722b7919b060a8c2a4ae1850e5"}, - {file = "mdformat-0.7.22.tar.gz", hash = "sha256:eef84fa8f233d3162734683c2a8a6222227a229b9206872e6139658d99acb1ea"}, -] - -[package.dependencies] -markdown-it-py = ">=1.0.0,<4.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - -[[package]] -name = "mediapy" -version = "1.2.4" -description = "Read/write/show images and videos in an IPython notebook" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mediapy-1.2.4-py3-none-any.whl", hash = "sha256:dd2b2364543077a1d292cab9eca5d08c8550521523aa1cbb721fd7617ccde872"}, - {file = "mediapy-1.2.4.tar.gz", hash = "sha256:052947a676ebd3491359a6943b144559fdc414f741b03a05c78fa7b6291e6b12"}, -] - -[package.dependencies] -ipython = "*" -matplotlib = "*" -numpy = "*" -Pillow = "*" - -[package.extras] -dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist", "pytype"] - -[[package]] -name = "mergedeep" -version = "1.3.4" -description = "A deep merge function for 🐍." -optional = false -python-versions = ">=3.6" -files = [ - {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, - {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, -] - -[[package]] -name = "mistune" -version = "3.1.3" -description = "A sane and fast Markdown parser with useful plugins and renderers" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9"}, - {file = "mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0"}, -] - -[package.dependencies] -typing-extensions = {version = "*", markers = "python_version < \"3.11\""} - -[[package]] -name = "mkdocs" -version = "1.6.1" -description = "Project documentation with Markdown." -optional = false -python-versions = ">=3.8" -files = [ - {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, - {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, -] - -[package.dependencies] -click = ">=7.0" -colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} -ghp-import = ">=1.0" -jinja2 = ">=2.11.1" -markdown = ">=3.3.6" -markupsafe = ">=2.0.1" -mergedeep = ">=1.3.4" -mkdocs-get-deps = ">=0.2.0" -packaging = ">=20.5" -pathspec = ">=0.11.1" -pyyaml = ">=5.1" -pyyaml-env-tag = ">=0.1" -watchdog = ">=2.0" - -[package.extras] -i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] - -[[package]] -name = "mkdocs-autorefs" -version = "1.4.2" -description = "Automatically link across pages in MkDocs." -optional = false -python-versions = ">=3.9" -files = [ - {file = "mkdocs_autorefs-1.4.2-py3-none-any.whl", hash = "sha256:83d6d777b66ec3c372a1aad4ae0cf77c243ba5bcda5bf0c6b8a2c5e7a3d89f13"}, - {file = "mkdocs_autorefs-1.4.2.tar.gz", hash = "sha256:e2ebe1abd2b67d597ed19378c0fff84d73d1dbce411fce7a7cc6f161888b6749"}, -] - -[package.dependencies] -Markdown = ">=3.3" -markupsafe = ">=2.0.1" -mkdocs = ">=1.1" - -[[package]] -name = "mkdocs-get-deps" -version = "0.2.0" -description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, - {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, -] - -[package.dependencies] -mergedeep = ">=1.3.4" -platformdirs = ">=2.2.0" -pyyaml = ">=5.1" - -[[package]] -name = "mkdocs-material" -version = "9.6.14" -description = "Documentation that simply works" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mkdocs_material-9.6.14-py3-none-any.whl", hash = "sha256:3b9cee6d3688551bf7a8e8f41afda97a3c39a12f0325436d76c86706114b721b"}, - {file = "mkdocs_material-9.6.14.tar.gz", hash = "sha256:39d795e90dce6b531387c255bd07e866e027828b7346d3eba5ac3de265053754"}, -] - -[package.dependencies] -babel = ">=2.10,<3.0" -backrefs = ">=5.7.post1,<6.0" -colorama = ">=0.4,<1.0" -jinja2 = ">=3.1,<4.0" -markdown = ">=3.2,<4.0" -mkdocs = ">=1.6,<2.0" -mkdocs-material-extensions = ">=1.3,<2.0" -paginate = ">=0.5,<1.0" -pygments = ">=2.16,<3.0" -pymdown-extensions = ">=10.2,<11.0" -requests = ">=2.26,<3.0" - -[package.extras] -git = ["mkdocs-git-committers-plugin-2 (>=1.1,<3)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] -imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] -recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] - -[[package]] -name = "mkdocs-material-extensions" -version = "1.3.1" -description = "Extension pack for Python Markdown and MkDocs Material." -optional = false -python-versions = ">=3.8" -files = [ - {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, - {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, -] - -[[package]] -name = "mkdocstrings" -version = "0.29.1" -description = "Automatic documentation from sources, for MkDocs." -optional = false -python-versions = ">=3.9" -files = [ - {file = "mkdocstrings-0.29.1-py3-none-any.whl", hash = "sha256:37a9736134934eea89cbd055a513d40a020d87dfcae9e3052c2a6b8cd4af09b6"}, - {file = "mkdocstrings-0.29.1.tar.gz", hash = "sha256:8722f8f8c5cd75da56671e0a0c1bbed1df9946c0cef74794d6141b34011abd42"}, -] - -[package.dependencies] -Jinja2 = ">=2.11.1" -Markdown = ">=3.6" -MarkupSafe = ">=1.1" -mkdocs = ">=1.6" -mkdocs-autorefs = ">=1.4" -pymdown-extensions = ">=6.3" - -[package.extras] -crystal = ["mkdocstrings-crystal (>=0.3.4)"] -python = ["mkdocstrings-python (>=1.16.2)"] -python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] - -[[package]] -name = "mkdocstrings-python" -version = "1.16.12" -description = "A Python handler for mkdocstrings." -optional = false -python-versions = ">=3.9" -files = [ - {file = "mkdocstrings_python-1.16.12-py3-none-any.whl", hash = "sha256:22ded3a63b3d823d57457a70ff9860d5a4de9e8b1e482876fc9baabaf6f5f374"}, - {file = "mkdocstrings_python-1.16.12.tar.gz", hash = "sha256:9b9eaa066e0024342d433e332a41095c4e429937024945fea511afe58f63175d"}, -] - -[package.dependencies] -griffe = ">=1.6.2" -mkdocs-autorefs = ">=1.4" -mkdocstrings = ">=0.28.3" -typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "ml-dtypes" -version = "0.3.2" -description = "" -optional = false -python-versions = ">=3.9" -files = [ - {file = "ml_dtypes-0.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7afde548890a92b41c0fed3a6c525f1200a5727205f73dc21181a2726571bb53"}, - {file = "ml_dtypes-0.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a746fe5fb9cd974a91070174258f0be129c592b93f9ce7df6cc336416c3fbd"}, - {file = "ml_dtypes-0.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:961134ea44c7b8ca63eda902a44b58cd8bd670e21d62e255c81fba0a8e70d9b7"}, - {file = "ml_dtypes-0.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:6b35c4e8ca957c877ac35c79ffa77724ecc3702a1e4b18b08306c03feae597bb"}, - {file = "ml_dtypes-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:763697ab8a88d47443997a7cdf3aac7340049aed45f7521f6b0ec8a0594821fe"}, - {file = "ml_dtypes-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b89b194e9501a92d289c1ffd411380baf5daafb9818109a4f49b0a1b6dce4462"}, - {file = "ml_dtypes-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c34f2ba9660b21fe1034b608308a01be82bbef2a92fb8199f24dc6bad0d5226"}, - {file = "ml_dtypes-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:6604877d567a29bfe7cc02969ae0f2425260e5335505cf5e7fefc3e5465f5655"}, - {file = "ml_dtypes-0.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:93b78f53431c93953f7850bb1b925a17f0ab5d97527e38a7e865b5b4bc5cfc18"}, - {file = "ml_dtypes-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a17ef2322e60858d93584e9c52a5be7dd6236b056b7fa1ec57f1bb6ba043e33"}, - {file = "ml_dtypes-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8505946df1665db01332d885c2020b4cb9e84a8b1241eb4ba69d59591f65855"}, - {file = "ml_dtypes-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:f47619d978ab1ae7dfdc4052ea97c636c6263e1f19bd1be0e42c346b98d15ff4"}, - {file = "ml_dtypes-0.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7b3fb3d4f6b39bcd4f6c4b98f406291f0d681a895490ee29a0f95bab850d53c"}, - {file = "ml_dtypes-0.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a4c3fcbf86fa52d0204f07cfd23947ef05b4ad743a1a988e163caa34a201e5e"}, - {file = "ml_dtypes-0.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91f8783fd1f2c23fd3b9ee5ad66b785dafa58ba3cdb050c4458021fa4d1eb226"}, - {file = "ml_dtypes-0.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ba8e1fafc7fff3e643f453bffa7d082df1678a73286ce8187d3e825e776eb94"}, - {file = "ml_dtypes-0.3.2.tar.gz", hash = "sha256:533059bc5f1764fac071ef54598db358c167c51a718f68f5bb55e3dee79d2967"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.21.2", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, -] - -[package.extras] -dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] - -[[package]] -name = "mypy-extensions" -version = "1.1.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, - {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, -] - -[[package]] -name = "nbclient" -version = "0.10.2" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d"}, - {file = "nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193"}, -] - -[package.dependencies] -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -nbformat = ">=5.1" -traitlets = ">=5.4" - -[package.extras] -dev = ["pre-commit"] -docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.1.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.1.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] - -[[package]] -name = "nbconvert" -version = "7.16.6" -description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b"}, - {file = "nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582"}, -] - -[package.dependencies] -beautifulsoup4 = "*" -bleach = {version = "!=5.0.0", extras = ["css"]} -defusedxml = "*" -jinja2 = ">=3.0" -jupyter-core = ">=4.7" -jupyterlab-pygments = "*" -markupsafe = ">=2.0" -mistune = ">=2.0.3,<4" -nbclient = ">=0.5.0" -nbformat = ">=5.7" -packaging = "*" -pandocfilters = ">=1.4.1" -pygments = ">=2.4.1" -traitlets = ">=5.1" - -[package.extras] -all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] -docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["pyqtwebengine (>=5.15)"] -qtpng = ["pyqtwebengine (>=5.15)"] -serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] -webpdf = ["playwright"] - -[[package]] -name = "nbformat" -version = "5.10.4" -description = "The Jupyter Notebook format" -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, - {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, -] - -[package.dependencies] -fastjsonschema = ">=2.15" -jsonschema = ">=2.6" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -traitlets = ">=5.1" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["pep440", "pre-commit", "pytest", "testpath"] - -[[package]] -name = "nest-asyncio" -version = "1.6.0" -description = "Patch asyncio to allow nested event loops" -optional = false -python-versions = ">=3.5" -files = [ - {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, - {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, -] - -[[package]] -name = "nodeenv" -version = "1.9.1" -description = "Node.js virtual environment builder" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, - {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, -] - -[[package]] -name = "notebook" -version = "7.4.3" -description = "Jupyter Notebook - A web-based notebook environment for interactive computing" -optional = false -python-versions = ">=3.8" -files = [ - {file = "notebook-7.4.3-py3-none-any.whl", hash = "sha256:9cdeee954e04101cadb195d90e2ab62b7c9286c1d4f858bf3bb54e40df16c0c3"}, - {file = "notebook-7.4.3.tar.gz", hash = "sha256:a1567481cd3853f2610ee0ecf5dfa12bb508e878ee8f92152c134ef7f0568a76"}, -] - -[package.dependencies] -jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.4.3,<4.5" -jupyterlab-server = ">=2.27.1,<3" -notebook-shim = ">=0.2,<0.3" -tornado = ">=6.2.0" - -[package.extras] -dev = ["hatch", "pre-commit"] -docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] - -[[package]] -name = "notebook-shim" -version = "0.2.4" -description = "A shim layer for notebook traits and config" -optional = false -python-versions = ">=3.7" -files = [ - {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, - {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, -] - -[package.dependencies] -jupyter-server = ">=1.8,<3" - -[package.extras] -test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] - -[[package]] -name = "numpy" -version = "1.26.4" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, -] - -[[package]] -name = "oauthlib" -version = "3.2.2" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -optional = false -python-versions = ">=3.6" -files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, -] - -[package.extras] -rsa = ["cryptography (>=3.0.0)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] - -[[package]] -name = "opencv-python" -version = "4.11.0.86" -description = "Wrapper package for OpenCV python bindings." -optional = false -python-versions = ">=3.6" -files = [ - {file = "opencv-python-4.11.0.86.tar.gz", hash = "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4"}, - {file = "opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:432f67c223f1dc2824f5e73cdfcd9db0efc8710647d4e813012195dc9122a52a"}, - {file = "opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:9d05ef13d23fe97f575153558653e2d6e87103995d54e6a35db3f282fe1f9c66"}, - {file = "opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b92ae2c8852208817e6776ba1ea0d6b1e0a1b5431e971a2a0ddd2a8cc398202"}, - {file = "opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b02611523803495003bd87362db3e1d2a0454a6a63025dc6658a9830570aa0d"}, - {file = "opencv_python-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:810549cb2a4aedaa84ad9a1c92fbfdfc14090e2749cedf2c1589ad8359aa169b"}, - {file = "opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, - {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, -] - -[[package]] -name = "opt-einsum" -version = "3.4.0" -description = "Path optimization of einsum functions." -optional = false -python-versions = ">=3.8" -files = [ - {file = "opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd"}, - {file = "opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac"}, -] - -[[package]] -name = "overrides" -version = "7.7.0" -description = "A decorator to automatically detect mismatch when overriding a method." -optional = false -python-versions = ">=3.6" -files = [ - {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, - {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, -] - -[[package]] -name = "packaging" -version = "25.0" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, - {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, -] - -[[package]] -name = "paginate" -version = "0.5.7" -description = "Divides large result sets into pages for easier browsing" -optional = false -python-versions = "*" -files = [ - {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, - {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, -] - -[package.extras] -dev = ["pytest", "tox"] -lint = ["black"] - -[[package]] -name = "pandas" -version = "2.3.0" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pandas-2.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:625466edd01d43b75b1883a64d859168e4556261a5035b32f9d743b67ef44634"}, - {file = "pandas-2.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6872d695c896f00df46b71648eea332279ef4077a409e2fe94220208b6bb675"}, - {file = "pandas-2.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4dd97c19bd06bc557ad787a15b6489d2614ddaab5d104a0310eb314c724b2d2"}, - {file = "pandas-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:034abd6f3db8b9880aaee98f4f5d4dbec7c4829938463ec046517220b2f8574e"}, - {file = "pandas-2.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23c2b2dc5213810208ca0b80b8666670eb4660bbfd9d45f58592cc4ddcfd62e1"}, - {file = "pandas-2.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:39ff73ec07be5e90330cc6ff5705c651ace83374189dcdcb46e6ff54b4a72cd6"}, - {file = "pandas-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:40cecc4ea5abd2921682b57532baea5588cc5f80f0231c624056b146887274d2"}, - {file = "pandas-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8adff9f138fc614347ff33812046787f7d43b3cef7c0f0171b3340cae333f6ca"}, - {file = "pandas-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e5f08eb9a445d07720776df6e641975665c9ea12c9d8a331e0f6890f2dcd76ef"}, - {file = "pandas-2.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa35c266c8cd1a67d75971a1912b185b492d257092bdd2709bbdebe574ed228d"}, - {file = "pandas-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a0cc77b0f089d2d2ffe3007db58f170dae9b9f54e569b299db871a3ab5bf46"}, - {file = "pandas-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c06f6f144ad0a1bf84699aeea7eff6068ca5c63ceb404798198af7eb86082e33"}, - {file = "pandas-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ed16339bc354a73e0a609df36d256672c7d296f3f767ac07257801aa064ff73c"}, - {file = "pandas-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:fa07e138b3f6c04addfeaf56cc7fdb96c3b68a3fe5e5401251f231fce40a0d7a"}, - {file = "pandas-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2eb4728a18dcd2908c7fccf74a982e241b467d178724545a48d0caf534b38ebf"}, - {file = "pandas-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9d8c3187be7479ea5c3d30c32a5d73d62a621166675063b2edd21bc47614027"}, - {file = "pandas-2.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ff730713d4c4f2f1c860e36c005c7cefc1c7c80c21c0688fd605aa43c9fcf09"}, - {file = "pandas-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba24af48643b12ffe49b27065d3babd52702d95ab70f50e1b34f71ca703e2c0d"}, - {file = "pandas-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:404d681c698e3c8a40a61d0cd9412cc7364ab9a9cc6e144ae2992e11a2e77a20"}, - {file = "pandas-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6021910b086b3ca756755e86ddc64e0ddafd5e58e076c72cb1585162e5ad259b"}, - {file = "pandas-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:094e271a15b579650ebf4c5155c05dcd2a14fd4fdd72cf4854b2f7ad31ea30be"}, - {file = "pandas-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c7e2fc25f89a49a11599ec1e76821322439d90820108309bf42130d2f36c983"}, - {file = "pandas-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6da97aeb6a6d233fb6b17986234cc723b396b50a3c6804776351994f2a658fd"}, - {file = "pandas-2.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb32dc743b52467d488e7a7c8039b821da2826a9ba4f85b89ea95274f863280f"}, - {file = "pandas-2.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:213cd63c43263dbb522c1f8a7c9d072e25900f6975596f883f4bebd77295d4f3"}, - {file = "pandas-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1d2b33e68d0ce64e26a4acc2e72d747292084f4e8db4c847c6f5f6cbe56ed6d8"}, - {file = "pandas-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:430a63bae10b5086995db1b02694996336e5a8ac9a96b4200572b413dfdfccb9"}, - {file = "pandas-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4930255e28ff5545e2ca404637bcc56f031893142773b3468dc021c6c32a1390"}, - {file = "pandas-2.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f925f1ef673b4bd0271b1809b72b3270384f2b7d9d14a189b12b7fc02574d575"}, - {file = "pandas-2.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78ad363ddb873a631e92a3c063ade1ecfb34cae71e9a2be6ad100f875ac1042"}, - {file = "pandas-2.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951805d146922aed8357e4cc5671b8b0b9be1027f0619cea132a9f3f65f2f09c"}, - {file = "pandas-2.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a881bc1309f3fce34696d07b00f13335c41f5f5a8770a33b09ebe23261cfc67"}, - {file = "pandas-2.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e1991bbb96f4050b09b5f811253c4f3cf05ee89a589379aa36cd623f21a31d6f"}, - {file = "pandas-2.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bb3be958022198531eb7ec2008cfc78c5b1eed51af8600c6c5d9160d89d8d249"}, - {file = "pandas-2.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9efc0acbbffb5236fbdf0409c04edce96bec4bdaa649d49985427bd1ec73e085"}, - {file = "pandas-2.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75651c14fde635e680496148a8526b328e09fe0572d9ae9b638648c46a544ba3"}, - {file = "pandas-2.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5be867a0541a9fb47a4be0c5790a4bccd5b77b92f0a59eeec9375fafc2aa14"}, - {file = "pandas-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84141f722d45d0c2a89544dd29d35b3abfc13d2250ed7e68394eda7564bd6324"}, - {file = "pandas-2.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f95a2aef32614ed86216d3c450ab12a4e82084e8102e355707a1d96e33d51c34"}, - {file = "pandas-2.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e0f51973ba93a9f97185049326d75b942b9aeb472bec616a129806facb129ebb"}, - {file = "pandas-2.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:b198687ca9c8529662213538a9bb1e60fa0bf0f6af89292eb68fea28743fcd5a"}, - {file = "pandas-2.3.0.tar.gz", hash = "sha256:34600ab34ebf1131a7613a260a61dbe8b62c188ec0ea4c296da7c9a06b004133"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.7" - -[package.extras] -all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] -aws = ["s3fs (>=2022.11.0)"] -clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] -compression = ["zstandard (>=0.19.0)"] -computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] -consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] -feather = ["pyarrow (>=10.0.1)"] -fss = ["fsspec (>=2022.11.0)"] -gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] -hdf5 = ["tables (>=3.8.0)"] -html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] -mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] -parquet = ["pyarrow (>=10.0.1)"] -performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] -plot = ["matplotlib (>=3.6.3)"] -postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] -pyarrow = ["pyarrow (>=10.0.1)"] -spss = ["pyreadstat (>=1.2.0)"] -sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] -test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.9.2)"] - -[[package]] -name = "pandocfilters" -version = "1.5.1" -description = "Utilities for writing pandoc filters in python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, - {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, -] - -[[package]] -name = "parso" -version = "0.8.4" -description = "A Python Parser" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, -] - -[package.extras] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["docopt", "pytest"] - -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - -[[package]] -name = "pexpect" -version = "4.9.0" -description = "Pexpect allows easy control of interactive console applications." -optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, - {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pillow" -version = "11.2.1" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047"}, - {file = "pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95"}, - {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61"}, - {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1"}, - {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c"}, - {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d"}, - {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97"}, - {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579"}, - {file = "pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d"}, - {file = "pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad"}, - {file = "pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2"}, - {file = "pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70"}, - {file = "pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf"}, - {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7"}, - {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8"}, - {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600"}, - {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788"}, - {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e"}, - {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e"}, - {file = "pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6"}, - {file = "pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193"}, - {file = "pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7"}, - {file = "pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f"}, - {file = "pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b"}, - {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d"}, - {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4"}, - {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d"}, - {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4"}, - {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443"}, - {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c"}, - {file = "pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3"}, - {file = "pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941"}, - {file = "pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb"}, - {file = "pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28"}, - {file = "pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830"}, - {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0"}, - {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1"}, - {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f"}, - {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155"}, - {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14"}, - {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b"}, - {file = "pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2"}, - {file = "pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691"}, - {file = "pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c"}, - {file = "pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22"}, - {file = "pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7"}, - {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16"}, - {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b"}, - {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406"}, - {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91"}, - {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751"}, - {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9"}, - {file = "pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd"}, - {file = "pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e"}, - {file = "pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681"}, - {file = "pillow-11.2.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7491cf8a79b8eb867d419648fff2f83cb0b3891c8b36da92cc7f1931d46108c8"}, - {file = "pillow-11.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b02d8f9cb83c52578a0b4beadba92e37d83a4ef11570a8688bbf43f4ca50909"}, - {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014ca0050c85003620526b0ac1ac53f56fc93af128f7546623cc8e31875ab928"}, - {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3692b68c87096ac6308296d96354eddd25f98740c9d2ab54e1549d6c8aea9d79"}, - {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f781dcb0bc9929adc77bad571b8621ecb1e4cdef86e940fe2e5b5ee24fd33b35"}, - {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2b490402c96f907a166615e9a5afacf2519e28295f157ec3a2bb9bd57de638cb"}, - {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd6b20b93b3ccc9c1b597999209e4bc5cf2853f9ee66e3fc9a400a78733ffc9a"}, - {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4b835d89c08a6c2ee7781b8dd0a30209a8012b5f09c0a665b65b0eb3560b6f36"}, - {file = "pillow-11.2.1-cp39-cp39-win32.whl", hash = "sha256:b10428b3416d4f9c61f94b494681280be7686bda15898a3a9e08eb66a6d92d67"}, - {file = "pillow-11.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ebce70c3f486acf7591a3d73431fa504a4e18a9b97ff27f5f47b7368e4b9dd1"}, - {file = "pillow-11.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:c27476257b2fdcd7872d54cfd119b3a9ce4610fb85c8e32b70b42e3680a29a1e"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044"}, - {file = "pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] -fpx = ["olefile"] -mic = ["olefile"] -test-arrow = ["pyarrow"] -tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions"] -xmp = ["defusedxml"] - -[[package]] -name = "pint" -version = "0.24.4" -description = "Physical quantities module" -optional = false -python-versions = ">=3.9" -files = [ - {file = "Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659"}, - {file = "pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80"}, -] - -[package.dependencies] -flexcache = ">=0.3" -flexparser = ">=0.4" -platformdirs = ">=2.1.0" -typing-extensions = ">=4.0.0" - -[package.extras] -babel = ["babel (<=2.8)"] -bench = ["pytest", "pytest-codspeed"] -dask = ["dask"] -mip = ["mip (>=1.13)"] -numpy = ["numpy (>=1.23)"] -pandas = ["pint-pandas (>=0.3)"] -test = ["pytest", "pytest-benchmark", "pytest-cov", "pytest-mpl", "pytest-subtests"] -testbase = ["pytest", "pytest-benchmark", "pytest-cov", "pytest-subtests"] -uncertainties = ["uncertainties (>=3.1.6)"] -xarray = ["xarray"] - -[[package]] -name = "platformdirs" -version = "4.3.8" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.9" -files = [ - {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, - {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, -] - -[package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.14.1)"] - -[[package]] -name = "pluggy" -version = "1.6.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, - {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["coverage", "pytest", "pytest-benchmark"] - -[[package]] -name = "portpicker" -version = "1.6.0" -description = "A library to choose unique available network ports." -optional = false -python-versions = ">=3.6" -files = [ - {file = "portpicker-1.6.0-py3-none-any.whl", hash = "sha256:b2787a41404cf7edbe29b07b9e0ed863b09f2665dcc01c1eb0c2261c1e7d0755"}, - {file = "portpicker-1.6.0.tar.gz", hash = "sha256:bd507fd6f96f65ee02781f2e674e9dc6c99bbfa6e3c39992e3916204c9d431fa"}, -] - -[package.dependencies] -psutil = "*" - -[[package]] -name = "pre-commit" -version = "4.2.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -optional = false -python-versions = ">=3.9" -files = [ - {file = "pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd"}, - {file = "pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146"}, -] - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -virtualenv = ">=20.10.0" - -[[package]] -name = "prometheus-client" -version = "0.22.1" -description = "Python client for the Prometheus monitoring system." -optional = false -python-versions = ">=3.9" -files = [ - {file = "prometheus_client-0.22.1-py3-none-any.whl", hash = "sha256:cca895342e308174341b2cbf99a56bef291fbc0ef7b9e5412a0f26d653ba7094"}, - {file = "prometheus_client-0.22.1.tar.gz", hash = "sha256:190f1331e783cf21eb60bca559354e0a4d4378facecf78f5428c39b675d20d28"}, -] - -[package.extras] -twisted = ["twisted"] - -[[package]] -name = "prompt-toolkit" -version = "3.0.51" -description = "Library for building powerful interactive command lines in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, - {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, -] - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "protobuf" -version = "3.20.3" -description = "Protocol Buffers" -optional = false -python-versions = ">=3.7" -files = [ - {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, - {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, - {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, - {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, - {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, - {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, - {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, - {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, - {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, - {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, - {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, - {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, - {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, - {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, - {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, - {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, - {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, - {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, - {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, - {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, - {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, - {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, -] - -[[package]] -name = "psutil" -version = "7.0.0" -description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." -optional = false -python-versions = ">=3.6" -files = [ - {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, - {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, - {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, - {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, - {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, - {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, - {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, -] - -[package.extras] -dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] -test = ["pytest", "pytest-xdist", "setuptools"] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.3" -description = "Safely evaluate AST nodes without side effects" -optional = false -python-versions = "*" -files = [ - {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, - {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, -] - -[package.extras] -tests = ["pytest"] - -[[package]] -name = "pvlib" -version = "0.13.1" -description = "A set of functions and classes for simulating the performance of photovoltaic energy systems." -optional = false -python-versions = ">=3.10" -files = [ - {file = "pvlib-0.13.1-py3-none-any.whl", hash = "sha256:7de5c71b2f6b92f66eb4ac5d7d26a145c209cc6036dd1c90a7a323bc097b3e46"}, - {file = "pvlib-0.13.1.tar.gz", hash = "sha256:a93fd118d048b787db66c234486c05c0c65cf09db344d82083961bc826adf46f"}, -] - -[package.dependencies] -h5py = "*" -numpy = ">=1.21.2" -pandas = ">=1.3.3" -pytz = "*" -requests = "*" -scipy = ">=1.7.2" - -[package.extras] -all = ["pvlib[doc,optional,test]"] -doc = ["docutils (==0.21)", "ipython", "matplotlib", "pickleshare", "pillow", "pydata-sphinx-theme (==0.15.4)", "solarfactors", "sphinx (==7.3.7)", "sphinx-favicon", "sphinx-gallery", "sphinx-hoverxref (>=1.4.2,<1.5.0)", "sphinx-toggleprompt (==0.5.2)"] -optional = ["cython", "ephem", "nrel-pysam", "numba (>=0.17.0)", "solarfactors", "statsmodels"] -test = ["packaging", "pytest", "pytest-cov", "pytest-mock", "pytest-remotedata", "pytest-rerunfailures", "pytest-timeout", "requests-mock"] - -[[package]] -name = "pyasn1" -version = "0.6.1" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, - {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.2" -description = "A collection of ASN.1-based protocols modules" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"}, - {file = "pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"}, -] - -[package.dependencies] -pyasn1 = ">=0.6.1,<0.7.0" - -[[package]] -name = "pycparser" -version = "2.22" -description = "C parser in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, -] - -[[package]] -name = "pygame" -version = "2.1.3" -description = "Python Game Development" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pygame-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bfc8a0d863470ec673ff267caaff59b858e967ef78170dc04fc318a7c5f9dd33"}, - {file = "pygame-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:64d37dc04a14df9519e2e87611cac6a144c6204365e3fdb0bfb86fa459e32f38"}, - {file = "pygame-2.1.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d9764bb10f61a1137aa1118b832417c52e53da19971f4fa94605ea5bd4acc92b"}, - {file = "pygame-2.1.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6403f1705fc3b4fc2a51e06f3a7102cc1ed9884dc9ff5b99a4cac0d65255ad58"}, - {file = "pygame-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab841fe3a4c703cc021d3bb466a9bf5df41edfa3267c44fff5bd6f47944cd4c3"}, - {file = "pygame-2.1.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:009e9886a463f4cb86e5d11024fafb6b9a5f5808d21c4df66938922adc6ee90b"}, - {file = "pygame-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b75481cc17a22679c69014ef2322d55cfa66be0923abbd9206e01ef10bb5dab6"}, - {file = "pygame-2.1.3-cp310-cp310-win32.whl", hash = "sha256:1924826a32cc49c0d6b2e523f05e2ea608e1ff631ba595a910ddf37a8b38ee77"}, - {file = "pygame-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:ba578c5cac85358566de3010b3f3393df3b936b310eba6811abbae5241ec19c0"}, - {file = "pygame-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cb0493d0f7fa378fccfc65548aec92edeadbde981c964337f11c884432bfaa35"}, - {file = "pygame-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:217072e80f470847e121b5c5658f89be35e2c1c3ab23d4126fe80fc64fd34d27"}, - {file = "pygame-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55374e1afb72c6dc546fb1d9ac972de2adf642de69ec7003e66023254512f1e5"}, - {file = "pygame-2.1.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9f24b4aeba86e882f3640c4251b0325f86556a5f2661bd7c9e3dc1c9fe966c6"}, - {file = "pygame-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f04d89bdf7951e9fde68c7174b522befd9ae6e5c2a75d195435223df044aaacc"}, - {file = "pygame-2.1.3-cp311-cp311-win32.whl", hash = "sha256:bf1024e516fd3a3948ec45f0ad3b63e69f66c342e4678b2e04a383f735272b8f"}, - {file = "pygame-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:e18c6b0fa9e39ad3fe68e48ace92285c026ee70f05bf4dfa54a33fa89f7a0474"}, - {file = "pygame-2.1.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f71cfb9f161473511543ba8e713f1b34c6b00c70412ecd2d71111da82fe7f062"}, - {file = "pygame-2.1.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:21a4fbc7462d3b8bd9692a6198fb031a80a85e7ac24cfcee382901b2b57db67c"}, - {file = "pygame-2.1.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:868ec3a2b87fdca43b4f4ef8314d4fb00c4d9ef6e732f5a9b0348ae3d015de3d"}, - {file = "pygame-2.1.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154a0a0a953006e8ab90353055037b6710e00aa19941e2fbc1b4f0358e1a4882"}, - {file = "pygame-2.1.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:787fff1984107da0c533d2e87c85b0082788c8b24952adf9f0bc6459be485e7f"}, - {file = "pygame-2.1.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf5b5fbb526fe76b0eb5a076b94afd29e0a91bc1ba9d6b573fad9722b7e8a5d9"}, - {file = "pygame-2.1.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fbbd59b95017824a9b7c3695b13f2df27a64c557c42970a6cad2e26dd5f4f31"}, - {file = "pygame-2.1.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:261fd434d869e1ae285b3ca90112d62c712fde53679e1bce3dfcee79e93f2b06"}, - {file = "pygame-2.1.3-cp36-cp36m-win32.whl", hash = "sha256:1e083351df89cc0f9ce003cff003d420fa0362e9fd00a793c9a68fc8cd0a2e5f"}, - {file = "pygame-2.1.3-cp36-cp36m-win_amd64.whl", hash = "sha256:0b182a6010f16571b1a92e34208ac1e9ad01a725f2fa3c1ad158c4b515ae12de"}, - {file = "pygame-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:240f920f846150ffb2c217d75cd1005989fbedd007df82949db361934bfa9660"}, - {file = "pygame-2.1.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4ef7f1f7d37ffddee63569b5d09f693d0704b04e7c2ff5af90bf61e4cdffe6c7"}, - {file = "pygame-2.1.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:caa4c10f79793b7be9eb1e647f84eee3e9ebb79d143d72eecaaaeb94eb44e1c1"}, - {file = "pygame-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5760ea0f181c8395bc39fdb50000ce2b77d453ba4c0d98e00303a89af6ae5f0"}, - {file = "pygame-2.1.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc1bbb23e4f32b361956275bdde5992893981362fd37c0e62586537400bd4a4b"}, - {file = "pygame-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a139c4290fa5227ccead2c57f6e41195c22f643e0fb7336c9da0c734c9df3cd4"}, - {file = "pygame-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b358abc054bf94fede79bb213f7ac9dd8a8737c8ac48a6bb0fa72314c147bd76"}, - {file = "pygame-2.1.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c9d827fbd093d5d4ef35bd9ec2994535b5f37af15860975be7e59a2d415b51c7"}, - {file = "pygame-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:97b0ec29c9810ca1125df013656e13a89388e5ca72fdd4d900235bceaed30349"}, - {file = "pygame-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0e8cb75c4cb8ae512e4f3d5410ea64359b049f7825a6e8a9010fdf5c539b8433"}, - {file = "pygame-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a0420eb1015abb3ebba4d29c1239010eac4d82a36b94659847d18af218293aa4"}, - {file = "pygame-2.1.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c473efee52359806d8c0a876f42ccb7ead088e7ae8f5d31e6e43f94793c943ea"}, - {file = "pygame-2.1.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5581841a9baa902d7efc243d3d03ae380f929e90d98ecccbbd49b1fa03e0a6ff"}, - {file = "pygame-2.1.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1758bbf986efc9f08344c7eae733f6d04f596745f737bc4c02412b809ac65d58"}, - {file = "pygame-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd54e859e1b626c332e254128db30e5d6d33544c10154a1ec7a052cac6a50a4"}, - {file = "pygame-2.1.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:986805fbc0827bf8b8dd8c52aa4ce2fbd4475d51fe1df326bf3e788c1b9f59fd"}, - {file = "pygame-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e26c4bb679e7514a7f6c69ca8a68a495013bf46f200476d334459c44a733356f"}, - {file = "pygame-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4908fc837fd9f68b6cfdfeffb99b342c25cf770d76768498dc4c066c2f8b2776"}, - {file = "pygame-2.1.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fa8efe34b13a6bfb37e627c2b28e9967b87cd01de92cd000852e08ef8aed1cf0"}, - {file = "pygame-2.1.3-cp38-cp38-win32.whl", hash = "sha256:867498b0ac20f5c981dcc3ee00262d06b3806b355c632f42c11f5b716ccb2ba1"}, - {file = "pygame-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:7b06978de0400276e451cbbbba80cc9566cf5663dbb8518b7ec598078440de06"}, - {file = "pygame-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:565cccf5bf47e2ec577a0c237919aef9da66d075e982d339fae31e37734e02b8"}, - {file = "pygame-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af925800444941cea5e45eb94954e5335006fb1b5d35d996e22b3f616e9e0e8e"}, - {file = "pygame-2.1.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:50934f9efc6f51d1c4408b607d34162f74ec0763628c6384e062f6bc3e97d98a"}, - {file = "pygame-2.1.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5624318d189403dde7c58bdb62c340edd0faad6f18a6cf46a9f6923a66db2ba4"}, - {file = "pygame-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45cfe97fa4de560d866f53afbf3c61136bfb4114eb585ac4b6c82c278baf2c1c"}, - {file = "pygame-2.1.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:06e8e4d04f8d57969689d9316bbffc7e4b9862534541535b6e892e410c4f4248"}, - {file = "pygame-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41baee1b5502b7472df0eb59af66ee347ac8ef042b08b553c85546e34daa736a"}, - {file = "pygame-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0745fc99d104c71bf90c70c09a541b7922ba47391e16e9629490722fc1f3e46b"}, - {file = "pygame-2.1.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b0bfcc7359308748edfe277137efd19f21e5b22373f106848d64dc048db22701"}, - {file = "pygame-2.1.3-cp39-cp39-win32.whl", hash = "sha256:df450cc4342d5664accfdd895c5ee380710eaf16942722117c01deab3373bb35"}, - {file = "pygame-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:d61bbd7a071d80706fd6337abd96484398dc04b3245e8e5df4e7c99e3676086b"}, - {file = "pygame-2.1.3-pp36-pypy36_pp73-win32.whl", hash = "sha256:8fa2701374d3125084b2fd1f9c6d056e7e0fb8ec655e46a5fa1531b7e419fa69"}, - {file = "pygame-2.1.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:595b639fab8a1acafe78050ef71668eae0a22fb5efa022b0cd2bce26a15a371d"}, - {file = "pygame-2.1.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad0835f1406a8589ebe7447801a47ff68c16b753d2b27193947e21c8adbac8c1"}, - {file = "pygame-2.1.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:704cb29a380b8e84d4051300e7eccd918e35cb8c44ae931fc0ec8c942e42c71f"}, - {file = "pygame-2.1.3-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:787c1f46905c2f6dd0310144fa7c61cb54d97990c477992601555edf01699f95"}, - {file = "pygame-2.1.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26e9f1385dddffe605d8afbcba1f90f81156deadbc27327dcc844eb71e24ffa"}, - {file = "pygame-2.1.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f9fe7d817ae099f1b1fd0aac7502f7472a3ba18b068efa3dc30b5d293760565a"}, - {file = "pygame-2.1.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f8207ed3feeda63df711245bec8613809b7aea71db7d0a1515268c5bd6f52d"}, - {file = "pygame-2.1.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff16c4cffa9958935d39eed73e5a707fc6e86b85f1ec06baf7172c555801730d"}, - {file = "pygame-2.1.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d138b15cf378b3755e1e48ea49f0f0406067ada2c176bc6489e70bc836ab72d"}, - {file = "pygame-2.1.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f2c3c25a1018495011dd0734df4f23ddf6e88037e884b9ecb03ef33a17c5b4c"}, - {file = "pygame-2.1.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd259998a71a2f7793a4e5d5fc31493f7c7d9ec73e4320895145e7dbc1c8e48d"}, - {file = "pygame-2.1.3.tar.gz", hash = "sha256:df29c4369df9231eebffac801fa7af021279d7e9dc4c1cae698cc4077c98d069"}, -] - -[[package]] -name = "pygments" -version = "2.19.1" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, - {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, -] - -[package.extras] -windows-terminal = ["colorama (>=0.4.6)"] - -[[package]] -name = "pyink" -version = "24.10.1" -description = "Pyink is a python formatter, forked from Black with slightly different behavior." -optional = false -python-versions = ">=3.9" -files = [ - {file = "pyink-24.10.1-py3-none-any.whl", hash = "sha256:6349bf6ab75e2ea39a5f0bc3dee7ede7f4af8529291472638026de5fd4af80d2"}, - {file = "pyink-24.10.1.tar.gz", hash = "sha256:5ec4339aa4953f796e88d90bcac3e3472161e4c36dbde203d80f5f76721ac718"}, -] - -[package.dependencies] -black = "24.10.0" -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "pylint" -version = "3.3.7" -description = "python code static checker" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "pylint-3.3.7-py3-none-any.whl", hash = "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d"}, - {file = "pylint-3.3.7.tar.gz", hash = "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559"}, -] - -[package.dependencies] -astroid = ">=3.3.8,<=3.4.0.dev0" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = [ - {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, -] -isort = ">=4.2.5,<5.13 || >5.13,<7" -mccabe = ">=0.6,<0.8" -platformdirs = ">=2.2" -tomli = {version = ">=1.1", markers = "python_version < \"3.11\""} -tomlkit = ">=0.10.1" - -[package.extras] -spelling = ["pyenchant (>=3.2,<4.0)"] -testutils = ["gitpython (>3)"] - -[[package]] -name = "pylint-per-file-ignores" -version = "1.4.0" -description = "A pylint plugin to ignore error codes per file." -optional = false -python-versions = "<4.0.0,>=3.8.1" -files = [ - {file = "pylint_per_file_ignores-1.4.0-py3-none-any.whl", hash = "sha256:0cd82d22551738b4e63a0aa1dab2a1fc4016e8f27f1429159616483711e122fd"}, - {file = "pylint_per_file_ignores-1.4.0.tar.gz", hash = "sha256:c0de7b3d0169571aefaa1ac3a82a265641b8825b54a0b6f5ef27c3b76b988609"}, -] - -[package.dependencies] -tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "pymdown-extensions" -version = "10.15" -description = "Extension pack for Python Markdown." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pymdown_extensions-10.15-py3-none-any.whl", hash = "sha256:46e99bb272612b0de3b7e7caf6da8dd5f4ca5212c0b273feb9304e236c484e5f"}, - {file = "pymdown_extensions-10.15.tar.gz", hash = "sha256:0e5994e32155f4b03504f939e501b981d306daf7ec2aa1cd2eb6bd300784f8f7"}, -] - -[package.dependencies] -markdown = ">=3.6" -pyyaml = "*" - -[package.extras] -extra = ["pygments (>=2.19.1)"] - -[[package]] -name = "pyparsing" -version = "3.2.3" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, - {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pytest" -version = "8.4.0" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e"}, - {file = "pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6"}, -] - -[package.dependencies] -colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} -iniconfig = ">=1" -packaging = ">=20" -pluggy = ">=1.5,<2" -pygments = ">=2.7.2" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} - -[package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "1.1.0" -description = "Read key-value pairs from a .env file and set them as environment variables" -optional = false -python-versions = ">=3.9" -files = [ - {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, - {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "python-json-logger" -version = "3.3.0" -description = "JSON Log Formatter for the Python Logging Package" -optional = false -python-versions = ">=3.8" -files = [ - {file = "python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7"}, - {file = "python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84"}, -] - -[package.extras] -dev = ["backports.zoneinfo", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec", "mypy", "orjson", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] - -[[package]] -name = "pytz" -version = "2024.2" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, - {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, -] - -[[package]] -name = "pywin32" -version = "310" -description = "Python for Window Extensions" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, - {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, - {file = "pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213"}, - {file = "pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd"}, - {file = "pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c"}, - {file = "pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582"}, - {file = "pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d"}, - {file = "pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060"}, - {file = "pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966"}, - {file = "pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab"}, - {file = "pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e"}, - {file = "pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33"}, - {file = "pywin32-310-cp38-cp38-win32.whl", hash = "sha256:0867beb8addefa2e3979d4084352e4ac6e991ca45373390775f7084cc0209b9c"}, - {file = "pywin32-310-cp38-cp38-win_amd64.whl", hash = "sha256:30f0a9b3138fb5e07eb4973b7077e1883f558e40c578c6925acc7a94c34eaa36"}, - {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, - {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, -] - -[[package]] -name = "pywinpty" -version = "2.0.15" -description = "Pseudo terminal support for Windows from Python." -optional = false -python-versions = ">=3.9" -files = [ - {file = "pywinpty-2.0.15-cp310-cp310-win_amd64.whl", hash = "sha256:8e7f5de756a615a38b96cd86fa3cd65f901ce54ce147a3179c45907fa11b4c4e"}, - {file = "pywinpty-2.0.15-cp311-cp311-win_amd64.whl", hash = "sha256:9a6bcec2df2707aaa9d08b86071970ee32c5026e10bcc3cc5f6f391d85baf7ca"}, - {file = "pywinpty-2.0.15-cp312-cp312-win_amd64.whl", hash = "sha256:83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc"}, - {file = "pywinpty-2.0.15-cp313-cp313-win_amd64.whl", hash = "sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408"}, - {file = "pywinpty-2.0.15-cp313-cp313t-win_amd64.whl", hash = "sha256:a4560ad8c01e537708d2790dbe7da7d986791de805d89dd0d3697ca59e9e4901"}, - {file = "pywinpty-2.0.15-cp39-cp39-win_amd64.whl", hash = "sha256:d261cd88fcd358cfb48a7ca0700db3e1c088c9c10403c9ebc0d8a8b57aa6a117"}, - {file = "pywinpty-2.0.15.tar.gz", hash = "sha256:312cf39153a8736c617d45ce8b6ad6cd2107de121df91c455b10ce6bba7a39b2"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "pyyaml-env-tag" -version = "1.1" -description = "A custom YAML tag for referencing environment variables in YAML files." -optional = false -python-versions = ">=3.9" -files = [ - {file = "pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04"}, - {file = "pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff"}, -] - -[package.dependencies] -pyyaml = "*" - -[[package]] -name = "pyzmq" -version = "26.4.0" -description = "Python bindings for 0MQ" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyzmq-26.4.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:0329bdf83e170ac133f44a233fc651f6ed66ef8e66693b5af7d54f45d1ef5918"}, - {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:398a825d2dea96227cf6460ce0a174cf7657d6f6827807d4d1ae9d0f9ae64315"}, - {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d52d62edc96787f5c1dfa6c6ccff9b581cfae5a70d94ec4c8da157656c73b5b"}, - {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1410c3a3705db68d11eb2424d75894d41cff2f64d948ffe245dd97a9debfebf4"}, - {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7dacb06a9c83b007cc01e8e5277f94c95c453c5851aac5e83efe93e72226353f"}, - {file = "pyzmq-26.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6bab961c8c9b3a4dc94d26e9b2cdf84de9918931d01d6ff38c721a83ab3c0ef5"}, - {file = "pyzmq-26.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a5c09413b924d96af2aa8b57e76b9b0058284d60e2fc3730ce0f979031d162a"}, - {file = "pyzmq-26.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d489ac234d38e57f458fdbd12a996bfe990ac028feaf6f3c1e81ff766513d3b"}, - {file = "pyzmq-26.4.0-cp310-cp310-win32.whl", hash = "sha256:dea1c8db78fb1b4b7dc9f8e213d0af3fc8ecd2c51a1d5a3ca1cde1bda034a980"}, - {file = "pyzmq-26.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa59e1f5a224b5e04dc6c101d7186058efa68288c2d714aa12d27603ae93318b"}, - {file = "pyzmq-26.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:a651fe2f447672f4a815e22e74630b6b1ec3a1ab670c95e5e5e28dcd4e69bbb5"}, - {file = "pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54"}, - {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030"}, - {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01"}, - {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e"}, - {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88"}, - {file = "pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6"}, - {file = "pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df"}, - {file = "pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef"}, - {file = "pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca"}, - {file = "pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896"}, - {file = "pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3"}, - {file = "pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b"}, - {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905"}, - {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b"}, - {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63"}, - {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5"}, - {file = "pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b"}, - {file = "pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84"}, - {file = "pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f"}, - {file = "pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44"}, - {file = "pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be"}, - {file = "pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0"}, - {file = "pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3"}, - {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43"}, - {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6"}, - {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e"}, - {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771"}, - {file = "pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30"}, - {file = "pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86"}, - {file = "pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101"}, - {file = "pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637"}, - {file = "pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b"}, - {file = "pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08"}, - {file = "pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4"}, - {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a"}, - {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b"}, - {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d"}, - {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf"}, - {file = "pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c"}, - {file = "pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8"}, - {file = "pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364"}, - {file = "pyzmq-26.4.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:831cc53bf6068d46d942af52fa8b0b9d128fb39bcf1f80d468dc9a3ae1da5bfb"}, - {file = "pyzmq-26.4.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:51d18be6193c25bd229524cfac21e39887c8d5e0217b1857998dfbef57c070a4"}, - {file = "pyzmq-26.4.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:445c97854204119ae2232503585ebb4fa7517142f71092cb129e5ee547957a1f"}, - {file = "pyzmq-26.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:807b8f4ad3e6084412c0f3df0613269f552110fa6fb91743e3e306223dbf11a6"}, - {file = "pyzmq-26.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c01d109dd675ac47fa15c0a79d256878d898f90bc10589f808b62d021d2e653c"}, - {file = "pyzmq-26.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0a294026e28679a8dd64c922e59411cb586dad307661b4d8a5c49e7bbca37621"}, - {file = "pyzmq-26.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:22c8dd677274af8dfb1efd05006d6f68fb2f054b17066e308ae20cb3f61028cf"}, - {file = "pyzmq-26.4.0-cp38-cp38-win32.whl", hash = "sha256:14fc678b696bc42c14e2d7f86ac4e97889d5e6b94d366ebcb637a768d2ad01af"}, - {file = "pyzmq-26.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d1ef0a536662bbbdc8525f7e2ef19e74123ec9c4578e0582ecd41aedc414a169"}, - {file = "pyzmq-26.4.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:a88643de8abd000ce99ca72056a1a2ae15881ee365ecb24dd1d9111e43d57842"}, - {file = "pyzmq-26.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a744ce209ecb557406fb928f3c8c55ce79b16c3eeb682da38ef5059a9af0848"}, - {file = "pyzmq-26.4.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9434540f333332224ecb02ee6278b6c6f11ea1266b48526e73c903119b2f420f"}, - {file = "pyzmq-26.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c6f0a23e55cd38d27d4c89add963294ea091ebcb104d7fdab0f093bc5abb1c"}, - {file = "pyzmq-26.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6145df55dc2309f6ef72d70576dcd5aabb0fd373311613fe85a5e547c722b780"}, - {file = "pyzmq-26.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2ea81823840ef8c56e5d2f9918e4d571236294fea4d1842b302aebffb9e40997"}, - {file = "pyzmq-26.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc2abc385dc37835445abe206524fbc0c9e3fce87631dfaa90918a1ba8f425eb"}, - {file = "pyzmq-26.4.0-cp39-cp39-win32.whl", hash = "sha256:41a2508fe7bed4c76b4cf55aacfb8733926f59d440d9ae2b81ee8220633b4d12"}, - {file = "pyzmq-26.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:d4000e8255d6cbce38982e5622ebb90823f3409b7ffe8aeae4337ef7d6d2612a"}, - {file = "pyzmq-26.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f6919d9c120488246bdc2a2f96662fa80d67b35bd6d66218f457e722b3ff64"}, - {file = "pyzmq-26.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:98d948288ce893a2edc5ec3c438fe8de2daa5bbbd6e2e865ec5f966e237084ba"}, - {file = "pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9f34f5c9e0203ece706a1003f1492a56c06c0632d86cb77bcfe77b56aacf27b"}, - {file = "pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80c9b48aef586ff8b698359ce22f9508937c799cc1d2c9c2f7c95996f2300c94"}, - {file = "pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f2a5b74009fd50b53b26f65daff23e9853e79aa86e0aa08a53a7628d92d44a"}, - {file = "pyzmq-26.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:61c5f93d7622d84cb3092d7f6398ffc77654c346545313a3737e266fc11a3beb"}, - {file = "pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb"}, - {file = "pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1"}, - {file = "pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494"}, - {file = "pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9"}, - {file = "pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0"}, - {file = "pyzmq-26.4.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:91c3ffaea475ec8bb1a32d77ebc441dcdd13cd3c4c284a6672b92a0f5ade1917"}, - {file = "pyzmq-26.4.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d9a78a52668bf5c9e7b0da36aa5760a9fc3680144e1445d68e98df78a25082ed"}, - {file = "pyzmq-26.4.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b70cab356ff8c860118b89dc86cd910c73ce2127eb986dada4fbac399ef644cf"}, - {file = "pyzmq-26.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acae207d4387780838192326b32d373bb286da0b299e733860e96f80728eb0af"}, - {file = "pyzmq-26.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f928eafd15794aa4be75463d537348b35503c1e014c5b663f206504ec1a90fe4"}, - {file = "pyzmq-26.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:552b0d2e39987733e1e9e948a0ced6ff75e0ea39ab1a1db2fc36eb60fd8760db"}, - {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd670a8aa843f2ee637039bbd412e0d7294a5e588e1ecc9ad98b0cdc050259a4"}, - {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d367b7b775a0e1e54a59a2ba3ed4d5e0a31566af97cc9154e34262777dab95ed"}, - {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112af16c406e4a93df2caef49f884f4c2bb2b558b0b5577ef0b2465d15c1abc"}, - {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c76c298683f82669cab0b6da59071f55238c039738297c69f187a542c6d40099"}, - {file = "pyzmq-26.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:49b6ca2e625b46f499fb081aaf7819a177f41eeb555acb05758aa97f4f95d147"}, - {file = "pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d"}, -] - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "referencing" -version = "0.36.2" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, - {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" -typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} - -[[package]] -name = "requests" -version = "2.32.4" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, - {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset_normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-oauthlib" -version = "2.0.0" -description = "OAuthlib authentication support for Requests." -optional = false -python-versions = ">=3.4" -files = [ - {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, - {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, -] - -[package.dependencies] -oauthlib = ">=3.0.0" -requests = ">=2.0.0" - -[package.extras] -rsa = ["oauthlib[signedtoken] (>=3.0.0)"] - -[[package]] -name = "rfc3339-validator" -version = "0.1.4" -description = "A pure python RFC3339 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, - {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "rfc3986-validator" -version = "0.1.1" -description = "Pure python rfc3986 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, - {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, -] - -[[package]] -name = "rpds-py" -version = "0.25.1" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.9" -files = [ - {file = "rpds_py-0.25.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f4ad628b5174d5315761b67f212774a32f5bad5e61396d38108bd801c0a8f5d9"}, - {file = "rpds_py-0.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c742af695f7525e559c16f1562cf2323db0e3f0fbdcabdf6865b095256b2d40"}, - {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:605ffe7769e24b1800b4d024d24034405d9404f0bc2f55b6db3362cd34145a6f"}, - {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ccc6f3ddef93243538be76f8e47045b4aad7a66a212cd3a0f23e34469473d36b"}, - {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f70316f760174ca04492b5ab01be631a8ae30cadab1d1081035136ba12738cfa"}, - {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1dafef8df605fdb46edcc0bf1573dea0d6d7b01ba87f85cd04dc855b2b4479e"}, - {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0701942049095741a8aeb298a31b203e735d1c61f4423511d2b1a41dcd8a16da"}, - {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e87798852ae0b37c88babb7f7bbbb3e3fecc562a1c340195b44c7e24d403e380"}, - {file = "rpds_py-0.25.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3bcce0edc1488906c2d4c75c94c70a0417e83920dd4c88fec1078c94843a6ce9"}, - {file = "rpds_py-0.25.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e2f6a2347d3440ae789505693a02836383426249d5293541cd712e07e7aecf54"}, - {file = "rpds_py-0.25.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4fd52d3455a0aa997734f3835cbc4c9f32571345143960e7d7ebfe7b5fbfa3b2"}, - {file = "rpds_py-0.25.1-cp310-cp310-win32.whl", hash = "sha256:3f0b1798cae2bbbc9b9db44ee068c556d4737911ad53a4e5093d09d04b3bbc24"}, - {file = "rpds_py-0.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:3ebd879ab996537fc510a2be58c59915b5dd63bccb06d1ef514fee787e05984a"}, - {file = "rpds_py-0.25.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5f048bbf18b1f9120685c6d6bb70cc1a52c8cc11bdd04e643d28d3be0baf666d"}, - {file = "rpds_py-0.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fbb0dbba559959fcb5d0735a0f87cdbca9e95dac87982e9b95c0f8f7ad10255"}, - {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4ca54b9cf9d80b4016a67a0193ebe0bcf29f6b0a96f09db942087e294d3d4c2"}, - {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ee3e26eb83d39b886d2cb6e06ea701bba82ef30a0de044d34626ede51ec98b0"}, - {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89706d0683c73a26f76a5315d893c051324d771196ae8b13e6ffa1ffaf5e574f"}, - {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2013ee878c76269c7b557a9a9c042335d732e89d482606990b70a839635feb7"}, - {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45e484db65e5380804afbec784522de84fa95e6bb92ef1bd3325d33d13efaebd"}, - {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:48d64155d02127c249695abb87d39f0faf410733428d499867606be138161d65"}, - {file = "rpds_py-0.25.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:048893e902132fd6548a2e661fb38bf4896a89eea95ac5816cf443524a85556f"}, - {file = "rpds_py-0.25.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0317177b1e8691ab5879f4f33f4b6dc55ad3b344399e23df2e499de7b10a548d"}, - {file = "rpds_py-0.25.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bffcf57826d77a4151962bf1701374e0fc87f536e56ec46f1abdd6a903354042"}, - {file = "rpds_py-0.25.1-cp311-cp311-win32.whl", hash = "sha256:cda776f1967cb304816173b30994faaf2fd5bcb37e73118a47964a02c348e1bc"}, - {file = "rpds_py-0.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:dc3c1ff0abc91444cd20ec643d0f805df9a3661fcacf9c95000329f3ddf268a4"}, - {file = "rpds_py-0.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:5a3ddb74b0985c4387719fc536faced33cadf2172769540c62e2a94b7b9be1c4"}, - {file = "rpds_py-0.25.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5ffe453cde61f73fea9430223c81d29e2fbf412a6073951102146c84e19e34c"}, - {file = "rpds_py-0.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:115874ae5e2fdcfc16b2aedc95b5eef4aebe91b28e7e21951eda8a5dc0d3461b"}, - {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a714bf6e5e81b0e570d01f56e0c89c6375101b8463999ead3a93a5d2a4af91fa"}, - {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35634369325906bcd01577da4c19e3b9541a15e99f31e91a02d010816b49bfda"}, - {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4cb2b3ddc16710548801c6fcc0cfcdeeff9dafbc983f77265877793f2660309"}, - {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ceca1cf097ed77e1a51f1dbc8d174d10cb5931c188a4505ff9f3e119dfe519b"}, - {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2cd1a4b0c2b8c5e31ffff50d09f39906fe351389ba143c195566056c13a7ea"}, - {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de336a4b164c9188cb23f3703adb74a7623ab32d20090d0e9bf499a2203ad65"}, - {file = "rpds_py-0.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9fca84a15333e925dd59ce01da0ffe2ffe0d6e5d29a9eeba2148916d1824948c"}, - {file = "rpds_py-0.25.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88ec04afe0c59fa64e2f6ea0dd9657e04fc83e38de90f6de201954b4d4eb59bd"}, - {file = "rpds_py-0.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8bd2f19e312ce3e1d2c635618e8a8d8132892bb746a7cf74780a489f0f6cdcb"}, - {file = "rpds_py-0.25.1-cp312-cp312-win32.whl", hash = "sha256:e5e2f7280d8d0d3ef06f3ec1b4fd598d386cc6f0721e54f09109a8132182fbfe"}, - {file = "rpds_py-0.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:db58483f71c5db67d643857404da360dce3573031586034b7d59f245144cc192"}, - {file = "rpds_py-0.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:6d50841c425d16faf3206ddbba44c21aa3310a0cebc3c1cdfc3e3f4f9f6f5728"}, - {file = "rpds_py-0.25.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:659d87430a8c8c704d52d094f5ba6fa72ef13b4d385b7e542a08fc240cb4a559"}, - {file = "rpds_py-0.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68f6f060f0bbdfb0245267da014d3a6da9be127fe3e8cc4a68c6f833f8a23bb1"}, - {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083a9513a33e0b92cf6e7a6366036c6bb43ea595332c1ab5c8ae329e4bcc0a9c"}, - {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:816568614ecb22b18a010c7a12559c19f6fe993526af88e95a76d5a60b8b75fb"}, - {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c6564c0947a7f52e4792983f8e6cf9bac140438ebf81f527a21d944f2fd0a40"}, - {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c4a128527fe415d73cf1f70a9a688d06130d5810be69f3b553bf7b45e8acf79"}, - {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e1d7a4978ed554f095430b89ecc23f42014a50ac385eb0c4d163ce213c325"}, - {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d74ec9bc0e2feb81d3f16946b005748119c0f52a153f6db6a29e8cd68636f295"}, - {file = "rpds_py-0.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3af5b4cc10fa41e5bc64e5c198a1b2d2864337f8fcbb9a67e747e34002ce812b"}, - {file = "rpds_py-0.25.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79dc317a5f1c51fd9c6a0c4f48209c6b8526d0524a6904fc1076476e79b00f98"}, - {file = "rpds_py-0.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1521031351865e0181bc585147624d66b3b00a84109b57fcb7a779c3ec3772cd"}, - {file = "rpds_py-0.25.1-cp313-cp313-win32.whl", hash = "sha256:5d473be2b13600b93a5675d78f59e63b51b1ba2d0476893415dfbb5477e65b31"}, - {file = "rpds_py-0.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7b74e92a3b212390bdce1d93da9f6488c3878c1d434c5e751cbc202c5e09500"}, - {file = "rpds_py-0.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:dd326a81afe332ede08eb39ab75b301d5676802cdffd3a8f287a5f0b694dc3f5"}, - {file = "rpds_py-0.25.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a58d1ed49a94d4183483a3ce0af22f20318d4a1434acee255d683ad90bf78129"}, - {file = "rpds_py-0.25.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f251bf23deb8332823aef1da169d5d89fa84c89f67bdfb566c49dea1fccfd50d"}, - {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dbd586bfa270c1103ece2109314dd423df1fa3d9719928b5d09e4840cec0d72"}, - {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d273f136e912aa101a9274c3145dcbddbe4bac560e77e6d5b3c9f6e0ed06d34"}, - {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:666fa7b1bd0a3810a7f18f6d3a25ccd8866291fbbc3c9b912b917a6715874bb9"}, - {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:921954d7fbf3fccc7de8f717799304b14b6d9a45bbeec5a8d7408ccbf531faf5"}, - {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d86373ff19ca0441ebeb696ef64cb58b8b5cbacffcda5a0ec2f3911732a194"}, - {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c8980cde3bb8575e7c956a530f2c217c1d6aac453474bf3ea0f9c89868b531b6"}, - {file = "rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8eb8c84ecea987a2523e057c0d950bcb3f789696c0499290b8d7b3107a719d78"}, - {file = "rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e43a005671a9ed5a650f3bc39e4dbccd6d4326b24fb5ea8be5f3a43a6f576c72"}, - {file = "rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58f77c60956501a4a627749a6dcb78dac522f249dd96b5c9f1c6af29bfacfb66"}, - {file = "rpds_py-0.25.1-cp313-cp313t-win32.whl", hash = "sha256:2cb9e5b5e26fc02c8a4345048cd9998c2aca7c2712bd1b36da0c72ee969a3523"}, - {file = "rpds_py-0.25.1-cp313-cp313t-win_amd64.whl", hash = "sha256:401ca1c4a20cc0510d3435d89c069fe0a9ae2ee6495135ac46bdd49ec0495763"}, - {file = "rpds_py-0.25.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ce4c8e485a3c59593f1a6f683cf0ea5ab1c1dc94d11eea5619e4fb5228b40fbd"}, - {file = "rpds_py-0.25.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d8222acdb51a22929c3b2ddb236b69c59c72af4019d2cba961e2f9add9b6e634"}, - {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4593c4eae9b27d22df41cde518b4b9e4464d139e4322e2127daa9b5b981b76be"}, - {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd035756830c712b64725a76327ce80e82ed12ebab361d3a1cdc0f51ea21acb0"}, - {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:114a07e85f32b125404f28f2ed0ba431685151c037a26032b213c882f26eb908"}, - {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dec21e02e6cc932538b5203d3a8bd6aa1480c98c4914cb88eea064ecdbc6396a"}, - {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09eab132f41bf792c7a0ea1578e55df3f3e7f61888e340779b06050a9a3f16e9"}, - {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c98f126c4fc697b84c423e387337d5b07e4a61e9feac494362a59fd7a2d9ed80"}, - {file = "rpds_py-0.25.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0e6a327af8ebf6baba1c10fadd04964c1965d375d318f4435d5f3f9651550f4a"}, - {file = "rpds_py-0.25.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bc120d1132cff853ff617754196d0ac0ae63befe7c8498bd67731ba368abe451"}, - {file = "rpds_py-0.25.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:140f61d9bed7839446bdd44852e30195c8e520f81329b4201ceead4d64eb3a9f"}, - {file = "rpds_py-0.25.1-cp39-cp39-win32.whl", hash = "sha256:9c006f3aadeda131b438c3092124bd196b66312f0caa5823ef09585a669cf449"}, - {file = "rpds_py-0.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:a61d0b2c7c9a0ae45732a77844917b427ff16ad5464b4d4f5e4adb955f582890"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b24bf3cd93d5b6ecfbedec73b15f143596c88ee249fa98cefa9a9dc9d92c6f28"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:0eb90e94f43e5085623932b68840b6f379f26db7b5c2e6bcef3179bd83c9330f"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d50e4864498a9ab639d6d8854b25e80642bd362ff104312d9770b05d66e5fb13"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c9409b47ba0650544b0bb3c188243b83654dfe55dcc173a86832314e1a6a35d"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:796ad874c89127c91970652a4ee8b00d56368b7e00d3477f4415fe78164c8000"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85608eb70a659bf4c1142b2781083d4b7c0c4e2c90eff11856a9754e965b2540"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4feb9211d15d9160bc85fa72fed46432cdc143eb9cf6d5ca377335a921ac37b"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ccfa689b9246c48947d31dd9d8b16d89a0ecc8e0e26ea5253068efb6c542b76e"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3c5b317ecbd8226887994852e85de562f7177add602514d4ac40f87de3ae45a8"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:454601988aab2c6e8fd49e7634c65476b2b919647626208e376afcd22019eeb8"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1c0c434a53714358532d13539272db75a5ed9df75a4a090a753ac7173ec14e11"}, - {file = "rpds_py-0.25.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f73ce1512e04fbe2bc97836e89830d6b4314c171587a99688082d090f934d20a"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee86d81551ec68a5c25373c5643d343150cc54672b5e9a0cafc93c1870a53954"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89c24300cd4a8e4a51e55c31a8ff3918e6651b241ee8876a42cc2b2a078533ba"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:771c16060ff4e79584dc48902a91ba79fd93eade3aa3a12d6d2a4aadaf7d542b"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:785ffacd0ee61c3e60bdfde93baa6d7c10d86f15655bd706c89da08068dc5038"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a40046a529cc15cef88ac5ab589f83f739e2d332cb4d7399072242400ed68c9"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85fc223d9c76cabe5d0bff82214459189720dc135db45f9f66aa7cffbf9ff6c1"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0be9965f93c222fb9b4cc254235b3b2b215796c03ef5ee64f995b1b69af0762"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8378fa4a940f3fb509c081e06cb7f7f2adae8cf46ef258b0e0ed7519facd573e"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:33358883a4490287e67a2c391dfaea4d9359860281db3292b6886bf0be3d8692"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1d1fadd539298e70cac2f2cb36f5b8a65f742b9b9f1014dd4ea1f7785e2470bf"}, - {file = "rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9a46c2fb2545e21181445515960006e85d22025bd2fe6db23e76daec6eb689fe"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:50f2c501a89c9a5f4e454b126193c5495b9fb441a75b298c60591d8a2eb92e1b"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d779b325cc8238227c47fbc53964c8cc9a941d5dbae87aa007a1f08f2f77b23"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:036ded36bedb727beeabc16dc1dad7cb154b3fa444e936a03b67a86dc6a5066e"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:245550f5a1ac98504147cba96ffec8fabc22b610742e9150138e5d60774686d7"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff7c23ba0a88cb7b104281a99476cccadf29de2a0ef5ce864959a52675b1ca83"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e37caa8cdb3b7cf24786451a0bdb853f6347b8b92005eeb64225ae1db54d1c2b"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2f48ab00181600ee266a095fe815134eb456163f7d6699f525dee471f312cf"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e5fc7484fa7dce57e25063b0ec9638ff02a908304f861d81ea49273e43838c1"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d3c10228d6cf6fe2b63d2e7985e94f6916fa46940df46b70449e9ff9297bd3d1"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:5d9e40f32745db28c1ef7aad23f6fc458dc1e29945bd6781060f0d15628b8ddf"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:35a8d1a24b5936b35c5003313bc177403d8bdef0f8b24f28b1c4a255f94ea992"}, - {file = "rpds_py-0.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6099263f526efff9cf3883dfef505518730f7a7a93049b1d90d42e50a22b4793"}, - {file = "rpds_py-0.25.1.tar.gz", hash = "sha256:8960b6dac09b62dac26e75d7e2c4a22efb835d827a7278c34f72b2b84fa160e3"}, -] - -[[package]] -name = "rsa" -version = "4.9.1" -description = "Pure-Python RSA implementation" -optional = false -python-versions = "<4,>=3.6" -files = [ - {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, - {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "scikit-learn" -version = "1.7.0" -description = "A set of python modules for machine learning and data mining" -optional = false -python-versions = ">=3.10" -files = [ - {file = "scikit_learn-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9fe7f51435f49d97bd41d724bb3e11eeb939882af9c29c931a8002c357e8cdd5"}, - {file = "scikit_learn-1.7.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0c93294e1e1acbee2d029b1f2a064f26bd928b284938d51d412c22e0c977eb3"}, - {file = "scikit_learn-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf3755f25f145186ad8c403312f74fb90df82a4dfa1af19dc96ef35f57237a94"}, - {file = "scikit_learn-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2726c8787933add436fb66fb63ad18e8ef342dfb39bbbd19dc1e83e8f828a85a"}, - {file = "scikit_learn-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:e2539bb58886a531b6e86a510c0348afaadd25005604ad35966a85c2ec378800"}, - {file = "scikit_learn-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ef09b1615e1ad04dc0d0054ad50634514818a8eb3ee3dee99af3bffc0ef5007"}, - {file = "scikit_learn-1.7.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:7d7240c7b19edf6ed93403f43b0fcb0fe95b53bc0b17821f8fb88edab97085ef"}, - {file = "scikit_learn-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80bd3bd4e95381efc47073a720d4cbab485fc483966f1709f1fd559afac57ab8"}, - {file = "scikit_learn-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dbe48d69aa38ecfc5a6cda6c5df5abef0c0ebdb2468e92437e2053f84abb8bc"}, - {file = "scikit_learn-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:8fa979313b2ffdfa049ed07252dc94038def3ecd49ea2a814db5401c07f1ecfa"}, - {file = "scikit_learn-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c2c7243d34aaede0efca7a5a96d67fddaebb4ad7e14a70991b9abee9dc5c0379"}, - {file = "scikit_learn-1.7.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9f39f6a811bf3f15177b66c82cbe0d7b1ebad9f190737dcdef77cfca1ea3c19c"}, - {file = "scikit_learn-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63017a5f9a74963d24aac7590287149a8d0f1a0799bbe7173c0d8ba1523293c0"}, - {file = "scikit_learn-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b2f8a0b1e73e9a08b7cc498bb2aeab36cdc1f571f8ab2b35c6e5d1c7115d97d"}, - {file = "scikit_learn-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:34cc8d9d010d29fb2b7cbcd5ccc24ffdd80515f65fe9f1e4894ace36b267ce19"}, - {file = "scikit_learn-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5b7974f1f32bc586c90145df51130e02267e4b7e77cab76165c76cf43faca0d9"}, - {file = "scikit_learn-1.7.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:014e07a23fe02e65f9392898143c542a50b6001dbe89cb867e19688e468d049b"}, - {file = "scikit_learn-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e7ced20582d3a5516fb6f405fd1d254e1f5ce712bfef2589f51326af6346e8"}, - {file = "scikit_learn-1.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1babf2511e6ffd695da7a983b4e4d6de45dce39577b26b721610711081850906"}, - {file = "scikit_learn-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:5abd2acff939d5bd4701283f009b01496832d50ddafa83c90125a4e41c33e314"}, - {file = "scikit_learn-1.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e39d95a929b112047c25b775035c8c234c5ca67e681ce60d12413afb501129f7"}, - {file = "scikit_learn-1.7.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:0521cb460426c56fee7e07f9365b0f45ec8ca7b2d696534ac98bfb85e7ae4775"}, - {file = "scikit_learn-1.7.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:317ca9f83acbde2883bd6bb27116a741bfcb371369706b4f9973cf30e9a03b0d"}, - {file = "scikit_learn-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:126c09740a6f016e815ab985b21e3a0656835414521c81fc1a8da78b679bdb75"}, - {file = "scikit_learn-1.7.0.tar.gz", hash = "sha256:c01e869b15aec88e2cdb73d27f15bdbe03bce8e2fb43afbe77c45d399e73a5a3"}, -] - -[package.dependencies] -joblib = ">=1.2.0" -numpy = ">=1.22.0" -scipy = ">=1.8.0" -threadpoolctl = ">=3.1.0" - -[package.extras] -benchmark = ["matplotlib (>=3.5.0)", "memory_profiler (>=0.57.0)", "pandas (>=1.4.0)"] -build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.22.0)", "scipy (>=1.8.0)"] -docs = ["Pillow (>=8.4.0)", "matplotlib (>=3.5.0)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.4.0)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.19.0)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] -examples = ["matplotlib (>=3.5.0)", "pandas (>=1.4.0)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.19.0)", "seaborn (>=0.9.0)"] -install = ["joblib (>=1.2.0)", "numpy (>=1.22.0)", "scipy (>=1.8.0)", "threadpoolctl (>=3.1.0)"] -maintenance = ["conda-lock (==3.0.1)"] -tests = ["matplotlib (>=3.5.0)", "mypy (>=1.15)", "numpydoc (>=1.2.0)", "pandas (>=1.4.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.2.1)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.11.7)", "scikit-image (>=0.19.0)"] - -[[package]] -name = "scipy" -version = "1.15.3" -description = "Fundamental algorithms for scientific computing in Python" -optional = false -python-versions = ">=3.10" -files = [ - {file = "scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c"}, - {file = "scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253"}, - {file = "scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f"}, - {file = "scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92"}, - {file = "scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82"}, - {file = "scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40"}, - {file = "scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e"}, - {file = "scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c"}, - {file = "scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13"}, - {file = "scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b"}, - {file = "scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba"}, - {file = "scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65"}, - {file = "scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1"}, - {file = "scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889"}, - {file = "scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982"}, - {file = "scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9"}, - {file = "scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594"}, - {file = "scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb"}, - {file = "scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019"}, - {file = "scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6"}, - {file = "scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477"}, - {file = "scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c"}, - {file = "scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45"}, - {file = "scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49"}, - {file = "scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e"}, - {file = "scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539"}, - {file = "scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed"}, - {file = "scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759"}, - {file = "scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62"}, - {file = "scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb"}, - {file = "scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730"}, - {file = "scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825"}, - {file = "scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7"}, - {file = "scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11"}, - {file = "scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126"}, - {file = "scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163"}, - {file = "scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8"}, - {file = "scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5"}, - {file = "scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e"}, - {file = "scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb"}, - {file = "scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723"}, - {file = "scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb"}, - {file = "scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4"}, - {file = "scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5"}, - {file = "scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca"}, - {file = "scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf"}, -] - -[package.dependencies] -numpy = ">=1.23.5,<2.5" - -[package.extras] -dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] -doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "seaborn" -version = "0.13.2" -description = "Statistical data visualization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987"}, - {file = "seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7"}, -] - -[package.dependencies] -matplotlib = ">=3.4,<3.6.1 || >3.6.1" -numpy = ">=1.20,<1.24.0 || >1.24.0" -pandas = ">=1.2" - -[package.extras] -dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] -docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] -stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] - -[[package]] -name = "send2trash" -version = "1.8.3" -description = "Send file to trash natively under Mac OS X, Windows and Linux" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, - {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, -] - -[package.extras] -nativelib = ["pyobjc-framework-Cocoa", "pywin32"] -objc = ["pyobjc-framework-Cocoa"] -win32 = ["pywin32"] - -[[package]] -name = "setuptools" -version = "80.9.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.9" -files = [ - {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, - {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] - -[[package]] -name = "six" -version = "1.17.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, - {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "soupsieve" -version = "2.7" -description = "A modern CSS selector implementation for Beautiful Soup." -optional = false -python-versions = ">=3.8" -files = [ - {file = "soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4"}, - {file = "soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a"}, -] - -[[package]] -name = "stack-data" -version = "0.6.3" -description = "Extract data from python stack frames and tracebacks for informative displays" -optional = false -python-versions = "*" -files = [ - {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, - {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - -[[package]] -name = "tensorboard" -version = "2.15.2" -description = "TensorBoard lets you watch Tensors Flow" -optional = false -python-versions = ">=3.9" -files = [ - {file = "tensorboard-2.15.2-py3-none-any.whl", hash = "sha256:a6f6443728064d962caea6d34653e220e34ef8df764cb06a8212c17e1a8f0622"}, -] - -[package.dependencies] -absl-py = ">=0.4" -google-auth = ">=1.6.3,<3" -google-auth-oauthlib = ">=0.5,<2" -grpcio = ">=1.48.2" -markdown = ">=2.6.8" -numpy = ">=1.12.0" -protobuf = ">=3.19.6,<4.24.0 || >4.24.0" -requests = ">=2.21.0,<3" -setuptools = ">=41.0.0" -six = ">1.9" -tensorboard-data-server = ">=0.7.0,<0.8.0" -werkzeug = ">=1.0.1" - -[[package]] -name = "tensorboard-data-server" -version = "0.7.2" -description = "Fast data loading for TensorBoard" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, - {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, - {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, -] - -[[package]] -name = "tensorflow" -version = "2.15.1" -description = "TensorFlow is an open source machine learning framework for everyone." -optional = false -python-versions = ">=3.9" -files = [ - {file = "tensorflow-2.15.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:91b51a507007d63a70b65be307d701088d15042a6399c0e2312b53072226e909"}, - {file = "tensorflow-2.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:10132acc072d59696c71ce7221d2d8e0e3ff1e6bc8688dbac6d7aed8e675b710"}, - {file = "tensorflow-2.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c5ef9c758ec9ff7ce2aff76b71c980bc5119b879071c2cc623b1591a497a1a"}, - {file = "tensorflow-2.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea290e435464cf0794f657b48786e5fa413362abe55ed771c172c25980d070ce"}, - {file = "tensorflow-2.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:8e5431d45ceb416c2b1b6de87378054fbac7d2ed35d45b102d89a786613fffdc"}, - {file = "tensorflow-2.15.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:6761efe511e6ee0f893f60738fefbcc51d6dc386eeaaafea59d21899ef369ffd"}, - {file = "tensorflow-2.15.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:aa926114d1e13ffe5b2ea59c3f195216f26646d7fe36e9e5207b291e4b7902ff"}, - {file = "tensorflow-2.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e73d43dbc68d8c711e70edecc4ac70472799a25ec4ec18a84d479ee18033d3c5"}, - {file = "tensorflow-2.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb0edd69103c154245c5f209f0507355cc68ba7e4de350084bc31edc562478e4"}, - {file = "tensorflow-2.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:a49f8755c74a89553294a99ab25aa87ab1cddbfa40fe58387e09f64f0578cedc"}, - {file = "tensorflow-2.15.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:f8e85821317c9c0fbf1256e9f721cfb1400ba1e09becb844b3ddd91f744805fc"}, - {file = "tensorflow-2.15.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b75815b6a601edad52b4181e9805c8fcd04813a6ab1d5cd8127188dfd2788e20"}, - {file = "tensorflow-2.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:432788ac5d1234b9e9b7c7f73603a5655271a28c293329c52c7c0b9434a1184e"}, - {file = "tensorflow-2.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89b5aa1022dec47e567512eaf4e1271b8e6c1ff1984e30d0d9127bd1093ed4c5"}, - {file = "tensorflow-2.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:aaf3cfa290597ebbdf19d1a78729e3f555e459506cd58f8d7399359ac5e02a05"}, -] - -[package.dependencies] -absl-py = ">=1.0.0" -astunparse = ">=1.6.0" -flatbuffers = ">=23.5.26" -gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" -google-pasta = ">=0.1.1" -grpcio = ">=1.24.3,<2.0" -h5py = ">=2.9.0" -keras = ">=2.15.0,<2.16" -libclang = ">=13.0.0" -ml-dtypes = ">=0.3.1,<0.4.0" -numpy = ">=1.23.5,<2.0.0" -opt-einsum = ">=2.3.2" -packaging = "*" -protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -setuptools = "*" -six = ">=1.12.0" -tensorboard = ">=2.15,<2.16" -tensorflow-cpu-aws = {version = "2.15.1", markers = "platform_system == \"Linux\" and (platform_machine == \"arm64\" or platform_machine == \"aarch64\")"} -tensorflow-estimator = ">=2.15.0,<2.16" -tensorflow-intel = {version = "2.15.1", markers = "platform_system == \"Windows\""} -tensorflow-io-gcs-filesystem = ">=0.23.1" -termcolor = ">=1.1.0" -typing-extensions = ">=3.6.6" -wrapt = ">=1.11.0,<1.15" - -[package.extras] -and-cuda = ["nvidia-cublas-cu12 (==12.2.5.6)", "nvidia-cuda-cupti-cu12 (==12.2.142)", "nvidia-cuda-nvcc-cu12 (==12.2.140)", "nvidia-cuda-nvrtc-cu12 (==12.2.140)", "nvidia-cuda-runtime-cu12 (==12.2.140)", "nvidia-cudnn-cu12 (==8.9.4.25)", "nvidia-cufft-cu12 (==11.0.8.103)", "nvidia-curand-cu12 (==10.3.3.141)", "nvidia-cusolver-cu12 (==11.5.2.141)", "nvidia-cusparse-cu12 (==12.1.2.141)", "nvidia-nccl-cu12 (==2.16.5)", "nvidia-nvjitlink-cu12 (==12.2.140)"] - -[[package]] -name = "tensorflow-cpu-aws" -version = "2.15.1" -description = "TensorFlow is an open source machine learning framework for everyone." -optional = false -python-versions = ">=3.9" -files = [ - {file = "tensorflow_cpu_aws-2.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c781d95cb8c58d47cb012b7b4e77b2f3e8d4d47b45926bc54976506fa0c037cc"}, - {file = "tensorflow_cpu_aws-2.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4c3a3a9363bf42999adedbbd514e3a133be2d62f61fee9cfa46aaefb087c09e"}, - {file = "tensorflow_cpu_aws-2.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9a25f2b9da4740074fdd89bd2a4cf280a9d40b1d26a973ef079e6673c1bf7de"}, -] - -[package.dependencies] -absl-py = ">=1.0.0" -astunparse = ">=1.6.0" -flatbuffers = ">=23.5.26" -gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" -google-pasta = ">=0.1.1" -grpcio = ">=1.24.3,<2.0" -h5py = ">=2.9.0" -keras = ">=2.15.0,<2.16" -libclang = ">=13.0.0" -ml-dtypes = ">=0.3.1,<0.4.0" -numpy = ">=1.23.5,<2.0.0" -opt-einsum = ">=2.3.2" -packaging = "*" -protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -setuptools = "*" -six = ">=1.12.0" -tensorboard = ">=2.15,<2.16" -tensorflow-estimator = ">=2.15.0,<2.16" -tensorflow-io-gcs-filesystem = ">=0.23.1" -termcolor = ">=1.1.0" -typing-extensions = ">=3.6.6" -wrapt = ">=1.11.0,<1.15" - -[package.extras] -and-cuda = ["nvidia-cublas-cu12 (==12.2.5.6)", "nvidia-cuda-cupti-cu12 (==12.2.142)", "nvidia-cuda-nvcc-cu12 (==12.2.140)", "nvidia-cuda-nvrtc-cu12 (==12.2.140)", "nvidia-cuda-runtime-cu12 (==12.2.140)", "nvidia-cudnn-cu12 (==8.9.4.25)", "nvidia-cufft-cu12 (==11.0.8.103)", "nvidia-curand-cu12 (==10.3.3.141)", "nvidia-cusolver-cu12 (==11.5.2.141)", "nvidia-cusparse-cu12 (==12.1.2.141)", "nvidia-nccl-cu12 (==2.16.5)", "nvidia-nvjitlink-cu12 (==12.2.140)"] - -[[package]] -name = "tensorflow-estimator" -version = "2.15.0" -description = "TensorFlow Estimator." -optional = false -python-versions = ">=3.7" -files = [ - {file = "tensorflow_estimator-2.15.0-py2.py3-none-any.whl", hash = "sha256:aedf21eec7fb2dc91150fc91a1ce12bc44dbb72278a08b58e79ff87c9e28f153"}, -] - -[[package]] -name = "tensorflow-intel" -version = "2.15.1" -description = "TensorFlow is an open source machine learning framework for everyone." -optional = false -python-versions = ">=3.9" -files = [ - {file = "tensorflow_intel-2.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f305142b3c5e239c82c463429b1f88726dd27d9f23523871f825493a9ffc5f4"}, - {file = "tensorflow_intel-2.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:4f05059493f8203285ac5cea3b1955887a7903c1ca6f7a29e4b6ef912b1f934b"}, - {file = "tensorflow_intel-2.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:921f18f7eb9cf59769e9668b3935fe178c990e2973d8013870dae5e3b58de079"}, -] - -[package.dependencies] -absl-py = ">=1.0.0" -astunparse = ">=1.6.0" -flatbuffers = ">=23.5.26" -gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" -google-pasta = ">=0.1.1" -grpcio = ">=1.24.3,<2.0" -h5py = ">=2.9.0" -keras = ">=2.15.0,<2.16" -libclang = ">=13.0.0" -ml-dtypes = ">=0.3.1,<0.4.0" -numpy = ">=1.23.5,<2.0.0" -opt-einsum = ">=2.3.2" -packaging = "*" -protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -setuptools = "*" -six = ">=1.12.0" -tensorboard = ">=2.15,<2.16" -tensorflow-estimator = ">=2.15.0,<2.16" -tensorflow-io-gcs-filesystem = ">=0.23.1" -termcolor = ">=1.1.0" -typing-extensions = ">=3.6.6" -wrapt = ">=1.11.0,<1.15" - -[package.extras] -and-cuda = ["nvidia-cublas-cu12 (==12.2.5.6)", "nvidia-cuda-cupti-cu12 (==12.2.142)", "nvidia-cuda-nvcc-cu12 (==12.2.140)", "nvidia-cuda-nvrtc-cu12 (==12.2.140)", "nvidia-cuda-runtime-cu12 (==12.2.140)", "nvidia-cudnn-cu12 (==8.9.4.25)", "nvidia-cufft-cu12 (==11.0.8.103)", "nvidia-curand-cu12 (==10.3.3.141)", "nvidia-cusolver-cu12 (==11.5.2.141)", "nvidia-cusparse-cu12 (==12.1.2.141)", "nvidia-nccl-cu12 (==2.16.5)", "nvidia-nvjitlink-cu12 (==12.2.140)"] - -[[package]] -name = "tensorflow-io-gcs-filesystem" -version = "0.37.1" -description = "TensorFlow IO" -optional = false -python-versions = "<3.13,>=3.7" -files = [ - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:249c12b830165841411ba71e08215d0e94277a49c551e6dd5d72aab54fe5491b"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:257aab23470a0796978efc9c2bcf8b0bc80f22e6298612a4c0a50d3f4e88060c"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8febbfcc67c61e542a5ac1a98c7c20a91a5e1afc2e14b1ef0cb7c28bc3b6aa70"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9679b36e3a80921876f31685ab6f7270f3411a4cc51bc2847e80d0e4b5291e27"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:32c50ab4e29a23c1f91cd0f9ab8c381a0ab10f45ef5c5252e94965916041737c"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b02f9c5f94fd62773954a04f69b68c4d576d076fd0db4ca25d5479f0fbfcdbad"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e1f2796b57e799a8ca1b75bf47c2aaa437c968408cc1a402a9862929e104cda"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee7c8ee5fe2fd8cb6392669ef16e71841133041fee8a330eff519ad9b36e4556"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:ffebb6666a7bfc28005f4fbbb111a455b5e7d6cd3b12752b7050863ecb27d5cc"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fe8dcc6d222258a080ac3dfcaaaa347325ce36a7a046277f6b3e19abc1efb3c5"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbb33f1745f218464a59cecd9a18e32ca927b0f4d77abd8f8671b645cc1a182f"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:286389a203a5aee1a4fa2e53718c661091aa5fea797ff4fa6715ab8436b02e6c"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ee5da49019670ed364f3e5fb86b46420841a6c3cb52a300553c63841671b3e6d"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8943036bbf84e7a2be3705cb56f9c9df7c48c9e614bb941f0936c58e3ca89d6f"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:426de1173cb81fbd62becec2012fc00322a295326d90eb6c737fab636f182aed"}, - {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df00891669390078a003cedbdd3b8e645c718b111917535fa1d7725e95cdb95"}, -] - -[package.extras] -tensorflow = ["tensorflow (>=2.16.0,<2.17.0)"] -tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.16.0,<2.17.0)"] -tensorflow-cpu = ["tensorflow-cpu (>=2.16.0,<2.17.0)"] -tensorflow-gpu = ["tensorflow-gpu (>=2.16.0,<2.17.0)"] -tensorflow-rocm = ["tensorflow-rocm (>=2.16.0,<2.17.0)"] - -[[package]] -name = "tensorflow-probability" -version = "0.22.1" -description = "Probabilistic modeling and statistical inference in TensorFlow" -optional = false -python-versions = ">=3.9" -files = [ - {file = "tensorflow_probability-0.22.1-py2.py3-none-any.whl", hash = "sha256:3035b936b028ea10bd3a9589329557f5b2c5ace813a6bff3f59acfe3226eef9b"}, -] - -[package.dependencies] -absl-py = "*" -cloudpickle = ">=1.3" -decorator = "*" -dm-tree = "*" -gast = ">=0.3.2" -numpy = ">=1.13.3" -six = ">=1.10.0" - -[package.extras] -jax = ["jax", "jaxlib"] -tfds = ["tensorflow-datasets (>=2.2.0)"] - -[[package]] -name = "termcolor" -version = "3.1.0" -description = "ANSI color formatting for output in terminal" -optional = false -python-versions = ">=3.9" -files = [ - {file = "termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa"}, - {file = "termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970"}, -] - -[package.extras] -tests = ["pytest", "pytest-cov"] - -[[package]] -name = "terminado" -version = "0.18.1" -description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -optional = false -python-versions = ">=3.8" -files = [ - {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, - {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, -] - -[package.dependencies] -ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} -tornado = ">=6.1.0" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] -typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] - -[[package]] -name = "tf-agents" -version = "0.18.0" -description = "TF-Agents: A Reinforcement Learning Library for TensorFlow" -optional = false -python-versions = ">=3" -files = [ - {file = "tf_agents-0.18.0-py3-none-any.whl", hash = "sha256:97b812f9baf54527e1a4e720d0d8ba1ef2d370c791b05954e3a826b47d0e7066"}, -] - -[package.dependencies] -absl-py = ">=0.6.1" -cloudpickle = ">=1.3" -gin-config = ">=0.4.0" -gym = ">=0.17.0,<=0.23.0" -numpy = ">=1.19.0" -pillow = "*" -protobuf = ">=3.11.3" -pygame = "2.1.3" -six = ">=1.10.0" -tensorflow-probability = ">=0.22.0,<0.23.0" -typing-extensions = ">=3.7.4.3" -wrapt = ">=1.11.1" - -[package.extras] -reverb = ["dm-reverb (>=0.13.0,<0.14.0)", "rlds", "tensorflow (>=2.14.0,<2.15.0)"] -tests = ["mock (>=2.0.0)", "opencv-python (>=3.4.1.15)", "pybullet", "scipy (>=1.1.0)"] - -[[package]] -name = "threadpoolctl" -version = "3.6.0" -description = "threadpoolctl" -optional = false -python-versions = ">=3.9" -files = [ - {file = "threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb"}, - {file = "threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e"}, -] - -[[package]] -name = "tinycss2" -version = "1.4.0" -description = "A tiny CSS parser" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, - {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, -] - -[package.dependencies] -webencodings = ">=0.4" - -[package.extras] -doc = ["sphinx", "sphinx_rtd_theme"] -test = ["pytest", "ruff"] - -[[package]] -name = "tomli" -version = "2.2.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, -] - -[[package]] -name = "tomlkit" -version = "0.13.3" -description = "Style preserving TOML library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, - {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, -] - -[[package]] -name = "tornado" -version = "6.5.1" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -optional = false -python-versions = ">=3.9" -files = [ - {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7"}, - {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a"}, - {file = "tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365"}, - {file = "tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b"}, - {file = "tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7"}, - {file = "tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c"}, -] - -[[package]] -name = "traitlets" -version = "5.14.3" -description = "Traitlets Python configuration system" -optional = false -python-versions = ">=3.8" -files = [ - {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, - {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] - -[[package]] -name = "types-python-dateutil" -version = "2.9.0.20250516" -description = "Typing stubs for python-dateutil" -optional = false -python-versions = ">=3.9" -files = [ - {file = "types_python_dateutil-2.9.0.20250516-py3-none-any.whl", hash = "sha256:2b2b3f57f9c6a61fba26a9c0ffb9ea5681c9b83e69cd897c6b5f668d9c0cab93"}, - {file = "types_python_dateutil-2.9.0.20250516.tar.gz", hash = "sha256:13e80d6c9c47df23ad773d54b2826bd52dbbb41be87c3f339381c1700ad21ee5"}, -] - -[[package]] -name = "typing-extensions" -version = "4.14.0" -description = "Backported and Experimental Type Hints for Python 3.9+" -optional = false -python-versions = ">=3.9" -files = [ - {file = "typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af"}, - {file = "typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4"}, -] - -[[package]] -name = "tzdata" -version = "2025.2" -description = "Provider of IANA time zone data" -optional = false -python-versions = ">=2" -files = [ - {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, - {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, -] - -[[package]] -name = "uri-template" -version = "1.3.0" -description = "RFC 6570 URI Template Processor" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, - {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, -] - -[package.extras] -dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] - -[[package]] -name = "urllib3" -version = "2.4.0" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.9" -files = [ - {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, - {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "virtualenv" -version = "20.31.2" -description = "Virtual Python Environment builder" -optional = false -python-versions = ">=3.8" -files = [ - {file = "virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11"}, - {file = "virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af"}, -] - -[package.dependencies] -distlib = ">=0.3.7,<1" -filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<5" - -[package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] - -[[package]] -name = "watchdog" -version = "6.0.0" -description = "Filesystem events monitoring" -optional = false -python-versions = ">=3.9" -files = [ - {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, - {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, - {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"}, - {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"}, - {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"}, - {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"}, - {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"}, - {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"}, - {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"}, - {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"}, - {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"}, -] - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] - -[[package]] -name = "wcwidth" -version = "0.2.13" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, -] - -[[package]] -name = "webcolors" -version = "24.11.1" -description = "A library for working with the color formats defined by HTML and CSS." -optional = false -python-versions = ">=3.9" -files = [ - {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, - {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, -] - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -optional = false -python-versions = "*" -files = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] - -[[package]] -name = "websocket-client" -version = "1.8.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=3.8" -files = [ - {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, - {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, -] - -[package.extras] -docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - -[[package]] -name = "werkzeug" -version = "3.1.3" -description = "The comprehensive WSGI web application library." -optional = false -python-versions = ">=3.9" -files = [ - {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, - {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, -] - -[package.dependencies] -MarkupSafe = ">=2.1.1" - -[package.extras] -watchdog = ["watchdog (>=2.3)"] - -[[package]] -name = "wheel" -version = "0.45.1" -description = "A built-package format for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, - {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, -] - -[package.extras] -test = ["pytest (>=6.0.0)", "setuptools (>=65)"] - -[[package]] -name = "widgetsnbextension" -version = "4.0.14" -description = "Jupyter interactive widgets for Jupyter Notebook" -optional = false -python-versions = ">=3.7" -files = [ - {file = "widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575"}, - {file = "widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af"}, -] - -[[package]] -name = "wrapt" -version = "1.14.1" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, - {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, - {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, - {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] - -[metadata] -lock-version = "2.0" -python-versions = ">=3.10.12,<3.12" -content-hash = "1a295dd26e5d02c3a54bd81545db8cac9a44bc06fe44e164e8b764b60c8077df" diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index fddd8a41..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,98 +0,0 @@ -[tool.poetry] -name = "smart_control" -version = "0.1.0" -description = "" -authors = [] -readme = "README.md" - -[tool.poetry.dependencies] -python = ">=3.10.12,<3.12" -tensorflow = "2.15.1" - -# The "dm-reverb" package is meant for Linux only, so we are conditionally -# ... installing the normal package on Linux, and another package on Mac. -# ... However there may still be issues with the Mac version. -# ... See: https://github.com/google/sbsim/issues/102 for details. -#dm-reverb = "^0.14.0" -# -dm-reverb = { version = "0.14.0", markers = "sys_platform == 'linux'" } -dm-reverb-macos = { version = "0.11.0.dev0", markers = "sys_platform == 'darwin'" } -#dm-reverb-macos-nightly = { version = ">=0.11.20241207", markers = "sys_platform == 'darwin'" } - -pytz = "^2024.1" -gin-config = "^0.5.0" -matplotlib = "^3.9.2" -pandas = "^2.2.2" -bidict = "^0.23.1" -protobuf = "3.20.3" -pint = "^0.24.3" -holidays = "^0.56" -google3 = "^1.0.0" -opencv-python = "^4.10.0.84" -scipy = "^1.14.1" -mediapy = "^1.2.2" -seaborn = "^0.13.2" -tf-agents = "0.18.0" -scikit-learn = "^1.5.1" -ipykernel = "^6.29.5" -typing-extensions = "^4.12.2" -ipython = "^8.27.0" -importlib-resources = { version = "*", python = "<3.11" } -python-dotenv = "^1.1.0" -pvlib = "0.13.1" - -[tool.poetry.group.dev.dependencies] -pytest = "^8.3.5" -pyink = "^24.10.1" -pre-commit = "^4.2.0" -isort = "^6.0.1" -pylint = "^3.3.6" -pylint-per-file-ignores = "^1.4.0" -mdformat = "^0.7.22" - -[tool.poetry.group.docs.dependencies] -mkdocs = "^1.6.1" -mkdocstrings = "^0.29.1" -mkdocstrings-python = "^1.16.10" -mkdocs-material = "^9.6.14" -mkdocs-autorefs = "^1.4.2" - -[tool.poetry.group.notebooks.dependencies] -jupyter = "^1.1.1" - -[tool.pyink] -line-length = 80 -unstable = true -pyink-indentation = 2 -pyink-use-majority-quotes = true -pyink-annotation-pragmas = [ - "noqa", - "pylint:", - "type: ignore", - "pytype:", - "mypy:", - "pyright:", - "pyre-", -] -force-exclude = ''' -( - /.*_pb2\.py - | /BUILD$ - | /Dockerfile$ -) -''' - -[tool.isort] -lexicographical = true -group_by_package = true -order_by_type = false -force_sort_within_sections = true -force_single_line = true -line_length = 200 -single_line_exclusions = ['typing'] -known_first_party = ["smart_control"] -skip_glob = ['smart_control/proto/*'] - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/smart_control/BUILD b/smart_control/BUILD deleted file mode 100644 index 45a4053f..00000000 --- a/smart_control/BUILD +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Top-level BUILD for Smart Buildings Smart Control - -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -licenses(["notice"]) diff --git a/smart_control/__init__.py b/smart_control/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/agents/mppi/base_forecaster.py b/smart_control/agents/mppi/base_forecaster.py new file mode 100644 index 00000000..1db64101 --- /dev/null +++ b/smart_control/agents/mppi/base_forecaster.py @@ -0,0 +1,32 @@ +"""Base class for all forecaster implementations. + +This class defines the interface that BaseBuilding expects for getting +predictions about future action-invariant observations. +""" + +import abc +from typing import Dict, Optional, Sequence +import pandas as pd + + +class BaseForecaster(abc.ABC): + """Abstract base class for all forecaster implementations. + + This class defines the interface that the MPPIPolicy expects for getting + predictions about future action-invariant observations. + """ + + @abc.abstractmethod + def predict( + self, timestamp: pd.Timestamp, features: Sequence[str] + ) -> Optional[Dict[str, float]]: + """For a given future timestamp, return a dictionary of predicted values. + + Args: + timestamp: The future timestamp to generate a forecast for. + features: A list of feature names to be forecasted. + + Returns: + A dictionary mapping feature names to their forecasted values, + or None if a forecast cannot be made (e.g., error or missing data). + """ diff --git a/smart_control/agents/mppi/mppi_agent.py b/smart_control/agents/mppi/mppi_agent.py new file mode 100644 index 00000000..ab63f0a8 --- /dev/null +++ b/smart_control/agents/mppi/mppi_agent.py @@ -0,0 +1,732 @@ +"""A pure TensorFlow implementation of an MPPI-based TF-Agents policy and agent. + +In this library, we implement the algorithm described in: +Zhang, Renhao, et al. "Model-based reinforcement learning for parameterized +action spaces." ICML (2024). https://arxiv.org/abs/2404.03037 +""" + +from typing import Optional +import gin +import numpy as np +from smart_buildings.smart_control.models import base_world_model +import tensorflow as tf +import tensorflow_probability as tfp +from tf_agents.agents import tf_agent +from tf_agents.environments import tf_py_environment +from tf_agents.policies import tf_policy +from tf_agents.trajectories import policy_step +from tf_agents.trajectories import time_step as ts +from tf_agents.typing import types + + +@gin.configurable +class MPPIPolicy(tf_policy.TFPolicy): + """A TF-Agents policy that implements the MPPI planning logic from the DLPA paper. + + This policy uses Model Predictive Path Integral (MPPI) control, a variant of + the Cross-Entropy Method (CEM), to plan actions in a parameterized action + space. The overall approach is described in Section 4.2 and summarized in + Algorithm 1 of the paper. + """ + + def __init__( + self, + time_step_spec: ts.TimeStep, + action_spec: types.NestedTensorSpec, + world_model: base_world_model.BaseWorldModel, + # --- Gin-configurable parameters --- + seed: int = 42, + seed_steps: int = 0, + mpc_horizon: int = 12, + mpc_popsize: int = 20, + mpc_gamma: float = 0.99, + mpc_num_elites: int = 5, + cem_iter: int = 3, + mpc_alpha: float = 0.1, + mpc_temperature: float = 0.5, + name: Optional[str] = None, + ): + """Initializes the MPPI policy. + + Args: + time_step_spec: A `TimeStep` spec of the expected time_steps. + action_spec: A nest of BoundedTensorSpec representing the actions. + world_model: An instance of a class that inherits from + `BaseWorldModel`, used for simulating trajectories. + seed: The random seed for the TF random generator. + seed_steps: The number of initial steps to take random actions before + planning. + mpc_horizon: The number of steps to look ahead in the planning horizon. + mpc_popsize: The number of action sequences to sample in the population. + mpc_gamma: The discount factor for future rewards. + mpc_num_elites: The number of top-performing sequences to use for updating + the distribution. + cem_iter: The number of Cross-Entropy Method iterations. + mpc_alpha: The learning rate for updating the distribution mean and std. + mpc_temperature: The temperature parameter for scaling elite weights. + name: The name of this policy. + """ + # --- Initialize planner attributes --- + self.model = world_model + + self.discrete_action_normalizers = self.model.discrete_action_normalizers + self.continuous_action_normalizers = ( + self.model.continuous_action_normalizers + ) + # --- Store Gin-injected parameters --- + self.k_dim = self.model.k_dim + self.all_z_dim = self.model.all_z_dim + self.z_min = tf.constant(self.model.z_min, dtype=tf.float32) + self.z_max = tf.constant(self.model.z_max, dtype=tf.float32) + self.seed_steps = seed_steps + self.mpc_horizon = mpc_horizon + self.mpc_popsize = mpc_popsize + self.mpc_gamma = mpc_gamma + self.mpc_num_elites = mpc_num_elites + self.cem_iter = cem_iter + self.mpc_alpha = mpc_alpha + self.mpc_temperature = mpc_temperature + self.offset = tf.constant(self.model.offset, dtype=tf.int32) + self.par_size = tf.constant(self.model.par_size, dtype=tf.int32) + self._step_counter = tf.Variable(0, dtype=tf.int64, name='step_counter') + # Use TF random generator for reproducibility + self.tf_random_generator = tf.random.Generator.from_seed(seed) + policy_state_spec = { + 'prev_mean_k': tf.TensorSpec( + shape=(mpc_horizon, self.k_dim), dtype=tf.float32 + ), + 'prev_mean_z': tf.TensorSpec( + shape=(mpc_horizon, self.all_z_dim), dtype=tf.float32 + ), + 'prev_std_z': tf.TensorSpec( + shape=(mpc_horizon, self.all_z_dim), dtype=tf.float32 + ), + } + super().__init__( + time_step_spec=time_step_spec, + action_spec=action_spec, + policy_state_spec=policy_state_spec, + name=name, + ) + + def _get_initial_state(self, batch_size: int) -> types.NestedTensor: + """Returns the initial state of the policy. + + Args: + batch_size: The batch size for the initial state. + + Returns: + A nest of tensors representing the initial policy state. + """ + kmean_init = tf.ones( + (self.mpc_horizon, self.k_dim), dtype=tf.float32 + ) / tf.cast(self.k_dim, tf.float32) + zmean_init = tf.zeros((self.mpc_horizon, self.all_z_dim), dtype=tf.float32) + zstd_init = 2 * tf.ones( + (self.mpc_horizon, self.all_z_dim), dtype=tf.float32 + ) + return { + 'prev_mean_k': tf.tile( + tf.expand_dims(kmean_init, 0), [batch_size, 1, 1] + ), + 'prev_mean_z': tf.tile( + tf.expand_dims(zmean_init, 0), [batch_size, 1, 1] + ), + 'prev_std_z': tf.tile(tf.expand_dims(zstd_init, 0), [batch_size, 1, 1]), + } + + def synchronize(self, source_env: tf_py_environment.TFPyEnvironment) -> None: + """Synchronizes the planning environment with the acting environment. + + This delegates the synchronization logic to the world model. + + Args: + source_env: The main TF-Agents environment to synchronize with. + """ + self.model.synchronize(source_env) + + def _get_action_steps( + self, time_step: ts.TimeStep, policy_state: types.NestedTensor + ) -> policy_step.PolicyStep: + """Runs the planner for a batch of time steps. + + This function handles the batch processing, state resetting on episode + boundaries, and calling the core planning logic for each item in the batch. + + Args: + time_step: A `TimeStep` tuple corresponding to `time_step_spec()`. + policy_state: A nest of tensors representing the policy's state. + + Returns: + A `PolicyStep` named tuple containing the action, state, and info. + """ + + # --- Graph-compatible state reset --- + def _reset_state_fn(): + # The step counter must be reset inside the true_fn of tf.cond to be + # part of the graph. + self._step_counter.assign(0) + return self._get_initial_state(tf.shape(time_step.observation)[0]) + + # Use tf.cond for graph-compatible conditional logic. + # We assume all items in a batch are of the same step_type. + policy_state = tf.cond( + time_step.is_first()[0], + true_fn=_reset_state_fn, + false_fn=lambda: policy_state, + ) + + observation = time_step.observation + + # --- Graph-compatible batch processing --- + # Use tf.map_fn to apply the planning logic to each item in the batch. + # This replaces the Python for-loop and works in graph mode. + # The model has state and is not re-entrant, so we must disable + # parallel execution. + action_steps = tf.map_fn( + fn=lambda elems: self._plan_and_get_action_trajectory( + elems[0], tf.nest.map_structure(lambda t: t, elems[1]) + ), + elems=(observation, policy_state), + fn_output_signature=self.policy_step_spec, + parallel_iterations=1, + ) + + self._step_counter.assign_add(1) + return action_steps + + def _action( + self, + time_step: ts.TimeStep, + policy_state: types.NestedTensor, + seed: Optional[types.Seed] = None, + ) -> policy_step.PolicyStep: + """Generates an action by running the MPPI planner. + + Args: + time_step: A `TimeStep` tuple corresponding to `time_step_spec()`. + policy_state: A nest of tensors representing the policy's state. + seed: The seed for any stochasticity in the action generation. + + Returns: + A `PolicyStep` named tuple containing the action, state, and info. + """ + return self._get_action_steps(time_step, policy_state) + + def _distribution( + self, time_step: ts.TimeStep, policy_state: types.NestedTensor + ) -> policy_step.PolicyStep: + """Generates a distribution over actions by running the MPPI planner. + + Args: + time_step: A `TimeStep` tuple corresponding to `time_step_spec()`. + policy_state: A nest of tensors representing the policy's state. + + Returns: + A `PolicyStep` named tuple containing a distribution over actions. + """ + action_steps = self._get_action_steps(time_step, policy_state) + + # The policy is sampling-based, so representing the output as a + # distribution is more accurate. The chosen action is treated as the mean + # (or mode) of this distribution. + + # For the discrete part, we select a single best action index. + discrete_dist = tfp.distributions.Deterministic( + loc=action_steps.action['discrete_action'] + ) + + # For the continuous part, we create a narrow Normal distribution centered + # around the chosen action to acknowledge the planner's stochastic nature. + continuous_dist = tfp.distributions.Normal( + loc=action_steps.action['continuous_action'], + scale=1e-3, # Small scale to represent a tight distribution + ) + + dist = { + 'discrete_action': discrete_dist, + 'continuous_action': continuous_dist, + } + return policy_step.PolicyStep(dist, action_steps.state, action_steps.info) + + def _plan_and_get_action_trajectory( + self, observation: types.Tensor, policy_state: types.NestedTensor + ) -> policy_step.PolicyStep: + """Runs the planner for a single observation and returns a formatted action. + + This function is designed to be called within a `tf.map_fn` to process a + batch of observations in a graph-compatible manner. It takes a single + unbatched observation and the corresponding policy state, runs the MPPI + planner, and formats the resulting action into a `PolicyStep`. + + Args: + observation: A single tensor representing the environment's observation. + policy_state: The policy's state for this specific observation. + + Returns: + A `policy_step.PolicyStep` containing the chosen action, the new policy + state, and an empty info tuple. + """ + # This logic assumes a single, non-batched observation. + observation_np = observation + + # Run the planner to get the best action sequence + action_plan, new_policy_state = self.plan( + observation_np, policy_state, step=self._step_counter + ) + + # Extract the first action from the plan. + # Shape: (k_dim + all_z_dim,) + first_action_normalized = action_plan[0] + + # Decode the discrete action 'k' + # k_part shape: (k_dim,) + k_part = first_action_normalized[: self.k_dim] + k_tensor = tf.argmax(k_part, output_type=tf.int32) + + # Decode the continuous action 'z'. Full z-vector has shape (all_z_dim,). + # We must slice the correct part of this vector corresponding to the + # chosen 'k'. + z_vector_normalized = first_action_normalized[self.k_dim :] + offset = tf.gather(self.offset, k_tensor) + num_params = tf.gather(self.par_size, k_tensor) + z_normalized = tf.slice(z_vector_normalized, [offset], [num_params]) + + # De-normalize the continuous part of the action. + # Use the flattened z_min/z_max from the world model. + z_max_active = tf.slice(self.model.all_z_max, [offset], [num_params]) + z_min_active = tf.slice(self.model.all_z_min, [offset], [num_params]) + z_native = ( + 0.5 + * (tf.clip_by_value(z_normalized, -1.0, 1.0) + 1) + * (z_max_active - z_min_active) + + z_min_active + ) + + # Format the action into a dictionary that the environment can understand. + # The model.create_action_dict method uses .numpy() and must be + # wrapped in a tf.py_function to be compatible with graph mode. + def _py_create_action(k_tensor, z_native_tensor): + action_dict = self.model.create_action_dict( + k_tensor.numpy(), z_native_tensor.numpy() + ) + return [ + action_dict['discrete_action'], + action_dict['continuous_action'], + ] + + [discrete_action, continuous_action] = tf.py_function( + func=_py_create_action, + inp=[k_tensor, z_native], + Tout=[tf.int32, tf.float32], + ) + + # Set shapes, as py_function loses them. + discrete_action.set_shape(self.action_spec['discrete_action'].shape) + continuous_action.set_shape(self.action_spec['continuous_action'].shape) + action_tf = { + 'discrete_action': discrete_action, + 'continuous_action': continuous_action, + } + + return policy_step.PolicyStep( + action=action_tf, state=new_policy_state, info=() + ) + + def plan( + self, + state: types.Tensor, # pylint: disable=unused-argument + policy_state: types.NestedTensor, + step: tf.Variable, + ) -> tuple[tf.Tensor, types.NestedTensor]: + """The core MPPI planning loop. + + This function implements the iterative planning process described in + Section 4.2 and Algorithm 1 of the paper. It uses the Cross-Entropy + Method (CEM) to refine a distribution over action sequences. + + Args: + state: The current environment state (observation). Not used in the + current implementation but kept for API consistency. + policy_state: The policy's internal state, containing the mean of the + action distribution from the previous step. + step: The current time step counter. + + Returns: + A tuple containing: + - chosen_action_plan: The best sequence of actions found by the planner. + - new_policy_state: The updated policy state for the next step. + """ + + def _seed_step_fn(): + """Action selection for seed steps.""" + k_int = self.tf_random_generator.uniform( + shape=(), maxval=self.k_dim, dtype=tf.int32 + ) + k_onehot = tf.one_hot(k_int, self.k_dim) + z_rand = self.tf_random_generator.uniform( + shape=[self.all_z_dim], minval=-1.0, maxval=1.0 + ) + action_plan = tf.tile( + tf.expand_dims(tf.concat([k_onehot, z_rand], axis=0), 0), + [self.mpc_horizon, 1], + ) + return action_plan, policy_state + + def _plan_fn(): + """The main planning logic.""" + # Initialize sampling distribution (mean and standard deviation) + kmean_init = tf.ones((self.mpc_horizon, self.k_dim)) / self.k_dim + zmean_init = tf.zeros((self.mpc_horizon, self.all_z_dim)) + std_init = 2 * tf.ones((self.mpc_horizon, self.all_z_dim)) + + # Warm-start the distribution from the previous step + def _warm_start_fn(): + # policy_state is already unbatched from tf.map_fn + prev_mean_k = policy_state['prev_mean_k'] + prev_mean_z = policy_state['prev_mean_z'] + prev_std_z = policy_state['prev_std_z'] + kmean = tf.concat([prev_mean_k[1:], kmean_init[-1:]], axis=0) + zmean = tf.concat([prev_mean_z[1:], zmean_init[-1:]], axis=0) + std = tf.concat([prev_std_z[1:], std_init[-1:]], axis=0) + return kmean, zmean, std + + kmean, zmean, std = tf.cond( + tf.equal(step, 0), + true_fn=lambda: (kmean_init, zmean_init, std_init), + false_fn=_warm_start_fn, + ) + + # Initial sample before the loop + actions_init = self._sample_from_distribution(kmean, zmean, std) + value_init, _ = self._estimate_value(actions_init) + value_init = tf.where(tf.math.is_nan(value_init), 0.0, value_init) + + # --- CEM Refinement Loop --- + def _cem_loop_cond(i, kmean, zmean, std, actions, value): + del kmean, zmean, std, actions, value + return tf.less(i, self.cem_iter) + + def _cem_loop_body(i, kmean, zmean, std, actions, value): + kmean_new, zmean_new, std_new = self._update_distribution( + actions, value, kmean, zmean, std + ) + actions_new = self._sample_from_distribution( + kmean_new, zmean_new, std_new + ) + value_new, _ = self._estimate_value(actions_new) + value_new = tf.where(tf.math.is_nan(value_new), 0.0, value_new) + return i + 1, kmean_new, zmean_new, std_new, actions_new, value_new + + _, kmean, zmean, std, actions, value = tf.while_loop( + cond=_cem_loop_cond, + body=_cem_loop_body, + loop_vars=[0, kmean, zmean, std, actions_init, value_init], + ) + + # --- Action Selection --- + _, elite_idxs = tf.math.top_k( + tf.squeeze(value, axis=1), k=self.mpc_num_elites + ) + elite_actions = tf.gather(actions, elite_idxs, axis=1) + chosen_action_plan = elite_actions[:, 0] + + # Update policy state for the next step (unbatched) + new_policy_state = { + 'prev_mean_k': kmean, + 'prev_mean_z': zmean, + 'prev_std_z': std, + } + return chosen_action_plan, new_policy_state + + return tf.cond( + tf.less(step, self.seed_steps), + true_fn=_seed_step_fn, + false_fn=_plan_fn, + ) + + def _estimate_value(self, actions: tf.Tensor) -> tuple[tf.Tensor, tf.Tensor]: + """Rolls out trajectories and calculates their cumulative discounted reward. + + This function implements the trajectory return calculation described in + Equation (4) of the paper. + It is designed to work within a TensorFlow graph by wrapping the stateful, + Python-based model rollout in `tf.py_function`. + + Args: + actions: A tensor of action sequences to evaluate. Shape: (horizon, + popsize, action_dim). + + Returns: + A tuple containing: + - total_rewards: The total discounted reward for each trajectory. + - trajectories: The sequence of states for each trajectory. + """ + # Capture the pristine model state ONCE before starting the rollouts. + pristine_building_state = self.model.get_state() + + # This helper function contains the stateful Python logic for rolling out + # a single trajectory. It will be wrapped in tf.py_function. + def _py_rollout_single_trajectory(action_sequence): + # The world model's state is reset from a pristine copy for each rollout. + # This state was captured before the planning step began. + self.model.set_state(pristine_building_state) + + trajectory_reward = 0.0 + discount = self.mpc_gamma + trajectory_states = [] + + # Use a standard Python loop, as this will run inside tf.py_function. + for t in range(self.mpc_horizon): + # The model.next() method expects a batched action. + action_t = np.expand_dims(action_sequence[t], axis=0) + s_pred, reward, _, _ = self.model.next(action_t) + + trajectory_states.append(s_pred[0]) + trajectory_reward += discount * reward[0, 0] + discount *= self.mpc_gamma + + return np.array(trajectory_reward, dtype=np.float32), np.array( + trajectory_states, dtype=np.float32 + ) + + # Wrap the Python function to make it usable in a TF graph. + def _tf_rollout_trajectory(action_sequence): + reward, trajectory = tf.py_function( + func=_py_rollout_single_trajectory, + inp=[action_sequence], + Tout=[tf.float32, tf.float32], + ) + # Set the shape information, which is lost by tf.py_function. + reward.set_shape(()) + trajectory.set_shape( + [self.mpc_horizon, self.time_step_spec.observation.shape[0]] + ) + return reward, trajectory + + # Transpose actions so that map_fn iterates over trajectories. + # Original shape: (horizon, popsize, action_dim) + # Transposed shape: (popsize, horizon, action_dim) + actions_transposed = tf.transpose(actions, perm=[1, 0, 2]) + + # Apply the rollout function to each action sequence in the population. + # parallel_iterations=1 is critical because the underlying Python function + # is stateful and not thread-safe. + total_rewards, trajectories = tf.map_fn( + fn=_tf_rollout_trajectory, + elems=actions_transposed, + fn_output_signature=(tf.float32, tf.float32), + parallel_iterations=1, + ) + + # Reshape the outputs to match the original function's signature. + return tf.expand_dims(total_rewards, axis=-1), trajectories + + def _sample_from_distribution( + self, kmean: tf.Tensor, zmean: tf.Tensor, std: tf.Tensor + ) -> tf.Tensor: + """Samples a batch of action sequences from the current distribution. + + This implements the sampling process described by Equations (2) and (3) + in Section 4.2 of the paper. + - Eq (2) Discrete: k sim Cat(theta_1, ..., theta_K) + - Eq (3) Continuous: z_k sim N(mu_k, sigma_k^2 I) + + Args: + kmean: The mean of the categorical distribution for discrete actions + (theta). Shape is (horizon, k_dim). + zmean: The mean of the Gaussian distribution for continuous actions (mu). + Shape is (horizon, all_z_dim). + std: The standard deviation of the Gaussian distribution (sigma). Shape is + (horizon, all_z_dim). + + Returns: + A tensor of sampled action sequences. Shape: (horizon, popsize, + k_dim + all_z_dim). + """ + # Sample discrete actions + k_logits = tf.math.log(kmean + 1e-9) # Add epsilon for numerical stability + k_int = tf.random.categorical(logits=k_logits, num_samples=self.mpc_popsize) + k_onehot = tf.one_hot(k_int, depth=self.k_dim, dtype=tf.float32) + # This transpose was causing a shape mismatch in the concatenation below. + # k_onehot = tf.transpose(k_onehot, perm=[0, 2, 1]) + + # Sample continuous actions from a Gaussian + z_all = tf.clip_by_value( + tf.expand_dims(zmean, 1) + + tf.expand_dims(std, 1) + * self.tf_random_generator.normal( + shape=[self.mpc_horizon, self.mpc_popsize, self.all_z_dim] + ), + -1.0, + 1.0, + ) + + return tf.concat([k_onehot, z_all], axis=-1) + + def _update_distribution( + self, + actions: tf.Tensor, + value: tf.Tensor, + kmean: tf.Tensor, + zmean: tf.Tensor, + std: tf.Tensor, + ) -> tuple[tf.Tensor, tf.Tensor, tf.Tensor]: + """Updates the distribution mean and std using Cross-Entropy Method. + + This function implements the CEM update rules from Section 4.2 of the paper, + specifically Equations (5), (6), and (7). + + - Eq (5): Update rule for discrete action distribution mean (theta). + - Eq (6): Update rule for continuous parameter distribution mean (mu). + - Eq (7): Update rule for continuous parameter distribution std (sigma). + + Args: + actions: The population of action sequences sampled from the distribution. + Shape is (horizon, popsize, action_dim). + value: The estimated value (return) for each action sequence. Shape is + (popsize, 1). + kmean: The current mean of the categorical distribution. Shape is + (horizon, k_dim). + zmean: The current mean of the Gaussian distribution. Shape is (horizon, + all_z_dim). + std: The current standard deviation of the Gaussian distribution. Shape is + (horizon, all_z_dim). + + Returns: + A tuple containing the updated (kmean, zmean, std). + """ + # --- Get Elites --- + # Select the top-performing action sequences (elites) based on their + # estimated values. + elite_values, elite_idxs = tf.math.top_k( + tf.squeeze(value, axis=1), k=self.mpc_num_elites + ) + # elite_actions shape: (horizon, num_elites, action_dim) + elite_actions = tf.gather(actions, elite_idxs, axis=1) + + # --- Calculate Elite Weights --- + # Convert elite values into weights using the softmax function. This gives + # more influence to higher-rewarding trajectories. + max_value = tf.reduce_max(elite_values) + # elite_weights shape: (num_elites,) + elite_weights = tf.exp(self.mpc_temperature * (elite_values - max_value)) + elite_weights /= tf.reduce_sum(elite_weights) + 1e-9 + + # --- Separate k and z parts of the elite actions --- + # elite_k shape: (horizon, num_elites, k_dim) + elite_k = elite_actions[:, :, : self.k_dim] + # elite_z shape: (horizon, num_elites, all_z_dim) + elite_z = elite_actions[:, :, self.k_dim :] + + # --- Update Mean (k and z) --- + # Calculate the weighted average of the elite actions to get the new mean. + # Einsum computes the dot product between weights and actions over the + # 'elites' dimension (p), for each step in the horizon (h). + # 'hpe,p->he' where h=horizon, p=elites, e=features. + # elite_weights is broadcast across the horizon dimension. + updated_kmean = tf.einsum('hpe,p->he', elite_k, elite_weights) + updated_zmean = tf.einsum('hpe,p->he', elite_z, elite_weights) + + # --- Update Standard Deviation (z only) --- + # Calculate the weighted standard deviation for the continuous part. + z_diff_sq = (elite_z - tf.expand_dims(updated_zmean, 1)) ** 2 + weighted_z_var = tf.einsum('hpe,p->he', z_diff_sq, elite_weights) + updated_zstd = tf.sqrt(weighted_z_var + 1e-9) # Add epsilon for stability + + # --- Apply Momentum (CEM smoothing) --- + # Blend the new distribution parameters with the old ones to stabilize + # the learning process. + new_kmean = self.mpc_alpha * kmean + (1 - self.mpc_alpha) * updated_kmean + new_zmean = self.mpc_alpha * zmean + (1 - self.mpc_alpha) * updated_zmean + new_std = self.mpc_alpha * std + (1 - self.mpc_alpha) * updated_zstd + + return new_kmean, new_zmean, new_std + + +@gin.configurable +class MPPIAgent(tf_agent.TFAgent): + """An agent that uses the pure TensorFlow MPPIPolicy to select actions.""" + + def __init__( + self, + time_step_spec: ts.TimeStep, + action_spec: types.NestedTensorSpec, + world_model, + train_step_counter: Optional[tf.Variable] = None, + name: Optional[str] = None, + **kwargs, # Pass-through for MPPIPolicy gin params + ): + """Initializes the MPPI agent. + + Args: + time_step_spec: A `TimeStep` spec of the expected time_steps. + action_spec: A nest of BoundedTensorSpec representing the actions. + world_model: An instance of a class that inherits from + `BaseWorldModel`, used by the policy for planning. + train_step_counter: An optional `tf.Variable` to increment for each train + step. + name: The name of this agent. + **kwargs: Additional keyword arguments to be passed to the MPPIPolicy. + """ + tf.Module.__init__(self, name=name) + + policy = MPPIPolicy( + time_step_spec=time_step_spec, + action_spec=action_spec, + world_model=world_model, + **kwargs, # Pass all other gin-configured params + ) + + super().__init__( + time_step_spec, + action_spec, + policy=policy, + collect_policy=policy, + train_sequence_length=None, + train_step_counter=train_step_counter, + ) + + def synchronize(self, env: tf_py_environment.TFPyEnvironment) -> None: + """Synchronizes the planner's internal state with the environment. + + This is a proxy for the policy's `synchronize` method, which copies the + state from the acting environment's building to the planning environment's + building. + + Args: + env: The environment to synchronize with. + """ + self.policy.synchronize(env) + + def _initialize(self): # pylint: disable=useless-super-delegation + """Initializes the agent by calling the parent's `_initialize` method. + + This ensures that the policy's initial state is properly set up. + + Returns: + An operation that initializes the agent. + """ + return super(MPPIAgent, self)._initialize() + + def _train( + self, + experience: types.NestedTensor, + weights: Optional[types.Tensor] = None, + ) -> tf_agent.LossInfo: + """MPPI is a planning agent and does not train from a replay buffer. + + This method is required by the `TFAgent` interface but is a no-op for MPPI, + as the policy is optimized online through planning rather than offline + through training on past experience. + + Args: + experience: A batch of experience trajectories. + weights: Optional weights for the experience. + + Returns: + A `LossInfo` object with a constant loss of 0.0. + """ + if self.train_step_counter is not None: + self.train_step_counter.assign_add(1) + return tf_agent.LossInfo(loss=tf.constant(0.0), extra=()) diff --git a/smart_control/agents/mppi/mppi_agent_test.py b/smart_control/agents/mppi/mppi_agent_test.py new file mode 100644 index 00000000..ac31dfef --- /dev/null +++ b/smart_control/agents/mppi/mppi_agent_test.py @@ -0,0 +1,510 @@ +from unittest import mock +import gin +import numpy as np +from smart_buildings.smart_control.agents.mppi import mppi_agent +from smart_buildings.smart_control.utils import bounded_action_normalizer +import tensorflow as tf +from tf_agents.specs import array_spec +from tf_agents.trajectories import time_step as ts + + +class MPPIAgentTest(tf.test.TestCase): + """Unit tests for the MPPIAgent and MPPIPolicy.""" + # TODO(sipple): add tests to catch bad shapes. + + def _get_dummy_observation(self): + """Generates a dummy observation based on the observation spec.""" + return np.zeros( + (1,) + self.observation_spec.shape, dtype=self.observation_spec.dtype + ) + + def setUp(self): + super().setUp() + gin.clear_config() # Isolate the test from global gin configurations + + # --- 1. Define Device IDs, Specs, and Normalizers --- + ac1_id = 'ac1' + ac2_id = 'ac2' + hws_id = 'hws' + gin.bind_parameter('%AC1', ac1_id) + gin.bind_parameter('%AC2', ac2_id) + gin.bind_parameter('%HWS', hws_id) + + # Discrete Normalizers + self.mock_discrete_normalizers = { + f'{ac1_id}_supervisor_run_command': ( + bounded_action_normalizer.BoundedActionNormalizer( + min_native_value=-1.1, max_native_value=1.1 + ) + ), + f'{ac2_id}_supervisor_run_command': ( + bounded_action_normalizer.BoundedActionNormalizer( + min_native_value=-1.1, max_native_value=1.1 + ) + ), + f'{hws_id}_supervisor_run_command': ( + bounded_action_normalizer.BoundedActionNormalizer( + min_native_value=-1.1, max_native_value=1.1 + ) + ), + } + + # Continuous Normalizers + z_min_map = { + f'{ac1_id}_supply_air_static_pressure_setpoint': -12.0, + f'{ac1_id}_supply_air_temperature_setpoint': -20.0, + f'{ac2_id}_supply_air_static_pressure_setpoint': -10.0, + f'{ac2_id}_supply_air_temperature_setpoint': -15.0, + f'{hws_id}_differential_pressure_setpoint': -5.0, + f'{hws_id}_supply_water_temperature_setpoint': -8.0, + } + z_max_map = { + f'{ac1_id}_supply_air_static_pressure_setpoint': 15.0, + f'{ac1_id}_supply_air_temperature_setpoint': 25.0, + f'{ac2_id}_supply_air_static_pressure_setpoint': 12.0, + f'{ac2_id}_supply_air_temperature_setpoint': 18.0, + f'{hws_id}_differential_pressure_setpoint': 8.0, + f'{hws_id}_supply_water_temperature_setpoint': 10.0, + } + # For testing, we use a non-standard agent-side range to distinguish it + # from the policy's internal [-1, 1] range. + agent_continuous_min_map = {key: -2.0 for key in z_min_map} + agent_continuous_max_map = {key: 2.0 for key in z_min_map} + + self.mock_continuous_normalizers = { + key: bounded_action_normalizer.BoundedActionNormalizer( + min_native_value=z_min_map[key], + max_native_value=z_max_map[key], + min_normalized_value=agent_continuous_min_map[key], + max_normalized_value=agent_continuous_max_map[key], + ) + for key in sorted(z_min_map.keys()) + } + + # Define Observation and Action Specs + self.observation_spec = array_spec.ArraySpec( + shape=(10,), dtype=np.float32, name='observation' + ) + self.time_step_spec = ts.time_step_spec(self.observation_spec) + min_bounds = [ + agent_continuous_min_map[key] for key in sorted(z_min_map.keys()) + ] + max_bounds = [ + agent_continuous_max_map[key] for key in sorted(z_min_map.keys()) + ] + self.action_spec = { + 'discrete_action': array_spec.BoundedArraySpec( + shape=(3,), dtype=np.int32, name='discrete', minimum=-1, maximum=1 + ), + 'continuous_action': array_spec.BoundedArraySpec( + shape=(6,), + dtype=np.float32, + name='continuous', + minimum=np.array(min_bounds, dtype=np.float32), + maximum=np.array(max_bounds, dtype=np.float32), + ), + } + + # --- 2. Calculate Dependent Parameters --- + self.par_size = np.array([0, 2, 2, 2, 4, 4, 4, 6]) + self.k_dim = self.par_size.shape[0] # 8 + self.all_z_dim = self.action_spec['continuous_action'].shape[0] # 6 + self.z_dim = np.max(self.par_size) # 6 + self.offset = np.insert(np.cumsum(self.par_size), 0, 0)[:-1] + + # Reshape z_min and z_max for the policy + action_z_min = np.array( + [z_min_map[key] for key in sorted(z_min_map.keys())], dtype=np.float32 + ) + action_z_max = np.array( + [z_max_map[key] for key in sorted(z_max_map.keys())], dtype=np.float32 + ) + z_min_shaped = np.zeros((self.k_dim, self.z_dim), dtype=np.float32) + z_max_shaped = np.zeros((self.k_dim, self.z_dim), dtype=np.float32) + for k in range(self.k_dim): + num_params = self.par_size[k] + if num_params > 0: + # Note: This simplified mapping is for testing purposes. + # A real implementation would have a more complex mapping. + z_min_shaped[k, :num_params] = action_z_min[:num_params] + z_max_shaped[k, :num_params] = action_z_max[:num_params] + + # --- 3. Mock World Model and its Attributes --- + self.mock_world_model = mock.MagicMock() + self.mock_world_model.k_dim = self.k_dim + self.mock_world_model.par_size = self.par_size + self.mock_world_model.z_dim = self.z_dim + self.mock_world_model.all_z_dim = self.all_z_dim + self.mock_world_model.offset = self.offset + self.mock_world_model.z_min = z_min_shaped + self.mock_world_model.z_max = z_max_shaped + self.mock_world_model.all_z_min = action_z_min + self.mock_world_model.all_z_max = action_z_max + self.mock_world_model.discrete_normalizers = self.mock_discrete_normalizers + self.mock_world_model.continuous_normalizers = ( + self.mock_continuous_normalizers + ) + + # Create a plausible discrete action mapping for k_dim=8 + self.mock_world_model.discrete_action_mapping = { + i: np.random.randint(-1, 2, size=(3,)) for i in range(self.k_dim) + } + self.mock_world_model.discrete_action_mapping[1] = np.array([1, -1, 0]) + + self.mock_world_model.get_state.return_value = 'pristine' + self.mock_world_model.time_step_spec = self.time_step_spec + self.mock_world_model.env = mock.MagicMock() + self.mock_world_model.env._field_names = ['zone_air_temperature_sensor'] + + # --- 4. Configure MPC and Instantiate Agent --- + self.mpc_horizon = 2 + self.mpc_popsize = 10 + self.mpc_num_elites = 2 + gin.bind_parameter('mppi_agent.MPPIPolicy.mpc_horizon', self.mpc_horizon) + gin.bind_parameter('mppi_agent.MPPIPolicy.mpc_popsize', self.mpc_popsize) + gin.bind_parameter( + 'mppi_agent.MPPIPolicy.mpc_num_elites', self.mpc_num_elites + ) + + self.train_step_counter = tf.Variable(0) + self.agent = mppi_agent.MPPIAgent( + time_step_spec=self.time_step_spec, + action_spec=self.action_spec, + world_model=self.mock_world_model, + train_step_counter=self.train_step_counter, + ) + + def test_agent_creation(self): + """Verifies that the agent and its policy are created successfully.""" + self.assertIsInstance(self.agent, mppi_agent.MPPIAgent) + self.assertIsInstance(self.agent.policy, mppi_agent.MPPIPolicy) + + def test_train_increments_counter(self): + """Verifies that the train method increments the step counter.""" + initial_value = self.agent.train_step_counter.numpy() + loss_info = self.agent.train(experience=None) + self.assertEqual(self.agent.train_step_counter.numpy(), initial_value + 1) + self.assertEqual(loss_info.loss, 0.0) + + def test_synchronize_copies_env_state(self): + """Tests that the agent correctly syncs with an external environment.""" + # 1. Arrange + # Define a side effect for the mock model's synchronize method that + # simulates the actual copying behavior. + def mock_sync_logic(source_env): + py_env = source_env.pyenv if hasattr(source_env, 'pyenv') else source_env + source_building = py_env.building + target_building = self.mock_world_model.env.building + + target_building._native_inputs = source_building._native_inputs.copy() + target_building._current_timestamp = source_building._current_timestamp + + self.mock_world_model.synchronize.side_effect = mock_sync_logic + + mock_env = mock.MagicMock() + source_building = mock_env.pyenv.building + source_building._native_inputs.copy.return_value = {'input1': 123} + source_building._current_timestamp = 456 + + # 2. Action + self.agent.synchronize(mock_env) + + # 3. Assertion + # First, check that the agent correctly delegated the call. + self.mock_world_model.synchronize.assert_called_once_with(mock_env) + + # Second, check that the state was copied as expected by the side effect. + target_building = self.agent.policy.model.env.building + self.assertEqual(target_building._native_inputs, {'input1': 123}) + self.assertEqual(target_building._current_timestamp, 456) + + @mock.patch.object(mppi_agent.MPPIPolicy, 'plan') + def test_action_generation(self, mock_plan): + """Tests that a planned action is correctly decoded and formatted.""" + # Arrange: Simulate planner choosing k=1 with native values [5.0, 10.0]. + keys = sorted(self.mock_continuous_normalizers.keys()) + norm1, norm2 = ( + self.mock_continuous_normalizers[keys[0]], + self.mock_continuous_normalizers[keys[1]], + ) + policy_val_1 = ( + (5.0 - norm1._min_native_value) + / (norm1._max_native_value - norm1._min_native_value) + ) * 2.0 - 1.0 + policy_val_2 = ( + (10.0 - norm2._min_native_value) + / (norm2._max_native_value - norm2._min_native_value) + ) * 2.0 - 1.0 + k_part = tf.one_hot(1, self.k_dim) + z_part = tf.constant( + [policy_val_1, policy_val_2, 0, 0, 0, 0], dtype=tf.float32 + ) + first_action = tf.concat([k_part, z_part], axis=0) + initial_state = self.agent.policy.get_initial_state(batch_size=1) + unbatched_state = tf.nest.map_structure(lambda t: t[0], initial_state) + mock_plan.return_value = ( + tf.stack([first_action] * self.mpc_horizon), + unbatched_state, + ) + time_step = ts.transition( + self._get_dummy_observation(), + reward=np.array([0.0], dtype=np.float32), + discount=np.array([1.0], dtype=np.float32), + ) + time_step = tf.nest.map_structure(tf.convert_to_tensor, time_step) + # Mock the final formatting step to let the test focus on decoding. + expected_discrete = np.array([1, -1, 0]) + expected_continuous = np.array([ + norm1.agent_value(5.0), + norm2.agent_value(10.0), + self.mock_continuous_normalizers[keys[2]].agent_value(0.0), + self.mock_continuous_normalizers[keys[3]].agent_value(0.0), + self.mock_continuous_normalizers[keys[4]].agent_value(0.0), + self.mock_continuous_normalizers[keys[5]].agent_value(0.0), + ]) + self.mock_world_model.create_action_dict = mock.MagicMock( + return_value={ + 'discrete_action': expected_discrete, + 'continuous_action': expected_continuous, + } + ) + + # Act + action_step = self.agent.policy.action(time_step, initial_state) + + # Assert + # Check that the decoding was correct by inspecting the arguments passed + # to the mocked formatting function. + self.mock_world_model.create_action_dict.assert_called_once() + ( + called_k, + called_z_native, + ) = self.mock_world_model.create_action_dict.call_args[0] + self.assertEqual(called_k, 1) + self.assertAllClose(called_z_native, [5.0, 10.0], atol=1e-5) + + # The final action should also be correct because of the mock's return + # value. + self.assertAllClose(action_step.action['discrete_action'][0], [1, -1, 0]) + self.assertAllClose( + action_step.action['continuous_action'][0], + expected_continuous, + atol=1e-5, + ) + # The plan method is called with positional arguments for observation + # and policy_state, and a keyword argument for step. + mock_plan.assert_called_once() + called_args, called_kwargs = mock_plan.call_args + expected_observation = tf.constant(self._get_dummy_observation()[0]) + self.assertAllClose(called_args[0], expected_observation) + tf.nest.map_structure(self.assertAllClose, called_args[1], unbatched_state) + self.assertIn('step', called_kwargs) + self.assertIsInstance(called_kwargs['step'], tf.Variable) + + @mock.patch.object(mppi_agent.MPPIPolicy, '_estimate_value') + def test_plan_returns_updated_state(self, mock_estimate_value): + """Tests that the planner returns a correctly shaped policy state.""" + # 1. Setup + policy = self.agent.policy + observation = self._get_dummy_observation()[0] # plan expects unbatched + initial_state = policy.get_initial_state(batch_size=1) + unbatched_initial_state = tf.nest.map_structure( + lambda t: t[0], initial_state + ) + + # Mock `_estimate_value` to isolate the planner's state management logic + # from the value estimation logic. This makes the test more focused and + # efficient, as we only want to verify the shape of the returned policy + # state here. + # The mock value should have shape (popsize, 1) + mock_value = tf.random.normal((self.mpc_popsize, 1)) + mock_estimate_value.return_value = ( + mock_value, + None, + ) # trajectories not needed + + # 2. Action: Run the planner + step_counter = tf.Variable(1) + _, new_policy_state = policy.plan( + observation, unbatched_initial_state, step_counter + ) + + # 3. Assertion: Check that new_policy_state has the correct structure + self.assertIn('prev_mean_k', new_policy_state) + self.assertIn('prev_mean_z', new_policy_state) + self.assertEqual( + new_policy_state['prev_mean_k'].shape, (self.mpc_horizon, self.k_dim) + ) + self.assertEqual( + new_policy_state['prev_mean_z'].shape, + (self.mpc_horizon, self.all_z_dim), + ) + + def test_estimate_value_resets_environment_for_each_trajectory(self): + """Verifies that the model state is reset for each trajectory.""" + policy = self.agent.policy + self.mock_world_model.next.return_value = ( + tf.zeros((1, self.observation_spec.shape[0])), + tf.constant([[1.0]]), + False, + {}, + ) + + # Action dimension is k_dim + all_z_dim = 8 + 6 = 14 + actions = tf.zeros((self.mpc_horizon, self.mpc_popsize, 14)) + + # Act + policy._estimate_value(actions) + + # Assertion: get_state is called once, set_state is called + # for each trajectory + self.mock_world_model.get_state.assert_called_once() + self.assertEqual( + self.mock_world_model.set_state.call_count, self.mpc_popsize + ) + + @mock.patch.object(mppi_agent.MPPIPolicy, '_estimate_value') + def test_plan_finds_optimal_action(self, mock_estimate_value): + """Tests that the planner converges to the action with the highest reward.""" + # 1. Setup: Define an optimal action and a reward function + optimal_k = 7 + tf.random.set_seed(123) + # Temporarily increase sampling to make sure the planner samples enough. + policy = self.agent.policy + original_popsize = policy.mpc_popsize + original_elites = policy.mpc_num_elites + policy.mpc_popsize = 200 + policy.mpc_num_elites = 40 + + def side_effect_for_estimate_value(actions): + # This function will return a high reward only for the optimal action + # across the entire planning horizon. + # actions shape: (horizon, popsize, action_dim) + k_indices = tf.argmax(actions[:, :, : self.k_dim], axis=-1) + # Reward is based on the sum of rewards at each step. + rewards_per_step = tf.where(k_indices == optimal_k, 100.0, -1.0) + total_rewards = tf.reduce_sum(rewards_per_step, axis=0) + # returned value should have shape (popsize, 1) + return tf.expand_dims(total_rewards, axis=-1), None + + mock_estimate_value.side_effect = side_effect_for_estimate_value + observation = self._get_dummy_observation()[0] + initial_state = self.agent.policy.get_initial_state(batch_size=1) + unbatched_initial_state = tf.nest.map_structure( + lambda t: t[0], initial_state + ) + step_counter = tf.Variable(1) + + try: + # 2. Action: Run the planner + action_plan, _ = self.agent.policy.plan( + observation, unbatched_initial_state, step_counter + ) + finally: + # Restore original parameters to avoid affecting other tests. + policy.mpc_popsize = original_popsize + policy.mpc_num_elites = original_elites + + # 3. Assertion: Check that the planner chose the optimal action + # The action_plan has shape (horizon, action_dim) + # The first k_dim elements are the one-hot encoded k. + chosen_k_one_hot = action_plan[:, : self.k_dim] + chosen_k_indices = tf.argmax(chosen_k_one_hot, axis=-1) + + # The planner should converge to the optimal k for all steps + # in the horizon. + expected_k_indices = tf.constant( + [optimal_k] * self.mpc_horizon, dtype=tf.int64 + ) + self.assertAllEqual(chosen_k_indices, expected_k_indices) + + def test_update_distribution_logic(self): + """Verifies the CEM distribution update logic.""" + # 1. Arrange + policy = self.agent.policy + horizon = policy.mpc_horizon + popsize = policy.mpc_popsize + k_dim = policy.k_dim + all_z_dim = policy.all_z_dim + action_dim = k_dim + all_z_dim + alpha = policy.mpc_alpha + + # Create two distinct "elite" action sequences. + # Elite 1: k=0, z=[0.5, 0.5, ...] + elite_action_1_k = tf.one_hot([0] * horizon, depth=k_dim) + elite_action_1_z = tf.fill((horizon, all_z_dim), 0.5) + elite_action_1 = tf.concat([elite_action_1_k, elite_action_1_z], axis=-1) + + # Elite 2: k=1, z=[-0.5, -0.5, ...] + elite_action_2_k = tf.one_hot([1] * horizon, depth=k_dim) + elite_action_2_z = tf.fill((horizon, all_z_dim), -0.5) + elite_action_2 = tf.concat([elite_action_2_k, elite_action_2_z], axis=-1) + + # Create a batch of actions, embedding the elites at specific indices. + actions_np = np.zeros((horizon, popsize, action_dim), dtype=np.float32) + # For this test, we'll make the first two samples the elites. + actions_np[:, 0, :] = elite_action_1.numpy() + actions_np[:, 1, :] = elite_action_2.numpy() + actions = tf.constant(actions_np) + + # Create corresponding values. The elites get high scores. + # To make weight calculation predictable, set a fixed temperature. + policy.mpc_temperature = 1.0 + value_np = np.zeros((popsize, 1), dtype=np.float32) + # Elite 1 has a higher value, so it should get a higher weight. + value_np[0] = 10.0 + value_np[1] = 5.0 + value = tf.constant(value_np) + + # Initial distribution parameters are all zeros for this test. + initial_kmean = tf.zeros((horizon, k_dim), dtype=tf.float32) + initial_zmean = tf.zeros((horizon, all_z_dim), dtype=tf.float32) + initial_std = tf.zeros((horizon, all_z_dim), dtype=tf.float32) + + # 2. Act + new_kmean, new_zmean, new_std = policy._update_distribution( + actions, value, initial_kmean, initial_zmean, initial_std + ) + + # 3. Assert + # Manually calculate the expected results to verify the implementation. + # a. Calculate elite weights (softmax of values [10.0, 5.0]). + elite_values = tf.constant([10.0, 5.0]) + max_val = tf.reduce_max(elite_values) # 10.0 + unnorm_weights = tf.exp(policy.mpc_temperature * (elite_values - max_val)) + weights = unnorm_weights / tf.reduce_sum(unnorm_weights) + + # b. Calculate updated means (before momentum). + # This is the weighted average of the elite actions. + # Since actions are constant across the horizon, the mean will be too. + expected_updated_kmean_h0 = ( + weights[0] * elite_action_1_k[0] + weights[1] * elite_action_2_k[0] + ) + expected_updated_kmean = tf.stack([expected_updated_kmean_h0] * horizon) + + expected_updated_zmean_val = weights[0] * 0.5 + weights[1] * -0.5 + expected_updated_zmean = tf.fill( + (horizon, all_z_dim), expected_updated_zmean_val + ) + + # c. Calculate updated std dev (before momentum). + z_diff_sq_1 = (0.5 - expected_updated_zmean_val) ** 2 + z_diff_sq_2 = (-0.5 - expected_updated_zmean_val) ** 2 + expected_var_val = weights[0] * z_diff_sq_1 + weights[1] * z_diff_sq_2 + expected_updated_zstd = tf.fill( + (horizon, all_z_dim), tf.sqrt(expected_var_val + 1e-9) + ) + + # d. Apply momentum to get the final expected values. + # Since initial params are zero, this is just a scaling. + expected_new_kmean = (1 - alpha) * expected_updated_kmean + expected_new_zmean = (1 - alpha) * expected_updated_zmean + expected_new_zstd = (1 - alpha) * expected_updated_zstd + + self.assertAllClose(new_kmean, expected_new_kmean) + self.assertAllClose(new_zmean, expected_new_zmean) + self.assertAllClose(new_std, expected_new_zstd) + + +if __name__ == '__main__': + tf.test.main() diff --git a/smart_control/agents/mppi/mppi_utils.py b/smart_control/agents/mppi/mppi_utils.py new file mode 100644 index 00000000..dccf4ebd --- /dev/null +++ b/smart_control/agents/mppi/mppi_utils.py @@ -0,0 +1,151 @@ +"""Utility functions used by the MPPI agent and world model.""" + +import enum +import re +import numpy as np +from tf_agents.trajectories import policy_step +from smart_buildings.smart_control.utils import bounded_action_normalizer + + +class HistogramEstimationMethod(enum.Enum): + """Method used to estimate a value from a histogram.""" + + WEIGHTED_AVERAGE = 'weighted_average' + MAX_PROBABILITY = 'max_probability' + + +def get_estimated_temp_from_histogram( + observation_array: np.ndarray, + all_field_names: list[str], + sensor_base_name: str, # e.g., "zone_air_temperature_sensor" + method: HistogramEstimationMethod = HistogramEstimationMethod.WEIGHTED_AVERAGE, +) -> float | None: + r"""Estimates a single temperature value from its histogram features in the observation. + + Args: + observation_array: A numpy array containing the observation data. + all_field_names: A list of strings representing the names of all fields in + the observation. + sensor_base_name: The base name of the sensor for which to estimate the + temperature (e.g., "zone_air_temperature_sensor"). + method: The method to use for estimating the temperature. Can be either + "weighted_average" or "max_probability". + + Returns: + The estimated temperature value, or None if no valid histogram bins are + found. + + The function expects histogram features in the observation array, with names + that follow a specific pattern: + `(.+_)?{sensor_base_name}_h_([0-9]+\\.?[0-9]*)`, where: + - `(.+_)`: An optional prefix. + - `{sensor_base_name}`: The base name of the sensor. + - `_h_`: A literal string that separates the sensor name from the bin value. + - `([0-9]+\\.?[0-9]*)`: The temperature value of the bin. + + """ + relevant_bins = [] # List of (temperature_value, probability_in_bin) + + pattern = re.compile( + f'(.+_)?{re.escape(sensor_base_name)}_h_([0-9]+\\.?[0-9]*)' + ) + + for i, full_name in enumerate(all_field_names): + match = pattern.fullmatch(full_name) + if match: + try: + temp_str = match.group(2) # The captured temperature part + temp_val = float(temp_str) + bin_probability = observation_array[i] + if bin_probability > 0: # Consider only bins with some presence + relevant_bins.append({'temp': temp_val, 'prob': bin_probability}) + except ValueError: + print( + 'Warning: Could not parse temperature from histogram bin name:' + f' {full_name}' + ) + continue + + if not relevant_bins: + print(f'No active or parseable histogram bins found for {sensor_base_name}') + return None + + if method == HistogramEstimationMethod.MAX_PROBABILITY: + best_bin = max(relevant_bins, key=lambda x: x['prob']) + return best_bin['temp'] + elif method == HistogramEstimationMethod.WEIGHTED_AVERAGE: + weighted_sum = sum(b['temp'] * b['prob'] for b in relevant_bins) + total_prob = sum(b['prob'] for b in relevant_bins) + if total_prob > 0: + return weighted_sum / total_prob + else: + print( + f'Total probability for {sensor_base_name} bins is zero, cannot' + ' compute weighted average.' + ) + return None + else: + raise ValueError(f'Unknown method: {method}') + + +def apply_action( + policy_step_instance: policy_step.PolicyStep, + discrete_action_normalizers: dict[ + str, bounded_action_normalizer.BoundedActionNormalizer + ], + continuous_action_normalizers: dict[ + str, bounded_action_normalizer.BoundedActionNormalizer + ], + device_id: str, + action_name: str, + native_action_value: float, +) -> policy_step.PolicyStep: + """Applies a single action to the policy step. + + This function modifies the provided `policy_step_instance` by setting the + normalized value of a given action. It supports both discrete and continuous + actions, and uses the provided normalizers to convert from native action + values to agent values. + + Args: + policy_step_instance: The PolicyStep object to modify. + discrete_action_normalizers: A dictionary mapping device action names to + discrete action normalizers. + continuous_action_normalizers: A dictionary mapping device action names to + continuous action normalizers. + device_id: The ID of the device for which the action is applied. + action_name: The name of the action to apply. + native_action_value: The native value of the action to apply. + + Returns: + The modified PolicyStep object. + + Raises: + ValueError: If the device action name is not found in either the discrete + or continuous action normalizers, or if an unknown method is provided. + """ + device_action_name = device_id + '_' + action_name + if device_action_name in discrete_action_normalizers: + + normalizer = discrete_action_normalizers[device_action_name] + normalized_action_value = normalizer.agent_value(native_action_value) + index = list(discrete_action_normalizers.keys()).index(device_action_name) + policy_step_instance.action['discrete_action'][index] = ( + normalized_action_value + ) + + elif device_action_name in continuous_action_normalizers: + normalizer = continuous_action_normalizers[device_action_name] + normalized_action_value = normalizer.agent_value(native_action_value) + index = list(continuous_action_normalizers.keys()).index(device_action_name) + policy_step_instance.action['continuous_action'][index] = ( + normalized_action_value + ) + + else: + raise ValueError( + 'Device action name %s not found in action normalizers.' + % device_action_name + ) + + return policy_step_instance diff --git a/smart_control/agents/mppi/mppi_utils_test.py b/smart_control/agents/mppi/mppi_utils_test.py new file mode 100644 index 00000000..a40ce634 --- /dev/null +++ b/smart_control/agents/mppi/mppi_utils_test.py @@ -0,0 +1,157 @@ +from unittest import mock + +from absl.testing import absltest +from absl.testing import parameterized +import numpy as np +from tf_agents.trajectories import policy_step + +# pylint: disable=g-bad-import-order we prefer local imports below packages +from smart_buildings.smart_control.agents.mppi import mppi_utils +from smart_buildings.smart_control.utils import bounded_action_normalizer + + +class GetEstimatedTempFromHistogramTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.all_field_names = [ + 'some_other_feature', + 'prefix_zone_air_temperature_sensor_h_20.0', + 'prefix_zone_air_temperature_sensor_h_22.5', + 'prefix_zone_air_temperature_sensor_h_25.0', + 'another_feature', + ] + self.sensor_base_name = 'zone_air_temperature_sensor' + self.observation_array = np.array([10.0, 0.2, 0.6, 0.2, 20.0]) + + def test_weighted_average(self): + estimated_temp = mppi_utils.get_estimated_temp_from_histogram( + self.observation_array, + self.all_field_names, + self.sensor_base_name, + method=mppi_utils.HistogramEstimationMethod.WEIGHTED_AVERAGE, + ) + expected_temp = (20.0 * 0.2 + 22.5 * 0.6 + 25.0 * 0.2) / 1.0 + self.assertAlmostEqual(estimated_temp, expected_temp) + + def test_max_probability(self): + estimated_temp = mppi_utils.get_estimated_temp_from_histogram( + self.observation_array, + self.all_field_names, + self.sensor_base_name, + method=mppi_utils.HistogramEstimationMethod.MAX_PROBABILITY, + ) + self.assertAlmostEqual(estimated_temp, 22.5) + + def test_no_active_bins(self): + observation_array = np.zeros_like(self.observation_array) + estimated_temp = mppi_utils.get_estimated_temp_from_histogram( + observation_array, self.all_field_names, self.sensor_base_name + ) + self.assertIsNone(estimated_temp) + + def test_unparseable_bin_name_is_ignored(self): + all_field_names = [ + 'prefix_zone_air_temperature_sensor_h_20.0', + 'prefix_zone_air_temperature_sensor_h_invalid', + ] + observation_array = np.array([0.5, 0.5]) + estimated_temp = mppi_utils.get_estimated_temp_from_histogram( + observation_array, + all_field_names, + self.sensor_base_name, + method=mppi_utils.HistogramEstimationMethod.WEIGHTED_AVERAGE, + ) + self.assertAlmostEqual(estimated_temp, 20.0) + + def test_unknown_method_raises_value_error(self): + with self.assertRaises(ValueError): + mppi_utils.get_estimated_temp_from_histogram( + self.observation_array, + self.all_field_names, + self.sensor_base_name, + method='not_a_real_method', + ) + + +class ApplyActionTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.mock_discrete_normalizer = mock.create_autospec( + bounded_action_normalizer.BoundedActionNormalizer, instance=True + ) + self.mock_continuous_normalizer = mock.create_autospec( + bounded_action_normalizer.BoundedActionNormalizer, instance=True + ) + + self.discrete_action_normalizers = { + 'dev1_discrete_action': self.mock_discrete_normalizer + } + self.continuous_action_normalizers = { + 'dev1_continuous_action': self.mock_continuous_normalizer + } + + self.mock_policy_step = mock.create_autospec( + policy_step.PolicyStep, instance=True + ) + self.mock_policy_step.action = { + 'discrete_action': np.array([0]), + 'continuous_action': np.array([0.0]), + } + + def test_apply_discrete_action(self): + self.mock_discrete_normalizer.agent_value.return_value = 1 + + result_step = mppi_utils.apply_action( + self.mock_policy_step, + self.discrete_action_normalizers, + self.continuous_action_normalizers, + device_id='dev1', + action_name='discrete_action', + native_action_value=10.0, + ) + + self.mock_discrete_normalizer.agent_value.assert_called_once_with(10.0) + np.testing.assert_array_equal(result_step.action['discrete_action'], [1]) + np.testing.assert_array_equal( + result_step.action['continuous_action'], [0.0] + ) + + def test_apply_continuous_action(self): + self.mock_continuous_normalizer.agent_value.return_value = 0.5 + + result_step = mppi_utils.apply_action( + self.mock_policy_step, + self.discrete_action_normalizers, + self.continuous_action_normalizers, + device_id='dev1', + action_name='continuous_action', + native_action_value=25.0, + ) + + self.mock_continuous_normalizer.agent_value.assert_called_once_with(25.0) + np.testing.assert_array_almost_equal( + result_step.action['continuous_action'], [0.5] + ) + np.testing.assert_array_equal(result_step.action['discrete_action'], [0]) + + def test_action_not_found_raises_value_error(self): + with self.assertRaisesRegex( + ValueError, + 'Device action name dev2_unknown_action not found in action' + ' normalizers.', + ): + mppi_utils.apply_action( + self.mock_policy_step, + self.discrete_action_normalizers, + self.continuous_action_normalizers, + device_id='dev2', + action_name='unknown_action', + native_action_value=1.0, + ) + + +if __name__ == '__main__': + absltest.main() + diff --git a/smart_control/agents/mppi/world_model.py b/smart_control/agents/mppi/world_model.py new file mode 100644 index 00000000..c36af71c --- /dev/null +++ b/smart_control/agents/mppi/world_model.py @@ -0,0 +1,445 @@ +"""Defines the EnvWorldModel class to be used by a model-based RL algorithm (MPPI). + +This class is a wrapper around the environment used for our BaseBuilding Class. +Thus, it can work with any environment that inherits from BaseBuilding class. +""" + +import collections +import itertools +from typing import Any, List, Mapping, cast + +import gin +import numpy as np +import pandas as pd +from smart_buildings.smart_control.agents.mppi import mppi_utils +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.models import base_world_model +from smart_buildings.smart_control.utils import bounded_action_normalizer +import tensorflow as tf +from tf_agents.environments import tf_py_environment +from tf_agents.trajectories import policy_step as tf_policy_step + + +@gin.configurable +class EnvWorldModel(base_world_model.BaseWorldModel): + """A wrapper around the eval_env that provides a `next` method to serve as the world model for model-based RL algorithms.""" + + def __init__( + self, + env: environment.Environment, + discrete_normalizers: dict[ + str, bounded_action_normalizer.BoundedActionNormalizer + ], + continuous_normalizers: dict[ + str, bounded_action_normalizer.BoundedActionNormalizer + ], + par_size: np.ndarray | None = None, + ): + """Initializes the EnvWorldModel. + + Args: + env: The evaluation environment. + discrete_normalizers: Normalizers for discrete actions. + continuous_normalizers: Normalizers for continuous actions. + par_size: An array specifying the size of the continuous action space for + each discrete action. + """ + self._env = env + self.par_size = tf.constant(par_size, dtype=tf.int32) + self.discrete_action_normalizers = discrete_normalizers + self.continuous_action_normalizers = continuous_normalizers + self.action_spec = self.env.action_spec() + # offset[k] is the index of the first continuous parameter in the k-th + # discrete action. This is used to map the continuous action to the correct + # part of the flattened continuous action space (which has size all_z_dim). + offset = np.insert(np.cumsum(self.par_size), 0, 0)[:-1] + self.offset = tf.constant(offset, dtype=tf.int32) + # This is the total number of continuous parameters in the action space. + self.all_z_dim = np.sum(par_size) + + ( + unique_param_keys, + unique_param_key_to_idx, + ) = self._initialize_unique_continuous_params() + ( + supervisor_ids, + supervisor_id_to_key, + supervisor_to_params, + ) = self._initialize_supervisor_info(unique_param_keys) + params_for_k = self._generate_parameter_combinations( + supervisor_ids, supervisor_to_params + ) + self.k_dim = len(params_for_k) + self.supervisor_order = supervisor_ids + self._compute_discrete_action_mapping( + params_for_k, + supervisor_id_to_key, + supervisor_to_params, + ) + self._create_flattened_mappings(params_for_k, unique_param_key_to_idx) + + def synchronize(self, source_env: tf_py_environment.TFPyEnvironment): + """Synchronizes the planning environment with the acting environment. + + This copies the state from the acting environment's building to the + planning environment's building, ensuring the planner starts its + simulation from the correct state. + + Args: + source_env: The main TF-Agents environment to synchronize with. + """ + # The source_env could be a TFPyEnvironment wrapper or a raw Python env. + py_env = source_env.pyenv if hasattr(source_env, 'pyenv') else source_env + + # Access the underlying Python environment's building instance. + if not hasattr(py_env, 'building') or not hasattr(self.env, 'building'): + return + + source_building = py_env.building + target_building = self.env.building + + # Copy all relevant state attributes + target_building._native_inputs = source_building._native_inputs.copy() # pylint: disable=protected-access + target_building._current_observation_mapping = ( # pylint: disable=protected-access + source_building._current_observation_mapping.copy() # pylint: disable=protected-access + ) + target_building._current_timestamp = source_building._current_timestamp # pylint: disable=protected-access + target_building._observation_index = source_building._observation_index # pylint: disable=protected-access + + if ( + hasattr(source_building, '_current_action_mapping') + and source_building._current_action_mapping is not None # pylint: disable=protected-access + ): + target_building._current_action_mapping = ( # pylint: disable=protected-access + source_building._current_action_mapping.copy() # pylint: disable=protected-access + ) + else: + target_building._current_action_mapping = None # pylint: disable=protected-access + + def _initialize_unique_continuous_params( + self, + ) -> tuple[list[str], dict[str, int]]: + """Initializes and returns unique continuous parameter information.""" + # 1. Define the canonical list of UNIQUE continuous parameters from the + # normalizers. + # TODO(sipple): Remove protected access. + unique_param_keys = sorted(self.continuous_action_normalizers.keys()) + z_min = [ + self.continuous_action_normalizers[key]._min_native_value # pylint: disable=protected-access + for key in unique_param_keys + ] + z_max = [ + self.continuous_action_normalizers[key]._max_native_value # pylint: disable=protected-access + for key in unique_param_keys + ] + self.z_min = tf.constant(z_min, dtype=tf.float32) + self.z_max = tf.constant(z_max, dtype=tf.float32) + unique_param_key_to_idx = { + key: i for i, key in enumerate(unique_param_keys) + } + return unique_param_keys, unique_param_key_to_idx + + def _initialize_supervisor_info( + self, unique_param_keys: list[str] + ) -> tuple[ + list[str], dict[str, str], collections.defaultdict[str, List[str]] + ]: + """Initializes and returns supervisor-related information.""" + # 2. Dynamically build a map from supervisor ID to its full key + supervisor_id_to_key = {} + for key in self.discrete_action_normalizers.keys(): + # Assumes the ID is the part before the first underscore + supervisor_id = key.split('_', 1)[0] + supervisor_id_to_key[supervisor_id] = key + + # Derive the sorted list of supervisor IDs from the map + supervisor_ids = sorted(supervisor_id_to_key.keys()) + + # Group continuous parameters by supervisor ID + supervisor_to_params = collections.defaultdict(list) + for param_name in unique_param_keys: + supervisor_id = param_name.split('_', 1)[0] + supervisor_to_params[supervisor_id].append(param_name) + return supervisor_ids, supervisor_id_to_key, supervisor_to_params + + def _generate_parameter_combinations( + self, + supervisor_ids: list[str], + supervisor_to_params: collections.defaultdict[str, List[str]], + ) -> list[list[str]]: + """Generates all combinations of supervisor parameters.""" + supervisor_params_list = [ + supervisor_to_params.get(sid, []) for sid in supervisor_ids + ] + + params_for_k = [] + for r in range(len(supervisor_params_list) + 1): + for combo in itertools.combinations(supervisor_params_list, r): + flattened_list = [] + for sublist in combo: + flattened_list.extend(sublist) + params_for_k.append(flattened_list) + return params_for_k + + def _compute_discrete_action_mapping( + self, + params_for_k: list[list[str]], + supervisor_id_to_key: dict[str, str], + supervisor_to_params: collections.defaultdict[str, List[str]], + ): + """Computes the discrete action mapping.""" + # TODO(sipple): Remove protected access. + # 3.Compute the discrete action mapping using the dynamic lookup + self._discrete_action_mapping = {} + for k, k_params in enumerate(params_for_k): + command = [] + for supervisor_id in self.supervisor_order: + # Look up the full key from the map instead of reconstructing it + normalizer_key = supervisor_id_to_key[supervisor_id] + normalizer = self.discrete_action_normalizers[normalizer_key] + supervisor_params = supervisor_to_params.get(supervisor_id, []) + if supervisor_params and any(p in k_params for p in supervisor_params): + command.append(normalizer._max_native_value) # pylint: disable=protected-access + else: + command.append(normalizer._min_native_value) # pylint: disable=protected-access + self._discrete_action_mapping[k] = command + + def _create_flattened_mappings( + self, + params_for_k: list[list[str]], + unique_param_key_to_idx: dict[str, int], + ): + """Creates mappings for the flattened action space.""" + # 4. Construct the final FLATTENED list of parameter names. This list has + # `all_z_dim` elements and defines the exact layout of the model's output. + flattened_param_names = [] + for k_idx in range(self.k_dim): + flattened_param_names.extend(params_for_k[k_idx]) + + # 5. Build the mapping from the flattened space to the unique + # parameter space. + self.all_dim_to_unique_dim_idx = tf.constant( + [unique_param_key_to_idx[name] for name in flattened_param_names], + dtype=tf.int32, + ) + + # 6. Use the mapping to create z_min/z_max vectors that align with the + # `all_z_dim` (flattened) action space for de-normalization. + self.all_z_min = tf.gather(self.z_min, self.all_dim_to_unique_dim_idx) + self.all_z_max = tf.gather(self.z_max, self.all_dim_to_unique_dim_idx) + self.all_z_min.set_shape([self.all_z_dim]) + self.all_z_max.set_shape([self.all_z_dim]) + + # 7. Create the continuous_mapping list, aligned with the flattened space. + self.continuous_mapping = [ + { + 'device_id': name.split('_', 1)[0], + 'setpoint_name': name.split('_', 1)[1], + } + for name in flattened_param_names + ] + + @property + def env(self): + return self._env + + @property + def discrete_action_mapping(self) -> dict[int, List[float]]: + return self._discrete_action_mapping + + @discrete_action_mapping.setter + def discrete_action_mapping(self, value: dict[int, List[float]]): + self._discrete_action_mapping = value + + def get_state(self) -> dict[str, Any]: + """Saves a snapshot of the internal state of the building environment.""" + if not hasattr(self.env, 'building'): + # TODO(sipple): Remove protected access. + return {} + + native_inputs = self.env.building._native_inputs.copy() # pylint: disable=protected-access + obs_mapping = self.env.building._current_observation_mapping.copy() # pylint: disable=protected-access + timestamp = self.env.building._current_timestamp # pylint: disable=protected-access + obs_index = self.env.building._observation_index # pylint: disable=protected-access + if ( + self.env.building._current_action_mapping is not None # pylint: disable=protected-access + ): # pylint: disable=protected-access + action_mapping = self.env.building._current_action_mapping.copy() # pylint: disable=protected-access + else: + action_mapping = None + + pristine_state = { + '_native_inputs': native_inputs, + '_current_observation_mapping': obs_mapping, + '_current_timestamp': timestamp, + '_observation_index': obs_index, + '_current_action_mapping': action_mapping, + } + return pristine_state + + def set_state(self, state_dict: Mapping[str, Any]): + """Restores the internal state of the building environment.""" + # TODO(sipple): Remove protected access. + if not hasattr(self.env, 'building') or not state_dict: + return + + for key, value in state_dict.items(): + setattr( + self.env.building, + key, + value.copy() if hasattr(value, 'copy') else value, + ) + + @property + def building(self): + return self.env.building + + def rollout( + self, + start_timestamp: pd.Timestamp, + action_trajectory: list[tuple[int, tf.Tensor]], + ): + """Resets the environment and executes a sequence of actions.""" + predicted_states, predicted_rewards = [], [] + # TODO(sipple): Remove protected access. + self.env._episode_start_timestamp = start_timestamp # pylint: disable=protected-access + time_step = self.env.reset() + predicted_states.append(time_step.observation) # Add initial state + + # Execute the trajectory of actions for each step of the horizon. + for _, (k_action, z_action) in enumerate(action_trajectory): + # Call the new, centralized helper method + action_dict = self.create_action_dict(k_action, z_action.numpy()) + time_step = self.env.step(action_dict) + predicted_states.append(time_step.observation) + predicted_rewards.append(time_step.reward) + + return predicted_states, predicted_rewards + + def create_action_dict( + self, k: int, z_native: np.ndarray + ) -> dict[str, np.ndarray]: + """Builds the final action dictionary required by the environment. + + This is the single source of truth for converting a discrete action 'k' and + a de-normalized continuous vector 'z_native' into the correct format. + + Args: + k: The chosen discrete action index. + z_native: A numpy array of de-normalized continuous action values. + + Returns: + The formatted action dictionary. + """ + actions_to_apply = [] + supervisor_vals = self._discrete_action_mapping[k] + + # Get the number of active parameters and the offset for the chosen 'k' + num_active = self.par_size[k].numpy() + offset_val = self.offset[k].numpy() + + # Map active continuous parameters + for i in range(num_active): + param_idx = offset_val + i + mapping = self.continuous_mapping[param_idx] + actions_to_apply.append({ + 'device_id': mapping['device_id'], + 'action_name': mapping['setpoint_name'], + 'native_value': z_native[i], + }) + + # Add discrete supervisor actions + for i, device_id in enumerate(self.supervisor_order): + actions_to_apply.append({ + 'device_id': device_id, + 'action_name': 'supervisor_run_command', + 'native_value': supervisor_vals[i], + }) + + # Initialize the action dictionary structure + action_dict = { + 'discrete_action': np.zeros( + self.action_spec['discrete_action'].shape, dtype=np.int32 + ), + 'continuous_action': np.zeros( + self.action_spec['continuous_action'].shape, dtype=np.float32 + ), + } + policy_step = collections.namedtuple( + 'PolicyStepMimic', ['action', 'state', 'info'] + )(action=action_dict, state=(), info=()) + + # Populate the action dictionary using the utility function + for action_item in actions_to_apply: + policy_step = mppi_utils.apply_action( + cast(tf_policy_step.PolicyStep, policy_step), + self.discrete_action_normalizers, + self.continuous_action_normalizers, + action_item['device_id'], + action_item['action_name'], + action_item['native_value'], + ) + return policy_step.action + + def _format_action_from_tensor(self, a: tf.Tensor) -> dict[str, np.ndarray]: + """Decodes the model's raw action tensor and formats it for the environment.""" + if a.shape[0] != 1: + raise ValueError( + 'EnvWorldModel._format_action_from_tensor expects a batch size of 1,' + f' but got shape {a.shape}' + ) + action_tensor = tf.squeeze(a, axis=0) + + # 1. Decode the discrete action 'k' + k_tensor = tf.argmax(action_tensor[: self.k_dim], output_type=tf.int32) + + # 2. Decode and de-normalize the continuous action 'z' + z_vector_normalized = action_tensor[self.k_dim :] + offset = self.offset[k_tensor] + num_params = self.par_size[k_tensor] + z_normalized = z_vector_normalized[offset : offset + num_params] + + z_max_active = self.all_z_max[offset : offset + num_params] + z_min_active = self.all_z_min[offset : offset + num_params] + z_native = ( + 0.5 + * (tf.clip_by_value(z_normalized, -1.0, 1.0) + 1) + * (z_max_active - z_min_active) + + z_min_active + ) + + # 3. Delegate final formatting to the helper function + return self.create_action_dict(k_tensor.numpy(), z_native.numpy()) + + def next(self, a: tf.Tensor): + """Mimics the learned world_model's `next` method.""" + # 1. Decode the action tensor into the dictionary format for the env + action_dict = self._format_action_from_tensor(a) + + time_step = self.env.step(action_dict) + + # 2. Unpack the results from the TimeStep object + s_pred = time_step.observation + reward = time_step.reward + is_terminal = time_step.is_last() + + # This handles cases where the environment returns a float, int, None, + # or a 0-dimensional numpy.ndarray.(#Q: would this be a problem + # when reward in -inf?) + try: + reward_float = float(reward) + except (TypeError, ValueError): + reward_float = 0.0 + + # 3. Format the results into tensors + s_pred_tensor = tf.expand_dims( + tf.constant(s_pred, dtype=tf.float32), axis=0 + ) + reward_tensor = tf.constant([[reward_float]], dtype=tf.float32) + + continue_prob = ( + tf.constant([[0.0, 1.0]]) if is_terminal else tf.constant([[1.0, 0.0]]) + ) + r1 = None + + return s_pred_tensor, reward_tensor, continue_prob, r1 diff --git a/smart_control/agents/mppi/world_model_test.py b/smart_control/agents/mppi/world_model_test.py new file mode 100644 index 00000000..ceb7696b --- /dev/null +++ b/smart_control/agents/mppi/world_model_test.py @@ -0,0 +1,317 @@ +import unittest +from unittest import mock + +import gin +import numpy as np +import pandas as pd +from smart_buildings.smart_control.agents.mppi import world_model +from smart_buildings.smart_control.utils import bounded_action_normalizer +import tensorflow as tf +from tf_agents.specs import array_spec +from tf_agents.trajectories import time_step as ts + + +class EnvWorldModelTest(tf.test.TestCase): + + def setUp(self): + """Initializes the test environment and the world model instance.""" + super().setUp() + self.mock_env = mock.MagicMock() + + # Define supervisor IDs and bind them for gin configuration + ac1_id = '4192383548323266560' + ac2_id = '202194278473007104' + hws_id = '3111519637754347520' + gin.bind_parameter('%AC1', ac1_id) + gin.bind_parameter('%AC2', ac2_id) + gin.bind_parameter('%HWS', hws_id) + + # Create normalizers, which are required inputs for the world model + self.mock_discrete_normalizers = { + f'{ac2_id}_supervisor_run_command': ( + bounded_action_normalizer.BoundedActionNormalizer( + min_native_value=-1.1, max_native_value=1.1 + ) + ), + f'{hws_id}_supervisor_run_command': ( + bounded_action_normalizer.BoundedActionNormalizer( + min_native_value=-1.1, max_native_value=1.1 + ) + ), + f'{ac1_id}_supervisor_run_command': ( + bounded_action_normalizer.BoundedActionNormalizer( + min_native_value=-1.1, max_native_value=1.1 + ) + ), + } + + # z_min and z_max are min/max NATIVE values for continuous parameters + z_min_map = { + f'{ac1_id}_supply_air_static_pressure_setpoint': -12.0, + f'{ac1_id}_supply_air_temperature_setpoint': -20.0, + f'{ac2_id}_supply_air_static_pressure_setpoint': -10.0, + f'{ac2_id}_supply_air_temperature_setpoint': -15.0, + f'{hws_id}_differential_pressure_setpoint': -5.0, + f'{hws_id}_supply_water_temperature_setpoint': -8.0, + } + z_max_map = { + f'{ac1_id}_supply_air_static_pressure_setpoint': 15.0, + f'{ac1_id}_supply_air_temperature_setpoint': 25.0, + f'{ac2_id}_supply_air_static_pressure_setpoint': 12.0, + f'{ac2_id}_supply_air_temperature_setpoint': 18.0, + f'{hws_id}_differential_pressure_setpoint': 8.0, + f'{hws_id}_supply_water_temperature_setpoint': 10.0, + } + # for "normalized" values, normally we use -1 to 1, but for testing, + # we make it -2 to 2 so that we can see the difference between + # z_normalized (-1 to 1), which mppi returns + # versus z_native (min/max native values) which the environment uses. + agent_continuous_min_map = {key: -2.0 for key in z_min_map} + agent_continuous_max_map = {key: 2.0 for key in z_min_map} + + self.mock_continuous_normalizers = { + key: bounded_action_normalizer.BoundedActionNormalizer( + min_native_value=z_min_map[key], + max_native_value=z_max_map[key], + min_normalized_value=agent_continuous_min_map[key], + max_normalized_value=agent_continuous_max_map[key], + ) + for key in sorted(z_min_map.keys()) + } + + # Configure the mock environment's action spec + min_bounds = [ + agent_continuous_min_map[key] for key in sorted(z_min_map.keys()) + ] + max_bounds = [ + agent_continuous_max_map[key] for key in sorted(z_min_map.keys()) + ] + # Set the return_value to mock a method call + self.mock_env.action_spec.return_value = { + 'discrete_action': array_spec.BoundedArraySpec( + shape=(3,), dtype=np.int32, name='discrete', minimum=-1, maximum=1 + ), + 'continuous_action': array_spec.BoundedArraySpec( + shape=(6,), + dtype=np.float32, + name='continuous', + minimum=min_bounds, + maximum=max_bounds, + ), + } + self.observation_spec = array_spec.ArraySpec( + shape=(10,), dtype=np.float32, name='observation' + ) + + # Define par_size as an input to the world model + self.par_size = np.array([0, 2, 2, 2, 4, 4, 4, 6]) + + # Instantiate the class under test + self.world_model = world_model.EnvWorldModel( + env=self.mock_env, + discrete_normalizers=self.mock_discrete_normalizers, + continuous_normalizers=self.mock_continuous_normalizers, + par_size=self.par_size, + ) + + def test_initialization(self): + """Tests that the world model initializes correctly.""" + # all_z_dim = sum of par_size = 0+2+2+2+4+4+4+6 = 24 + self.assertLen(self.world_model.continuous_mapping, 24) + # Check that the device IDs in the mapping are correct based on params_for_k + self.assertEqual( + self.world_model.continuous_mapping[0]['device_id'], + gin.query_parameter('%AC2'), + ) + self.assertEqual( + self.world_model.continuous_mapping[2]['device_id'], + gin.query_parameter('%HWS'), + ) + self.assertEqual( + self.world_model.continuous_mapping[4]['device_id'], + gin.query_parameter('%AC1'), + ) + + # Verify z_min and z_max against the normalizers that were passed in + unique_param_keys = sorted(self.mock_continuous_normalizers.keys()) + expected_z_min = tf.constant( + [ + self.mock_continuous_normalizers[key]._min_native_value + for key in unique_param_keys + ], + dtype=tf.float32, + ) + expected_z_max = tf.constant( + [ + self.mock_continuous_normalizers[key]._max_native_value + for key in unique_param_keys + ], + dtype=tf.float32, + ) + self.assertAllClose(self.world_model.z_min, expected_z_min) + self.assertAllClose(self.world_model.z_max, expected_z_max) + + def test_format_action_from_tensor(self): + """Tests the internal action formatting logic.""" + # Action: k=1 ([0, 1, 0, 0, 0, 0, 0, 0]), z_normalized=[0.5, -0.5] + k_onehot = tf.constant( + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], dtype=tf.float32 + ) + z_normalized = tf.constant([0.5, -0.5], dtype=tf.float32) + # The z-vector must be padded to all_z_dim. For k=1, offset is 0. + z_padded = tf.pad( + z_normalized, + [[0, self.world_model.all_z_dim - tf.shape(z_normalized)[0]]], + ) + action_tensor = tf.expand_dims( + tf.concat([k_onehot, z_padded], axis=0), axis=0 + ) + + action_dict = self.world_model._format_action_from_tensor(action_tensor) + print('action dict: ', action_dict) + expected_discrete = np.array([1, -1, -1], dtype=np.float32) + expected_continuous = np.array([1, -1, 0, 0, 0.0, 0.0], dtype=np.float32) + np.testing.assert_array_equal( + action_dict['discrete_action'], expected_discrete + ) + np.testing.assert_array_almost_equal( + action_dict['continuous_action'], expected_continuous + ) + + def test_next_method_steps_env(self): + """Tests that the `next` method correctly steps the wrapped environment.""" + # Action: k=2 ([ [-1.1, 1.1, -1.1]]), z_normalized=[-1.0, 1.0] + # For k=2, the active parameters are for HWS (indices 2, 3). + # z_native[0] = -1 (min) + # z_native[1] = 2 (max) + k_onehot = tf.constant( + [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], dtype=tf.float32 + ) + # The z-vector must be padded to all_z_dim. For k=2, the values start at + # offset 2. + z_values = tf.constant([-1.0, 1.0], dtype=tf.float32) + z_padded = tf.concat([tf.zeros(2), z_values, tf.zeros(20)], axis=0) + action_tensor = tf.expand_dims( + tf.concat([k_onehot, z_padded], axis=0), axis=0 + ) + expected_s_pred = np.ones( + self.observation_spec.shape, dtype=self.observation_spec.dtype + ) + + def check_step_action(action_dict): + """Checks that the action passed to env.step is correct.""" + expected_discrete = np.array([-1, 1, -1], dtype=np.int32) + expected_continuous = np.array( + [0.0, 0.0, -2.0, 2.0, 0.0, 0.0], dtype=np.float32 + ) + try: + np.testing.assert_array_equal( + action_dict['discrete_action'], expected_discrete + ) + np.testing.assert_array_almost_equal( + action_dict['continuous_action'], expected_continuous + ) + return ts.transition(observation=expected_s_pred, reward=10.0) + except AssertionError: + return ts.transition(observation=expected_s_pred, reward=-1.0) + + self.mock_env.step.side_effect = check_step_action + + s_pred, reward, continue_prob, _ = self.world_model.next(action_tensor) + + self.mock_env.step.assert_called_once() + + self.assertTrue( + tf.experimental.numpy.allclose( + tf.squeeze(s_pred, axis=0), + tf.convert_to_tensor(expected_s_pred, dtype=tf.float32), + ) + ) + self.assertEqual(reward.numpy().item(), 10.0) + self.assertTrue( + tf.experimental.numpy.allclose( + continue_prob, tf.constant([[1.0, 0.0]], dtype=tf.float32) + ) + ) + + def test_format_action_from_tensor_k0_k7(self): + """Tests action formatting for k=0 and k=7 edge cases.""" + # Case 1: k=0 (no continuous parameters) + k_onehot_0 = tf.constant( + [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], dtype=tf.float32 + ) + # For k=0, the z-values should be ignored, so we use non-zeros to test. + z_padded_0 = tf.ones((self.world_model.all_z_dim,), dtype=tf.float32) + action_tensor_0 = tf.expand_dims( + tf.concat([k_onehot_0, z_padded_0], axis=0), axis=0 + ) + action_dict_0 = self.world_model._format_action_from_tensor(action_tensor_0) + expected_discrete_0 = np.array([-1, -1, -1], dtype=np.int32) + expected_continuous_0 = np.zeros((6,), dtype=np.float32) + np.testing.assert_array_equal( + action_dict_0['discrete_action'], expected_discrete_0 + ) + np.testing.assert_array_almost_equal( + action_dict_0['continuous_action'], expected_continuous_0 + ) + + # Case 2: k=7 (all 6 continuous parameters are active) + k_onehot_7 = tf.constant( + [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], dtype=tf.float32 + ) + z_normalized_7 = tf.constant( + [0.1, 0.2, 0.3, 0.4, 0.5, -0.5], dtype=tf.float32 + ) + # For k=7, the offset is 18 and num_params is 6. + z_padded_7 = tf.concat([tf.zeros(18), z_normalized_7], axis=0) + action_tensor_7 = tf.expand_dims( + tf.concat([k_onehot_7, z_padded_7], axis=0), axis=0 + ) + action_dict_7 = self.world_model._format_action_from_tensor(action_tensor_7) + expected_discrete_7 = np.array([1, 1, 1], dtype=np.int32) + + # agent_value = 2*z_normalized + expected_continuous_7 = np.array( + [0.2, 0.4, 0.6, 0.8, 1.0, -1.0], dtype=np.float32 + ) + np.testing.assert_array_equal( + action_dict_7['discrete_action'], expected_discrete_7 + ) + np.testing.assert_array_almost_equal( + action_dict_7['continuous_action'], expected_continuous_7 + ) + + def test_rollout_method(self): + """Tests the multi-step rollout functionality.""" + start_timestamp = pd.Timestamp('2023-01-01') + action_trajectory = [ + (0, tf.constant([0.0, -1.0], dtype=tf.float32)), + (1, tf.constant([1.0, 0.0], dtype=tf.float32)), + ] + obs1 = np.full(self.observation_spec.shape, 1.0, dtype=np.float32) + obs2 = np.full(self.observation_spec.shape, 2.0, dtype=np.float32) + self.mock_env.step.side_effect = [ + ts.transition(obs1, reward=5.0), + ts.transition(obs2, reward=15.0), + ] + initial_obs = np.zeros(self.observation_spec.shape, dtype=np.float32) + self.mock_env.reset.return_value = ts.restart(initial_obs) + + states, rewards = self.world_model.rollout( + start_timestamp, action_trajectory + ) + + self.mock_env.reset.assert_called_once() + self.assertEqual( + self.world_model.env._episode_start_timestamp, start_timestamp + ) + self.assertEqual(self.mock_env.step.call_count, 2) + + np.testing.assert_array_equal(states[0], initial_obs) + np.testing.assert_array_equal(states[1], obs1) + np.testing.assert_array_equal(states[2], obs2) + self.assertEqual(rewards, [5.0, 15.0]) + + +if __name__ == '__main__': + unittest.main() diff --git a/smart_control/configs/resources/sb1/BUILD b/smart_control/configs/resources/sb1/BUILD deleted file mode 100644 index a98abc2c..00000000 --- a/smart_control/configs/resources/sb1/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2024 Google LLC - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# https://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -filegroup( - name = "config_data", - srcs = [ - "double_resolution_zone_1_2.npy", - "local_weather_moffett_field_20230701_20231122.csv", - "observation_response_2024.08.29.00", - "reset_temps.npy", - "sim_config.gin", - "sim_config_legacy.gin", - ], -) diff --git a/smart_control/configs/resources/sb1/README.md b/smart_control/configs/resources/sb1/README.md new file mode 100644 index 00000000..1b44c8bd --- /dev/null +++ b/smart_control/configs/resources/sb1/README.md @@ -0,0 +1,57 @@ +# Simulation Configuration for Building 'SB-1' + +## Gin Configuration Files + +There are some older versions of the gin config located at "sim_config.gin" and +"legacy_config.gin". These are deprecated by Judah's HVAC updates in December +2025. + +The config Gabriel used for his RL experiments is located at "train_sim_configs" +directory. These are deprecated by Judah's HVAC updates in December 2025. + +The newest version of the full gin config file is found at +"sim_202512/full_config.gin". This file represents the **current operational +configuration** with the current HVAC setup. We have been updating it even after +the namespaced date stamp. + +## Data Files + +### Floor Plan + +The "double_resolution_zone_1_2.npy" file provides the floor plan for the +building. + +### Zone Temperatures + +The "reset_temps.npy" file provides initial zone temperatures that can be used +to seed / setup the environment. It is the default setup for simulation +experiments. + +The "demo_temps.npy" file provides a slightly different set of initial zone +temperatures that have been determined to produce a more interesting temperature +gradients in live demos. + +### Weather Data + +The "local_weather_moffett_field_20230701_20231122.csv" file was the original +source of weather data for the specified time range in 2023. + +We have since added more years of historical weather data, in the "weather_data" +directory, including the "2023.csv" file which deprecates the original file. +From time to time we can refresh the data in this directory. It's also possible +that this weather data can be shared by multiple buildings, so we could consider +moving it to a more central location, like +"configs/resources/weather_data/{station_name}", where multiple buildings like +"sb1" can share the same weather station. + +## Config Utils + +The "config_utils" directory provides helper methods to load data files and +ensure the necessary dependencies have been imported. + +It provides a helper function to apply the configuration, and customize certain +configuration settings that we might want to parameterize in experimental +trials. + +Finally, it provides tests to ensure the configuration settings are being +applied as desired. diff --git a/smart_control/configs/resources/sb1/config_utils/conftest.py b/smart_control/configs/resources/sb1/config_utils/conftest.py new file mode 100644 index 00000000..143ee600 --- /dev/null +++ b/smart_control/configs/resources/sb1/config_utils/conftest.py @@ -0,0 +1,287 @@ +"""Test helpers for configs tests.""" + +# WEATHER DATA + +WEATHER_COLUMNS = ( + "Time", + "StationName", + "Location", + "TempC", + "DewPointC", + "BarometerMbar", + "Rain", + "RainTotal", + "WindspeedKmph", + "WindDirection", + "SkyCoverage", + "VisibilityKm", + "Humidity", + "TempF", + "HumidityARM", +) + +# ENVIRONMENT + +ACTION_NORMALIZER_NAMES = ( + "ahu_1_supply_air_temperature_setpoint", + "ahu_1_supply_air_static_pressure_setpoint", + "ahu_2_supply_air_temperature_setpoint", + "ahu_2_supply_air_static_pressure_setpoint", + "supply_water_temperature_setpoint", + "differential_pressure_setpoint", +) + +ACTION_NAMES = ( + "ahs_ahu_1_supply_air_temperature_setpoint", + "ahs_ahu_1_supply_air_static_pressure_setpoint", + "ahs_ahu_2_supply_air_temperature_setpoint", + "ahs_ahu_2_supply_air_static_pressure_setpoint", + "hws_supply_water_temperature_setpoint", + "hws_differential_pressure_setpoint", +) + +DEFAULT_ACTION_VALUES = (-0.2, 1.0, -0.2, 1.0, 0.5, 1.0) + +ACTION_FIELDS = ( + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "ahs_ahu_1_supply_air_temperature_setpoint", + "setpoint_name": "ahu_1_supply_air_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Kelvin", + "min_native_value": 285.0, + "max_native_value": 305.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "ahs_ahu_1_supply_air_static_pressure_setpoint", + "setpoint_name": "ahu_1_supply_air_static_pressure_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Pascal", + "min_native_value": 0.0, + "max_native_value": 20000.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "ahs_ahu_2_supply_air_temperature_setpoint", + "setpoint_name": "ahu_2_supply_air_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Kelvin", + "min_native_value": 285.0, + "max_native_value": 305.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "ahs_ahu_2_supply_air_static_pressure_setpoint", + "setpoint_name": "ahu_2_supply_air_static_pressure_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Pascal", + "min_native_value": 0.0, + "max_native_value": 20000.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "hws", + "device_type": "HWS", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "hws_supply_water_temperature_setpoint", + "setpoint_name": "supply_water_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Kelvin", + "min_native_value": 310.0, + "max_native_value": 350.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "hws", + "device_type": "HWS", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "hws_differential_pressure_setpoint", + "setpoint_name": "differential_pressure_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Pascal", + "min_native_value": 0.0, + "max_native_value": 20.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, +) + +# HYBRID ACTION ENVIRONMENT + +HYBRID_ACTION_NAMES = ( + "ahs_ahu_1_supervisor_run_command", + "ahs_ahu_2_supervisor_run_command", + "ahs_ahu_1_supply_air_temperature_setpoint", + "ahs_ahu_1_supply_air_static_pressure_setpoint", + "ahs_ahu_2_supply_air_temperature_setpoint", + "ahs_ahu_2_supply_air_static_pressure_setpoint", + "hws_supervisor_run_command", + "hws_supply_water_temperature_setpoint", + "hws_differential_pressure_setpoint", +) + +HYBRID_ACTION_NORMALIZER_NAMES = ( + "supply_water_temperature_setpoint", + "differential_pressure_setpoint", + "ahu_1_supply_air_temperature_setpoint", + "ahu_1_supply_air_static_pressure_setpoint", + "ahu_2_supply_air_temperature_setpoint", + "ahu_2_supply_air_static_pressure_setpoint", + "supervisor_run_command", + "ahu_1_supervisor_run_command", + "ahu_2_supervisor_run_command", +) + +HYBRID_DEFAULT_ACTION_VALUES = (1.0, 1.0, -0.2, 1.0, -0.2, 1.0, 1.0, 0.5, 1.0) + +HYBRID_ACTION_FIELDS = ( + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "DISCRETE", + "action_name": "ahs_ahu_1_supervisor_run_command", + "setpoint_name": "ahu_1_supervisor_run_command", + "value_type": "VALUE_CONTINUOUS", + "units": "On/Off", + "min_native_value": 0.0, + "max_native_value": 1.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "DISCRETE", + "action_name": "ahs_ahu_2_supervisor_run_command", + "setpoint_name": "ahu_2_supervisor_run_command", + "value_type": "VALUE_CONTINUOUS", + "units": "On/Off", + "min_native_value": 0.0, + "max_native_value": 1.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "ahs_ahu_1_supply_air_temperature_setpoint", + "setpoint_name": "ahu_1_supply_air_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Kelvin", + "min_native_value": 285.0, + "max_native_value": 305.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "ahs_ahu_1_supply_air_static_pressure_setpoint", + "setpoint_name": "ahu_1_supply_air_static_pressure_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Pascal", + "min_native_value": 0.0, + "max_native_value": 20000.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "ahs_ahu_2_supply_air_temperature_setpoint", + "setpoint_name": "ahu_2_supply_air_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Kelvin", + "min_native_value": 285.0, + "max_native_value": 305.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "ahs", + "device_type": "AHU", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "ahs_ahu_2_supply_air_static_pressure_setpoint", + "setpoint_name": "ahu_2_supply_air_static_pressure_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Pascal", + "min_native_value": 0.0, + "max_native_value": 20000.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "hws", + "device_type": "HWS", + "zone_id": "default_zone_id", + "setpoint_type": "DISCRETE", + "action_name": "hws_supervisor_run_command", + "setpoint_name": "supervisor_run_command", + "value_type": "VALUE_TYPE_UNDEFINED", + "units": "On/Off", + "min_native_value": 0.0, + "max_native_value": 1.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "hws", + "device_type": "HWS", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "hws_supply_water_temperature_setpoint", + "setpoint_name": "supply_water_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Kelvin", + "min_native_value": 310.0, + "max_native_value": 350.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, + { + "device_id": "hws", + "device_type": "HWS", + "zone_id": "default_zone_id", + "setpoint_type": "CONTINUOUS", + "action_name": "hws_differential_pressure_setpoint", + "setpoint_name": "differential_pressure_setpoint", + "value_type": "VALUE_CONTINUOUS", + "units": "Pascal", + "min_native_value": 0.0, + "max_native_value": 20.0, + "min_normalized_value": -1.0, + "max_normalized_value": 1.0, + }, +) diff --git a/smart_control/configs/resources/sb1/config_utils/data_files.py b/smart_control/configs/resources/sb1/config_utils/data_files.py new file mode 100644 index 00000000..2281c45d --- /dev/null +++ b/smart_control/configs/resources/sb1/config_utils/data_files.py @@ -0,0 +1,40 @@ +"""Helper functions for loading data files. + +NOTE: consider moving this file up into the "configs" directory itself, +to accompany the corresponding data files. +""" + +import os + +import numpy as np +import pandas as pd + +from smart_buildings.smart_control.utils import constants + +DIRPATH = os.path.join(constants.REPO_DIRPATH, "configs", "resources", "sb1") + +ZONE_TEMPS_FILEPATH = os.path.join(DIRPATH, "reset_temps.npy") +FLOOR_PLAN_FILEPATH = os.path.join(DIRPATH, "double_resolution_zone_1_2.npy") +WEATHER_DATA_DIRPATH = os.path.join(DIRPATH, "weather_data") + + +def get_floor_plan(filepath: str = FLOOR_PLAN_FILEPATH) -> np.ndarray: + """Returns the floor plan as a numpy array.""" + with open(filepath, "rb") as f: + return np.load(f) + + +def get_zone_temps(filepath: str = ZONE_TEMPS_FILEPATH) -> np.ndarray: + """Returns the zone temperatures as a numpy array.""" + with open(filepath, "rb") as f: + return np.load(f) + + +def get_weather_data_filepath(year: int = 2024) -> str: + """Returns the filepath to the weather data for the given year.""" + return os.path.join(WEATHER_DATA_DIRPATH, f"{year}.csv") + + +def get_weather_data(year: int = 2024) -> pd.DataFrame: + """Returns the weather data for the given year as a pandas DataFrame.""" + return pd.read_csv(get_weather_data_filepath(year)) diff --git a/smart_control/configs/resources/sb1/config_utils/data_files_test.py b/smart_control/configs/resources/sb1/config_utils/data_files_test.py new file mode 100644 index 00000000..f5cc822b --- /dev/null +++ b/smart_control/configs/resources/sb1/config_utils/data_files_test.py @@ -0,0 +1,58 @@ +"""Test for data files used within gin configs.""" + +from absl.testing import absltest +import numpy as np +import pandas as pd + +from smart_buildings.smart_control.configs.resources.sb1.config_utils import conftest +from smart_buildings.smart_control.configs.resources.sb1.config_utils import data_files + + +class WeatherDataTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.weather_df = data_files.get_weather_data() + + def test_columns(self): + self.assertEqual( + list(self.weather_df.columns), list(conftest.WEATHER_COLUMNS) + ) + + def test_time_range(self): + self.assertEqual(self.weather_df["Time"].min(), "20240101-0100") + self.assertEqual(self.weather_df["Time"].max(), "20241230-0900") + + +class FloorPlanTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.floorplan = data_files.get_floor_plan() + self.df = pd.DataFrame(self.floorplan) + + def test_shape(self): + self.assertEqual(self.df.shape, (744, 1004)) + + def test_values(self): + value_counts = self.df.stack().value_counts().to_dict() + value_counts = {int(k): v for k, v in value_counts.items()} + self.assertEqual(value_counts, {0: 436332, 1: 60204, 2: 250440}) + + +class ZoneTempsTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.zone_temps = data_files.get_zone_temps() + + def test_shape(self): + self.assertEqual(self.zone_temps.shape, (744, 1004)) + + def test_values(self): + self.assertAlmostEqual(np.min(self.zone_temps), 288.287, places=3) + self.assertAlmostEqual(np.max(self.zone_temps), 297.372, places=3) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/configs/resources/sb1/config_utils/full_config.py b/smart_control/configs/resources/sb1/config_utils/full_config.py new file mode 100644 index 00000000..ea1f1845 --- /dev/null +++ b/smart_control/configs/resources/sb1/config_utils/full_config.py @@ -0,0 +1,89 @@ +"""Gin configuration utilities for Building 'SB-1'.""" + +import os + +import gin + +# pylint: disable=unused-import # these imports are needed by the gin config: +from smart_buildings.smart_control.configs.resources.sb1.config_utils import data_files +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.reward import electricity_energy_cost +from smart_buildings.smart_control.reward import natural_gas_energy_cost +from smart_buildings.smart_control.reward import setpoint_energy_carbon_regret +from smart_buildings.smart_control.simulator import building +from smart_buildings.smart_control.simulator import hvac_floorplan_based +from smart_buildings.smart_control.simulator import randomized_arrival_departure_occupancy as occupancy +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import simulator_building +from smart_buildings.smart_control.simulator import stochastic_convection_simulator +from smart_buildings.smart_control.simulator import tf_simulator +from smart_buildings.smart_control.simulator import weather_controller +from smart_buildings.smart_control.utils import environment_utils +from smart_buildings.smart_control.utils import observation_normalizer +# pylint: enable=unused-import + +FULL_CONFIG_FILEPATH = os.path.join( + data_files.DIRPATH, "sim_202512", "full_config.gin" +) + +START_TIMESTAMP = "2024-12-16 00:00:00" +N_DAYS = 7 + + +def parse_gin_config( + config_filepath: str = FULL_CONFIG_FILEPATH, +) -> gin.config.ParsedConfigFileIncludesAndImports: + return gin.parse_config_file(config_filepath) + + +def set_gin_config( + config_filepath: str = FULL_CONFIG_FILEPATH, + # episode settings: + start_timestamp: str = START_TIMESTAMP, + n_days: int = N_DAYS, + # reward function settings: + productivity_weight: float = 0.6, + energy_cost_weight: float = 0.2, + carbon_emission_weight: float = 0.2, + # occupancy settings (centered around building operational hours): + earliest_expected_arrival_hour: int = 7, + latest_expected_arrival_hour: int = 12, + earliest_expected_departure_hour: int = 13, + latest_expected_departure_hour: int = 19, + # building settings: + floor_plan_filepath: str = data_files.FLOOR_PLAN_FILEPATH, + # weather settings: + weather_data_filepath: str | None = None, +) -> None: + """Overrides specified parameters in the provided gin config.""" + if weather_data_filepath is None: + year = int(start_timestamp[0:4]) + weather_data_filepath = data_files.get_weather_data_filepath(year) + + # clear settings: + gin.clear_config() + + gin.add_config_file_search_path(os.path.dirname(config_filepath)) + gin.parse_config_file(config_filepath) + + # override settings: + gin.parse_config(f"start_timestamp = '{start_timestamp}'") + gin.parse_config(f"num_days_in_episode = {n_days}") + gin.parse_config(f"weather_data_filepath = '{weather_data_filepath}'") + gin.parse_config(f"floor_plan_filepath = '{floor_plan_filepath}'") + gin.parse_config(f"productivity_weight = {productivity_weight}") + gin.parse_config(f"energy_cost_weight = {energy_cost_weight}") + gin.parse_config(f"carbon_emission_weight = {carbon_emission_weight}") + gin.parse_config( + f"earliest_expected_arrival_hour = {earliest_expected_arrival_hour}" + ) + gin.parse_config( + f"latest_expected_arrival_hour = {latest_expected_arrival_hour}" + ) + gin.parse_config( + f"earliest_expected_departure_hour = {earliest_expected_departure_hour}" + ) + gin.parse_config( + f"latest_expected_departure_hour = {latest_expected_departure_hour}" + ) diff --git a/smart_control/configs/resources/sb1/config_utils/full_config_test.py b/smart_control/configs/resources/sb1/config_utils/full_config_test.py new file mode 100644 index 00000000..a716d1b4 --- /dev/null +++ b/smart_control/configs/resources/sb1/config_utils/full_config_test.py @@ -0,0 +1,444 @@ +"""Tests for Building 'SB-1' config files used in simulation experiments.""" + +from unittest import mock +import warnings + +from absl import logging +from absl.testing import absltest +from absl.testing import parameterized +import pandas as pd + +from smart_buildings.smart_control.configs.resources.sb1.config_utils import conftest +from smart_buildings.smart_control.configs.resources.sb1.config_utils import data_files +from smart_buildings.smart_control.configs.resources.sb1.config_utils import full_config +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import hybrid_action_environment # pylint: disable=unused-import +from smart_buildings.smart_control.reward import setpoint_energy_carbon_regret +from smart_buildings.smart_control.simulator import building +from smart_buildings.smart_control.simulator import hvac_floorplan_based +from smart_buildings.smart_control.simulator import randomized_arrival_departure_occupancy +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import simulator_building +from smart_buildings.smart_control.simulator import stochastic_convection_simulator +from smart_buildings.smart_control.simulator import tf_simulator +from smart_buildings.smart_control.simulator import weather_controller +from smart_buildings.smart_control.utils import observation_normalizer + +FloorPlanBasedBuilding = building.FloorPlanBasedBuilding +FloorPlanBasedHvac = hvac_floorplan_based.FloorPlanBasedHvac +HybridActionEnvironment = hybrid_action_environment.HybridActionEnvironment +RandomizedOccupancy = randomized_arrival_departure_occupancy.RandomizedArrivalDepartureOccupancy # pylint: disable=line-too-long +ReplayWeatherController = weather_controller.ReplayWeatherController +SetpointEnergyCarbonRegretFunction = setpoint_energy_carbon_regret.SetpointEnergyCarbonRegretFunction # pylint: disable=line-too-long +SimulatorBuilding = simulator_building.SimulatorBuilding +StandardScoreObservationNormalizer = observation_normalizer.StandardScoreObservationNormalizer # pylint: disable=line-too-long +TFSimulator = tf_simulator.TFSimulator + +# environment has lots of info logs, which cause "Test log too large" errors, +# and prevent us from seeing the reasons for test failures, +# so disable info level logging: +logging.set_verbosity(logging.WARNING) + +warnings.filterwarnings("ignore", category=UserWarning) + + +class EnvironmentConfigTest(parameterized.TestCase): + + @classmethod + def _create_environment(cls): + return environment.Environment() + + @classmethod + def setUpClass(cls): + super().setUpClass() + + full_config.set_gin_config() + + # env takes a long time to load, so we are doing it once at the class level: + cls.env = cls._create_environment() + + cls.sim_building = cls.env.building + cls.occupancy = cls.sim_building.occupancy + cls.sim = cls.sim_building.simulator + + cls.building = cls.sim.building + cls.hvac = cls.sim.hvac + cls.wc = cls.sim.weather_controller + + cls.expected_action_names = conftest.ACTION_NAMES + cls.expected_action_normalizer_names = conftest.ACTION_NORMALIZER_NAMES + cls.expected_default_action_values = conftest.DEFAULT_ACTION_VALUES + + def test_environment(self): + self.assertIsInstance(self.env, environment.Environment) + + def test_properties(self): + self.assertEqual(self.env.time_step_mins, 5) + self.assertEqual( + self.env.start_timestamp, pd.Timestamp(full_config.START_TIMESTAMP) + ) + self.assertEqual(self.env.num_days_in_episode, full_config.N_DAYS) + self.assertEqual(self.env.discount_factor, 0.9) + + # + # SIM + # + + def test_weather_controller(self): + wc = self.wc + self.assertIsInstance(wc, ReplayWeatherController) + + self.assertEqual(wc.convection_coefficient, 100.0) + self.assertEqual(wc.csv_filepath, data_files.get_weather_data_filepath()) + self.assertEqual(wc.min_time, pd.Timestamp("2024-01-01 01:00:00", tz="UTC")) + self.assertEqual(wc.max_time, pd.Timestamp("2024-12-30 09:00:00", tz="UTC")) + + with self.subTest("weather_data"): + df = wc.weather_df + self.assertIsInstance(df, pd.DataFrame) + self.assertEqual(df.shape, (8529, 15)) + self.assertEqual(df.columns.tolist(), list(conftest.WEATHER_COLUMNS)) + + with self.subTest("time_range"): + timestamp = pd.Timestamp(full_config.START_TIMESTAMP) + self.assertEqual(wc.get_current_temp(timestamp), 285.15) + + future_timestamp = timestamp + pd.Timedelta(days=full_config.N_DAYS + 1) + self.assertEqual(wc.get_current_temp(future_timestamp), 289.15) + + def test_reward_function(self): + reward_function = self.env.reward_function + self.assertIsInstance(reward_function, SetpointEnergyCarbonRegretFunction) + self.assertEqual(reward_function.energy_cost_weight, 0.2) + self.assertEqual(reward_function.carbon_emission_weight, 0.2) + self.assertEqual(reward_function.productivity_weight, 0.6) + + def test_building(self): + bldg = self.building + self.assertIsInstance(bldg, building.FloorPlanBasedBuilding) + self.assertEqual(bldg.floor_plan_filepath, data_files.FLOOR_PLAN_FILEPATH) + self.assertEqual(bldg.zone_map_filepath, data_files.FLOOR_PLAN_FILEPATH) + self.assertEqual(bldg.cv_size_cm, 10) + self.assertEqual(bldg.floor_height_cm, 300.0) + self.assertEqual(bldg.initial_temp, 294.0) + + with self.subTest("material_properties"): + self.assertEqual( + bldg.inside_air_properties, + building.MaterialProperties( + conductivity=50.0, + heat_capacity=700.0, + density=1.0, + ), + ) + self.assertEqual( + bldg.inside_wall_properties, + building.MaterialProperties( + conductivity=50.0, + heat_capacity=700.0, + density=1.0, + ), + ) + self.assertEqual( + bldg.building_exterior_properties, + building.MaterialProperties( + conductivity=0.05, + heat_capacity=700.0, + density=1.0, + ), + ) + + def test_convection_simulator(self): + simulator = self.building.convection_simulator + self.assertIsInstance( + simulator, stochastic_convection_simulator.StochasticConvectionSimulator + ) + self.assertEqual(simulator.p, 0.5) + self.assertEqual(simulator.distance, 25) + + def test_building_zones(self): + df = self.sim_building.zones_df + self.assertIsInstance(df, pd.DataFrame) + + expected_records = [] + for i in range(1, 127): + expected_records.append({ + "building_id": "US-SIM-001", + "zone_id": f"room_{i}", + "zone_type_id": 1, # ROOM + "zone_type": "ROOM", + "description": "Simulated zone", + "floor": 0, + "area": 0.0, + "device_ids": [f"VAV_{i}"], + }) + self.assertEqual(df.to_dict("records"), expected_records) + + def test_building_devices(self): + df = self.sim_building.devices_df + self.assertIsInstance(df, pd.DataFrame) + self.assertEqual( + df.columns.tolist(), + [ + "device_id", + "device_type_id", + "device_type", + "namespace", + "code", + "zone_id", + ], + ) + self.assertLen(df, 128) + + vav_ids = [f"VAV_{i}" for i in range(1, 127)] + expected_device_ids = ["hws", "ahs"] + vav_ids + self.assertCountEqual(df["device_id"].tolist(), expected_device_ids) + + def test_hvac(self): + hvac = self.hvac + self.assertIsInstance(hvac, hvac_floorplan_based.FloorPlanBasedHvac) + + with self.subTest("properties"): + self.assertEqual(hvac.vav_max_air_flow_rate, 2.0) + self.assertEqual(hvac.vav_reheat_max_water_flow_factor, 0.03) + + with self.subTest("setpoint_schedule"): + schedule = hvac.schedule + self.assertIsInstance(schedule, setpoint_schedule.SetpointSchedule) + self.assertEqual(schedule.morning_start_hour, 6) + self.assertEqual(schedule.evening_start_hour, 19) + self.assertEqual(schedule.comfort_temp_window, (294, 297)) + self.assertEqual(schedule.eco_temp_window, (289, 298)) + self.assertEqual(schedule.time_zone, "US/Pacific") + + def test_simulator(self): + sim = self.sim + self.assertIsInstance(sim, TFSimulator) + self.assertIsInstance(sim.building, FloorPlanBasedBuilding) + self.assertIsInstance(sim.hvac, FloorPlanBasedHvac) + self.assertIsInstance(sim.weather_controller, ReplayWeatherController) + self.assertEqual(sim.time_step_sec, 300) + self.assertEqual(sim.convergence_threshold, 0.1) + self.assertEqual(sim.iteration_limit, 100) + self.assertEqual(sim.iteration_warning, 20) + self.assertEqual( + sim.start_timestamp, pd.Timestamp(full_config.START_TIMESTAMP) + ) + + def test_occupancy(self): + self.assertIsInstance(self.occupancy, RandomizedOccupancy) + + self.assertEqual(self.occupancy.zone_assignment, 1) + self.assertEqual(self.occupancy.earliest_expected_arrival_hour, 7) + self.assertEqual(self.occupancy.latest_expected_arrival_hour, 12) + self.assertEqual(self.occupancy.earliest_expected_departure_hour, 13) + self.assertEqual(self.occupancy.latest_expected_departure_hour, 19) + self.assertEqual(self.occupancy.step_size, pd.Timedelta(300, unit="second")) + self.assertEqual(self.occupancy.time_zone, "US/Pacific") + + def test_simulator_building(self): + self.assertIsInstance(self.sim_building, SimulatorBuilding) + self.assertIsInstance(self.sim_building.simulator, TFSimulator) + self.assertIsInstance(self.sim_building.occupancy, RandomizedOccupancy) + + # + # ENV + # + + def test_observation_config(self): + normalizer = self.env.observation_normalizer + self.assertIsInstance(normalizer, StandardScoreObservationNormalizer) + + observation_names = normalizer.normalization_constants.keys() + self.assertLen(observation_names, 54) + with self.subTest("outside_air_temperature_sensor"): + self.assertIn("outside_air_temperature_sensor", observation_names) + + def test_action_names(self): + self.assertCountEqual(self.env.action_names, self.expected_action_names) + + def test_action_normalizers(self): + action_normalizers = self.env.action_normalizers + self.assertCountEqual( + action_normalizers.keys(), self.expected_action_normalizer_names + ) + + @parameterized.named_parameters( + dict( + testcase_name="supply_water_temperature_setpoint", + setpoint_name="supply_water_temperature_setpoint", + min_normalized_value=-1.0, + max_normalized_value=1.0, + min_native_value=310.0, + max_native_value=350.0, + ), + dict( + testcase_name="differential_pressure_setpoint", + setpoint_name="differential_pressure_setpoint", + min_normalized_value=-1.0, + max_normalized_value=1.0, + min_native_value=0.0, + max_native_value=20.0, + ), + dict( + testcase_name="ahu_1_supply_air_temperature_setpoint", + setpoint_name="ahu_1_supply_air_temperature_setpoint", + min_normalized_value=-1.0, + max_normalized_value=1.0, + min_native_value=285.0, + max_native_value=305.0, + ), + dict( + testcase_name="ahu_1_supply_air_static_pressure_setpoint", + setpoint_name="ahu_1_supply_air_static_pressure_setpoint", + min_normalized_value=-1.0, + max_normalized_value=1.0, + min_native_value=0.0, + max_native_value=20000.0, + ), + dict( + testcase_name="ahu_2_supply_air_temperature_setpoint", + setpoint_name="ahu_2_supply_air_temperature_setpoint", + min_normalized_value=-1.0, + max_normalized_value=1.0, + min_native_value=285.0, + max_native_value=305.0, + ), + dict( + testcase_name="ahu_2_supply_air_static_pressure_setpoint", + setpoint_name="ahu_2_supply_air_static_pressure_setpoint", + min_normalized_value=-1.0, + max_normalized_value=1.0, + min_native_value=0.0, + max_native_value=20000.0, + ), + ) + def test_action_normalizer_values( + self, + setpoint_name, + min_normalized_value, + max_normalized_value, + min_native_value, + max_native_value, + ): + normalizer = self.env.action_normalizers[setpoint_name] + self.assertEqual(normalizer.min_normalized_value, min_normalized_value) + self.assertEqual(normalizer.max_normalized_value, max_normalized_value) + self.assertEqual(normalizer.min_native_value, min_native_value) + self.assertEqual(normalizer.max_native_value, max_native_value) + + def test_default_actions(self): + self.assertSequenceAlmostEqual( + self.env.default_policy_values.numpy().tolist(), + self.expected_default_action_values, + places=5, + ) + + def test_action_fields_df(self): + df = self.env.action_fields_df + self.assertIsInstance(df, pd.DataFrame) + self.assertCountEqual(df.to_dict("records"), conftest.ACTION_FIELDS) + + +class HybridActionEnvironmentConfigTest(EnvironmentConfigTest): + + @classmethod + def _create_environment(cls): + return HybridActionEnvironment() # pylint:disable=no-value-for-parameter these are set by the gin config! + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.expected_action_names = conftest.HYBRID_ACTION_NAMES + cls.expected_action_normalizer_names = conftest.HYBRID_ACTION_NORMALIZER_NAMES # pylint: disable=line-too-long + cls.expected_default_action_values = conftest.HYBRID_DEFAULT_ACTION_VALUES + + def test_environment(self): + self.assertIsInstance(self.env, HybridActionEnvironment) + + @parameterized.named_parameters( + dict( + testcase_name="supervisor_run_command", + setpoint_name="supervisor_run_command", + min_normalized_value=-1.0, + max_normalized_value=1.0, + min_native_value=0.0, + max_native_value=1.0, + ), + dict( + testcase_name="ahu_1_supervisor_run_command", + setpoint_name="ahu_1_supervisor_run_command", + min_normalized_value=-1.0, + max_normalized_value=1.0, + min_native_value=0.0, + max_native_value=1.0, + ), + dict( + testcase_name="ahu_2_supervisor_run_command", + setpoint_name="ahu_2_supervisor_run_command", + min_normalized_value=-1.0, + max_normalized_value=1.0, + min_native_value=0.0, + max_native_value=1.0, + ), + ) + def test_discrete_action_normalizer_values( + self, + setpoint_name, + min_normalized_value, + max_normalized_value, + min_native_value, + max_native_value, + ): + normalizer = self.env.action_normalizers[setpoint_name] + self.assertEqual(normalizer.min_normalized_value, min_normalized_value) + self.assertEqual(normalizer.max_normalized_value, max_normalized_value) + self.assertEqual(normalizer.min_native_value, min_native_value) + self.assertEqual(normalizer.max_native_value, max_native_value) + + def test_action_fields_df(self): + df = self.env.action_fields_df + self.assertIsInstance(df, pd.DataFrame) + self.assertCountEqual(df.to_dict("records"), conftest.HYBRID_ACTION_FIELDS) + + +class OverrideConfigTest(parameterized.TestCase): + + def test_override_config_values(self): + full_config.set_gin_config( + productivity_weight=0.1, + energy_cost_weight=0.2, + carbon_emission_weight=0.7, + earliest_expected_arrival_hour=5, + latest_expected_arrival_hour=10, + earliest_expected_departure_hour=15, + latest_expected_departure_hour=20, + ) + env = environment.Environment() + + with self.subTest("reward_weights"): + reward_function = env.reward_function + self.assertEqual(reward_function.productivity_weight, 0.1) + self.assertEqual(reward_function.energy_cost_weight, 0.2) + self.assertEqual(reward_function.carbon_emission_weight, 0.7) + + with self.subTest("occupancy_hours"): + occupancy = env.building.occupancy + self.assertEqual(occupancy.earliest_expected_arrival_hour, 5) + self.assertEqual(occupancy.latest_expected_arrival_hour, 10) + self.assertEqual(occupancy.earliest_expected_departure_hour, 15) + self.assertEqual(occupancy.latest_expected_departure_hour, 20) + + def test_weather_data_year_corresponds_with_timestamp(self): + with mock.patch.object( + data_files, "get_weather_data_filepath", return_value="example.csv" + ) as mock_get_weather_data_filepath: + full_config.set_gin_config( + start_timestamp="2023-05-10 08:00:00", + weather_data_filepath=None, + ) + mock_get_weather_data_filepath.assert_called_once_with(2023) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/configs/resources/sb1/sim_202512/full_config.gin b/smart_control/configs/resources/sb1/sim_202512/full_config.gin new file mode 100644 index 00000000..f5fe4fc8 --- /dev/null +++ b/smart_control/configs/resources/sb1/sim_202512/full_config.gin @@ -0,0 +1,796 @@ + +########################## +### NOTES +########################## + +# this config: +# + can be used with continuous or hybrid action environments +# + can be used with new HVAC system that allows for multiple air handler units + + +########################## +### WEATHER CONTROLLER +########################## + +convection_coefficient = 100.0 +weather_data_filepath = "third_party/py/smart_buildings/smart_control/configs/resources/sb1/weather_data/2024.csv" + +ReplayWeatherController.convection_coefficient = %convection_coefficient +ReplayWeatherController.local_weather_path = %weather_data_filepath +weather_controller = @ReplayWeatherController() + +########################## +### BUILDING +########################## + +initial_temp = 294.0 +control_volume_cm = 10 #20 +floor_height_cm = 300.0 + +floor_plan_filepath = "/third_party/py/smart_buildings/smart_control/configs/resources/us_mtv_1055/double_resolution_zone_1_2.npy" +zone_map_filepath = %floor_plan_filepath + +interior_cv_conductivity = 50.0 +interior_cv_heat_capacity = 700 +interior_cv_density = 1.0 + +interior_wall_cv_conductivity = 50.0 +interior_wall_cv_density = 1.0 +interior_wall_cv_heat_capacity = 700.0 + +exterior_cv_conductivity = 0.05 # Biggest cause of divergence +exterior_cv_heat_capacity = 700.0 +exterior_cv_density = 1.0 + +inside_air_properties/MaterialProperties.conductivity = %interior_cv_conductivity +inside_air_properties/MaterialProperties.heat_capacity = %interior_cv_heat_capacity +inside_air_properties/MaterialProperties.density = %interior_cv_density + +inside_wall_properties/MaterialProperties.conductivity = %interior_wall_cv_conductivity +inside_wall_properties/MaterialProperties.heat_capacity = %interior_wall_cv_heat_capacity +inside_wall_properties/MaterialProperties.density = %interior_wall_cv_density + +building_exterior_properties/MaterialProperties.conductivity = %exterior_cv_conductivity +building_exterior_properties/MaterialProperties.heat_capacity = %exterior_cv_heat_capacity +building_exterior_properties/MaterialProperties.density = %exterior_cv_density + +sim/FloorPlanBasedBuilding: + cv_size_cm = %control_volume_cm + floor_height_cm = %floor_height_cm + initial_temp = %initial_temp + inside_air_properties = @inside_air_properties/MaterialProperties() + inside_wall_properties = @inside_wall_properties/MaterialProperties() + building_exterior_properties = @building_exterior_properties/MaterialProperties() + floor_plan_filepath = %floor_plan_filepath + zone_map_filepath = %zone_map_filepath + convection_simulator = @StochasticConvectionSimulator() + #save_debugging_images = False + + +########################## +### SCHEDULE ... +### https://source.corp.google.com/piper///depot/google3/corp/ml/smart_buildings/smart_control/configs/real_building/us_mtv_1055/base_config.gin;l=7?q=%23%20HVAC%20heating%2Fcooling%20schedule&ct=os&sq=package:piper%20file:%2F%2Fdepot%2Fgoogle3%20-file:google3%2Fexperimental +########################## + +morning_start_hour = 6 +evening_start_hour = 19 +# temperature setpoints in Kelvin: +heating_setpoint_day = 294 +cooling_setpoint_day = 297 +heating_setpoint_night = 289 +cooling_setpoint_night = 298 +time_zone="US/Pacific" + +hvac/SetpointSchedule: + morning_start_hour = %morning_start_hour + evening_start_hour = %evening_start_hour + comfort_temp_window = (%heating_setpoint_day, %cooling_setpoint_day) + eco_temp_window = (%heating_setpoint_night, %cooling_setpoint_night) + time_zone = %time_zone + + +########################## +### HVAC +########################## + +water_pump_differential_head = 6.0 +water_pump_efficiency = 0.98 +supply_water_temperature_setpoint = 360.0 +boiler_heating_rate = 0.5 # K / min +boiler_cooling_rate = 0.1 # K / min + +fan_static_pressure = 10000.0 # pascal +fan_efficiency = 0.9 + +supply_air_temperature_setpoint = 298.0 +air_handler_recirculation_ratio = 0.3 + +vav_max_air_flowrate = 2.0 +vav_reheat_water_flowrate = 0.03 + +floor_1_rooms = [ + 'room_1', 'room_2', 'room_3', 'room_4', 'room_5', 'room_6', 'room_7', 'room_8', 'room_9', 'room_10', + 'room_11', 'room_12', 'room_13', 'room_14', 'room_15', 'room_16', 'room_17', 'room_18', 'room_19', 'room_20', + 'room_21', 'room_22', 'room_23', 'room_24', 'room_25', 'room_26', 'room_27', 'room_28', 'room_29', 'room_30', + 'room_31', 'room_32', 'room_33', 'room_34', 'room_35', 'room_36', 'room_37', 'room_38', 'room_39', 'room_40', + 'room_41', 'room_42', 'room_43', 'room_44', 'room_45', 'room_46', 'room_47', 'room_48', 'room_49', 'room_50', + 'room_51', 'room_52', 'room_53' +] + +floor_2_rooms = [ + 'room_54', 'room_55', 'room_56', 'room_57', 'room_58', 'room_59', 'room_60', 'room_61', 'room_62', 'room_63', + 'room_64', 'room_65', 'room_66', 'room_67', 'room_68', 'room_69', 'room_70', 'room_71', 'room_72', 'room_73', + 'room_74', 'room_75', 'room_76', 'room_77', 'room_78', 'room_79', 'room_80', 'room_81', 'room_82', 'room_83', + 'room_84', 'room_85', 'room_86', 'room_87', 'room_88', 'room_89', 'room_90', 'room_91', 'room_92', 'room_93', + 'room_94', 'room_95', 'room_96', 'room_97', 'room_98', 'room_99', 'room_100', 'room_101', 'room_102', 'room_103', + 'room_104', 'room_105', 'room_106', 'room_107', 'room_108', 'room_109', 'room_110', 'room_111', 'room_112', 'room_113', + 'room_114', 'room_115', 'room_116', 'room_117', 'room_118', 'room_119', 'room_120', 'room_121', 'room_122', 'room_123', + 'room_124', 'room_125', 'room_126' +] + +ahu_1/AirHandler: + recirculation = %air_handler_recirculation_ratio + supply_air_temperature_setpoint = %supply_air_temperature_setpoint + fan_static_pressure = %fan_static_pressure + fan_efficiency = %fan_efficiency + max_air_flow_rate = 8.67 + sim_weather_controller = %weather_controller + device_id = 'ahu_1' + +ahu_2/AirHandler: + recirculation = %air_handler_recirculation_ratio + supply_air_temperature_setpoint = %supply_air_temperature_setpoint + fan_static_pressure = %fan_static_pressure + fan_efficiency = %fan_efficiency + max_air_flow_rate = 8.67 + sim_weather_controller = %weather_controller + device_id = 'ahu_2' + +hvac/AirHandlerSystem: + ahus = { + @ahu_1/AirHandler(): %floor_1_rooms, + @ahu_2/AirHandler(): %floor_2_rooms, + } + device_id = 'ahs' + +hvac/WaterPump: + water_pump_differential_head = %water_pump_differential_head + water_pump_efficiency = %water_pump_efficiency + +hvac/Boiler: + supply_water_temperature_setpoint = %supply_water_temperature_setpoint + heating_rate = %boiler_heating_rate + cooling_rate = %boiler_cooling_rate + +hvac/HotWaterSystem: + pump = @hvac/WaterPump() + heat_source = @hvac/Boiler() + device_id = 'hws' + + +sim/FloorPlanBasedHvac: + air_handler = @hvac/AirHandlerSystem() + hot_water_system = @hvac/HotWaterSystem() + schedule = @hvac/SetpointSchedule() + vav_max_air_flow_rate = %vav_max_air_flowrate + vav_reheat_max_water_flow_factor = %vav_reheat_water_flowrate + # prepare for future update associating floors with zones: + # floor_zones_map = { + # 1: %floor_1_rooms, + # 2: %floor_2_rooms, + # } + + +########################## +### OCCUPANCY +########################## + +time_step_sec = 300 # should not be changed b/c apparently it affects the sim + +work_occupancy = 1 # number of workers per zone + +earliest_expected_arrival_hour = 7 +latest_expected_arrival_hour = 12 +earliest_expected_departure_hour = 13 +latest_expected_departure_hour = 19 + +randomized_occupancy/RandomizedArrivalDepartureOccupancy: + zone_assignment = %work_occupancy + earliest_expected_arrival_hour = %earliest_expected_arrival_hour + latest_expected_arrival_hour = %latest_expected_arrival_hour + earliest_expected_departure_hour = %earliest_expected_departure_hour + latest_expected_departure_hour = %latest_expected_departure_hour + time_step_sec = %time_step_sec + time_zone = %time_zone + + +########################## +### SIMULATOR +########################## + +# shuffle parameters +#p: likelihood of any air volume being shuffled per time step +StochasticConvectionSimulator.p = 0.5 +# max jump distance in grid units squared, -1 means mixing across any distance +# 25 means jump of 5 grid units = 50 cm with 10cm grid +StochasticConvectionSimulator.distance = 25 +StochasticConvectionSimulator.seed = 5 + +# Finite difference settings. +convergence_threshold = 0.1 +iteration_limit = 100 +iteration_warning = 20 +start_timestamp = '2024-12-16 00:00:00' + +sim/to_timestamp.date_str = %start_timestamp + +sim_building/TFSimulator: + building = @sim/FloorPlanBasedBuilding() + hvac = @sim/FloorPlanBasedHvac() + weather_controller = %weather_controller + time_step_sec = %time_step_sec + convergence_threshold = %convergence_threshold + iteration_limit = %iteration_limit + iteration_warning = %iteration_warning + start_timestamp = @sim/to_timestamp() + +SimulatorBuilding.simulator = @sim_building/TFSimulator() +SimulatorBuilding.occupancy = @randomized_occupancy/RandomizedArrivalDepartureOccupancy() + + +########################## +### REWARDS +########################## + +reward_normalizer_shift = 0.0 +reward_normalizer_scale = 450.0 + +max_productivity_personhour_usd = 300.00 +min_productivity_personhour_usd = 100.00 +productivity_midpoint_delta = 0.5 +productivity_decay_stiffness = 4.3 + +max_electricity_rate=160000 # watts +max_natural_gas_rate=400000 # watts + +productivity_weight=0.6 +energy_cost_weight=0.2 +carbon_emission_weight=0.2 + +SetpointEnergyCarbonRegretFunction.max_productivity_personhour_usd = %max_productivity_personhour_usd +SetpointEnergyCarbonRegretFunction.min_productivity_personhour_usd = %min_productivity_personhour_usd +SetpointEnergyCarbonRegretFunction.max_electricity_rate = %max_electricity_rate +SetpointEnergyCarbonRegretFunction.max_natural_gas_rate = %max_natural_gas_rate +SetpointEnergyCarbonRegretFunction.productivity_decay_stiffness = %productivity_decay_stiffness +SetpointEnergyCarbonRegretFunction.productivity_midpoint_delta = %productivity_midpoint_delta +SetpointEnergyCarbonRegretFunction.electricity_energy_cost = @ElectricityEnergyCost() +SetpointEnergyCarbonRegretFunction.natural_gas_energy_cost = @NaturalGasEnergyCost() +SetpointEnergyCarbonRegretFunction.productivity_weight = %productivity_weight +SetpointEnergyCarbonRegretFunction.energy_cost_weight= %energy_cost_weight +SetpointEnergyCarbonRegretFunction.carbon_emission_weight = %carbon_emission_weight + + +########################## +### ACTIONS +########################## + + +### ACTIONS (NEW!) + +# Action Normalization Parameters -> edited to match real building: https://source.corp.google.com/piper///depot/google3/corp/ml/smart_buildings/smart_control/configs/real_building/us_mtv_1055/base_config.gin;rcl=520286766;l=89 +supply_water_bounded_action_normalizer/set_action_normalization_constants.min_normalized_value = -1. +supply_water_bounded_action_normalizer/set_action_normalization_constants.max_normalized_value = 1.0 +supply_water_bounded_action_normalizer/set_action_normalization_constants.min_native_value = 310 +supply_water_bounded_action_normalizer/set_action_normalization_constants.max_native_value = 350.0 + +supply_air_heating_temperature_setpoint/set_action_normalization_constants.min_normalized_value = -1. +supply_air_heating_temperature_setpoint/set_action_normalization_constants.max_normalized_value = 1. +supply_air_heating_temperature_setpoint/set_action_normalization_constants.min_native_value = 285 +supply_air_heating_temperature_setpoint/set_action_normalization_constants.max_native_value = 295.0 + +supply_air_temperature_setpoint/set_action_normalization_constants.min_normalized_value = -1. +supply_air_temperature_setpoint/set_action_normalization_constants.max_normalized_value = 1. +supply_air_temperature_setpoint/set_action_normalization_constants.min_native_value = 285 +supply_air_temperature_setpoint/set_action_normalization_constants.max_native_value = 305.0 + +differential_pressure_setpoint/set_action_normalization_constants.min_normalized_value = -1. +differential_pressure_setpoint/set_action_normalization_constants.max_normalized_value = 1. +differential_pressure_setpoint/set_action_normalization_constants.min_native_value = 0 +differential_pressure_setpoint/set_action_normalization_constants.max_native_value = 20.0 + +static_pressure_setpoint/set_action_normalization_constants.min_normalized_value = -1. +static_pressure_setpoint/set_action_normalization_constants.max_normalized_value = 1. +static_pressure_setpoint/set_action_normalization_constants.min_native_value = 0 +static_pressure_setpoint/set_action_normalization_constants.max_native_value = 20000.0 + +run_command/set_action_normalization_constants.min_normalized_value = -1. +run_command/set_action_normalization_constants.max_normalized_value = 1. +run_command/set_action_normalization_constants.min_native_value = 0.0 +run_command/set_action_normalization_constants.max_native_value = 1.0 + +# action_normalizer_map = { +# 'hws_supply_water_setpoint': @supply_water_bounded_action_normalizer/set_action_normalization_constants(), +# 'hws_differential_pressure': @differential_pressure_setpoint/set_action_normalization_constants(), +# 'ahu_ahu_1_supply_air_temperature_setpoint': @supply_air_temperature_setpoint/set_action_normalization_constants(), +# 'ahu_ahu_1_static_pressure_setpoint': @static_pressure_setpoint/set_action_normalization_constants(), +# 'ahu_ahu_2_supply_air_temperature_setpoint': @supply_air_temperature_setpoint/set_action_normalization_constants(), +# 'ahu_ahu_2_static_pressure_setpoint': @static_pressure_setpoint/set_action_normalization_constants(), +# 'hws_supervisor_run_command': @run_command/set_action_normalization_constants(), +# 'ahu_ahu_1_supervisor_run_command': @run_command/set_action_normalization_constants(), +# 'ahu_ahu_2_supervisor_run_command': @run_command/set_action_normalization_constants(), +# } + +# ENV + +action_normalizer_map_continuous = { + 'supply_water_temperature_setpoint': @supply_water_bounded_action_normalizer/set_action_normalization_constants(), + 'differential_pressure_setpoint': @differential_pressure_setpoint/set_action_normalization_constants(), + 'ahu_1_supply_air_temperature_setpoint': @supply_air_temperature_setpoint/set_action_normalization_constants(), + 'ahu_1_supply_air_static_pressure_setpoint': @static_pressure_setpoint/set_action_normalization_constants(), + 'ahu_2_supply_air_temperature_setpoint': @supply_air_temperature_setpoint/set_action_normalization_constants(), + 'ahu_2_supply_air_static_pressure_setpoint': @static_pressure_setpoint/set_action_normalization_constants(), +} +continuous/ActionConfig: + action_normalizers = %action_normalizer_map_continuous + +device_action_tuples = [ + ('ahs', 'ahu_1_supply_air_temperature_setpoint'), + ('ahs', 'ahu_1_supply_air_static_pressure_setpoint'), + ('ahs', 'ahu_2_supply_air_temperature_setpoint'), + ('ahs', 'ahu_2_supply_air_static_pressure_setpoint'), + ('hws', 'supply_water_temperature_setpoint'), + ('hws', 'differential_pressure_setpoint'), +] + +default_actions = { + 'hws_supply_water_temperature_setpoint': 340.0, + 'hws_differential_pressure_setpoint': 20.0, + 'ahs_ahu_1_supply_air_temperature_setpoint': 293.0, + 'ahs_ahu_1_supply_air_static_pressure_setpoint': 20000.0, + 'ahs_ahu_2_supply_air_temperature_setpoint': 293.0, + 'ahs_ahu_2_supply_air_static_pressure_setpoint': 20000.0, + +} + +# HYBRID ENV + +action_normalizer_map_hybrid = { + 'supply_water_temperature_setpoint': @supply_water_bounded_action_normalizer/set_action_normalization_constants(), + 'differential_pressure_setpoint': @differential_pressure_setpoint/set_action_normalization_constants(), + 'ahu_1_supply_air_temperature_setpoint': @supply_air_temperature_setpoint/set_action_normalization_constants(), + 'ahu_1_supply_air_static_pressure_setpoint': @static_pressure_setpoint/set_action_normalization_constants(), + 'ahu_2_supply_air_temperature_setpoint': @supply_air_temperature_setpoint/set_action_normalization_constants(), + 'ahu_2_supply_air_static_pressure_setpoint': @static_pressure_setpoint/set_action_normalization_constants(), + 'supervisor_run_command': @run_command/set_action_normalization_constants(), + 'ahu_1_supervisor_run_command': @run_command/set_action_normalization_constants(), + 'ahu_2_supervisor_run_command': @run_command/set_action_normalization_constants(), +} +hybrid/ActionConfig: + action_normalizers = %action_normalizer_map_hybrid + +hybrid_device_action_tuples = [ + ('ahs', 'ahu_1_supervisor_run_command'), + ('ahs', 'ahu_2_supervisor_run_command'), + ('ahs', 'ahu_1_supply_air_temperature_setpoint'), + ('ahs', 'ahu_1_supply_air_static_pressure_setpoint'), + ('ahs', 'ahu_2_supply_air_temperature_setpoint'), + ('ahs', 'ahu_2_supply_air_static_pressure_setpoint'), + ('hws', 'supervisor_run_command'), + ('hws', 'supply_water_temperature_setpoint'), + ('hws', 'differential_pressure_setpoint'), +] + +hybrid_default_actions = { + 'hws_supply_water_temperature_setpoint': 340.0, + 'hws_differential_pressure_setpoint': 20.0, + 'hws_supervisor_run_command': 1.0, + 'ahs_ahu_1_supply_air_temperature_setpoint': 293.0, + 'ahs_ahu_1_supply_air_static_pressure_setpoint': 20000.0, + 'ahs_ahu_2_supply_air_temperature_setpoint': 293.0, + 'ahs_ahu_2_supply_air_static_pressure_setpoint': 20000.0, + 'ahs_ahu_1_supervisor_run_command': 1.0, + 'ahs_ahu_2_supervisor_run_command': 1.0, +} + +########################## +### OBSERVATIONS +########################## + +# include "observations_config.gin" +# provides: +# - @StandardScoreObservationNormalizer() + +temperature_observation_normalizer/set_observation_normalization_constants.field_id = 'temperature' +temperature_observation_normalizer/set_observation_normalization_constants.sample_mean = 310.0 +temperature_observation_normalizer/set_observation_normalization_constants.sample_variance = 2500.0 + +supply_water_setpoint_observation_normalizer/set_observation_normalization_constants.field_id = 'supply_water_setpoint' +supply_water_setpoint_observation_normalizer/set_observation_normalization_constants.sample_mean = 310.0 +supply_water_setpoint_observation_normalizer/set_observation_normalization_constants.sample_variance = 2500.0 + +air_flowrate_observation_normalizer/set_observation_normalization_constants.field_id = 'air_flowrate' +air_flowrate_observation_normalizer/set_observation_normalization_constants.sample_mean = 0.5 +air_flowrate_observation_normalizer/set_observation_normalization_constants.sample_variance = 4.0 + +differential_pressure_observation_normalizer/set_observation_normalization_constants.field_id = 'differential_pressure' +differential_pressure_observation_normalizer/set_observation_normalization_constants.sample_mean = 10000.0 +differential_pressure_observation_normalizer/set_observation_normalization_constants.sample_variance = 100000.0 + +percentage_observation_normalizer/set_observation_normalization_constants.field_id = 'percentage' +percentage_observation_normalizer/set_observation_normalization_constants.sample_mean = 0.50 +percentage_observation_normalizer/set_observation_normalization_constants.sample_variance = 1.0 + +request_count_observation_normalizer/set_observation_normalization_constants.field_id = 'request_count' +request_count_observation_normalizer/set_observation_normalization_constants.sample_mean = 100.0 +request_count_observation_normalizer/set_observation_normalization_constants.sample_variance = 25.0 + +# measurement 0 building_air_static_pressure_sensor +building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.field_id = 'building_air_static_pressure_sensor' +building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_mean = 3.779228 +building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_variance = 14.599437 + +# measurement 1 building_air_static_pressure_setpoint +building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'building_air_static_pressure_setpoint' +building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 7.472401 +building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 0.000000 + +# measurement 2 cooling_percentage_command +cooling_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'cooling_percentage_command' +cooling_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 9.658281 +cooling_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 295.833612 + +# measurement 3 differential_pressure_sensor +differential_pressure_sensor_normalizer/set_observation_normalization_constants.field_id = 'differential_pressure_sensor' +differential_pressure_sensor_normalizer/set_observation_normalization_constants.sample_mean = 31611.814379 +differential_pressure_sensor_normalizer/set_observation_normalization_constants.sample_variance = 1844378631.487996 + +# measurement 4 differential_pressure_setpoint +differential_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'differential_pressure_setpoint' +differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 83810.269540 +differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 14889040.603647 + +# measurement 5 discharge_air_temperature_sensor +discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'discharge_air_temperature_sensor' +discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 69.889025 +discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 541.455462 + +# measurement 6 discharge_air_temperature_setpoint +discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'discharge_air_temperature_setpoint' +discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 57.665244 +discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 97.254479 + +# measurement 7 exhaust_air_damper_percentage_command +exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'exhaust_air_damper_percentage_command' +exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 25.000000 +exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 0.000000 + +# measurement 8 exhaust_air_damper_percentage_sensor +exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants.field_id = 'exhaust_air_damper_percentage_sensor' +exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants.sample_mean = 10.680755 +exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants.sample_variance = 539.207818 + +# measurement 9 exhaust_fan_speed_frequency_sensor +exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.field_id = 'exhaust_fan_speed_frequency_sensor' +exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_mean = 4.273057 +exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_variance = 138.559759 + +# measurement 10 exhaust_fan_speed_percentage_command +exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'exhaust_fan_speed_percentage_command' +exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 7.121761 +exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 384.888218 + +# measurement 11 heating_water_valve_percentage_command +heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'heating_water_valve_percentage_command' +heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 3.105189 +heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 202.006249 + +# measurement 12 mixed_air_temperature_sensor +mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'mixed_air_temperature_sensor' +mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 293.718710 +mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 12.517696 + +# measurement 13 mixed_air_temperature_setpoint +mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'mixed_air_temperature_setpoint' +mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 288.218302 +mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 3.186768 + +# measurement 14 outside_air_damper_percentage_command +outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'outside_air_damper_percentage_command' +outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 34.504101 +outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 2053.149002 + +# measurement 15 outside_air_dewpoint_temperature_sensor +outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_dewpoint_temperature_sensor' +outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 285.774428 +outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 2.504610 + +# measurement 16 outside_air_flowrate_sensor +outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_flowrate_sensor' +outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_mean = 3.701930 +outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_variance = 20.300565 + +# measurement 17 outside_air_flowrate_setpoint +outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.field_id = 'outside_air_flowrate_setpoint' +outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 8.730134 +outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 0.240364 + +# measurement 18 outside_air_relative_humidity_sensor +outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_relative_humidity_sensor' +outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants.sample_mean = 71.799372 +outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants.sample_variance = 172.388773 + +# measurement 19 outside_air_specificenthalpy_sensor +outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_specificenthalpy_sensor' +outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants.sample_mean = 60711.656343 +outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants.sample_variance = 25491060.173822 + +# measurement 20 outside_air_temperature_sensor +outside_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_temperature_sensor' +outside_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 291.244931 +outside_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 12.904175 + +# measurement 21 outside_air_wetbulb_temperature_sensor +outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_wetbulb_temperature_sensor' +outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 287.709943 +outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 3.594260 + +# measurement 22 program_differential_pressure_setpoint +program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_differential_pressure_setpoint' +program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 83808.578375 +program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 14897544.664858 + +# measurement 23 program_supply_air_static_pressure_setpoint +program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_supply_air_static_pressure_setpoint' +program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 163.396282 +program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 1092.073231 + +# measurement 24 program_supply_air_temperature_setpoint +program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_supply_air_temperature_setpoint' +program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 289.490004 +program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 2.854515 + +# measurement 25 program_supply_water_temperature_setpoint +program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_supply_water_temperature_setpoint' +program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 341.467705 +program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 74.961483 + +# measurement 26 return_air_temperature_sensor +return_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'return_air_temperature_sensor' +return_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 295.602164 +return_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 11.309930 + +# measurement 27 return_water_temperature_sensor +return_water_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'return_water_temperature_sensor' +return_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 326.219913 +return_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 497.847788 + +# measurement 28 run_status +run_status_normalizer/set_observation_normalization_constants.field_id = 'run_status' +run_status_normalizer/set_observation_normalization_constants.sample_mean = -0.638340 +run_status_normalizer/set_observation_normalization_constants.sample_variance = 0.592523 + +# measurement 29 speed_frequency_sensor +speed_frequency_sensor_normalizer/set_observation_normalization_constants.field_id = 'speed_frequency_sensor' +speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_mean = 7.003487 +speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_variance = 227.751249 + +# measurement 30 speed_percentage_command +speed_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'speed_percentage_command' +speed_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 11.330966 +speed_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 602.718159 + +# measurement 31 supervisor_supply_air_static_pressure_setpoint +supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supervisor_supply_air_static_pressure_setpoint' +supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 179.409052 +supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 352.049768 + +# measurement 32 supervisor_supply_air_temperature_setpoint +supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supervisor_supply_air_temperature_setpoint' +supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 290.2 +supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 9.66245 + +# measurement 33 supervisor_supply_water_temperature_setpoint +supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supervisor_supply_water_temperature_setpoint' +supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 332.164444 +supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 1.534112 + +# measurement 34 supply_air_damper_percentage_command +supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'supply_air_damper_percentage_command' +supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 51.173986 +supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 1059.265742 + +# measurement 35 supply_air_flowrate_sensor +supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_air_flowrate_sensor' +supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_mean = 177.520026 +supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_variance = 50499.153481 + +# measurement 36 supply_air_flowrate_setpoint +supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_air_flowrate_setpoint' +supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 209.557558 +supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 47308.757207 + +# measurement 37 supply_air_static_pressure_sensor +supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_air_static_pressure_sensor' +supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_mean = 128.527912 +supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_variance = 6679.599175 + +# measurement 38 supply_air_static_pressure_setpoint +supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_air_static_pressure_setpoint' +supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 181.307432 +supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 361.757966 + +# measurement 39 supply_air_temperature_sensor +supply_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_air_temperature_sensor' +supply_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 289.737939 +supply_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 6.265837 + +# measurement 40 supply_air_temperature_setpoint +supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_air_temperature_setpoint' +supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 289.329414 +supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 3.186769 + +# measurement 41 supply_fan_run_status +supply_fan_run_status_normalizer/set_observation_normalization_constants.field_id = 'supply_fan_run_status' +supply_fan_run_status_normalizer/set_observation_normalization_constants.sample_mean = 0.439849 +supply_fan_run_status_normalizer/set_observation_normalization_constants.sample_variance = 0.806533 + +# measurement 42 supply_fan_speed_frequency_sensor +supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_fan_speed_frequency_sensor' +supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_mean = 15.926249 +supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_variance = 207.034194 + +# measurement 43 supply_fan_speed_percentage_command +supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'supply_fan_speed_percentage_command' +supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 26.543748 +supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 575.094979 + +# measurement 44 supply_water_temperature_sensor +supply_water_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_water_temperature_sensor' +supply_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 321.520315 +supply_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 658.413066 + +# measurement 45 supply_water_temperature_setpoint +supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_water_temperature_setpoint' +supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 320.261985 +supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 240.195517 + +# measurement 46 zone_air_co2_concentration_sensor +zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants.field_id = 'zone_air_co2_concentration_sensor' +zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants.sample_mean = 432.092062 +zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants.sample_variance = 962.903840 + +# measurement 47 zone_air_co2_concentration_setpoint +zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants.field_id = 'zone_air_co2_concentration_setpoint' +zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 739.337708 +zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 3618.117781 + +# measurement 48 zone_air_cooling_temperature_setpoint +zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'zone_air_cooling_temperature_setpoint' +zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 82.084227 +zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 402.158853 + +# measurement 49 zone_air_heating_temperature_setpoint +zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'zone_air_heating_temperature_setpoint' +zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 64.231868 +zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 24.461668 + +# measurement 50 zone_air_temperature_sensor +zone_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'zone_air_temperature_sensor' +zone_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 190 +zone_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 408.113303 + +supervisor_run_command_normalizer/set_observation_normalization_constants.field_id = 'supervisor_run_command' +supervisor_run_command_normalizer/set_observation_normalization_constants.sample_mean = 0 +supervisor_run_command_normalizer/set_observation_normalization_constants.sample_variance = 1.0 + +observation_normalizer_map = { +'building_air_static_pressure_sensor' : @building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants(), +'building_air_static_pressure_setpoint' : @building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'cooling_percentage_command' : @cooling_percentage_command_normalizer/set_observation_normalization_constants(), +'differential_pressure_sensor' : @differential_pressure_sensor_normalizer/set_observation_normalization_constants(), +'differential_pressure_setpoint' : @differential_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'discharge_air_temperature_sensor' : @discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'discharge_air_temperature_setpoint' : @discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'exhaust_air_damper_percentage_command' : @exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants(), +'exhaust_air_damper_percentage_sensor' : @exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants(), +'exhaust_fan_speed_frequency_sensor' : @exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants(), +'exhaust_fan_speed_percentage_command' : @exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants(), +'heating_water_valve_percentage_command' : @heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants(), +'mixed_air_temperature_sensor' : @mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'mixed_air_temperature_setpoint' : @mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'outside_air_damper_percentage_command' : @outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants(), +'outside_air_dewpoint_temperature_sensor' : @outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_flowrate_sensor' : @outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_flowrate_setpoint' : @outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants(), +'outside_air_relative_humidity_sensor' : @outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_specificenthalpy_sensor' : @outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_temperature_sensor' : @outside_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_wetbulb_temperature_sensor' : @outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants(), +'program_differential_pressure_setpoint' : @program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'program_supply_air_static_pressure_setpoint' : @program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'program_supply_air_temperature_setpoint' : @program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'program_supply_water_temperature_setpoint' : @program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'return_air_temperature_sensor' : @return_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'return_water_temperature_sensor' : @return_water_temperature_sensor_normalizer/set_observation_normalization_constants(), +'run_status' : @run_status_normalizer/set_observation_normalization_constants(), +'speed_frequency_sensor' : @speed_frequency_sensor_normalizer/set_observation_normalization_constants(), +'speed_percentage_command' : @speed_percentage_command_normalizer/set_observation_normalization_constants(), +'supervisor_supply_air_static_pressure_setpoint' : @supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'supervisor_supply_air_temperature_setpoint' : @supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'supervisor_supply_water_temperature_setpoint' : @supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_damper_percentage_command' : @supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants(), +'supply_air_flowrate_sensor' : @supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants(), +'supply_air_flowrate_setpoint' : @supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_static_pressure_sensor' : @supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants(), +'supply_air_static_pressure_setpoint' : @supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_temperature_sensor' : @supply_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'supply_air_temperature_setpoint' : @supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_cooling_temperature_setpoint' : @supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_heating_temperature_setpoint' : @supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), + +'supply_fan_run_status' : @supply_fan_run_status_normalizer/set_observation_normalization_constants(), +'supply_fan_speed_frequency_sensor' : @supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants(), +'supply_fan_speed_percentage_command' : @supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants(), +'supply_water_temperature_sensor' : @supply_water_temperature_sensor_normalizer/set_observation_normalization_constants(), +'supply_water_setpoint' : @supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'zone_air_co2_concentration_sensor' : @zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants(), +'zone_air_co2_concentration_setpoint' : @zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants(), +'zone_air_cooling_temperature_setpoint' : @zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'zone_air_heating_temperature_setpoint' : @zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'zone_air_temperature_sensor' : @zone_air_temperature_sensor_normalizer/set_observation_normalization_constants(), + +'cooling_request_count': @request_count_observation_normalizer/set_observation_normalization_constants(), +} + + +StandardScoreObservationNormalizer: + normalization_constants = %observation_normalizer_map + + + +########################## +### ENVIRONMENT +########################## + +metrics_path = '/cns/oz-d/home/smart_buildings/control/metrics/sim_202512' +label = 'experiment' + +num_days_in_episode = 7 +metrics_reporting_interval=10 +num_hod_features = 12 +num_dow_features = 12 +discount_factor = 0.9 + +Environment.building = @SimulatorBuilding() +Environment.reward_function = @SetpointEnergyCarbonRegretFunction() +Environment.observation_normalizer = @StandardScoreObservationNormalizer() +Environment.metrics_reporting_interval = %metrics_reporting_interval +Environment.metrics_path = %metrics_path +Environment.label = %label +Environment.num_days_in_episode= %num_days_in_episode +Environment.discount_factor = %discount_factor +Environment.num_hod_features = %num_hod_features +Environment.num_dow_features = %num_dow_features + +Environment.action_config = @continuous/ActionConfig() +Environment.default_actions = %default_actions +Environment.device_action_tuples = %device_action_tuples + +########################## +### HYBRID ACTION ENVIRONMENT +########################## + +HybridActionEnvironment.building = @SimulatorBuilding() +HybridActionEnvironment.reward_function = @SetpointEnergyCarbonRegretFunction() +HybridActionEnvironment.observation_normalizer = @StandardScoreObservationNormalizer() +HybridActionEnvironment.metrics_reporting_interval = %metrics_reporting_interval +HybridActionEnvironment.metrics_path = %metrics_path +HybridActionEnvironment.label = %label +HybridActionEnvironment.num_days_in_episode = %num_days_in_episode +HybridActionEnvironment.discount_factor = %discount_factor +HybridActionEnvironment.num_hod_features = %num_hod_features +HybridActionEnvironment.num_dow_features = %num_dow_features + +HybridActionEnvironment.action_config = @hybrid/ActionConfig() +HybridActionEnvironment.default_actions = %hybrid_default_actions +HybridActionEnvironment.device_action_tuples = %hybrid_device_action_tuples diff --git a/smart_control/configs/resources/sb1/sim_202512/observations_config.gin b/smart_control/configs/resources/sb1/sim_202512/observations_config.gin new file mode 100644 index 00000000..049bc089 --- /dev/null +++ b/smart_control/configs/resources/sb1/sim_202512/observations_config.gin @@ -0,0 +1,350 @@ + +########################## +### OBSERVATIONS +########################## + +temperature_observation_normalizer/set_observation_normalization_constants.field_id = 'temperature' +temperature_observation_normalizer/set_observation_normalization_constants.sample_mean = 310.0 +temperature_observation_normalizer/set_observation_normalization_constants.sample_variance = 2500.0 + +supply_water_setpoint_observation_normalizer/set_observation_normalization_constants.field_id = 'supply_water_setpoint' +supply_water_setpoint_observation_normalizer/set_observation_normalization_constants.sample_mean = 310.0 +supply_water_setpoint_observation_normalizer/set_observation_normalization_constants.sample_variance = 2500.0 + +air_flowrate_observation_normalizer/set_observation_normalization_constants.field_id = 'air_flowrate' +air_flowrate_observation_normalizer/set_observation_normalization_constants.sample_mean = 0.5 +air_flowrate_observation_normalizer/set_observation_normalization_constants.sample_variance = 4.0 + +differential_pressure_observation_normalizer/set_observation_normalization_constants.field_id = 'differential_pressure' +differential_pressure_observation_normalizer/set_observation_normalization_constants.sample_mean = 10000.0 +differential_pressure_observation_normalizer/set_observation_normalization_constants.sample_variance = 100000.0 + +percentage_observation_normalizer/set_observation_normalization_constants.field_id = 'percentage' +percentage_observation_normalizer/set_observation_normalization_constants.sample_mean = 0.50 +percentage_observation_normalizer/set_observation_normalization_constants.sample_variance = 1.0 + +request_count_observation_normalizer/set_observation_normalization_constants.field_id = 'request_count' +request_count_observation_normalizer/set_observation_normalization_constants.sample_mean = 100.0 +request_count_observation_normalizer/set_observation_normalization_constants.sample_variance = 25.0 + +# measurement 0 building_air_static_pressure_sensor +building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.field_id = 'building_air_static_pressure_sensor' +building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_mean = 3.779228 +building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_variance = 14.599437 + +# measurement 1 building_air_static_pressure_setpoint +building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'building_air_static_pressure_setpoint' +building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 7.472401 +building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 0.000000 + +# measurement 2 cooling_percentage_command +cooling_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'cooling_percentage_command' +cooling_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 9.658281 +cooling_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 295.833612 + +# measurement 3 differential_pressure_sensor +differential_pressure_sensor_normalizer/set_observation_normalization_constants.field_id = 'differential_pressure_sensor' +differential_pressure_sensor_normalizer/set_observation_normalization_constants.sample_mean = 31611.814379 +differential_pressure_sensor_normalizer/set_observation_normalization_constants.sample_variance = 1844378631.487996 + +# measurement 4 differential_pressure_setpoint +differential_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'differential_pressure_setpoint' +differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 83810.269540 +differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 14889040.603647 + +# measurement 5 discharge_air_temperature_sensor +discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'discharge_air_temperature_sensor' +discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 69.889025 +discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 541.455462 + +# measurement 6 discharge_air_temperature_setpoint +discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'discharge_air_temperature_setpoint' +discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 57.665244 +discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 97.254479 + +# measurement 7 exhaust_air_damper_percentage_command +exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'exhaust_air_damper_percentage_command' +exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 25.000000 +exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 0.000000 + +# measurement 8 exhaust_air_damper_percentage_sensor +exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants.field_id = 'exhaust_air_damper_percentage_sensor' +exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants.sample_mean = 10.680755 +exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants.sample_variance = 539.207818 + +# measurement 9 exhaust_fan_speed_frequency_sensor +exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.field_id = 'exhaust_fan_speed_frequency_sensor' +exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_mean = 4.273057 +exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_variance = 138.559759 + +# measurement 10 exhaust_fan_speed_percentage_command +exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'exhaust_fan_speed_percentage_command' +exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 7.121761 +exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 384.888218 + +# measurement 11 heating_water_valve_percentage_command +heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'heating_water_valve_percentage_command' +heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 3.105189 +heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 202.006249 + +# measurement 12 mixed_air_temperature_sensor +mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'mixed_air_temperature_sensor' +mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 293.718710 +mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 12.517696 + +# measurement 13 mixed_air_temperature_setpoint +mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'mixed_air_temperature_setpoint' +mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 288.218302 +mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 3.186768 + +# measurement 14 outside_air_damper_percentage_command +outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'outside_air_damper_percentage_command' +outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 34.504101 +outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 2053.149002 + +# measurement 15 outside_air_dewpoint_temperature_sensor +outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_dewpoint_temperature_sensor' +outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 285.774428 +outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 2.504610 + +# measurement 16 outside_air_flowrate_sensor +outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_flowrate_sensor' +outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_mean = 3.701930 +outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_variance = 20.300565 + +# measurement 17 outside_air_flowrate_setpoint +outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.field_id = 'outside_air_flowrate_setpoint' +outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 8.730134 +outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 0.240364 + +# measurement 18 outside_air_relative_humidity_sensor +outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_relative_humidity_sensor' +outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants.sample_mean = 71.799372 +outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants.sample_variance = 172.388773 + +# measurement 19 outside_air_specificenthalpy_sensor +outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_specificenthalpy_sensor' +outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants.sample_mean = 60711.656343 +outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants.sample_variance = 25491060.173822 + +# measurement 20 outside_air_temperature_sensor +outside_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_temperature_sensor' +outside_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 291.244931 +outside_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 12.904175 + +# measurement 21 outside_air_wetbulb_temperature_sensor +outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_wetbulb_temperature_sensor' +outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 287.709943 +outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 3.594260 + +# measurement 22 program_differential_pressure_setpoint +program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_differential_pressure_setpoint' +program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 83808.578375 +program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 14897544.664858 + +# measurement 23 program_supply_air_static_pressure_setpoint +program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_supply_air_static_pressure_setpoint' +program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 163.396282 +program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 1092.073231 + +# measurement 24 program_supply_air_temperature_setpoint +program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_supply_air_temperature_setpoint' +program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 289.490004 +program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 2.854515 + +# measurement 25 program_supply_water_temperature_setpoint +program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_supply_water_temperature_setpoint' +program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 341.467705 +program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 74.961483 + +# measurement 26 return_air_temperature_sensor +return_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'return_air_temperature_sensor' +return_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 295.602164 +return_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 11.309930 + +# measurement 27 return_water_temperature_sensor +return_water_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'return_water_temperature_sensor' +return_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 326.219913 +return_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 497.847788 + +# measurement 28 run_status +run_status_normalizer/set_observation_normalization_constants.field_id = 'run_status' +run_status_normalizer/set_observation_normalization_constants.sample_mean = -0.638340 +run_status_normalizer/set_observation_normalization_constants.sample_variance = 0.592523 + +# measurement 29 speed_frequency_sensor +speed_frequency_sensor_normalizer/set_observation_normalization_constants.field_id = 'speed_frequency_sensor' +speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_mean = 7.003487 +speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_variance = 227.751249 + +# measurement 30 speed_percentage_command +speed_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'speed_percentage_command' +speed_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 11.330966 +speed_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 602.718159 + +# measurement 31 supervisor_supply_air_static_pressure_setpoint +supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supervisor_supply_air_static_pressure_setpoint' +supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 179.409052 +supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 352.049768 + +# measurement 32 supervisor_supply_air_temperature_setpoint +supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supervisor_supply_air_temperature_setpoint' +supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 290.2 +supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 9.66245 + +# measurement 33 supervisor_supply_water_temperature_setpoint +supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supervisor_supply_water_temperature_setpoint' +supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 332.164444 +supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 1.534112 + +# measurement 34 supply_air_damper_percentage_command +supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'supply_air_damper_percentage_command' +supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 51.173986 +supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 1059.265742 + +# measurement 35 supply_air_flowrate_sensor +supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_air_flowrate_sensor' +supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_mean = 177.520026 +supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_variance = 50499.153481 + +# measurement 36 supply_air_flowrate_setpoint +supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_air_flowrate_setpoint' +supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 209.557558 +supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 47308.757207 + +# measurement 37 supply_air_static_pressure_sensor +supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_air_static_pressure_sensor' +supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_mean = 128.527912 +supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_variance = 6679.599175 + +# measurement 38 supply_air_static_pressure_setpoint +supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_air_static_pressure_setpoint' +supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 181.307432 +supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 361.757966 + +# measurement 39 supply_air_temperature_sensor +supply_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_air_temperature_sensor' +supply_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 289.737939 +supply_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 6.265837 + +# measurement 40 supply_air_temperature_setpoint +supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_air_temperature_setpoint' +supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 289.329414 +supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 3.186769 + +# measurement 41 supply_fan_run_status +supply_fan_run_status_normalizer/set_observation_normalization_constants.field_id = 'supply_fan_run_status' +supply_fan_run_status_normalizer/set_observation_normalization_constants.sample_mean = 0.439849 +supply_fan_run_status_normalizer/set_observation_normalization_constants.sample_variance = 0.806533 + +# measurement 42 supply_fan_speed_frequency_sensor +supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_fan_speed_frequency_sensor' +supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_mean = 15.926249 +supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_variance = 207.034194 + +# measurement 43 supply_fan_speed_percentage_command +supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'supply_fan_speed_percentage_command' +supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 26.543748 +supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 575.094979 + +# measurement 44 supply_water_temperature_sensor +supply_water_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_water_temperature_sensor' +supply_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 321.520315 +supply_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 658.413066 + +# measurement 45 supply_water_temperature_setpoint +supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_water_temperature_setpoint' +supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 320.261985 +supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 240.195517 + +# measurement 46 zone_air_co2_concentration_sensor +zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants.field_id = 'zone_air_co2_concentration_sensor' +zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants.sample_mean = 432.092062 +zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants.sample_variance = 962.903840 + +# measurement 47 zone_air_co2_concentration_setpoint +zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants.field_id = 'zone_air_co2_concentration_setpoint' +zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 739.337708 +zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 3618.117781 + +# measurement 48 zone_air_cooling_temperature_setpoint +zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'zone_air_cooling_temperature_setpoint' +zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 82.084227 +zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 402.158853 + +# measurement 49 zone_air_heating_temperature_setpoint +zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'zone_air_heating_temperature_setpoint' +zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 64.231868 +zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 24.461668 + +# measurement 50 zone_air_temperature_sensor +zone_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'zone_air_temperature_sensor' +zone_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 190 +zone_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 408.113303 + +supervisor_run_command_normalizer/set_observation_normalization_constants.field_id = 'supervisor_run_command' +supervisor_run_command_normalizer/set_observation_normalization_constants.sample_mean = 0 +supervisor_run_command_normalizer/set_observation_normalization_constants.sample_variance = 1.0 + +observation_normalizer_map = { +'building_air_static_pressure_sensor' : @building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants(), +'building_air_static_pressure_setpoint' : @building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'cooling_percentage_command' : @cooling_percentage_command_normalizer/set_observation_normalization_constants(), +'differential_pressure_sensor' : @differential_pressure_sensor_normalizer/set_observation_normalization_constants(), +'differential_pressure_setpoint' : @differential_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'discharge_air_temperature_sensor' : @discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'discharge_air_temperature_setpoint' : @discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'exhaust_air_damper_percentage_command' : @exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants(), +'exhaust_air_damper_percentage_sensor' : @exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants(), +'exhaust_fan_speed_frequency_sensor' : @exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants(), +'exhaust_fan_speed_percentage_command' : @exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants(), +'heating_water_valve_percentage_command' : @heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants(), +'mixed_air_temperature_sensor' : @mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'mixed_air_temperature_setpoint' : @mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'outside_air_damper_percentage_command' : @outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants(), +'outside_air_dewpoint_temperature_sensor' : @outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_flowrate_sensor' : @outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_flowrate_setpoint' : @outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants(), +'outside_air_relative_humidity_sensor' : @outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_specificenthalpy_sensor' : @outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_temperature_sensor' : @outside_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'outside_air_wetbulb_temperature_sensor' : @outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants(), +'program_differential_pressure_setpoint' : @program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'program_supply_air_static_pressure_setpoint' : @program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'program_supply_air_temperature_setpoint' : @program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'program_supply_water_temperature_setpoint' : @program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'return_air_temperature_sensor' : @return_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'return_water_temperature_sensor' : @return_water_temperature_sensor_normalizer/set_observation_normalization_constants(), +'run_status' : @run_status_normalizer/set_observation_normalization_constants(), +'speed_frequency_sensor' : @speed_frequency_sensor_normalizer/set_observation_normalization_constants(), +'speed_percentage_command' : @speed_percentage_command_normalizer/set_observation_normalization_constants(), +'supervisor_supply_air_static_pressure_setpoint' : @supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'supervisor_supply_air_temperature_setpoint' : @supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'supervisor_supply_water_temperature_setpoint' : @supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_damper_percentage_command' : @supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants(), +'supply_air_flowrate_sensor' : @supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants(), +'supply_air_flowrate_setpoint' : @supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_static_pressure_sensor' : @supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants(), +'supply_air_static_pressure_setpoint' : @supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_temperature_sensor' : @supply_air_temperature_sensor_normalizer/set_observation_normalization_constants(), +'supply_air_temperature_setpoint' : @supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_cooling_temperature_setpoint' : @supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'supply_air_heating_temperature_setpoint' : @supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(), + +'supply_fan_run_status' : @supply_fan_run_status_normalizer/set_observation_normalization_constants(), +'supply_fan_speed_frequency_sensor' : @supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants(), +'supply_fan_speed_percentage_command' : @supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants(), +'supply_water_temperature_sensor' : @supply_water_temperature_sensor_normalizer/set_observation_normalization_constants(), +'supply_water_setpoint' : @supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'zone_air_co2_concentration_sensor' : @zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants(), +'zone_air_co2_concentration_setpoint' : @zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants(), +'zone_air_cooling_temperature_setpoint' : @zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'zone_air_heating_temperature_setpoint' : @zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants(), +'zone_air_temperature_sensor' : @zone_air_temperature_sensor_normalizer/set_observation_normalization_constants(), + +'cooling_request_count': @request_count_observation_normalizer/set_observation_normalization_constants(), +} + + +StandardScoreObservationNormalizer: + normalization_constants = %observation_normalizer_map diff --git a/smart_control/configs/resources/sb1/sim_config.gin b/smart_control/configs/resources/sb1/sim_config.gin index d10166e8..f92c020d 100644 --- a/smart_control/configs/resources/sb1/sim_config.gin +++ b/smart_control/configs/resources/sb1/sim_config.gin @@ -122,7 +122,7 @@ boiler_cooling_rate = 0.1 # K / min # Pa or N/M2 - fan_differential_pressure = 10000.0 + fan_static_pressure = 10000.0 fan_efficiency = 0.9 air_handler_heating_setpoint = 285.0 @@ -137,7 +137,7 @@ recirculation = %air_handler_recirculation_ratio heating_air_temp_setpoint = %air_handler_heating_setpoint cooling_air_temp_setpoint = %air_handler_cooling_setpoint - fan_differential_pressure = %fan_differential_pressure + fan_static_pressure = %fan_static_pressure fan_efficiency = %fan_efficiency max_air_flow_rate = 8.67 sim_weather_controller = %weather_controller diff --git a/smart_control/configs/resources/sb1/sim_config_legacy.gin b/smart_control/configs/resources/sb1/sim_config_legacy.gin index 56de2c14..47bbcc8b 100644 --- a/smart_control/configs/resources/sb1/sim_config_legacy.gin +++ b/smart_control/configs/resources/sb1/sim_config_legacy.gin @@ -126,7 +126,7 @@ boiler_cooling_rate = 0.1 # K / min # Pa or N/M2 - fan_differential_pressure = 10000.0 + fan_static_pressure = 10000.0 fan_efficiency = 0.9 air_handler_heating_setpoint = 285.0 @@ -141,7 +141,7 @@ recirculation = %air_handler_recirculation_ratio heating_air_temp_setpoint = %air_handler_heating_setpoint cooling_air_temp_setpoint = %air_handler_cooling_setpoint - fan_differential_pressure = %fan_differential_pressure + fan_static_pressure = %fan_static_pressure fan_efficiency = %fan_efficiency max_air_flow_rate = 8.67 sim_weather_controller = %weather_controller diff --git a/smart_control/configs/resources/sb1/train_sim_configs/sim_config_1_day.gin b/smart_control/configs/resources/sb1/train_sim_configs/sim_config_1_day.gin index 9d4eef17..b1ff84a2 100644 --- a/smart_control/configs/resources/sb1/train_sim_configs/sim_config_1_day.gin +++ b/smart_control/configs/resources/sb1/train_sim_configs/sim_config_1_day.gin @@ -122,7 +122,7 @@ boiler_cooling_rate = 0.1 # K / min # Pa or N/M2 - fan_differential_pressure = 10000.0 + fan_static_pressure = 10000.0 fan_efficiency = 0.9 air_handler_heating_setpoint = 285.0 @@ -137,7 +137,7 @@ recirculation = %air_handler_recirculation_ratio heating_air_temp_setpoint = %air_handler_heating_setpoint cooling_air_temp_setpoint = %air_handler_cooling_setpoint - fan_differential_pressure = %fan_differential_pressure + fan_static_pressure = %fan_static_pressure fan_efficiency = %fan_efficiency max_air_flow_rate = 8.67 sim_weather_controller = %weather_controller diff --git a/smart_control/dataset/BUILD b/smart_control/dataset/BUILD deleted file mode 100644 index 568be001..00000000 --- a/smart_control/dataset/BUILD +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2025 Google LLC - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# https://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load("//devtools/python/blaze:pytype.bzl", "pytype_strict_library") -load("//devtools/python/blaze:strict.bzl", "py_strict_test") - -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -pytype_strict_library( - name = "dataset", - srcs = ["dataset.py"], - deps = [ - "//third_party/py/matplotlib", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/utils:constants", - "//third_party/py/requests", - ], -) - -pytype_strict_library( - name = "partition", - srcs = ["partition.py"], - deps = [ - ":dataset", - "//third_party/py/numpy", - "//third_party/py/pandas", - ], -) - -pytype_strict_library( - name = "conftest", - testonly = True, - srcs = ["conftest.py"], - deps = [ - ":dataset", - ":partition", - "//third_party/py/dotenv" - "//third_party/py/pytest", - ], -) - -py_strict_test( - name = "dataset_test", - srcs = ["dataset_test.py"], - deps = [ - ":dataset", - ":conftest", - "//third_party/py/absl/testing:absltest", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/pytest", - ], -) - -py_strict_test( - name = "partition_test", - srcs = ["partition_test.py"], - deps = [ - ":partition", - ":conftest", - "//third_party/py/absl/testing:absltest", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/pytest", - ], -) diff --git a/smart_control/dataset/__init__.py b/smart_control/dataset/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/dataset/conftest.py b/smart_control/dataset/conftest.py deleted file mode 100644 index d9a9a826..00000000 --- a/smart_control/dataset/conftest.py +++ /dev/null @@ -1,127 +0,0 @@ -"""Tests for the Smart Buildings Dataset. - -Includes high fidelity tests to download the dataset and verify its structure. - -It takes around two minutes to download and unzip the data, so we are skipping -dataset tests by default, to keep the build fast. But you can trigger a download -by setting the `TEST_DATASET_DOWNLOAD` environment variable to 'true'. - -Downloaded data will not get cleared after tests run, so we can use it in -subsequent test runs without needing to re-download. This allows developers to -run dataset tests fairly quickly on their local machines. When the dataset -already exists locally, it only takes around five seconds to load. - -The dataset tests will be run if the data is being downloaded, or if there is -existing local data. You can override whether or not to test the dataset by -setting the the `TEST_DATASET` environment variable to 'true' or 'false'. If set -to `true`, `TEST_DATASET_DOWNLOAD` must also be set to `true`. - -Downloaded data will not get cleared by default before tests run, but you can -force a clean up and fresh download by setting the `CLEAR_TEST_DATASET_DOWNLOAD` -environment variable to 'true'. -""" - -import os -import shutil - -from dotenv import load_dotenv -import pytest - -from smart_control.dataset.dataset import BuildingDataset -from smart_control.dataset.dataset import DATA_DIR -from smart_control.dataset.partition import BuildingDatasetPartition - -load_dotenv() - -# whether or not to download the dataset: -TEST_DATASET_DOWNLOAD = bool( - os.getenv('TEST_DATASET_DOWNLOAD', default='false').lower() == 'true' -) -# whether or not to delete existing local data before downloading: -CLEAR_TEST_DATASET_DOWNLOAD = bool( - os.getenv('CLEAR_TEST_DATASET_DOWNLOAD', default='false').lower() == 'true' -) - -DATASET_DIRPATH = os.path.join(DATA_DIR, 'sb1') -ZIP_FILEPATH = os.path.join(DATA_DIR, 'sb1.zip') - -# override for whether or not to run dataset tests: -TEST_DATASET = os.getenv('TEST_DATASET') -if TEST_DATASET is not None: - TEST_DATASET = bool(TEST_DATASET.lower() == 'true') -else: - TEST_DATASET = bool(TEST_DATASET_DOWNLOAD or os.path.isdir(DATASET_DIRPATH)) - -# if forcing an override to run the tests, we must also download the data: -if TEST_DATASET and not TEST_DATASET_DOWNLOAD: - TEST_DATASET_DOWNLOAD = True - -SKIP_REASON = 'Skip large download by default.' - - -def cleanup_files(): - print('Deleting dataset files...') - - if os.path.isfile(ZIP_FILEPATH): - os.remove(ZIP_FILEPATH) - - if os.path.isdir(DATASET_DIRPATH): - shutil.rmtree(DATASET_DIRPATH) - - -# PYTEST FIXTURES - - -@pytest.fixture(scope='session') -def dataset(): - """Session-scoped pytest fixture for an example dataset. - Will be executed only once, and can be shared across multiple test files. - """ - if TEST_DATASET_DOWNLOAD and CLEAR_TEST_DATASET_DOWNLOAD: - cleanup_files() - - print('Initializing the dataset fixture...') - return BuildingDataset(dataset_id='sb1', download=TEST_DATASET_DOWNLOAD) - - -@pytest.fixture(scope='session') -def partition(dataset): # pylint: disable=redefined-outer-name - """Session-scoped pytest fixture for an example dataset partition. - Will be executed only once, and can be shared across multiple test files. - """ - return BuildingDatasetPartition(dataset=dataset, partition_id='2022_a') - - -# SHIMS TO GET PYTEST FIXTURES TO WORK WITH UNITTEST CLASSES :-) - - -@pytest.fixture(scope='class') -def set_dataset(request, dataset): # pylint: disable=redefined-outer-name - """ - A class-scoped fixture that takes the result of the 'dataset' fixture and - injects it into the test class as `cls.ds`. - - Use by decorating your test class with: - - @pytest.mark.usefixtures('set_dataset') - - NOTE: the injection happens AFTER the setUp methods run in the test class. - """ - if request.cls: - request.cls.ds = dataset - - -@pytest.fixture(scope='class') -def set_partition(request, partition): # pylint: disable=redefined-outer-name, line-too-long - """ - A class-scoped fixture that takes the result of the 'partition' fixture and - injects it into the test class as `cls.partition`. - - Use by decorating your test class with: - - @pytest.mark.usefixtures('set_partition') - - NOTE: the injection happens AFTER the setUp methods run in the test class. - """ - if request.cls: - request.cls.partition = partition diff --git a/smart_control/dataset/dataset.py b/smart_control/dataset/dataset.py index 435f7ed1..31ccc91f 100644 --- a/smart_control/dataset/dataset.py +++ b/smart_control/dataset/dataset.py @@ -1,406 +1,86 @@ """Smart Buildings Dataset implementation, including loading and downloading.""" -from functools import cached_property import json -import os import pickle import shutil - -from matplotlib import pyplot as plt import numpy as np -import pandas as pd import requests -from smart_control.utils.constants import ROOT_DIR - -DATA_DIR = os.path.join(ROOT_DIR, "data") -DOCS_DIR = os.path.join(ROOT_DIR, "docs") - -VALID_DATASET_PARTITIONS = { - "sb1": ["2022_a", "2022_b", "2023_a", "2023_b", "2024_a"] -} -"""Specifies the available partition identifiers for each dataset.""" - - -class BuildingDataset: - """A helper class for handling the dataset for a specific building. - - Args: - dataset_id (str): The identifier of the building dataset (e.g. "sb1"). - download (bool): Whether or not to download the dataset. - - Examples: - ```python - ds = BuildingDataset(dataset_id="sb1", download=True) - ``` - """ - - def __init__(self, dataset_id="sb1", download=True): - self.dataset_id = dataset_id - - if self.dataset_id not in VALID_DATASET_PARTITIONS: - raise ValueError("Invalid building: '{self.dataset_id}'.") - - self.partition_ids = VALID_DATASET_PARTITIONS[self.dataset_id] - if bool(download): +class SmartBuildingsDataset: + """Smart Buildings Dataset implementation, including loading and downloading.""" + + def __init__(self, download=True): + self.partitions = { + "sb1": [ + "2022_a", + "2022_b", + "2023_a", + "2023_b", + "2024_a", + ], + } + if download: self.download() - def __repr__(self): - return f"" + def download(self): + """Downloads the Smart Buildings Dataset from Google Cloud Storage.""" + print("Downloading data...") - @property - def zip_filename(self): - """The name of the zip file (e.g. "sb1.zip").""" - return f"{self.dataset_id}.zip" - - @property - def zip_url(self): - """The URL of the zip file located on Google Cloud Storage.""" - return ( - "https://storage.googleapis.com/gresearch/smart_buildings_dataset/" - f"tabular_data/{self.zip_filename}" - ) - - @property - def zip_filepath(self): - """The filepath of the local zip file after it has been downloaded.""" - return os.path.join(DATA_DIR, self.zip_filename) - - @property - def building_dirpath(self): - """The local directory containing the building's dataset, after it has been - extracted from the local zip file. - """ - return os.path.join(DATA_DIR, self.dataset_id) - - def download(self, timeout=60): - """Downloads the building's dataset from Google Cloud Storage. - - Only downloads and unzips the dataset if it doesn't already exist at the - expected [`building_dirpath`](./#smart_control.dataset.dataset.BuildingDataset.building_dirpath) - location. Otherwise it will load the existing local data. - - Download speed is fairly quick, but unzipping takes a few moments. - """ - if os.path.isdir(self.building_dirpath): - print("Using previously-downloaded data...") - print(os.path.abspath(self.building_dirpath)) - else: - print("Downloading zip file...") - print(self.zip_url) - with requests.get(self.zip_url, stream=True, timeout=timeout) as r: + def download_file(url): + local_filename = url.split("/")[-1] + with requests.get(url, stream=True) as r: r.raise_for_status() - with open(self.zip_filepath, "wb") as f: + with open(local_filename, "wb") as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) + return local_filename - print("Unpacking zip file...") - print(os.path.abspath(self.zip_filepath)) - shutil.unpack_archive(self.zip_filepath, self.building_dirpath) - - @property - def tabular_dirpath(self): - return os.path.join(self.building_dirpath, "tabular") - - # FLOORPLAN + url = "https://storage.googleapis.com/gresearch/smart_buildings_dataset/tabular_data/sb1.zip" + download_file(url) + shutil.unpack_archive("sb1.zip", "sb1/") - @property - def floorplan_filepath(self): - return os.path.join(self.tabular_dirpath, "floorplan.npy") - - @cached_property - def floorplan(self) -> np.ndarray: - """The building's floorplan, as a numpy array. - - The floorplan consists of a map of pixels with the following values: - - + 0: inside / internal space - + 1: wall / boundary - + 2: outside / external space - - Use the [`display_floorplan`](./#smart_control.dataset.dataset.BuildingDataset.display_floorplan) - method to view an image of the floorplan. - """ - return np.load(self.floorplan_filepath) - - @property - def floorplan_image_filepath(self): - """Filepath for saving an image of the floorplan.""" - floorplan_image_filename = f"{self.dataset_id}_floorplan.png" - return os.path.join(DOCS_DIR, "assets", "images", floorplan_image_filename) - - def display_floorplan( - self, - cmap="binary", - show=True, - save=True, - image_filepath: str | None = None, - ): - """Renders an image of the building's floorplan. - - Here is an example floorplan for building "sb1": - - ![An image of a floorplan.](../../assets/images/sb1_floorplan.png) + def get_floorplan(self, building): + """Gets the floorplan and device layout map for a specific building. Args: - cmap (str): The name of a [matplotlib color map](https://matplotlib.org/stable/users/explain/colors/colormaps.html) - to use when rendering the image. - show (bool): Whether or not to show the image. - save (bool): Whether or not to save the image (as a .png file). - image_filepath (str): An optional custom filepath to use when saving the - image. Only applies if `save=True`. By default, saves to the [`floorplan_image_filepath`](./#smart_control.dataset.dataset.BuildingDataset.floorplan_image_filepath) - """ - plt.imshow(self.floorplan, interpolation="nearest", cmap=cmap) - if show: - plt.show() - if save: - image_filepath = image_filepath or self.floorplan_image_filepath - plt.savefig(image_filepath) - - # DEVICES - - @property - def device_layout_map_filepath(self): - return os.path.join(self.tabular_dirpath, "device_layout_map.json") - - @cached_property - def device_layout_map(self) -> dict: - """A layout map of devices in the building. - - Returns: - A dictionary with keys corresponding to each of the device layouts - (e.g. 'VAV CO 1-1-06'). Each value is a list of integer coordinates. - The length of the coordinates list is not the same across all devices. - Here is an abbreviated version of the device layout map: - - ```py - { - 'VAV CO 1-1-06': [[79, 35], [80, 35], [80, 34], [80, 33], ... ], - ... - 'VAV RH 1-1-28 CO2 (Tech Talk 1H2)': [[22, 422], [23, 422], ... ], - ... - 'VAV RH 1-1-55': [[145, 126], [146, 126], [147, 126], ... ] - } - ``` - """ - with open(self.device_layout_map_filepath, encoding="utf-8") as json_file: - return json.load(json_file) - - @property - def device_infos_filepath(self): - return os.path.join(self.tabular_dirpath, "device_info_dicts.pickle") - - @cached_property - def device_infos(self) -> list[dict]: - """Information about the devices in the building. + building: The name of the building. Returns: - A list of device dictionaries. Here is an example device dictionary: - - ```py - { - 'device_id': '202194278473007104', - 'namespace': 'PHRED', - 'code': 'SB1:AHU:AC-2', - 'zone_id': '', - 'device_type': 6, - 'observable_fields': { - 'building_air_static_pressure_sensor': 1, - 'outside_air_flowrate_sensor': 1, - 'supply_fan_speed_percentage_command': 1, - 'supply_air_temperature_sensor': 1, - 'supply_fan_speed_frequency_sensor': 1, - 'supply_air_static_pressure_setpoint': 1, - 'return_air_temperature_sensor': 1, - 'mixed_air_temperature_setpoint': 1, - 'exhaust_fan_speed_percentage_command': 1, - 'exhaust_fan_speed_frequency_sensor': 1, - 'outside_air_damper_percentage_command': 1, - 'mixed_air_temperature_sensor': 1, - 'exhaust_air_damper_percentage_command': 1, - 'cooling_percentage_command': 1, - 'outside_air_flowrate_setpoint': 1, - 'supply_air_temperature_setpoint': 1, - 'building_air_static_pressure_setpoint': 1, - 'supply_air_static_pressure_sensor': 1, - }, - 'actionable_fields': { - 'exhaust_air_damper_percentage_command': 1, - 'supply_air_temperature_setpoint': 1, - 'supply_fan_speed_percentage_command': 1, - 'outside_air_flowrate_setpoint': 1, - 'cooling_percentage_command': 1, - 'mixed_air_temperature_setpoint': 1, - 'exhaust_fan_speed_percentage_command': 1, - 'outside_air_damper_percentage_command': 1, - 'supply_air_static_pressure_setpoint': 1, - 'building_air_static_pressure_setpoint': 1, - }, - } - ``` - """ - infos = pickle.load(open(self.device_infos_filepath, "rb")) - for info in infos: - if "action_fields" in info: - info["actionable_fields"] = info.pop("action_fields") # rename - return infos - - @cached_property - def devices_df(self) -> pd.DataFrame: - # pylint: disable=line-too-long - """A dataframe containing information about the building's devices. - - Each row is uniquely identified by the "device_id". - - Returns: - A `pandas.DataFrame`. Here is an example of the structure: - - | | device_id | namespace | code | device_type | observable_fields | actionable_fields | - |---:|-------------------:|:------------|:------------------|--------------:|:------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - | 0 | 202194278473007104 | PHRED | SB1:AHU:AC-2 | 6 | {'building_air_static_pressure_sensor': 1, ... } | {'exhaust_air_damper_percentage_command': 1, ... } - | 1 | 2760348383893915 | CDM | VAV CO 1-1-10 CO2 | 4 | {'zone_air_heating_temperature_setpoint': 1, ... } | {'supply_air_damper_percentage_command': 1, ... } | - | 2 | 2562701969438717 | CDM | VAV CO 2-2-36 | 4 | {'zone_air_heating_temperature_setpoint': 1, ... } | {'supply_air_flowrate_setpoint': 1, ... } | - | 3 | 2806035809406684 | CDM | | 4 | {'discharge_air_temperature_setpoint': 1, ... } | {'discharge_air_temperature_setpoint': 1, ... } | - | 4 | 2790439929052995 | CDM | VAV CO 1-1-43 | 4 | {'zone_air_heating_temperature_setpoint': 1, ... } | {'supply_air_damper_percentage_command': 1, ... } | - """ - # pylint: enable=line-too-long - df = pd.DataFrame(self.device_infos) - df = df.drop(columns=["zone_id"]) # many to many relationship - # consider renaming zone_id to zone_ids instead of dropping - return df - - # DEVICE FIELDS - - def _count_device_fields(self, field_type: str) -> pd.Series: + A tuple containing the floorplan and device layout map. """ - Param field_type (str) member of: ["actionable_fields", "observable_fields"] - """ - field_counts = {} - - for device_info in self.device_infos: - device_fields = list(device_info[field_type].keys()) - - for field in device_fields: - if field in field_counts: - field_counts[field] += 1 - else: - field_counts[field] = 1 - - value_counts = pd.Series(field_counts).sort_values(ascending=False) - value_counts.index.name = "field_name" - return value_counts - - @cached_property - def actionable_field_counts(self) -> pd.Series: - """Counts the number of devices supporting each actionable field.""" - return self._count_device_fields("actionable_fields") + if building not in self.partitions.keys(): + raise ValueError("invalid building") + floorplan = np.load(f"./{building}/tabular/floorplan.npy") + with open(f"./{building}/tabular/device_layout_map.json") as json_file: + device_layout_map = json.load(json_file) + return floorplan, device_layout_map - @cached_property - def actionable_fields(self) -> list[str]: - """Names of all unique actionable fields across all devices.""" - return sorted(self.actionable_field_counts.keys()) + def get_building_data(self, building, partition): + """Gets the data for a specific building and partition. - @cached_property - def observable_field_counts(self) -> pd.Series: - """Counts the number of devices supporting each observable field.""" - return self._count_device_fields("observable_fields") - - @cached_property - def observable_fields(self) -> list[str]: - """Names of all unique observable fields across all devices.""" - return sorted(self.observable_field_counts.keys()) - - @cached_property - def fields_df(self) -> pd.DataFrame: - # pylint: disable=line-too-long - """A dataframe containing information about all device fields in the - building, including whether each is observable and/or actionable. - - Each row is uniquely identified by the "field_name". - - Returns: - A `pandas.DataFrame`. Here is an example of the structure: - - | | field_name | is_actionable | is_observable | n_devices_actionable | n_devices_observable | - |---:|:--------------------------------------|:--------------|:--------------|:---------------------|:---------------------| - | 0 | building_air_static_pressure_sensor | False | True | 0 | 3 | - | 1 | building_air_static_pressure_setpoint | True | True | 3 | 3 | - | 2 | cooling_percentage_command | True | True | 3 | 3 | - | 3 | differential_pressure_sensor | False | True | 0 | 2 | - | 4 | differential_pressure_setpoint | True | True | 2 | 2 | - - """ - # pylint: enable=line-too-long - actionable_fields = set(self.actionable_fields) - observable_fields = set(self.observable_fields) - all_fields = actionable_fields.union(observable_fields) - - records = [] - for field in all_fields: - records.append({ - "field_name": field, - "is_actionable": field in actionable_fields, - "is_observable": field in observable_fields, - "n_devices_actionable": self.actionable_field_counts.get(field, 0), - "n_devices_observable": self.observable_field_counts.get(field, 0), - }) - return pd.DataFrame(records).sort_values(by="field_name") - - # ZONES - - @property - def zone_infos_filepath(self): - return os.path.join(self.tabular_dirpath, "zone_info_dicts.pickle") - - @cached_property - def zone_infos(self) -> list[dict]: - """Information about the zones in the building. - - Returns: - A list of zone dictionaries. Here is an example zone dictionary: - - ```py - { - 'zone_id': 'rooms/1002000133978', - 'building_id': 'buildings/3616672508', - 'zone_description': 'SB1-2-C2054', - 'area': 0.0, - 'zone_type': 1, - 'floor': 2, - 'devices': ['2618581107144046', '2696593986887004'], - } - ``` - """ - return pickle.load(open(self.zone_infos_filepath, "rb")) - - @cached_property - def zones_df(self) -> pd.DataFrame: - # pylint: disable=line-too-long - """A dataframe containing information about the building's zones. - - Each row is uniquely identified by the "zone_id". + Args: + building: The name of the building. + partition: The name of the partition. Returns: - A `pandas.DataFrame`. Here is an example of the structure: - - | | zone_id | building_id | zone_description | area | zone_type | floor | devices | n_devices | - |---:|:--------------------|:---------------------|:-------------------|-------:|------------:|--------:|:-----------------------------------------|------------:| - | 0 | rooms/1002000133978 | buildings/3616672508 | SB1-2-C2054 | 0 | 1 | 2 | ['2618581107144046', '2696593986887004'] | 2 | - | 1 | rooms/9028471695 | buildings/3616672508 | SB1-2-2D4A | 0 | 1 | 2 | ['2696593986887004'] | 1 | - | 2 | rooms/9028472496 | buildings/3616672508 | SB1-2-2D4H | 0 | 1 | 2 | ['2696593986887004'] | 1 | - | 3 | rooms/9028558963 | buildings/3616672508 | SB1-2-2D4B | 0 | 1 | 2 | ['2696593986887004'] | 1 | - | 4 | rooms/9028483453 | buildings/3616672508 | SB1-2-2D4G | 0 | 1 | 2 | ['2696593986887004'] | 1 | + A tuple containing the data and metadata. """ - # pylint: enable=line-too-long - df = pd.DataFrame(self.zone_infos) - df["n_devices"] = df["devices"].apply(len) - return df - - -if __name__ == "__main__": - - ds = BuildingDataset() - - # save building image to docs directory: - ds.display_floorplan(show=False, save=True) + if building not in self.partitions.keys(): + raise ValueError("invalid building") + if partition not in self.partitions[building]: + raise ValueError("invalid partition") + path = f"./{building}/tabular/{building}/{partition}/" + + data = np.load(path + "data.npy.npz") + metadata = pickle.load(open(path + "metadata.pickle", "rb")) + + if "device_infos" not in metadata.keys(): + metadata["device_infos"] = pickle.load( + open(f"./{building}/tabular/device_info_dicts.pickle", "rb") + ) + if "zone_infos" not in metadata.keys(): + metadata["zone_infos"] = pickle.load( + open(f"./{building}/tabular/zone_info_dicts.pickle", "rb") + ) + return data, metadata diff --git a/smart_control/dataset/dataset_test.py b/smart_control/dataset/dataset_test.py deleted file mode 100644 index 6abea317..00000000 --- a/smart_control/dataset/dataset_test.py +++ /dev/null @@ -1,523 +0,0 @@ -"""Tests for BuildingDataset class.""" - -import os -import tempfile -import unittest - -from absl.testing import absltest -import numpy as np -import pandas as pd -import pytest - -from smart_control.dataset.conftest import DATASET_DIRPATH -from smart_control.dataset.conftest import SKIP_REASON -from smart_control.dataset.conftest import TEST_DATASET -from smart_control.dataset.conftest import ZIP_FILEPATH -from smart_control.dataset.dataset import BuildingDataset -from smart_control.dataset.dataset import DATA_DIR - -# -# EXAMPLE BUILDING LEVEL DATA -# - -_DATASET_ID = 'sb1' -_PARTITION_IDS = ['2022_a', '2022_b', '2023_a', '2023_b', '2024_a'] - -_DEVICE_LAYOUT_IDS = [ - 'VAV CO 1-1-06', - 'VAV CO 1-1-07 CO2', - 'VAV CO 1-1-08 CO2', - 'VAV CO 1-1-10 CO2', - 'VAV CO 1-1-13 CO2', - 'VAV CO 1-1-16 CO2', - 'VAV CO 1-1-17 CO2', - 'VAV CO 1-1-18 CO2', - 'VAV CO 1-1-26', - 'VAV CO 1-1-27', - 'VAV CO 1-1-35 CO2', - 'VAV CO 1-1-43', - 'VAV CO 1-1-51', - 'VAV RH 1-1-01', - 'VAV RH 1-1-02', - 'VAV RH 1-1-03', - 'VAV RH 1-1-04', - 'VAV RH 1-1-05', - 'VAV RH 1-1-09 CO2', - 'VAV RH 1-1-11', - 'VAV RH 1-1-12 CO2', - 'VAV RH 1-1-14 CO2', - 'VAV RH 1-1-15', - 'VAV RH 1-1-19', - 'VAV RH 1-1-20', - 'VAV RH 1-1-21', - 'VAV RH 1-1-22', - 'VAV RH 1-1-23', - 'VAV RH 1-1-25 (MK # 1F9)', - 'VAV RH 1-1-28 CO2 (Hearty Tech Talk 1H2)', - 'VAV RH 1-1-29 CO2 (Hearty Tech Talk 1H2)', - 'VAV RH 1-1-30 CO2 (Hearty Tech Talk 1H2)', - 'VAV RH 1-1-31 CO2 (Hearty Tech Talk 1H2)', - 'VAV RH 1-1-32 CO2 (Hearty Tech Talk 1H2)', - 'VAV RH 1-1-33', - 'VAV RH 1-1-34', - 'VAV RH 1-1-36', - 'VAV RH 1-1-37', - 'VAV RH 1-1-38', - 'VAV RH 1-1-39', - 'VAV RH 1-1-40', - 'VAV RH 1-1-41', - 'VAV RH 1-1-42', - 'VAV RH 1-1-44', - 'VAV RH 1-1-45', - 'VAV RH 1-1-46', - 'VAV RH 1-1-47', - 'VAV RH 1-1-48', - 'VAV RH 1-1-49', - 'VAV RH 1-1-50', - 'VAV RH 1-1-52 CO2', - 'VAV RH 1-1-53', - 'VAV RH 1-1-54', - 'VAV RH 1-1-55', -] - -_FIRST_ZONE_INFO = { - 'zone_id': 'rooms/1002000133978', - 'building_id': 'buildings/3616672508', - 'zone_description': 'SB1-2-C2054', - 'area': 0.0, - 'zone_type': 1, - 'floor': 2, - 'devices': ['2618581107144046', '2696593986887004'], -} - -_LAST_ZONE_INFO = { - 'zone_id': 'rooms/11312312488', - 'building_id': 'buildings/3616672508', - 'zone_description': 'SB1-1-1J7B', - 'area': 0.0, - 'zone_type': 1, - 'floor': 1, - 'devices': ['2802781341872564'], -} - -_FIRST_DEVICE_INFO = { - 'device_id': '202194278473007104', - 'namespace': 'PHRED', - 'code': 'SB1:AHU:AC-2', - 'zone_id': '', - 'device_type': 6, - 'observable_fields': { - 'building_air_static_pressure_sensor': 1, - 'outside_air_flowrate_sensor': 1, - 'supply_fan_speed_percentage_command': 1, - 'supply_air_temperature_sensor': 1, - 'supply_fan_speed_frequency_sensor': 1, - 'supply_air_static_pressure_setpoint': 1, - 'return_air_temperature_sensor': 1, - 'mixed_air_temperature_setpoint': 1, - 'exhaust_fan_speed_percentage_command': 1, - 'exhaust_fan_speed_frequency_sensor': 1, - 'outside_air_damper_percentage_command': 1, - 'mixed_air_temperature_sensor': 1, - 'exhaust_air_damper_percentage_command': 1, - 'cooling_percentage_command': 1, - 'outside_air_flowrate_setpoint': 1, - 'supply_air_temperature_setpoint': 1, - 'building_air_static_pressure_setpoint': 1, - 'supply_air_static_pressure_sensor': 1, - }, - 'actionable_fields': { - 'exhaust_air_damper_percentage_command': 1, - 'supply_air_temperature_setpoint': 1, - 'supply_fan_speed_percentage_command': 1, - 'outside_air_flowrate_setpoint': 1, - 'cooling_percentage_command': 1, - 'mixed_air_temperature_setpoint': 1, - 'exhaust_fan_speed_percentage_command': 1, - 'outside_air_damper_percentage_command': 1, - 'supply_air_static_pressure_setpoint': 1, - 'building_air_static_pressure_setpoint': 1, - }, -} - -_LAST_DEVICE_INFO = { - 'device_id': '2640423556868160', - 'namespace': 'CDM', - 'code': 'VAV RH 2-2-68', - 'zone_id': '', - 'device_type': 4, - 'observable_fields': { - 'supply_air_flowrate_setpoint': 1, - 'discharge_air_temperature_setpoint': 1, - 'discharge_air_temperature_sensor': 1, - 'zone_air_heating_temperature_setpoint': 1, - 'heating_water_valve_percentage_command': 1, - 'supply_air_flowrate_sensor': 1, - 'zone_air_temperature_sensor': 1, - 'zone_air_cooling_temperature_setpoint': 1, - 'supply_air_damper_percentage_command': 1, - }, - 'actionable_fields': { - 'zone_air_cooling_temperature_setpoint': 1, - 'discharge_air_temperature_setpoint': 1, - 'heating_water_valve_percentage_command': 1, - 'supply_air_flowrate_setpoint': 1, - 'zone_air_heating_temperature_setpoint': 1, - 'supply_air_damper_percentage_command': 1, - }, -} - -_DEVICE_OBSERVABLE_FIELD_NAMES = [ - 'building_air_static_pressure_sensor', - 'building_air_static_pressure_setpoint', - 'cooling_percentage_command', - 'differential_pressure_sensor', - 'differential_pressure_setpoint', - 'discharge_air_temperature_sensor', - 'discharge_air_temperature_setpoint', - 'exhaust_air_damper_percentage_command', - 'exhaust_air_damper_percentage_sensor', - 'exhaust_fan_speed_frequency_sensor', - 'exhaust_fan_speed_percentage_command', - 'heating_water_valve_percentage_command', - 'mixed_air_temperature_sensor', - 'mixed_air_temperature_setpoint', - 'outside_air_damper_percentage_command', - 'outside_air_dewpoint_temperature_sensor', - 'outside_air_flowrate_sensor', - 'outside_air_flowrate_setpoint', - 'outside_air_relative_humidity_sensor', - 'outside_air_specificenthalpy_sensor', - 'outside_air_temperature_sensor', - 'outside_air_wetbulb_temperature_sensor', - 'program_differential_pressure_setpoint', - 'program_supply_air_static_pressure_setpoint', - 'program_supply_air_temperature_setpoint', - 'program_supply_water_temperature_setpoint', - 'return_air_temperature_sensor', - 'return_water_temperature_sensor', - 'run_status', - 'speed_frequency_sensor', - 'speed_percentage_command', - 'supervisor_supply_air_static_pressure_setpoint', - 'supervisor_supply_air_temperature_setpoint', - 'supervisor_supply_water_temperature_setpoint', - 'supply_air_damper_percentage_command', - 'supply_air_flowrate_sensor', - 'supply_air_flowrate_setpoint', - 'supply_air_static_pressure_sensor', - 'supply_air_static_pressure_setpoint', - 'supply_air_temperature_sensor', - 'supply_air_temperature_setpoint', - 'supply_fan_run_status', - 'supply_fan_speed_frequency_sensor', - 'supply_fan_speed_percentage_command', - 'supply_water_temperature_sensor', - 'supply_water_temperature_setpoint', - 'zone_air_co2_concentration_sensor', - 'zone_air_co2_concentration_setpoint', - 'zone_air_cooling_temperature_setpoint', - 'zone_air_heating_temperature_setpoint', - 'zone_air_temperature_sensor', -] - -_DEVICE_ACTIONABLE_FIELD_NAMES = [ - 'building_air_static_pressure_setpoint', - 'cooling_percentage_command', - 'differential_pressure_setpoint', - 'discharge_air_temperature_setpoint', - 'exhaust_air_damper_percentage_command', - 'exhaust_fan_speed_percentage_command', - 'heating_water_valve_percentage_command', - 'mixed_air_temperature_setpoint', - 'outside_air_damper_percentage_command', - 'outside_air_flowrate_setpoint', - 'program_differential_pressure_setpoint', - 'program_supply_air_static_pressure_setpoint', - 'program_supply_air_temperature_setpoint', - 'program_supply_water_temperature_setpoint', - 'speed_percentage_command', - 'supervisor_supply_air_static_pressure_setpoint', - 'supervisor_supply_air_temperature_setpoint', - 'supervisor_supply_water_temperature_setpoint', - 'supply_air_damper_percentage_command', - 'supply_air_flowrate_setpoint', - 'supply_air_static_pressure_setpoint', - 'supply_air_temperature_setpoint', - 'supply_fan_speed_percentage_command', - 'supply_water_temperature_setpoint', - 'zone_air_co2_concentration_setpoint', - 'zone_air_cooling_temperature_setpoint', - 'zone_air_heating_temperature_setpoint', -] - - -# -# BUILDING-SPECIFIC TESTS -# - - -class TestDataDirectory(absltest.TestCase): - """Tests for the data directory.""" - - def test_data_dir(self): - self.assertTrue(os.path.isdir(DATA_DIR)) - - -@pytest.mark.usefixtures('set_dataset') -class TestBuildingDataset(absltest.TestCase): - """Tests for the BuildingDataset class.""" - - def test_building_validations(self): - with self.assertRaises(ValueError): - invalid_id = 'OOPS' - BuildingDataset(dataset_id=invalid_id, download=False) - - def test_dataset_id(self): - self.assertEqual(self.ds.dataset_id, _DATASET_ID) - - def test_partition_ids(self): - self.assertEqual(self.ds.partition_ids, _PARTITION_IDS) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_download(self): - self.assertIn('download', dir(self.ds)) - self.assertTrue(os.path.isdir(DATASET_DIRPATH)) - self.assertTrue(os.path.exists(ZIP_FILEPATH)) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_floorplan(self): - floorplan = self.ds.floorplan - - self.assertIsInstance(floorplan, np.ndarray) - self.assertEqual(floorplan.shape, (744, 1004)) - - values, counts = np.unique(floorplan, return_counts=True) - value_counts = dict(zip(values, counts)) - self.assertEqual(value_counts, {0.0: 436332, 1.0: 60204, 2.0: 250440}) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_display_floorplan(self): - with tempfile.TemporaryDirectory() as temp_dir: - filepath = os.path.join(temp_dir, 'tmp_floorplan.png') - self.assertFalse(os.path.isfile(filepath)) - - self.ds.display_floorplan(show=False, save=True, image_filepath=filepath) - - # it saves the image to disk, at the specified location: - self.assertTrue(os.path.isfile(filepath)) - - # testing note: the temp dir gets deleted automatically :-) - self.assertFalse(os.path.isfile(filepath)) - - # DEVICES - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_device_layout_map(self): - device_layout_map = self.ds.device_layout_map - - self.assertIsInstance(device_layout_map, dict) - self.assertEqual(sorted(list(device_layout_map.keys())), _DEVICE_LAYOUT_IDS) - - # each device layout is a list of lists containing two integer coordinates. - # layouts may differ in length: - - example_layout_map = device_layout_map['VAV CO 1-1-06'] - self.assertIsInstance(example_layout_map, list) - self.assertEqual(np.array(example_layout_map).shape, (1021, 2)) - self.assertEqual(example_layout_map[0], [79, 35]) - self.assertEqual(example_layout_map[-1], [80, 64]) - - another_layout_map = device_layout_map['VAV RH 1-1-55'] - self.assertIsInstance(another_layout_map, list) - self.assertEqual(np.array(another_layout_map).shape, (935, 2)) - self.assertEqual(another_layout_map[0], [145, 126]) - self.assertEqual(another_layout_map[-1], [149, 160]) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_device_infos(self): - device_infos = self.ds.device_infos - self.assertIsInstance(device_infos, list) - self.assertEqual(len(device_infos), 173) - self.assertEqual(device_infos[0], _FIRST_DEVICE_INFO) - self.assertEqual(device_infos[-1], _LAST_DEVICE_INFO) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_devices_df(self): - devices_df = self.ds.devices_df - - self.assertIsInstance(devices_df, pd.DataFrame) - self.assertEqual(len(devices_df), 173) - - # each row uniquely identified by the device identifier: - self.assertEqual(devices_df['device_id'].nunique(), len(devices_df)) - - self.assertEqual( - devices_df.columns.tolist(), - [ - 'device_id', - 'namespace', - 'code', - 'device_type', - 'observable_fields', - 'actionable_fields', - ], - ) - - first_row = _FIRST_DEVICE_INFO.copy() - del first_row['zone_id'] # we removed "zone_id" from the df - self.assertEqual(devices_df.iloc[0].to_dict(), first_row) - - # each device belongs to a namespace: - self.assertEqual( - devices_df['namespace'].value_counts().to_dict(), - {'CDM': 155, 'PHRED': 18}, - ) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_observable_fields(self): - observable_fields = self.ds.observable_fields - self.assertIsInstance(observable_fields, list) - self.assertEqual(len(observable_fields), 51) - self.assertEqual(observable_fields, _DEVICE_OBSERVABLE_FIELD_NAMES) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_observable_field_counts(self): - value_counts = self.ds.observable_field_counts - self.assertIsInstance(value_counts, pd.Series) - self.assertEqual(len(value_counts), 51) - self.assertEqual( - sorted(list(value_counts.keys())), _DEVICE_OBSERVABLE_FIELD_NAMES - ) - # counts how many devices support each field: - self.assertEqual( - value_counts.head(5).to_dict(), - { - 'supply_air_damper_percentage_command': 123, - 'zone_air_cooling_temperature_setpoint': 123, - 'supply_air_flowrate_setpoint': 123, - 'zone_air_temperature_sensor': 123, - 'zone_air_heating_temperature_setpoint': 122, - }, - ) - self.assertEqual( - value_counts.tail(1).to_dict(), - {'supervisor_supply_water_temperature_setpoint': 1}, - ) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_actionable_fields(self): - actionable_fields = self.ds.actionable_fields - self.assertIsInstance(actionable_fields, list) - self.assertEqual(len(actionable_fields), 27) - self.assertEqual(actionable_fields, _DEVICE_ACTIONABLE_FIELD_NAMES) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_actionable_field_counts(self): - value_counts = self.ds.actionable_field_counts - self.assertIsInstance(value_counts, pd.Series) - self.assertEqual(len(value_counts), 27) - self.assertEqual( - sorted(list(value_counts.keys())), _DEVICE_ACTIONABLE_FIELD_NAMES - ) - # counts how many devices support each field: - self.assertEqual( - value_counts.head(5).to_dict(), - { - 'zone_air_cooling_temperature_setpoint': 123, - 'supply_air_damper_percentage_command': 123, - 'supply_air_flowrate_setpoint': 123, - 'zone_air_heating_temperature_setpoint': 122, - 'heating_water_valve_percentage_command': 99, - }, - ) - self.assertEqual( - value_counts.tail(1).to_dict(), - {'program_supply_water_temperature_setpoint': 1}, - ) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_fields_df(self): - fields_df = self.ds.fields_df - self.assertIsInstance(fields_df, pd.DataFrame) - self.assertEqual(len(fields_df), 51) - self.assertEqual( - fields_df.columns.tolist(), - [ - 'field_name', - 'is_actionable', - 'is_observable', - 'n_devices_actionable', - 'n_devices_observable', - ], - ) - # some are observable: - self.assertEqual( - fields_df.iloc[0].to_dict(), - { - 'field_name': 'building_air_static_pressure_sensor', - 'is_actionable': False, - 'is_observable': True, - 'n_devices_actionable': 0, - 'n_devices_observable': 3, - }, - ) - # some are actionable: - self.assertEqual( - fields_df.iloc[-1].to_dict(), - { - 'field_name': 'zone_air_temperature_sensor', - 'is_actionable': False, - 'is_observable': True, - 'n_devices_actionable': 0, - 'n_devices_observable': 123, - }, - ) - # some are both actionable and observable: - self.assertEqual( - len(fields_df[(fields_df.is_actionable & fields_df.is_observable)]), 27 - ) - - # ZONES - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_zone_infos(self): - zone_infos = self.ds.zone_infos - - self.assertIsInstance(zone_infos, list) - self.assertEqual(len(zone_infos), 563) - - self.assertEqual(zone_infos[0], _FIRST_ZONE_INFO) - self.assertEqual(zone_infos[-1], _LAST_ZONE_INFO) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_zones_df(self): - zones_df = self.ds.zones_df - - self.assertIsInstance(zones_df, pd.DataFrame) - self.assertEqual(len(zones_df), 563) - - # each row uniquely identified by the zone identifier: - self.assertEqual(zones_df['zone_id'].nunique(), len(zones_df)) - - self.assertEqual( - zones_df.columns.tolist(), - [ - 'zone_id', - 'building_id', - 'zone_description', - 'area', - 'zone_type', - 'floor', - 'devices', - 'n_devices', - ], - ) - - first_row = _FIRST_ZONE_INFO.copy() - first_row['n_devices'] = 2 # we added this column to the df - self.assertEqual(zones_df.iloc[0].to_dict(), first_row) - - -if __name__ == '__main__': - absltest.main() diff --git a/smart_control/dataset/partition.py b/smart_control/dataset/partition.py deleted file mode 100644 index ebfee3fc..00000000 --- a/smart_control/dataset/partition.py +++ /dev/null @@ -1,484 +0,0 @@ -"""The Building Dataset Partition.""" - -from functools import cached_property -import os -import pickle - -import numpy as np -import pandas as pd - -from smart_control.dataset.dataset import BuildingDataset - - -class BuildingDatasetPartition: - # pylint:disable=line-too-long - """A helper class for handling a specific dataset partition. - A partition is a subset of the building's data over a specific time period. - - The partition contains information about observations, actions, and rewards - for each time step: - - - **observation**: information the agent receives from the environment - - **action**: a decision the agent makes to interact with the environment - - **reward info**: feedback from the environment indicating the agent's - performance, contains information needed to compute the reward - - **reward**: results from passing the raw reward info through the reward - function - - Args: - dataset (BuildingDataset): The building dataset. - partition_id (str): The identifier of a partition in the specified dataset - (e.g. "2022_a"). - - Example: - ```python - ds = BuildingDataset(dataset_id='sb1', download=True) - partition = BuildingDatasetPartition(dataset=ds, partition_id='2022_a') - ``` - """ - # pylint:enable=line-too-long - - def __init__(self, dataset: BuildingDataset, partition_id: str): - self.ds = dataset - self.partition_id = partition_id - - if self.partition_id not in self.ds.partition_ids: - raise ValueError(f"Invalid partition: {self.partition_id}.") - - def __repr__(self): - return "" # pylint:disable=line-too-long - - @property - def partition_dirpath(self): - return os.path.join(self.ds.tabular_dirpath, self.ds.dataset_id, self.partition_id) # pylint:disable=line-too-long - - @property - def data_filepath(self): - return os.path.join(self.partition_dirpath, "data.npy.npz") - - @cached_property - def data(self) -> np.lib.npyio.NpzFile: - """Time-series data for the dataset partition. - - This property returns an `np.lib.npyio.NpzFile` object, which allows - dictionary-like access to NumPy arrays stored within a compressed - `.npz` archive. The arrays contain time-series data, where the first - dimension typically represents the time steps. - - Returns: - A dictionary-like numpy object with the following keys: - - - `'observation_value_matrix'` - - `'action_value_matrix'` - - `'reward_value_matrix'` - - `'reward_info_value_matrix'` - - Each of these keys has a corresponding public method for convenience. - See corresponding documentation below for more information about each. - """ - return np.load(self.data_filepath) - - @property - def metadata_filepath(self): - return os.path.join(self.partition_dirpath, "metadata.pickle") - - @cached_property - def metadata(self) -> dict: - """Metadata describing the partition [`data`](./#smart_control.dataset.partition.BuildingDatasetPartition.data). - - Returns: - A dictionary containing the following keys: - - - `'action_ids_map'` - - `'action_timestamps'` - - `'observation_ids'` - - `'observation_timestamps'` - - `'reward_info_ids'` - - `'reward_info_timestamps'` - - `'reward_timestamps'` - - Each of these keys has a corresponding public method for convenience. - See corresponding documentation below for more information about each. - """ - metadata = pickle.load(open(self.metadata_filepath, "rb")) - # renaming keys: - metadata = { - "action_ids_map": metadata["action_ids"], # renamed - "action_timestamps": metadata["action_timestamps"], - "observation_ids_map": metadata["observation_ids"], # renamed - "observation_timestamps": metadata["observation_timestamps"], - "reward_info_ids_map": metadata["reward_ids"], # renamed - "reward_timestamps": metadata["reward_timestamps"], - "reward_info_timestamps": metadata["reward_info_timestamps"], - } - return metadata - - # - # DATA PROPERTIES - # - - @cached_property - def action_value_matrix(self) -> np.ndarray: - """Time-series action data.""" - return self.data["action_value_matrix"] - - @cached_property - def observation_value_matrix(self) -> np.ndarray: - """Time-series observation data.""" - return self.data["observation_value_matrix"] - - @cached_property - def reward_value_matrix(self) -> np.ndarray: - """Time-series reward data.""" - return self.data["reward_value_matrix"] - - @cached_property - def reward_info_value_matrix(self) -> np.ndarray: - """Time series reward information data.""" - return self.data["reward_info_value_matrix"] - - # - # METADATA PROPERTIES - # - - @cached_property - def action_ids_map(self) -> dict: - """A mapping of unique action identifiers. - - Returns: - A dictionary where the keys are the [`action_ids`](./#smart_control.dataset.partition.BuildingDatasetPartition.action_ids) - and the values are unique integers referencing column indices in the - [`action_value_matrix`](./#smart_control.dataset.partition.BuildingDatasetPartition.action_value_matrix) - - For example: - - ```py - { - '12945159110931775488@supply_air_temperature_setpoint': 0, - '13761436543392677888@supply_water_temperature_setpoint': 1, - '14409954889734029312@supply_air_temperature_setpoint': 2 - } - ``` - """ - return self.metadata["action_ids_map"] - - @cached_property - def observation_ids_map(self) -> dict: - """A mapping of unique observation identifiers. - - Returns: - A dictionary where the keys are the [`observation_ids`](./#smart_control.dataset.partition.BuildingDatasetPartition.observation_ids) - and the values are unique integers referencing column indices in the - [`observation_value_matrix`](./#smart_control.dataset.partition.BuildingDatasetPartition.observation_value_matrix). - - For example: - - ```py - { - '202194278473007104@building_air_static_pressure_setpoint', 0, - ... - '2640423556868160@zone_air_temperature_sensor': 1197 - } - ``` - """ - return self.metadata["observation_ids_map"] - - @cached_property - def reward_info_ids_map(self) -> dict: - """A mapping of unique reward info identifiers. - - See: `RewardInfo` in "smart_control/proto/smart_control_reward.proto". - - Returns: - A dictionary where the keys are the [`reward_info_ids`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_info_ids) - and the values are unique integers referencing column indices in the [`reward_info_value_matrix`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_info_value_matrix). - - For example: - - ```py - { - 'rooms/9028552126@heating_setpoint_temperature': 0 - ... - '14409954889734029312@air_conditioning_electrical_energy_rate': 3251 - } - ``` - """ - return self.metadata["reward_info_ids_map"] - - @cached_property - def reward_ids_map(self) -> dict: - """A mapping of unique reward identifiers. - - See: `RewardResponse` in "smart_control/proto/smart_control_reward.proto". - - Returns: - A dictionary where the keys are the [`reward_ids`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_ids) - and the values are unique integers referencing column indices in the [`reward_value_matrix`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_value_matrix). - """ - return { - "agent_reward_value": 0, - "productivity_reward": 1, - "electricity_energy_cost": 2, - "natural_gas_energy_cost": 3, - "carbon_emitted": 4, - "carbon_cost": 5, - "productivity_weight": 6, - "energy_cost_weight": 7, - "carbon_emission_weight": 8, - "person_productivity": 9, - "total_occupancy": 10, - "reward_scale": 11, - "reward_shift": 12, - "productivity_regret": 13, - "normalized_productivity_regret": 14, - "normalized_energy_cost": 15, - "normalized_carbon_emission": 16, - } - - @cached_property - def action_ids(self) -> list[str]: - """A list of unique action identifiers. - - Action identifiers are in the format of `device_id@field_name`. - For example: `'12945159110931775488@supply_air_temperature_setpoint'`. - """ - return list(self.action_ids_map.keys()) - - @cached_property - def observation_ids(self) -> list[str]: - """A list of unique observation identifiers. - - Observation identifiers are in the format of `device_id@field_name`. - For example: `'2640423556868160@zone_air_temperature_sensor'`. - """ - return list(self.observation_ids_map.keys()) - - @cached_property - def reward_ids(self) -> list[str]: - """A list of unique reward identifiers. - - See: `RewardResponse` in "smart_control/proto/smart_control_reward.proto". - - Returns: - A list of the reward identifiers: - - [ - "agent_reward_value", - "productivity_reward", - "electricity_energy_cost", - "natural_gas_energy_cost", - "carbon_emitted", - "carbon_cost", - "productivity_weight", - "energy_cost_weight", - "carbon_emission_weight", - "person_productivity", - "total_occupancy", - "reward_scale", - "reward_shift", - "productivity_regret", - "normalized_productivity_regret", - "normalized_energy_cost", - "normalized_carbon_emission" - ] - """ - return list(self.reward_ids_map.keys()) - - @cached_property - def reward_info_ids(self) -> list[str]: - """A list of unique reward info identifiers. - - See: `RewardInfo` in "smart_control/proto/smart_control_reward.proto". - - Reward info identifiers are in the format of `device_id@field_name` or - `zone_id@field_name`. - For example: - - + `'rooms/9028552126@heating_setpoint_temperature'` - + `'14409954889734029312@air_conditioning_electrical_energy_rate'` - """ - return list(self.reward_info_ids_map.keys()) - - @cached_property - def action_timestamps(self) -> list[pd.Timestamp]: - """A list of sequential timestamps representing the time of each action.""" - return self.metadata["action_timestamps"] - - @cached_property - def observation_timestamps(self) -> list[pd.Timestamp]: - """A list of sequential timestamps representing the time of each - observation. - """ - return self.metadata["observation_timestamps"] - - @cached_property - def reward_timestamps(self) -> list[pd.Timestamp]: - """A list of sequential timestamps representing the time of each reward.""" - return self.metadata["reward_timestamps"] - - @cached_property - def reward_info_timestamps(self) -> list[pd.Timestamp]: - """A list of sequential timestamps related to reward information.""" - return self.metadata["reward_info_timestamps"] - - # - # DATAFRAME PROPERTIES - # - - def _construct_time_series_df(self, matrix_name, ids_name, timestamps_name): - """Constructs a dataframe, using matrix values from the partition data, - as well as column names and index values from the partition metadata. - """ - # using getattr() to leverage cached properties... - df = pd.DataFrame(getattr(self, matrix_name)) - columns_map = {v: k for k, v in getattr(self, ids_name).items()} - df = df.rename(columns=columns_map) - df.index = getattr(self, timestamps_name) - df.index.name = "timestamp" - df.sort_index() # ensure timestamps are in ascending order - return df - - @cached_property - def actions_df(self) -> pd.DataFrame: - # pylint: disable=line-too-long - """A time-series dataframe of numeric action values, constructed from the - following components: - - + Columns are the [`action_ids`](./#smart_control.dataset.partition.BuildingDatasetPartition.action_ids) - + Row indices are the [`action_timestamps`](./#smart_control.dataset.partition.BuildingDatasetPartition.action_timestamps) - + Cell values are from the [`action_value_matrix`](./#smart_control.dataset.partition.BuildingDatasetPartition.action_value_matrix) - - Returns: - A `pandas.DataFrame`. Here is an example of the structure: - - | timestamp | 12945159110931775488@supply_air_temperature_setpoint | ... | 14409954889734029312@supply_air_temperature_setpoint | - |---------------------------|-------------------------------------------------------|-----|-------------------------------------------------------| - | 2022-01-01 00:00:00+00:00 | 288.703705 | ... | 291.481476 | - | 2022-01-01 00:05:00+00:00 | 288.703705 | ... | 291.481476 | - | 2022-01-01 00:10:00+00:00 | 288.703705 | ... | 291.481476 | - | 2022-01-01 00:15:00+00:00 | 288.703705 | ... | 291.481476 | - | 2022-01-01 00:20:00+00:00 | 288.703705 | ... | 291.481476 | - - """ - # pylint: enable=line-too-long - return self._construct_time_series_df( - matrix_name="action_value_matrix", - ids_name="action_ids_map", - timestamps_name="action_timestamps", - ) - - @cached_property - def observations_df(self) -> pd.DataFrame: - # pylint: disable=line-too-long - """A time-series dataframe of numeric observation values, constructed from the - following components: - - + Columns are the [`observation_ids`](./#smart_control.dataset.partition.BuildingDatasetPartition.observation_ids) - + Row indices are the [`observation_timestamps`](./#smart_control.dataset.partition.BuildingDatasetPartition.observation_timestamps) - + Cell values are from the [`observation_value_matrix`](./#smart_control.dataset.partition.BuildingDatasetPartition.observation_value_matrix) - - Returns: - A `pandas.DataFrame`. Here is an example of the structure: - - | timestamp | 202194278473007104@building_air_static_pressure_setpoint | ... | 2640423556868160@zone_air_temperature_sensor | - |---------------------------|----------------------------------------------------------|-----|----------------------------------------------| - | 2022-01-01 00:00:00+00:00 | 7.472401 | ... | 68.500000 | - | 2022-01-01 00:05:00+00:00 | 7.472401 | ... | 68.300003 | - | 2022-01-01 00:10:00+00:00 | 7.472401 | ... | 68.300003 | - | 2022-01-01 00:15:00+00:00 | 7.472401 | ... | 68.000000 | - | 2022-01-01 00:20:00+00:00 | 7.472401 | ... | 68.000000 | - - """ - # pylint: enable=line-too-long - return self._construct_time_series_df( - matrix_name="observation_value_matrix", - ids_name="observation_ids_map", - timestamps_name="observation_timestamps", - ) - - @cached_property - def rewards_df(self) -> pd.DataFrame: - # pylint: disable=line-too-long - """A time-series dataframe of numeric reward values, constructed from the - following components: - - + Columns are the [`reward_ids`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_ids) - + Row indices are the [`reward_timestamps`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_timestamps) - + Cell values are from the [`reward_value_matrix`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_value_matrix) - - Returns: - A `pandas.DataFrame`. Here is an example of the structure: - - | timestamp | agent_reward_value | ... | normalized_carbon_emission | - |---------------------------|--------------------|-----|----------------------------| - | 2021-12-31 23:55:00+00:00 | -1.005403e-08 | ... | 1.797313e-08 | - | 2022-01-01 00:00:00+00:00 | -1.002312e-08 | ... | 1.782538e-08 | - | 2022-01-01 00:05:00+00:00 | -1.002312e-08 | ... | 1.782538e-08 | - | 2022-01-01 00:10:00+00:00 | -1.002312e-08 | ... | 1.782538e-08 | - | 2022-01-01 00:15:00+00:00 | -5.737567e-09 | ... | 1.020384e-08 | - """ - # pylint: enable=line-too-long - return self._construct_time_series_df( - matrix_name="reward_value_matrix", - ids_name="reward_ids_map", - timestamps_name="reward_timestamps", - ) - - @cached_property - def reward_infos_df(self) -> pd.DataFrame: - # pylint: disable=line-too-long - """A time-series dataframe of numeric reward info values, constructed from - the following components: - - + Columns are the [`reward_info_ids`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_info_ids) - + Row indices are the [`reward_info_timestamps`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_info_timestamps) - + Cell values are from the [`reward_info_value_matrix`](./#smart_control.dataset.partition.BuildingDatasetPartition.reward_info_value_matrix) - - Returns: - A `pandas.DataFrame`. Here is an example of the structure: - - | timestamp | rooms/9028552126@heating_setpoint_temperature | ... | 14409954889734029312@air_conditioning_electrical_energy_rate | - |---------------------------|-----------------------------------------------|-----|---------------------------------------------------------------| - | 2021-12-31 23:55:00+00:00 | 294.0 | ... | 0.0 | - | 2022-01-01 00:00:00+00:00 | 294.0 | ... | 0.0 | - | 2022-01-01 00:05:00+00:00 | 294.0 | ... | 0.0 | - | 2022-01-01 00:10:00+00:00 | 294.0 | ... | 0.0 | - | 2022-01-01 00:15:00+00:00 | 294.0 | ... | 0.0 | - """ - # pylint: enable=line-too-long - return self._construct_time_series_df( - matrix_name="reward_info_value_matrix", - ids_name="reward_info_ids_map", - timestamps_name="reward_info_timestamps", - ) - - -if __name__ == "__main__": - - selected_dataset_id = input("Please select a building (e.g. 'sb1'): ") or "sb1" # pylint:disable=line-too-long - ds = BuildingDataset(selected_dataset_id, download=True) - print(ds) - - selected_partition_id = input("Please select a partition (e.g. '2022_a'): ") or "2022_a" # pylint:disable=line-too-long - partition = BuildingDatasetPartition(ds, selected_partition_id) - print(partition) - - actions_df = partition.actions_df - print("ACTIONS:", actions_df.shape) - print(actions_df.index[0]) - print(actions_df.index[-1]) - - observations_df = partition.observations_df - print("OBSERVATIONS:", observations_df.shape) - print(observations_df.index[0]) - print(observations_df.index[-1]) - - rewards_df = partition.rewards_df - print("REWARDS:", rewards_df.shape) - print(rewards_df.index[0]) - print(rewards_df.index[-1]) - - reward_infos_df = partition.reward_infos_df - print("REWARD INFOS:", reward_infos_df.shape) - print(reward_infos_df.index[0]) - print(reward_infos_df.index[-1]) diff --git a/smart_control/dataset/partition_test.py b/smart_control/dataset/partition_test.py deleted file mode 100644 index 4b506336..00000000 --- a/smart_control/dataset/partition_test.py +++ /dev/null @@ -1,500 +0,0 @@ -"""Tests for BuildingDatasetPartition class.""" - -import unittest - -from absl.testing import absltest -from absl.testing import parameterized -import numpy as np -import pandas as pd -import pytest - -from smart_control.dataset.conftest import SKIP_REASON -from smart_control.dataset.conftest import TEST_DATASET -from smart_control.dataset.partition import BuildingDatasetPartition - -# -# HIGH LEVEL TESTS FOR ALL PARTITIONS IN BUILDING "SB1"... -# - -# pylint:disable=line-too-long -# fmt:off -PARTITION_PARAMETERS = [ - dict( - partition_id='2022_a', - actions_shape=(51852, 3), - actions_range=('2022-01-01 00:00:00+00:00', '2022-06-30 00:55:00+00:00'), - observations_shape=(51852, 1198), - observations_range=('2022-01-01 00:00:00+00:00', '2022-06-30 00:55:00+00:00'), - rewards_shape=(51852, 17), - rewards_range=('2021-12-31 23:55:00+00:00', '2022-06-30 00:50:00+00:00'), - reward_infos_shape=(51852, 3252), - reward_infos_range=('2021-12-31 23:55:00+00:00', '2022-06-30 00:50:00+00:00'), - ), - dict( - partition_id='2022_b', - actions_shape=(53292, 3), - actions_range=('2022-07-01 00:00:00+00:00', '2022-12-31 00:55:00+00:00'), - observations_shape=(53292, 1198), - observations_range=('2022-07-01 00:00:00+00:00', '2022-12-31 00:55:00+00:00'), - rewards_shape=(53292, 17), - rewards_range=('2022-06-30 23:55:00+00:00', '2022-12-31 00:50:00+00:00'), - reward_infos_shape=(53292, 3318), - reward_infos_range=('2022-06-30 23:55:00+00:00', '2022-12-31 00:50:00+00:00'), - ), - dict( - partition_id='2023_a', - actions_shape=(51852, 3), - actions_range=('2023-01-01 00:00:00+00:00', '2023-06-30 00:55:00+00:00'), - observations_shape=(51852, 1198), - observations_range=('2023-01-01 00:00:00+00:00', '2023-06-30 00:55:00+00:00'), - rewards_shape=(51852, 17), - rewards_range=('2022-12-31 23:55:00+00:00', '2023-06-30 00:50:00+00:00'), - reward_infos_shape=(51852, 3252), - reward_infos_range=('2022-12-31 23:55:00+00:00', '2023-06-30 00:50:00+00:00'), - ), - dict( - partition_id='2023_b', - actions_shape=(52716, 3), - actions_range=('2023-07-01 00:00:00+00:00', '2023-12-31 00:55:00+00:00'), - observations_shape=(52716, 1198), - observations_range=('2023-07-01 00:00:00+00:00', '2023-12-31 00:55:00+00:00'), - rewards_shape=(52716, 17), - rewards_range=('2023-06-30 23:55:00+00:00', '2023-12-31 00:50:00+00:00'), - reward_infos_shape=(52716, 3252), - reward_infos_range=('2023-06-30 23:55:00+00:00', '2023-12-31 00:50:00+00:00'), - ), - dict( - partition_id='2024_a', - actions_shape=(52140, 3), - actions_range=('2024-01-01 00:00:00+00:00', '2024-06-30 00:55:00+00:00'), - observations_shape=(52140, 1198), - observations_range=('2024-01-01 00:00:00+00:00', '2024-06-30 00:55:00+00:00'), - rewards_shape=(52140, 17), - rewards_range=('2023-12-31 23:55:00+00:00', '2024-06-30 00:50:00+00:00'), - reward_infos_shape=(52140, 3252), - reward_infos_range=('2023-12-31 23:55:00+00:00', '2024-06-30 00:50:00+00:00'), - ), -] -# pylint:enable=line-too-long -# fmt: on - - -@pytest.mark.usefixtures('set_dataset') -class TestAllBuildingDatasetPartitions(parameterized.TestCase): - """Tests all valid partitions for building "sb1".""" - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - @parameterized.parameters(PARTITION_PARAMETERS) - def test_all_partitions( - self, - partition_id, - actions_shape, - actions_range, - observations_shape, - observations_range, - rewards_shape, - rewards_range, - reward_infos_shape, - reward_infos_range, - ): - partition = BuildingDatasetPartition(self.ds, partition_id) - - actions_df = partition.actions_df - self.assertIsInstance(actions_df, pd.DataFrame) - self.assertEqual(actions_df.shape, actions_shape) - self.assertEqual(str(actions_df.index[0]), actions_range[0]) - self.assertEqual(str(actions_df.index[-1]), actions_range[-1]) - - observations_df = partition.observations_df - self.assertIsInstance(observations_df, pd.DataFrame) - self.assertEqual(observations_df.shape, observations_shape) - self.assertEqual(str(observations_df.index[0]), observations_range[0]) - self.assertEqual(str(observations_df.index[-1]), observations_range[-1]) - - rewards_df = partition.rewards_df - self.assertIsInstance(rewards_df, pd.DataFrame) - self.assertEqual(rewards_df.shape, rewards_shape) - self.assertEqual(str(rewards_df.index[0]), rewards_range[0]) - self.assertEqual(str(rewards_df.index[-1]), rewards_range[-1]) - - reward_infos_df = partition.reward_infos_df - self.assertIsInstance(reward_infos_df, pd.DataFrame) - self.assertEqual(reward_infos_df.shape, reward_infos_shape) - self.assertEqual(str(reward_infos_df.index[0]), reward_infos_range[0]) - self.assertEqual(str(reward_infos_df.index[-1]), reward_infos_range[-1]) - - -# -# DETAILED TESTS FOR THE "2022a" PARTITION... -# - -_ACTION_IDS_MAP = { - '12945159110931775488@supply_air_temperature_setpoint': 0, - '13761436543392677888@supply_water_temperature_setpoint': 1, - '14409954889734029312@supply_air_temperature_setpoint': 2, -} -_ACTION_IDS = list(_ACTION_IDS_MAP.keys()) - - -_REWARD_IDS_MAP = { - 'agent_reward_value': 0, - 'productivity_reward': 1, - 'electricity_energy_cost': 2, - 'natural_gas_energy_cost': 3, - 'carbon_emitted': 4, - 'carbon_cost': 5, - 'productivity_weight': 6, - 'energy_cost_weight': 7, - 'carbon_emission_weight': 8, - 'person_productivity': 9, - 'total_occupancy': 10, - 'reward_scale': 11, - 'reward_shift': 12, - 'productivity_regret': 13, - 'normalized_productivity_regret': 14, - 'normalized_energy_cost': 15, - 'normalized_carbon_emission': 16, -} -_REWARD_IDS = list(_REWARD_IDS_MAP.keys()) - - -@pytest.mark.usefixtures('set_dataset') -@pytest.mark.usefixtures('set_partition') -class TestBuildingDatasetPartition(absltest.TestCase): - """Tests for the BuildingDatasetPartition class.""" - - def test_partition_validations(self): - with self.assertRaises(ValueError): - invalid_id = 'OOPS' - BuildingDatasetPartition(self.ds, partition_id=invalid_id) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_partition_data(self): - data = self.partition.data - self.assertIsInstance(data, np.lib.npyio.NpzFile) - - # fmt: off - # we are surfacing each key into its own high-level public property: - with self.subTest('action_value_matrix'): - np.testing.assert_array_equal( - data['action_value_matrix'], - self.partition.action_value_matrix - ) - - with self.subTest('observation_value_matrix'): - np.testing.assert_array_equal( - data['observation_value_matrix'], - self.partition.observation_value_matrix, - ) - - with self.subTest('reward_value_matrix'): - np.testing.assert_array_equal( - data['reward_value_matrix'], - self.partition.reward_value_matrix - ) - - with self.subTest('reward_info_value_matrix'): - np.testing.assert_array_equal( - data['reward_info_value_matrix'], - self.partition.reward_info_value_matrix, - ) - # fmt: on - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_partition_metadata(self): - metadata = self.partition.metadata - - self.assertIsInstance(metadata, dict) - expected_keys = [ - 'action_ids_map', - 'action_timestamps', - 'observation_ids_map', - 'observation_timestamps', - 'reward_info_ids_map', - 'reward_info_timestamps', - 'reward_timestamps', - ] - self.assertEqual(sorted(metadata.keys()), expected_keys) - - # fmt: off - # pylint: disable=line-too-long - # we are surfacing each key into its own high-level public property: - self.assertEqual(metadata['action_ids_map'], self.partition.action_ids_map) - self.assertEqual(metadata['observation_ids_map'], self.partition.observation_ids_map) - self.assertEqual(metadata['reward_info_ids_map'], self.partition.reward_info_ids_map) - - self.assertEqual(metadata['action_timestamps'], self.partition.action_timestamps) - self.assertEqual(metadata['observation_timestamps'], self.partition.observation_timestamps) - self.assertEqual(metadata['reward_timestamps'], self.partition.reward_timestamps) - self.assertEqual(metadata['reward_info_timestamps'], self.partition.reward_info_timestamps) - # pylint: enable=line-too-long - # fmt: on - - # - # DATA PROPERTIES... - # - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_action_value_matrix(self): - self.assertEqual(self.partition.action_value_matrix.shape, (51852, 3)) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_observation_value_matrix(self): - self.assertEqual(self.partition.observation_value_matrix.shape, (51852, 1198)) # pylint: disable=line-too-long - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_reward_value_matrix(self): - self.assertEqual(self.partition.reward_value_matrix.shape, (51852, 17)) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_reward_info_value_matrix(self): - self.assertEqual(self.partition.reward_info_value_matrix.shape, (51852, 3252)) # pylint: disable=line-too-long - - # - # METADATA PROPERTIES... - # - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_action_ids_map(self): - self.assertEqual(self.partition.action_ids_map, _ACTION_IDS_MAP) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_observation_ids_map(self): - observation_ids_map = self.partition.observation_ids_map - self.assertIsInstance(observation_ids_map, dict) - self.assertEqual(len(observation_ids_map), 1198) - - # keys are the observation ids: - keys = list(observation_ids_map.keys()) - self.assertEqual(keys[0], '202194278473007104@building_air_static_pressure_setpoint') # pylint: disable=line-too-long - self.assertEqual(keys[-1], '2640423556868160@zone_air_temperature_sensor') - - # values are unique integers: - values = list(observation_ids_map.values()) - self.assertEqual(values[0], 0) - self.assertEqual(values[-1], 1197) - self.assertEqual(len(values), len(list(set(values)))) # all unique - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_reward_info_ids_map(self): - reward_info_ids_map = self.partition.reward_info_ids_map - self.assertIsInstance(reward_info_ids_map, dict) - self.assertEqual(len(reward_info_ids_map), 3252) - - # keys are the reward ids (there are 3252 but here are some examples): - keys = list(reward_info_ids_map.keys()) - self.assertEqual(keys[0], 'rooms/9028552126@heating_setpoint_temperature') - self.assertEqual(keys[-1], '14409954889734029312@air_conditioning_electrical_energy_rate') # pylint: disable=line-too-long - - # values are unique integers: - values = list(reward_info_ids_map.values()) - self.assertEqual(values[0], 0) - self.assertEqual(values[-1], 3251) - self.assertEqual(len(values), len(list(set(values)))) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_reward_ids_map(self): - reward_ids_map = self.partition.reward_ids_map - self.assertIsInstance(reward_ids_map, dict) - self.assertEqual(len(reward_ids_map), 17) - - # keys are the reward ids: - keys = list(reward_ids_map.keys()) - self.assertEqual(keys, _REWARD_IDS) - - # values are unique integers: - values = list(reward_ids_map.values()) - self.assertEqual(values[0], 0) - self.assertEqual(values[-1], 16) - self.assertEqual(len(values), len(list(set(values)))) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_action_ids(self): - self.assertEqual(self.partition.action_ids, _ACTION_IDS) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_observation_ids(self): - self.assertEqual( - self.partition.observation_ids, - list(self.partition.observation_ids_map.keys()), - ) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_reward_info_ids(self): - self.assertEqual( - self.partition.reward_info_ids, - list(self.partition.reward_info_ids_map.keys()), - ) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_reward_ids(self): - self.assertEqual(self.partition.reward_ids, _REWARD_IDS) - - def _assert_timestamps(self, timestamps, earliest, latest, length): - """ - Assertions for timestamps. - - Args: - timestamps (list): the timestamps to test - earliest and latest (str): expected earliest and latest values, - as strings, like '2022-06-30 00:55:00+00:00' - length (int) : expected length of the list - """ - self.assertIsInstance(timestamps, list) - self.assertEqual(len(timestamps), length) - - first_timestamp = timestamps[0] - last_timestamp = timestamps[-1] - # values are Timestamp objects: - self.assertIsInstance(first_timestamp, pd.Timestamp) - self.assertIsInstance(last_timestamp, pd.Timestamp) - # timestamp range matches expectations: - self.assertEqual(str(first_timestamp), earliest) - self.assertEqual(str(last_timestamp), latest) - # timestamps are sorted in ascending order: - self.assertEqual(first_timestamp, min(timestamps)) - self.assertEqual(last_timestamp, max(timestamps)) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_action_timestamps(self): - self._assert_timestamps( - self.partition.action_timestamps, - earliest='2022-01-01 00:00:00+00:00', - latest='2022-06-30 00:55:00+00:00', - length=51852, - ) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_observation_timestamps(self): - self._assert_timestamps( - self.partition.observation_timestamps, - earliest='2022-01-01 00:00:00+00:00', - latest='2022-06-30 00:55:00+00:00', - length=51852, - ) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_reward_timestamps(self): - self._assert_timestamps( - self.partition.reward_timestamps, - earliest='2021-12-31 23:55:00+00:00', - latest='2022-06-30 00:50:00+00:00', - length=51852, - ) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_reward_info_timestamps(self): - self._assert_timestamps( - self.partition.reward_info_timestamps, - earliest='2021-12-31 23:55:00+00:00', - latest='2022-06-30 00:50:00+00:00', - length=51852, - ) - - # - # DATAFRAME PROPERTIES... - # - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_actions_df(self): - df = self.partition.actions_df - - self.assertIsInstance(df, pd.DataFrame) - self.assertEqual(df.shape, (51852, 3)) - - # columns are the action ids: - self.assertEqual(df.columns.tolist(), _ACTION_IDS) - - # index values are the action timestamps: - self.assertEqual(str(df.index[0]), '2022-01-01 00:00:00+00:00') - self.assertEqual(str(df.index[-1]), '2022-06-30 00:55:00+00:00') - - # index timestamps are sorted in ascending order: - self.assertEqual(df.index[0], df.index.min()) - self.assertEqual(df.index[-1], df.index.max()) - - # values are all numeric (float) and non-null: - self.assertEqual(df.isna().sum().sum(), 0) - self.assertEqual(df.dtypes.unique().tolist(), [np.dtype('float64')]) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_observations_df(self): - df = self.partition.observations_df - - self.assertIsInstance(df, pd.DataFrame) - self.assertEqual(df.shape, (51852, 1198)) - - # columns are the observation ids: - # ... (there are 1198, but here are some examples): - example_column_names = [ - '202194278473007104@building_air_static_pressure_setpoint', - '2640423556868160@zone_air_temperature_sensor', - ] - for column_name in example_column_names: - self.assertIn(column_name, df.columns) - - # index values are the observation timestamps: - self.assertEqual(str(df.index[0]), '2022-01-01 00:00:00+00:00') - self.assertEqual(str(df.index[-1]), '2022-06-30 00:55:00+00:00') - - # index timestamps are sorted in ascending order: - self.assertEqual(df.index[0], df.index.min()) - self.assertEqual(df.index[-1], df.index.max()) - - # values are all numeric (float) and non-null: - self.assertEqual(df.isna().sum().sum(), 0) - self.assertEqual(df.dtypes.unique().tolist(), [np.dtype('float64')]) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_rewards_df(self): - df = self.partition.rewards_df - - self.assertIsInstance(df, pd.DataFrame) - self.assertEqual(df.shape, (51852, 17)) - - # columns correspond with fields from the `RewardResponse` proto: - self.assertEqual(df.columns.tolist(), _REWARD_IDS) - - # index values are the reward timestamps: - self.assertEqual(str(df.index[0]), '2021-12-31 23:55:00+00:00') - self.assertEqual(str(df.index[-1]), '2022-06-30 00:50:00+00:00') - - # index timestamps are sorted in ascending order: - self.assertEqual(df.index[0], df.index.min()) - self.assertEqual(df.index[-1], df.index.max()) - - # values are all numeric (float) and non-null: - self.assertEqual(df.isna().sum().sum(), 0) # all non-null - self.assertEqual(df.dtypes.unique().tolist(), [np.dtype('float64')]) - - @unittest.skipUnless(TEST_DATASET, SKIP_REASON) - def test_reward_infos_df(self): - df = self.partition.reward_infos_df - - self.assertIsInstance(df, pd.DataFrame) - self.assertEqual(df.shape, (51852, 3252)) - - # columns are the reward info ids: - # ... (there are 3252 but here are some examples): - example_column_names = [ - 'rooms/9028552126@heating_setpoint_temperature', - '14409954889734029312@air_conditioning_electrical_energy_rate', - ] - for column_name in example_column_names: - self.assertIn(column_name, df.columns) - - # index corresponding to the reward info timestamps: - self.assertEqual(str(df.index[0]), '2021-12-31 23:55:00+00:00') - self.assertEqual(str(df.index[-1]), '2022-06-30 00:50:00+00:00') - - # index is sorted in ascending order: - self.assertEqual(df.index[0], df.index.min()) - self.assertEqual(df.index[-1], df.index.max()) - - # values are all numeric (float) and non-null: - self.assertEqual(df.isna().sum().sum(), 0) - self.assertEqual(df.dtypes.unique().tolist(), [np.dtype('float64')]) - - -if __name__ == '__main__': - absltest.main() diff --git a/smart_control/environment/BUILD b/smart_control/environment/BUILD deleted file mode 100644 index d79fce15..00000000 --- a/smart_control/environment/BUILD +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Top-level BUILD for Smart Buildings Smart Control - -load("//devtools/python/blaze:pytype.bzl", "pytype_strict_library") -load("//devtools/python/blaze:strict.bzl", "py_strict_test") - -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -pytype_strict_library( - name = "environment", - srcs = ["environment.py"], - deps = [ - "//third_party/py/absl/logging", - "//third_party/py/bidict", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_building", - "//third_party/py/smart_buildings/smart_control/models:base_normalizer", - "//third_party/py/smart_buildings/smart_control/models:base_reward_function", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:building_image_generator", - "//third_party/py/smart_buildings/smart_control/utils:constants", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - "//third_party/py/smart_buildings/smart_control/utils:histogram_reducer", - "//third_party/py/smart_buildings/smart_control/utils:plot_utils", - "//third_party/py/smart_buildings/smart_control/utils:regression_building_utils", - "//third_party/py/smart_buildings/smart_control/utils:run_command_predictor", - "//third_party/py/smart_buildings/smart_control/utils:writer_lib", - "//third_party/py/tensorflow", - "//third_party/py/tf_agents/environments:py_environment", - "//third_party/py/tf_agents/specs:array_spec", - "//third_party/py/tf_agents/trajectories:time_step", - "//third_party/py/tf_agents/typing:types", - ], -) - -pytype_strict_library( - name = "environment_test_utils", - srcs = ["environment_test_utils.py"], - deps = [ - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_building", - "//third_party/py/smart_buildings/smart_control/models:base_reward_function", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "environment_test", - srcs = ["environment_test.py"], - deps = [ - ":environment", - ":environment_test_utils", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/bidict", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_building", - "//third_party/py/smart_buildings/smart_control/models:base_reward_function", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_normalization_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:bounded_action_normalizer", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - "//third_party/py/smart_buildings/smart_control/utils:histogram_reducer", - "//third_party/py/smart_buildings/smart_control/utils:observation_normalizer", - "//third_party/py/smart_buildings/smart_control/utils:test_utils", - "//third_party/py/tensorflow:tensorflow_no_contrib", - "//third_party/py/tf_agents/environments:utils", - "//third_party/py/tf_agents/specs:array_spec", - "//third_party/py/tf_agents/trajectories:time_step", - ], -) diff --git a/smart_control/environment/__init__.py b/smart_control/environment/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/environment/conftest.py b/smart_control/environment/conftest.py new file mode 100644 index 00000000..23de7cc1 --- /dev/null +++ b/smart_control/environment/conftest.py @@ -0,0 +1,500 @@ +"""(Even more) Test helpers for the environment module.""" + +import numpy as np +from tf_agents.specs import array_spec + +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import environment_test_utils +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.utils import bounded_action_normalizer +from smart_buildings.smart_control.utils import observation_normalizer + +ContinuousVariableInfo = smart_control_normalization_pb2.ContinuousVariableInfo + +BoundedActionNormalizer = bounded_action_normalizer.BoundedActionNormalizer +StandardScoreObservationNormalizer = observation_normalizer.StandardScoreObservationNormalizer # pylint: disable=line-too-long + +# +# BUILDING LAYOUTS +# + +LAYOUT = { + "zone_1": { + "air_handler_1": [ + "setpoint_1", + "measurement_1", + "supply_air_heating_temperature_setpoint", + "supervisor_run_command", + ], + "boiler_1": [ + "setpoint_2", + "setpoint_3", + "setpoint_4", + "measurement_2", + "supply_water_setpoint", + "supervisor_run_command", + ], + }, + "zone_2": { + "air_handler_2": [ + "measurement_3", + "supply_air_heating_temperature_setpoint", + "supervisor_run_command", + ], + "vav_1": ["setpoint_5", "measurement_4"], + }, +} + +DEMO_LAYOUT = { + "zone_1": { + "air_handler_1": [ + "supply_air_heating_temperature_setpoint", + "supervisor_run_command", + ], + "boiler_1": [ + "supply_water_setpoint", + "supervisor_run_command", + ], + }, + "zone_2": { + "air_handler_2": [ + "supply_air_heating_temperature_setpoint", + "supervisor_run_command", + ], + "outside_air_sensor": ["outside_air_temperature_sensor"], + }, +} + +MULTI_FLOOR_LAYOUT = { + "zone_1": { + "air_handler_1": [ + "supply_air_heating_temperature_setpoint", + "supervisor_run_command", + ], + "boiler_1": [ + "supply_water_setpoint", + "supervisor_run_command", + ], + "floor": 1, + }, + "zone_2": { + "air_handler_2": [ + "supply_air_heating_temperature_setpoint", + "supervisor_run_command", + ], + "outside_air_sensor": ["outside_air_temperature_sensor"], + "floor": 1, + }, + "zone_3": { + "air_handler_3": [ + "supply_air_heating_temperature_setpoint", + "supervisor_run_command", + ], + "floor": 2, + }, +} + +SIM_NEW_HVAC_LAYOUT = { + "zone_1": { + "ahu": [ + "ahu_1_supply_air_heating_temperature_setpoint", + "ahu_2_supply_air_heating_temperature_setpoint", + "ahu_1_static_pressure_setpoint", + "ahu_2_static_pressure_setpoint", + "supervisor_run_command", + ], + "hws": [ + "supply_water_setpoint", + "differential_pressure", + "supervisor_run_command", + ], + }, + "zone_2": { + "ahu": [ + "ahu_2_supply_air_heating_temperature_setpoint", + "ahu_2_supply_air_heating_temperature_setpoint", + "ahu_2_supervisor_run_command", + ], + "outside_air_sensor": ["outside_air_temperature_sensor"], + }, +} + +# +# FIXTURES +# + +OBSERVATION_NORMALIZERS = { + "temperature": {"sample_mean": 310.0, "sample_variance": 50 * 50}, + "supply_water_setpoint": { + "sample_mean": 310.0, + "sample_variance": 50 * 50, + }, + "air_flowrate": {"sample_mean": 0.5, "sample_variance": 4.0}, + "differential_pressure": { + "sample_mean": 20000.0, + "sample_variance": 100000.0, + }, + "percentage": {"sample_mean": 0.5, "sample_variance": 1.0}, + "request_count": {"sample_mean": 9, "sample_variance": 25.0}, + # ... + "outside_air_temperature_sensor": { + "sample_mean": 291.244931, + "sample_variance": 12.904175, + }, + "outside_air_relative_humidity_sensor": { + "sample_mean": 71.799372, + "sample_variance": 172.388773, + }, + # ... + "supply_air_heating_temperature_setpoint": { + "sample_mean": 289.329414, + "sample_variance": 3.186769, + }, + # ... + "supervisor_run_command": { + "sample_mean": 0.0, + "sample_variance": 1, + }, +} + +ACTION_NORMALIZERS = { + "supply_air_heating_temperature_setpoint": { + "min_native_value": 285.0, + "max_native_value": 295.0, # changed from 300 to make the math easier + }, + "supply_water_setpoint": { + "min_native_value": 310.0, + "max_native_value": 350.0, # changed from 355 to make the math easier + }, +} +HYBRID_ACTION_NORMALIZERS = { + **ACTION_NORMALIZERS, + **{ + "supervisor_run_command": { + "min_native_value": 0, + "max_native_value": 1, + }, + }, +} + +DEVICE_ACTION_TUPLES = [ + ("air_handler_1", "supply_air_heating_temperature_setpoint"), + ("boiler_1", "supply_water_setpoint"), + ("air_handler_2", "supply_air_heating_temperature_setpoint"), +] +HYBRID_DEVICE_ACTION_TUPLES = [ + ("air_handler_1", "supply_air_heating_temperature_setpoint"), # continuous + ("air_handler_1", "supervisor_run_command"), # discrete + ("boiler_1", "supply_water_setpoint"), # continuous + ("boiler_1", "supervisor_run_command"), # discrete + ("air_handler_2", "supply_air_heating_temperature_setpoint"), # continuous + ("air_handler_2", "supervisor_run_command"), # discrete +] + +# +# DEFAULT ACTIONS +# + +DEFAULT_ACTIONS = { + "air_handler_1_supply_air_heating_temperature_setpoint": 290.0, + "boiler_1_supply_water_setpoint": 310.0, + "air_handler_2_supply_air_heating_temperature_setpoint": 290.0, +} +DEFAULT_HYBRID_ACTIONS = { + "air_handler_1_supply_air_heating_temperature_setpoint": 290.0, + "air_handler_1_supervisor_run_command": 0, + "boiler_1_supply_water_setpoint": 310.0, + "boiler_1_supervisor_run_command": 0, + "air_handler_2_supply_air_heating_temperature_setpoint": 290.0, + "air_handler_2_supervisor_run_command": 0, +} + + +DEFAULT_ACTION_VALUES = [0.0, -1.0, 0.0] +DEFAULT_HYBRID_ACTION_VALUES = [0.0, -1.0, -1.0, -1.0, 0.0, -1.0] +DEFAULT_HYBRID_ACTION_DICT = { + "discrete_action": [0, 0, 0], + "continuous_action": [0.0, -1.0, 0.0], +} + +# +# EXAMPLE ACTIONS +# + +NORMALIZED_ACTION_VALUES = [-1.0, 0.0, 1.0] +NATIVE_ACTION_VALUES = [285.0, 330.0, 295.0] +ACTION_RECORDS = [ + { + "idx": 0, + "action_name": "air_handler_1_supply_air_heating_temperature_setpoint", # pylint: disable=line-too-long + "device_id": "air_handler_1", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_type": "CONTINUOUS", + "normalized_value": -1.0, + "native_value": 285.0, + "action_value": -1.0, + }, + { + "idx": 1, + "action_name": "boiler_1_supply_water_setpoint", + "device_id": "boiler_1", + "setpoint_name": "supply_water_setpoint", + "setpoint_type": "CONTINUOUS", + "normalized_value": 0.0, + "native_value": 330.0, + "action_value": 0.0, + }, + { + "idx": 2, + "action_name": "air_handler_2_supply_air_heating_temperature_setpoint", # pylint: disable=line-too-long + "device_id": "air_handler_2", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_type": "CONTINUOUS", + "normalized_value": 1.0, + "native_value": 295.0, + "action_value": 1.0, + }, +] + +NORMALIZED_HYBRID_ACTION_VALUES = [-1.0, -1.0, 0.0, 1.0, 1.0, 1.0] +NATIVE_HYBRID_ACTION_VALUES = [285.0, 0.0, 330.0, 1.0, 295.0, 1.0] +HYBRID_ACTION_RECORDS = [ + { + "idx": 0, + "action_name": "air_handler_1_supply_air_heating_temperature_setpoint", # pylint: disable=line-too-long + "device_id": "air_handler_1", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_type": "CONTINUOUS", + "normalized_value": -1.0, + "native_value": 285.0, + "action_value": -1.0, + }, + { + "idx": 1, + "action_name": "air_handler_1_supervisor_run_command", + "device_id": "air_handler_1", + "setpoint_name": "supervisor_run_command", + "setpoint_type": "DISCRETE", + "normalized_value": -1.0, + "native_value": 0.0, + "action_value": 0.0, + }, + { + "idx": 2, + "action_name": "boiler_1_supply_water_setpoint", + "device_id": "boiler_1", + "setpoint_name": "supply_water_setpoint", + "setpoint_type": "CONTINUOUS", + "normalized_value": 0.0, + "native_value": 330.0, + "action_value": 0.0, + }, + { + "idx": 3, + "action_name": "boiler_1_supervisor_run_command", + "device_id": "boiler_1", + "setpoint_name": "supervisor_run_command", + "setpoint_type": "DISCRETE", + "normalized_value": 1.0, + "native_value": 1.0, + "action_value": 1.0, + }, + { + "idx": 4, + "action_name": "air_handler_2_supply_air_heating_temperature_setpoint", # pylint: disable=line-too-long + "device_id": "air_handler_2", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_type": "CONTINUOUS", + "normalized_value": 1.0, + "native_value": 295.0, + "action_value": 1.0, + }, + { + "idx": 5, + "action_name": "air_handler_2_supervisor_run_command", + "device_id": "air_handler_2", + "setpoint_name": "supervisor_run_command", + "setpoint_type": "DISCRETE", + "normalized_value": 1.0, + "native_value": 1.0, + "action_value": 1.0, + }, +] + + +# +# FACTORIES +# + + +def create_building( + layout=None, + initial_values=None, + start_timestamp=None, + zone_reward_configs=None +): + """Building implementation for unit tests.""" + layout = layout or LAYOUT + initial_values = initial_values or {"outside_air_temperature_sensor": 295.0} + return environment_test_utils.SimpleBuilding( + layout=layout, + initial_values=initial_values, + start_timestamp=start_timestamp, + zone_reward_configs=zone_reward_configs, + ) + + +def create_observation_normalizer( + mapping=None, +) -> StandardScoreObservationNormalizer: + """Creates an observation normalizer to use for testing purposes. + + Args: + mapping: A dictionary of continuous variable mappings. The keys are the + normalizer identifiers, and the values are a dictionaries of statistics. + + Returns: + A StandardScoreObservationNormalizer instance. + """ + mapping = mapping or OBSERVATION_NORMALIZERS + mapping = {k: ContinuousVariableInfo(**v) for k, v in mapping.items()} + return StandardScoreObservationNormalizer(mapping) + + +def create_action_config(mapping=None): + """Creates a bounded action config to use for testing purposes. + + Args: + mapping: A dictionary of action mappings, for creating action normalizers. + The keys are the action names, and the values are dictionaries of minimum + and maximum native values. + + Returns: + An ActionConfig instance. + """ + mapping = mapping or ACTION_NORMALIZERS + normalizers = {k: BoundedActionNormalizer(**v) for k, v in mapping.items()} + return environment.ActionConfig(normalizers) + + +def create_hybrid_action_config(mapping=None): + mapping = mapping or HYBRID_ACTION_NORMALIZERS + return create_action_config(mapping) + + +def create_environment( + layout=None, + start_timestamp=None, + device_action_tuples=None, + observation_normalizers=None, + action_normalizers=None, + metrics_path=None, + writer_factory=None, + default_actions=None, + building=None, + num_days_in_episode=3, + zone_reward_configs=None, +): + """Creates an environment to use for testing purposes.""" + + building = building or create_building( + layout=layout, + start_timestamp=start_timestamp, + zone_reward_configs=zone_reward_configs, + ) + reward_function = environment_test_utils.SimpleRewardFunction() + obs_normalizer = create_observation_normalizer(observation_normalizers) + action_config = create_action_config(action_normalizers) + device_action_tuples = device_action_tuples or DEVICE_ACTION_TUPLES + env = environment.Environment( + building=building, + reward_function=reward_function, + observation_normalizer=obs_normalizer, + action_config=action_config, + device_action_tuples=device_action_tuples, + metrics_path=metrics_path, + writer_factory=writer_factory, + default_actions=default_actions, + num_days_in_episode=num_days_in_episode, + ) + env.reset() + return env + + +def create_hybrid_action_environment( + layout=None, + start_timestamp=None, + device_action_tuples=None, + observation_normalizers=None, + action_normalizers=None, + metrics_path=None, + writer_factory=None, + default_actions=None, + building=None, + num_days_in_episode=3, + zone_reward_configs=None, +): + """Creates an environment to use for testing purposes.""" + + building = building or create_building( + layout=layout, + start_timestamp=start_timestamp, + zone_reward_configs=zone_reward_configs, + ) + reward_function = environment_test_utils.SimpleRewardFunction() + obs_normalizer = create_observation_normalizer(observation_normalizers) + action_config = create_hybrid_action_config(action_normalizers) + device_action_tuples = device_action_tuples or HYBRID_DEVICE_ACTION_TUPLES + env = hybrid_action_environment.HybridActionEnvironment( + building=building, + reward_function=reward_function, + observation_normalizer=obs_normalizer, + action_config=action_config, + device_action_tuples=device_action_tuples, + metrics_path=metrics_path, + writer_factory=writer_factory, + default_actions=default_actions, + num_days_in_episode=num_days_in_episode, + ) + env.reset() + return env + + +def create_observation_spec(n_observations: int) -> array_spec.ArraySpec: + return array_spec.ArraySpec( + shape=(n_observations,), + dtype=np.float32, + name="observation" + ) + + +def create_action_spec(n_continuous: int) -> array_spec.BoundedArraySpec: + return array_spec.BoundedArraySpec( + shape=(n_continuous,), + dtype=np.float32, + minimum=-1, + maximum=1, + name="action", + ) + + +def create_hybrid_action_spec( + n_discrete: int, n_continuous: int +) -> dict[str, array_spec.BoundedArraySpec]: + return { + "discrete_action": array_spec.BoundedArraySpec( + (n_discrete,), + np.int32, + minimum=0, + maximum=1, + name="discrete_action", + ), + "continuous_action": array_spec.BoundedArraySpec( + (n_continuous,), + np.float32, + minimum=-1, + maximum=1, + name="continuous_action" + ), + } diff --git a/smart_control/environment/environment.py b/smart_control/environment/environment.py index 4a1a4ba4..ba0caf18 100644 --- a/smart_control/environment/environment.py +++ b/smart_control/environment/environment.py @@ -6,9 +6,11 @@ import collections import copy +import dataclasses +import functools import os import time -from typing import Final, Mapping, NewType, Optional, Sequence, Tuple +from typing import Any, Final, NewType, Optional, Tuple from absl import logging import bidict @@ -21,56 +23,100 @@ from tf_agents.trajectories import time_step as ts from tf_agents.typing import types -from smart_control.models import base_building -from smart_control.models import base_normalizer -from smart_control.models import base_reward_function -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.utils import building_image_generator -from smart_control.utils import constants -from smart_control.utils import conversion_utils -from smart_control.utils import histogram_reducer -from smart_control.utils import plot_utils -from smart_control.utils import regression_building_utils -from smart_control.utils import run_command_predictor -from smart_control.utils import writer_lib - -ACTION_REJECTION_REWARD: Final[float] = -np.inf - -DeviceInfo = smart_control_building_pb2.DeviceInfo -ValueType = smart_control_building_pb2.DeviceInfo.ValueType +# pylint: disable=g-bad-import-order we prefer local imports below packages +from smart_buildings.smart_control.models import base_building +from smart_buildings.smart_control.models import base_normalizer +from smart_buildings.smart_control.models import base_reward_function +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import building_image_generator +from smart_buildings.smart_control.utils import constants +from smart_buildings.smart_control.utils import conversion_utils +from smart_buildings.smart_control.utils import histogram_reducer +from smart_buildings.smart_control.utils import plot_utils +from smart_buildings.smart_control.utils import regression_building_utils +from smart_buildings.smart_control.utils import run_command_predictor +from smart_buildings.smart_control.utils import writer_lib +from smart_buildings.smart_control.utils.proto_parsers import reward_info_parser + +Mapping = collections.abc.Mapping +Sequence = collections.abc.Sequence ActionRequest = smart_control_building_pb2.ActionRequest ActionResponse = smart_control_building_pb2.ActionResponse +DeviceInfo = smart_control_building_pb2.DeviceInfo +DeviceType = smart_control_building_pb2.DeviceInfo.DeviceType ObservationRequest = smart_control_building_pb2.ObservationRequest ObservationResponse = smart_control_building_pb2.ObservationResponse +RewardInfo = smart_control_reward_pb2.RewardInfo +RewardResponse = smart_control_reward_pb2.RewardResponse SingleActionRequest = smart_control_building_pb2.SingleActionRequest SingleActionResponse = smart_control_building_pb2.SingleActionResponse SingleObservationResponse = smart_control_building_pb2.SingleObservationResponse +ValueType = smart_control_building_pb2.DeviceInfo.ValueType + -DeviceFieldId = NewType("DeviceFieldId", str) DeviceId = NewType("DeviceId", str) -FieldName = NewType("FieldName", str) +DeviceFieldId = NewType("DeviceFieldId", str) # i.e. the Action Name +FieldName = NewType("FieldName", str) # i.e. the Setpoint Name +DeviceCode = str +MeasurementName = str +Setpoint = str + +ActionNormalizerMap = Mapping[FieldName, base_normalizer.BaseActionNormalizer] +DefaultActions = Mapping[DeviceFieldId | FieldName, float] +DeviceActionTuple = Tuple[DeviceCode, Setpoint] +DeviceMeasurementTuple = Tuple[DeviceCode, MeasurementName] +NativeActionValues = Sequence[float] +NormalizedActionValues = Sequence[float] +ACTION_REJECTION_REWARD: Final[float] = -np.inf COMFORT_MODE_NOW: Final[str] = "comfort_mode_now" COMFORT_MODE_SOON: Final[str] = "comfort_mode_soon" NUM_OCCUPANTS: Final[str] = "num_occupants" DOW_LABEL: Final[str] = "dow" HOD_LABEL: Final[str] = "hod" -DeviceFieldId = NewType("DeviceFieldId", str) -FieldName = NewType("FieldName", str) -ActionNormalizerMap = Mapping[ - DeviceFieldId, base_normalizer.BaseActionNormalizer -] +DISCRETE_ACTION: Final[str] = "discrete_action" +CONTINUOUS_ACTION: Final[str] = "continuous_action" +DISCRETE_ACTION_COMMAND: Final[str] = "supervisor_run_command" -DefaultActions = Mapping[DeviceFieldId, float] +ACTION_TYPE_LABELS_MAP: Final[Mapping[str, str]] = { + DISCRETE_ACTION: "DISCRETE", + CONTINUOUS_ACTION: "CONTINUOUS", +} # Labels, for display purposes. + + +def is_discrete_setpoint(setpoint_name: str) -> bool: + """Checks if a setpoint name corresponds with a discrete action.""" + return DISCRETE_ACTION_COMMAND in setpoint_name + + +def get_setpoint_type(setpoint_name: str) -> str: + """Returns the type of the setpoint.""" + if is_discrete_setpoint(setpoint_name): + return DISCRETE_ACTION + return CONTINUOUS_ACTION + + +def get_setpoint_type_label(setpoint_name: str) -> str: + """Returns the type of the setpoint, as a label, for display purposes.""" + return ACTION_TYPE_LABELS_MAP[get_setpoint_type(setpoint_name)] -DeviceCode = str -Setpoint = str -MeasurementName = str -DeviceActionTuple = Tuple[DeviceCode, Setpoint] -DeviceMeasurementTuple = Tuple[DeviceCode, MeasurementName] + +def get_setpoint_units(setpoint_name: str) -> str: + """Returns the units for the given setpoint name, for display purposes.""" + # TODO(mjrossetti): formalize unit specification for each setpoint. + if is_discrete_setpoint(setpoint_name): + return "On/Off" + elif ( + "temperature" in setpoint_name + or "supply_water_setpoint" in setpoint_name + ): + return "Kelvin" + elif "pressure" in setpoint_name: + return "Pascal" + return "N/A" def all_actions_accepted(action_response: ActionResponse) -> bool: @@ -289,6 +335,74 @@ def get_action_normalizer( return self.action_normalizers.get(DeviceFieldId(setpoint_name)) +@dataclasses.dataclass(frozen=True) +class SetpointRecord: + """Represents a flattened record for an action field, for display purposes. + + Attributes: + device_id: Unique identifier for the device. + device_type: Type of the device. + zone_id: Zone identifier. + setpoint_type: Type of the setpoint (e.g., 'CONTINUOUS', 'DISCRETE'). + action_name: Unique identifier for the action. + setpoint_name: Name of the setpoint. + value_type: Value type of the setpoint. + units: Units of the setpoint. + min_native_value: Minimum value in native units. + max_native_value: Maximum value in native units. + min_normalized_value: Minimum value in normalized units. + max_normalized_value: Maximum value in normalized units. + """ + device_id: str + device_type: str + zone_id: str + setpoint_type: str + action_name: str + setpoint_name: str + value_type: str + units: str + min_native_value: float + max_native_value: float + min_normalized_value: float + max_normalized_value: float + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ActionRecord: + """An action for a specific setpoint, for display purposes. + + Provides a mapping between normalized and native values. + + Attributes: + idx: Index of the action, corresponding with the order of the action names. + action_name: Unique identifier for the action. Includes the device id and + setpoint name. + device_id: Unique identifier for the device. + setpoint_name: Name of the setpoint. + setpoint_type: Type of the setpoint (either 'CONTINUOUS' or 'DISCRETE'). + normalized_value: The value expressed in the normalized setpoint range. + native_value: The value expressed in the native setpoint units. + action_value: The value used to step the environment. + """ + + idx: int + action_name: str + device_id: DeviceId + setpoint_name: FieldName + setpoint_type: str + normalized_value: float + native_value: float + action_value: float + + def __post_init__(self) -> None: + labels = ACTION_TYPE_LABELS_MAP.values() + if self.setpoint_type not in labels: + raise ValueError( + f"Invalid setpoint_type: {self.setpoint_type}. " + f"Setpoint type must be one of {labels}." + ) + + def generate_field_id( device: DeviceId, field: FieldName, id_map: bidict.bidict ) -> DeviceFieldId: @@ -301,14 +415,14 @@ def generate_field_id( If a unique device/field generates the same id as a different device/field, the id will be concatenated with an integer if the id already exists. - Examples: - >>> generate_field_id(device='a_b', field='c') -> a_b_c - >>> generate_field_id(device='a_b', field='c') -> a_b_c - >>> generate_field_id(device='a', field='b_c') -> a_b_c_1 + Examples for clarity: + generate_field_id(device='a_b', field='c') -> a_b_c + generate_field_id(device='a_b', field='c') -> a_b_c + generate_field_id(device='a', field='b_c') -> a_b_c_1 - The first id is `a_b_c`. The second call is an exact duplicate of the first, - so the same id is returned. When the third call is made, because `a_b_c` is - already taken, an int is concatenated and the returned id is `a_b_c_1`. + The first id is a_b_c. The second call is an exact duplicate of the first, + so the same id is returned. When the third call is made, because a_b_c is + already taken, an int is concatenated and the returned id is a_b_c_1. Args: device: Device id. @@ -410,8 +524,9 @@ def __init__( ) self._start_timestamp: pd.Timestamp = self.building.current_timestamp self._action_history = [] + self.num_days_in_episode = num_days_in_episode self._end_timestamp: pd.Timestamp = self._start_timestamp + pd.Timedelta( - num_days_in_episode, unit="days" + self.num_days_in_episode, unit="days" ) self._step_interval = step_interval self._num_timesteps_in_episode = int( @@ -442,9 +557,7 @@ def __init__( # Retain the last observation to fill in missing or invalid values. self._last_observation_response: Optional[ObservationResponse] = None - if self.discount_factor <= 0 or self.discount_factor > 1: - raise ValueError("Discount factor must be in (0,1]") - + self.action_normalizers = action_config.action_normalizers if device_action_tuples is not None: self._action_spec, self.action_normalizers, self._action_names = ( self._get_action_spec_and_normalizers_from_device_action_tuples( @@ -500,12 +613,42 @@ def set_summary_writer(self, summary_path: str) -> None: summary_path, flush_millis=10000 ) + @property + def id_map(self) -> bidict.bidict: + return self._id_map + + @property + def action_names(self) -> Sequence[str]: + return self._action_names + + @property + def time_zone(self) -> str: + return self._time_zone + + @property + def observation_normalizer(self) -> base_normalizer.BaseObservationNormalizer: + return self._observation_normalizer + + @property + def step_count(self) -> int: + return self._step_count + @property def steps_per_episode(self) -> int: return ( self._end_timestamp - self._start_timestamp ).total_seconds() // self.building.time_step_sec + @property + def time_step_sec(self) -> float: + """Returns the time step interval in seconds.""" + return self.building.time_step_sec + + @property + def time_step_mins(self) -> int: + """Returns the time step interval in minutes (floored).""" + return int(self.time_step_sec // 60) # floor division + @property def start_timestamp(self) -> pd.Timestamp: return self._start_timestamp @@ -522,6 +665,219 @@ def end_timestamp(self, value: pd.Timestamp): def default_policy_values(self): return self._default_policy_values + @property + def label(self) -> str: + return self._label + + @property + def metrics_writer(self) -> writer_lib.BaseWriter | None: + return self._metrics_writer + + @property + def metrics_output_dir(self) -> writer_lib.PathLocation | None: + writer = self.metrics_writer + if writer is not None: + return writer.output_dir + else: + return None + + @property + def json_metadata(self) -> dict[str, Any]: + """Info to write into a JSON file. Needs to be serializable.""" + # Occupancy is only relevant in simulation (not for the real building): + if hasattr(self.building, "occupancy"): + occupancy_metadata = self.building.occupancy.json_metadata + else: + occupancy_metadata = None + + return { + "type": self.__class__.__name__, + "time_step_sec": self.time_step_sec, + "start_timestamp": str(self.start_timestamp), + "end_timestamp": str(self.end_timestamp), + "metrics_output_dir": self.metrics_output_dir, + "action_names": self.action_names, + "default_action_values": self.default_action_values, + "reward_function": self.reward_function.json_metadata, + "building": self.building.json_metadata, + "occupancy": occupancy_metadata, + } + + @functools.cached_property + def action_fields_map(self) -> dict[str, dict[str, Any]]: + mapping = {} + for device in self.building.devices: + for setpoint_name, value_type in device.action_fields.items(): + + normalizer = self.action_normalizers.get(setpoint_name) + if normalizer: + if device.device_id not in mapping: + mapping[device.device_id] = { + "device_id": device.device_id, + "device_type": DeviceType.Name(device.device_type), + "zone_id": device.zone_id, + "setpoints": [], + } + + mapping[device.device_id]["setpoints"].append({ + "action_name": self._id_map.get( + (device.device_id, setpoint_name) + ), + "setpoint_name": setpoint_name, + "value_type": ValueType.Name(value_type), + "units": get_setpoint_units(setpoint_name), + "min_native_value": normalizer.setpoint_min, + "max_native_value": normalizer.setpoint_max, + # The BaseActionNormalizer does not have min/max normalized values + # but the BoundedActionNormalizer does. Get them if available. + "min_normalized_value": getattr( + normalizer, "min_normalized_value", None + ), + "max_normalized_value": getattr( + normalizer, "max_normalized_value", None + ), + }) + + return mapping + + @functools.cached_property + def action_fields_flattened(self) -> Tuple[SetpointRecord, ...]: + """A tuple of immutable SetpointRecord dataclasses, for display purposes.""" + records = [] + for device_id, device_info in self.action_fields_map.items(): + for setpoint_info in device_info["setpoints"]: + setpoint_name = setpoint_info["setpoint_name"] + records.append( + SetpointRecord( + device_id=device_id, + device_type=device_info["device_type"], + zone_id=device_info["zone_id"], + setpoint_type=get_setpoint_type_label(setpoint_name), + action_name=setpoint_info["action_name"], + setpoint_name=setpoint_info["setpoint_name"], + value_type=setpoint_info["value_type"], + units=setpoint_info["units"], + min_native_value=setpoint_info["min_native_value"], + max_native_value=setpoint_info["max_native_value"], + min_normalized_value=setpoint_info["min_normalized_value"], + max_normalized_value=setpoint_info["max_normalized_value"], + ) + ) + return tuple(records) + + @functools.cached_property + def action_fields_df(self) -> pd.DataFrame: + """A DataFrame of setpoint records, for display purposes.""" + return pd.DataFrame(self.action_fields_flattened) + + @property + def default_action_values(self) -> NormalizedActionValues: + """The default action used to step the environment.""" + return self.default_policy_values.numpy().tolist() + + def get_action_records_from_normalized_values( + self, normalized_values: NormalizedActionValues, + ) -> Sequence[ActionRecord]: + """Converts normalized action values into action records. + + Args: + normalized_values: A list of normalized action values, assumed to be in + the same order as the action_names. + + Returns: + A list of action records. + """ + if len(normalized_values) != len(self.action_names): + raise ValueError( + f"Number of normalized values ({len(normalized_values)}) does not" + f" match number of action names ({len(self.action_names)})." + ) + + records = [] + for i, (action_name, normalized_value) in enumerate( + zip(self.action_names, normalized_values) + ): + device_id, setpoint_name = self.id_map.inv[action_name] + normalizer = self.action_normalizers.get(setpoint_name) + if normalizer is None: + raise ValueError(f"No normalizer found for setpoint: {setpoint_name}") + + native_value = normalizer.setpoint_value(np.array(normalized_value)) + + records.append( + ActionRecord( + idx=i, + action_name=action_name, + device_id=device_id, + setpoint_name=setpoint_name, + setpoint_type=get_setpoint_type_label(setpoint_name), + normalized_value=normalized_value, + native_value=native_value, + action_value=normalized_value, + ) + ) + return records + + def get_action_df_from_normalized_values( + self, normalized_values: NormalizedActionValues + ) -> pd.DataFrame: + """Returns a DataFrame of action records from normalized values.""" + return pd.DataFrame( + self.get_action_records_from_normalized_values(normalized_values) + ) + + def get_action_records_from_native_values( + self, native_values: NativeActionValues + ) -> Sequence[ActionRecord]: + """Converts native action values into action records. + + Args: + native_values: A list of native action values, assumed to be in the same + order as the action_names. + + Returns: + A list of action records. + """ + if len(native_values) != len(self.action_names): + raise ValueError( + f"Number of native values ({len(native_values)}) does not" + f" match number of action names ({len(self.action_names)})." + ) + + records = [] + for i, (action_name, native_value) in enumerate( + zip(self.action_names, native_values) + ): + device_id, setpoint_name = self.id_map.inv[action_name] + + normalizer = self.action_normalizers.get(setpoint_name) + if normalizer is None: + raise ValueError(f"No normalizer found for setpoint: {setpoint_name}") + + normalized_value = normalizer.agent_value(native_value) + + records.append( + ActionRecord( + idx=i, + action_name=action_name, + device_id=device_id, + setpoint_name=setpoint_name, + setpoint_type=get_setpoint_type_label(setpoint_name), + normalized_value=normalized_value, + native_value=native_value, + action_value=normalized_value, + ) + ) + return records + + def get_action_df_from_native_values( + self, native_values: NativeActionValues + ) -> pd.DataFrame: + """Returns a DataFrame of action records from native values.""" + return pd.DataFrame( + self.get_action_records_from_native_values(native_values) + ) + def _get_observation_request( self, devices: Sequence[DeviceInfo] ) -> ObservationRequest: @@ -559,13 +915,23 @@ def _normalize_default_actions(self, default_actions: DefaultActions): fixed_actions = [] for field_id in self._action_names: - # assert action_name in default_actions + _, setpoint_name = self.id_map.inv[field_id] - _, setpoint_name = self._id_map.inv[field_id] - native_setpoint_value = default_actions[setpoint_name] - normalized_agent_value = self.action_normalizers[field_id].agent_value( - native_setpoint_value + native_setpoint_value = default_actions.get( + field_id, + default_actions.get(setpoint_name) ) + if native_setpoint_value is None: + raise ValueError( + f"Missing default action for action: {field_id} (setpoint:" + f" {setpoint_name!r})" + ) + + normalizer = self.action_normalizers.get(setpoint_name) + if normalizer is None: + raise ValueError(f"No normalizer found for setpoint: {setpoint_name!r}") + + normalized_agent_value = normalizer.agent_value(native_setpoint_value) fixed_actions.append(normalized_agent_value) return tf.constant(fixed_actions) @@ -610,7 +976,7 @@ def _check_value_type_continuous(value: ValueType) -> None: setpoint_name = FieldName(setpoint_name) # Get BaseActionNormalizer based on device and setpoint_name - action_normalizer = action_config.get_action_normalizer(setpoint_name) + action_normalizer = self.action_normalizers.get(setpoint_name) # Do not add to action_spec without an action_normalizer. if not action_normalizer: @@ -624,7 +990,7 @@ def _check_value_type_continuous(value: ValueType) -> None: field_array_spec = action_normalizer.get_array_spec(field_id) action_spec[field_id] = field_array_spec - action_normalizers[field_id] = action_normalizer + action_normalizers[setpoint_name] = action_normalizer action_spec = array_spec.BoundedArraySpec( shape=(len(action_names),), @@ -659,7 +1025,7 @@ def _get_action_spec_and_normalizers_from_device_action_tuples( setpoint_name = FieldName(device_action_tuple[1]) # Get BaseActionNormalizer based on device and setpoint_name - action_normalizer = action_config.get_action_normalizer(setpoint_name) + action_normalizer = self.action_normalizers.get(setpoint_name) # Do not add to action_spec without an action_normalizer. # TODO(sipple) Include a unit test. @@ -672,7 +1038,7 @@ def _get_action_spec_and_normalizers_from_device_action_tuples( field_array_spec = action_normalizer.get_array_spec(field_id) action_spec[field_id] = field_array_spec - action_normalizers[field_id] = action_normalizer + action_normalizers[setpoint_name] = action_normalizer action_spec = array_spec.BoundedArraySpec( shape=(len(action_names),), @@ -713,13 +1079,9 @@ def _get_observation_spec( def _get_observation_spec_histogram_reducer( self, devices: Sequence[DeviceInfo] ) -> tuple[types.ArraySpec, Sequence[str]]: - """Returns an observation spec and a list of field names as histogram""" + """Returns an observation spec and a list of field names as histogram.""" - if self._observation_histogram_reducer is None: - raise ValueError( - "Observation histogram reducer must be configured before building " - "histogram spec." - ) + assert self._observation_histogram_reducer is not None observable_fields = [] @@ -799,9 +1161,23 @@ def _get_observation_spec_single_timeseries( return obs_spec, observable_fields @property - def current_simulation_timestamp(self): + def current_simulation_timestamp(self) -> pd.Timestamp: + """Returns the current simulation time. + + NOTE: It is possible for this to be timezone naive, or in UTC. + """ return self.building.current_timestamp + @property + def current_local_timestamp(self) -> pd.Timestamp: + """Returns the current local time in the building's time zone.""" + if self.current_simulation_timestamp.tz is None: + # just apply the local time zone (and don't adjust the time): + return self.current_simulation_timestamp.tz_localize(self.time_zone) + else: + # convert to the local time zone (and adjust the time), as necessary: + return self.current_simulation_timestamp.tz_convert(self.time_zone) + def _get_action_value_type(self, field_id) -> ValueType: if field_id in self._action_names: spec = self.action_spec()[field_id] @@ -838,7 +1214,7 @@ def _create_action_request(self, action_array) -> ActionRequest: agent_action = action[field_id] - action_normalizer = self.action_normalizers[field_id] + action_normalizer = self.action_normalizers[setpoint_name] action_value = action_normalizer.setpoint_value(agent_action) @@ -852,7 +1228,14 @@ def _create_action_request(self, action_array) -> ActionRequest: return action_request - def _get_observation(self) -> np.ndarray: + def _get_observation_response(self) -> ObservationResponse: + """Gets the observation response from the building. + + Ensures that metrics are written as applicable. + + Returns: + The observation response from the building. + """ timestamp = conversion_utils.pandas_to_proto_timestamp( self.building.current_timestamp ) @@ -882,6 +1265,14 @@ def _get_observation(self) -> np.ndarray: building_image, self.current_simulation_timestamp ) + return observation_response + + def get_observation_response(self) -> ObservationResponse: + return self._get_observation_response() + + def _get_observation(self) -> np.ndarray: + observation_response = self._get_observation_response() + normalized_observation_response = self._observation_normalizer.normalize( observation_response ) @@ -1023,11 +1414,7 @@ def _normalized_observation_response_to_observation_map_histogram_reducer( Dict of (device, field): measurement """ - if self._observation_histogram_reducer is None: - raise ValueError( - "Observation histogram reducer must be set before reducing " - "observation response." - ) + assert self._observation_histogram_reducer is not None feature_tuples = regression_building_utils.get_feature_tuples( normalized_observation_response @@ -1052,10 +1439,14 @@ def _normalized_observation_response_to_observation_map_histogram_reducer( } return observation_map - def _get_reward(self) -> float: - """Computes the immediate reward for the last action taken by the agent.""" + def get_reward_info_and_response(self) -> Tuple[RewardInfo, RewardResponse]: + """Gets reward info and reward response. + + Ensures metrics are written for both, if you get either. - # Get the reward input (RewardInfo) from the building. + Returns: + A tuple of (RewardInfo, RewardResponse). + """ reward_info = self.building.reward_info # Using the reward function, compute the reward value. reward_response = self.reward_function.compute_reward(reward_info) @@ -1076,18 +1467,34 @@ def _get_reward(self) -> float: self._write_summary_reward_response_metrics(reward_response) self._commit_reward_metrics() + return reward_info, reward_response + + def get_reward_info(self) -> RewardInfo: + """Returns reward info for the last action taken by the agent.""" + reward_info, _ = self.get_reward_info_and_response() + return reward_info + + def _get_reward(self) -> float: + """Returns the reward response's agent reward value.""" + _, reward_response = self.get_reward_info_and_response() return reward_response.agent_reward_value + def get_reward(self) -> float: + return self._get_reward() + def _write_summary_reward_info_metrics( self, reward_info: smart_control_reward_pb2.RewardInfo ) -> None: """Writes reward input metrics into the TensorBoard logs.""" - energy_use = conversion_utils.get_reward_info_energy_use(reward_info) + parser = reward_info_parser.RewardInfoParser(reward_info) + energy_use = parser.get_energy_consumption() self._accumulator["electrical_energy"].append( - energy_use["air_handler_blower_electricity"] - + energy_use["air_handler_air_conditioning"] + energy_use["air_handler_blower_electrical_energy"] + + energy_use["air_handler_air_conditioning_electrical_energy"] + energy_use["boiler_pump_electrical_energy"] + + energy_use["heat_pump_electricity_heating_energy"] + + energy_use["heat_pump_pump_electrical_energy"] ) self._accumulator["natural_gas_energy"].append( energy_use["boiler_natural_gas_heating_energy"] @@ -1123,10 +1530,7 @@ def _write_summary_reward_response_metrics( def _commit_reward_metrics(self) -> None: """Aggregates and writes reward metrics, and resets accumulator.""" - if self._summary_writer is None: - raise ValueError( - "Summary writer must be initialized before committing reward metrics." - ) + assert self._summary_writer is not None if self._global_step_count % self._metrics_reporting_interval == 0: with ( # pylint: disable=not-context-manager # TODO: consider adding comments to provide more context @@ -1143,10 +1547,6 @@ def _commit_reward_metrics(self) -> None: self._accumulator = collections.defaultdict(list) - @property - def label(self) -> str: - return self._label - def _reset(self) -> ts.TimeStep: self.building.reset() diff --git a/smart_control/environment/environment_test.py b/smart_control/environment/environment_test.py index 614ed0ec..243d35c6 100644 --- a/smart_control/environment/environment_test.py +++ b/smart_control/environment/environment_test.py @@ -1,5 +1,3 @@ -"""Tests for environment.""" - from unittest import mock from absl.testing import absltest @@ -12,21 +10,23 @@ from tf_agents.specs import array_spec from tf_agents.trajectories import time_step as ts -from smart_control.environment import environment -from smart_control.environment import environment_test_utils -from smart_control.models import base_building -from smart_control.models import base_reward_function -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_normalization_pb2 -from smart_control.utils import bounded_action_normalizer -from smart_control.utils import conversion_utils -from smart_control.utils import histogram_reducer -from smart_control.utils import observation_normalizer -from smart_control.utils import test_utils +# pylint: disable=g-bad-import-order we prefer local imports below packages +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import environment_test_utils +from smart_buildings.smart_control.models import base_building +from smart_buildings.smart_control.models import base_reward_function +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.utils import bounded_action_normalizer +from smart_buildings.smart_control.utils import conversion_utils +from smart_buildings.smart_control.utils import histogram_reducer +from smart_buildings.smart_control.utils import observation_normalizer +from smart_buildings.smart_control.utils import reader_lib as base_reader +from smart_buildings.smart_control.utils import test_utils def _get_histogram_reducer(): - reader = mock.create_autospec(test_utils.BaseReader, instance=True) + reader = mock.create_autospec(base_reader.BaseReader, instance=True) reader.read_action_responses.return_value = [ test_utils.get_test_action_response( pd.Timestamp("2022-03-13 00:00:00"), @@ -49,6 +49,47 @@ def _get_histogram_reducer(): ) +class SetpointLabelsTest(parameterized.TestCase): + + @parameterized.parameters( + ("supervisor_run_command", True), + ("ahu_1_supervisor_run_command", True), + ("setpoint_1", False), + ) + def test_is_discrete_setpoint(self, setpoint_name, expected): + self.assertEqual(environment.is_discrete_setpoint(setpoint_name), expected) + + @parameterized.parameters( + ("supervisor_run_command", environment.DISCRETE_ACTION), + ("ahu_1_supervisor_run_command", environment.DISCRETE_ACTION), + ("setpoint_1", environment.CONTINUOUS_ACTION), + ) + def test_get_setpoint_type(self, setpoint_name, expected): + self.assertEqual(environment.get_setpoint_type(setpoint_name), expected) + + @parameterized.parameters( + ("supervisor_run_command", "DISCRETE"), + ("ahu_1_supervisor_run_command", "DISCRETE"), + ("temperature_setpoint", "CONTINUOUS"), + ("pressure_setpoint", "CONTINUOUS"), + ) + def test_get_setpoint_type_label(self, setpoint_name, expected_label): + label = environment.get_setpoint_type_label(setpoint_name) + self.assertEqual(label, expected_label) + + @parameterized.parameters( + ("supervisor_run_command", "On/Off"), + ("ahu_1_supervisor_run_command", "On/Off"), + ("supply_water_temperature_setpoint", "Kelvin"), + ("pressure_setpoint", "Pascal"), + ("other_setpoint", "N/A"), + ) + def test_get_setpoint_units(self, setpoint_name, expected_units): + self.assertEqual( + environment.get_setpoint_units(setpoint_name), expected_units + ) + + class EnvironmentTest(parameterized.TestCase, tf.test.TestCase): @parameterized.parameters( @@ -66,13 +107,13 @@ class EnvironmentTest(parameterized.TestCase, tf.test.TestCase): 2.236067, ), ) - def test_comput_actions_regularization_cost_valid( + def test_compute_actions_regularization_cost_valid( self, action_history, expected ): cost = environment.compute_action_regularization_cost(action_history) self.assertAlmostEqual(expected, cost, places=3) - def test_comput_actions_regularization_cost_invalid(self): + def test_compute_actions_regularization_cost_invalid(self): action_history = [np.array([1, 0]), np.array([1, 0, 1])] with self.assertRaises(ValueError): _ = environment.compute_action_regularization_cost(action_history) @@ -866,5 +907,118 @@ def _get_test_observation_response( ) +class DefaultActionsTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.building = environment_test_utils.SimpleBuilding() + self.reward_function = environment_test_utils.SimpleRewardFunction() + self.observation_normalizer = observation_normalizer.StandardScoreObservationNormalizer( # pylint: disable=line-too-long + { + "temperature": ( + smart_control_normalization_pb2.ContinuousVariableInfo( + id="temperature", + sample_mean=310.0, + sample_variance=2500.0, + ) + ) + } + ) + normalizer = bounded_action_normalizer.BoundedActionNormalizer(200, 300) + self.action_config = environment.ActionConfig({ + "setpoint_1": normalizer, + "setpoint_2": normalizer, + }) + + @parameterized.named_parameters( + dict( + testcase_name="action_names_only", + default_actions={ + "air_handler_1_setpoint_1": 250.0, + "air_handler_2_setpoint_1": 260.0, + "air_handler_1_setpoint_2": 250.0, + "air_handler_2_setpoint_2": 250.0, + }, + expected_action_values=[0.0, 0.2, 0.0, 0.0], + ), + dict( + testcase_name="setpoint_names_only", + default_actions={ + "setpoint_1": 250.0, + "setpoint_2": 250.0, + }, + expected_action_values=[0.0, 0.0, 0.0, 0.0], + ), + dict( + testcase_name="mixed_names", + default_actions={ + "air_handler_1_setpoint_1": 250.0, + "air_handler_2_setpoint_1": 260.0, + "setpoint_2": 250.0, + }, + expected_action_values=[0.0, 0.2, 0.0, 0.0], + ), + ) + def test_default_actions( + self, default_actions, expected_action_values + ): + env = environment.Environment( + building=self.building, + reward_function=self.reward_function, + observation_normalizer=self.observation_normalizer, + action_config=self.action_config, + device_action_tuples=[ + ("air_handler_1", "setpoint_1"), + ("air_handler_2", "setpoint_1"), + ("air_handler_1", "setpoint_2"), + ("air_handler_2", "setpoint_2"), + ], + default_actions=default_actions, + ) + self.assertSequenceAlmostEqual( + env.default_action_values, expected_action_values, delta=0.001 + ) + + def test_normalize_default_actions_missing_normalizer_raises(self): + env = environment.Environment( + building=self.building, + reward_function=self.reward_function, + observation_normalizer=self.observation_normalizer, + action_config=self.action_config, + ) + # Clear out normalizers to simulate a missing entry + env.action_normalizers.clear() + env._action_names = ["example_field"] + env.id_map[("example_device", "example_setpoint")] = "example_field" + + with self.assertRaisesRegex( + ValueError, "No normalizer found for setpoint: .*example_setpoint.*" + ): + env._normalize_default_actions({"example_field": 250.0}) + + def test_normalize_default_actions_with_empty_dict_raises(self): + env = environment.Environment( + building=self.building, + reward_function=self.reward_function, + observation_normalizer=self.observation_normalizer, + action_config=self.action_config, + ) + env._action_names = ["example_field"] + env.id_map[("example_device", "example_setpoint")] = "example_field" + with self.assertRaisesRegex( + ValueError, "Missing default action for action: .*example_field.*" + ): + env._normalize_default_actions({}) + + def test_environment_init_without_default_actions_sets_empty_tensor(self): + env = environment.Environment( + building=self.building, + reward_function=self.reward_function, + observation_normalizer=self.observation_normalizer, + action_config=self.action_config, + ) + self.assertEqual(env.default_policy_values.numpy().tolist(), []) + + if __name__ == "__main__": absltest.main() diff --git a/smart_control/environment/environment_test_utils.py b/smart_control/environment/environment_test_utils.py index ff64178a..e1289942 100644 --- a/smart_control/environment/environment_test_utils.py +++ b/smart_control/environment/environment_test_utils.py @@ -1,46 +1,133 @@ """Shared test utiltiles for environment tests.""" import collections -from typing import Sequence +from collections.abc import Mapping, Sequence import pandas as pd +from smart_buildings.smart_control.models import base_building +from smart_buildings.smart_control.models import base_reward_function +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import conversion_utils -from smart_control.models import base_building -from smart_control.models import base_reward_function -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.utils import conversion_utils +# +# BUILDING +# + +DEFAULT_LAYOUT = { + "zone_1": { + "boiler_1": ["setpoint_1", "measurement_1"], + "vav_2": [ + "setpoint_2", + "setpoint_3", + "setpoint_4", + "measurement_2", + ], + }, + "zone_2": { + "boiler_3": ["measurement_3", "measurement_4"], + "vav_4": ["setpoint_5", "measurement_5"], + "air_handler_5": ["setpoint_6"], + }, +} class SimpleBuilding(base_building.BaseBuilding): """Building implementation for unit tests.""" - def __init__(self): - self.layout = { - "zone_1": { - "boiler_1": ["setpoint_1", "measurement_1"], - "vav_2": [ - "setpoint_2", - "setpoint_3", - "setpoint_4", - "measurement_2", - ], - }, - "zone_2": { - "boiler_3": ["measurement_3", "measurement_4"], - "vav_4": ["setpoint_5", "measurement_5"], - "air_handler_5": ["setpoint_6"], - }, - } + def __init__( + self, + layout: Mapping[str, Mapping[str, Sequence[str]]] | None = None, + initial_values: Mapping[str, float] | None = None, + start_timestamp: pd.Timestamp | None = None, + zones: Sequence[smart_control_building_pb2.ZoneInfo] | None = None, + zone_reward_configs: ( + Mapping[str, Mapping[str, int | float]] | None + ) = None, + ): + """Initializes the SimpleBuilding. + + Args: + layout: A mapping defining the building structure, + {zone_id: {device_id: [field_name1, ...]}}. Defaults to DEFAULT_LAYOUT. + initial_values: Initial continuous values for measurements and setpoints. + start_timestamp: The starting timestamp for the environment. + zones: A sequence of pre-defined ZoneInfo protos. If None, ZoneInfo protos + will be generated based on the provided or default `layout`. Each zone + in the layout will result in a ZoneInfo, with devices populated from the + layout's device keys. + zone_reward_configs: Optional per-zone configurations used to populate + the reward_info. + """ + self.layout = layout or DEFAULT_LAYOUT + + if not zones: + zones = [] + for zone, info in self.layout.items(): + zone_id = zone + devices = info.keys() + zone_info = smart_control_building_pb2.ZoneInfo( + zone_id=zone_id, + building_id="SimpleBuilding", + zone_description=zone_id, + floor=0, + devices=devices, + ) + zones.append(zone_info) + super().__init__(zones=zones) + self.values = collections.defaultdict(int) + if initial_values: + self.values.update(initial_values) + + self._start_timestamp = start_timestamp or pd.Timestamp( + "2021-06-07 12:00:01" + ) + self.zone_reward_configs = zone_reward_configs self.reset_called = False self.step_count = 0 + @property + def start_timestamp(self) -> pd.Timestamp: + return self._start_timestamp + @property def reward_info(self) -> smart_control_reward_pb2.RewardInfo: """Returns a message with data to compute the instantaneous reward.""" - # For the purposes of this test, we can return a dummy value - return smart_control_reward_pb2.RewardInfo() + reward_info = smart_control_reward_pb2.RewardInfo() + for zone_id, device_info in self.layout.items(): + for device_id in device_info: + if device_id == "floor": + continue + if "air_handler" in device_id: + ahu_reward_info = reward_info.air_handler_reward_infos[device_id] + ahu_reward_info.blower_electrical_energy_rate = 100.0 + ahu_reward_info.air_conditioning_electrical_energy_rate = 200.0 + elif "boiler" in device_id: + boiler_reward_info = reward_info.boiler_reward_infos[device_id] + boiler_reward_info.pump_electrical_energy_rate = 50.0 + boiler_reward_info.natural_gas_heating_energy_rate = 500.0 + elif "heat_pump" in device_id: + heat_pump_reward_info = reward_info.heat_pump_reward_infos[device_id] + heat_pump_reward_info.pump_electrical_energy_rate = 100.0 + heat_pump_reward_info.electricity_heating_energy_rate = 1000.0 + + zone_reward_info = reward_info.zone_reward_infos[zone_id] + config = (self.zone_reward_configs or {}).get(zone_id, {}) + zone_reward_info.average_occupancy = config.get("average_occupancy", 5) + zone_reward_info.zone_air_temperature = config.get( + "zone_air_temperature", 295.0 + ) + zone_reward_info.heating_setpoint_temperature = config.get( + "heating_setpoint_temperature", 290.0 + ) + zone_reward_info.cooling_setpoint_temperature = config.get( + "cooling_setpoint_temperature", 300.0 + ) + zone_reward_info.air_flow_rate_setpoint = 10.0 + zone_reward_info.air_flow_rate = 5.0 + + return reward_info def request_observations_within_time_interval( self, @@ -104,8 +191,8 @@ def wait_time(self) -> None: @property def current_timestamp(self) -> pd.Timestamp: - return pd.Timestamp("2021-06-07 12:00:01") + pd.Timedelta( - 5.0 * self.step_count, unit="minute" + return pd.Timestamp(self.start_timestamp) + pd.Timedelta( + self.step_count * self.time_step_sec, unit="seconds" ) def render(self, path: str) -> None: @@ -118,26 +205,30 @@ def devices(self) -> Sequence[smart_control_building_pb2.DeviceInfo]: devices = [] for zone, info in self.layout.items(): for device, fields in info.items(): + if device == "floor": + continue zone_id = zone device_id = device device_type = None - if "boiler" in device: + if "boiler" in device or "hws" in device: device_type = smart_control_building_pb2.DeviceInfo.DeviceType.BLR elif "vav" in device: device_type = smart_control_building_pb2.DeviceInfo.DeviceType.VAV - elif "air_handler" in device: + elif "air_handler" in device or "ahu" in device: device_type = smart_control_building_pb2.DeviceInfo.DeviceType.AHU + observable_fields = {} action_fields = {} for field in fields: - if "setpoint" in field: + if "setpoint" in field or "command" in field: action_fields[field] = ( smart_control_building_pb2.DeviceInfo.ValueType.VALUE_CONTINUOUS ) - if "measurement" in field: + if "measurement" in field or "sensor" in field: observable_fields[field] = ( smart_control_building_pb2.DeviceInfo.ValueType.VALUE_CONTINUOUS ) + device_info = smart_control_building_pb2.DeviceInfo( zone_id=zone_id, device_id=device_id, @@ -154,14 +245,15 @@ def zones(self) -> Sequence[smart_control_building_pb2.ZoneInfo]: zones = [] for zone, info in self.layout.items(): zone_id = zone - devices = info.keys() + devices = (k for k in info.keys() if k != "floor") + floor = info.get("floor", 0) zone_info = smart_control_building_pb2.ZoneInfo( zone_id=zone_id, building_id="SimpleBuilding", zone_description=zone_id, + floor=floor, ) - for device in devices: - zone_info.devices.append(device) + zone_info.devices.extend(devices) zones.append(zone_info) return zones @@ -178,6 +270,38 @@ def time_step_sec(self) -> float: return 300.0 +class SimpleBuildingHybridAction(SimpleBuilding): + """Building implementation for unit tests.""" + + def __init__(self): + layout = { + "zone_1": { + "boiler_1": [ + "setpoint_1", + "measurement_1", + "supervisor_run_command", + ], + "vav_2": [ + "setpoint_2", + "setpoint_3", + "setpoint_4", + "measurement_2", + ], + }, + "zone_2": { + "boiler_3": ["measurement_3", "measurement_4"], + "vav_4": ["setpoint_5", "measurement_5"], + "air_handler_5": ["setpoint_6", "supervisor_run_command"], + }, + } + super().__init__(layout=layout, initial_values=None, start_timestamp=None) + + +# +# REWARD FUNCTION +# + + class SimpleRewardFunction(base_reward_function.BaseRewardFunction): """Test reward function.""" diff --git a/smart_control/environment/hybrid_action_environment.py b/smart_control/environment/hybrid_action_environment.py new file mode 100644 index 00000000..189a9aab --- /dev/null +++ b/smart_control/environment/hybrid_action_environment.py @@ -0,0 +1,245 @@ +"""Extension class for Environment that exposes hybrid actions to agent. + +Intended for use with Hybrid Action - enabled agents that require both +continuous and discrete action spaces. +""" + +import collections +from collections.abc import Sequence +import dataclasses + +from absl import logging +import gin +import numpy as np +import tensorflow as tf +from tf_agents.specs import array_spec +from tf_agents.typing import types + +from smart_buildings.smart_control.environment import environment + +ActionRecord = environment.ActionRecord + +HybridAction = dict[str, list[float]] + +# Aliases kept here for backward compatibility: +DISCRETE_ACTION = environment.DISCRETE_ACTION +CONTINUOUS_ACTION = environment.CONTINUOUS_ACTION +DISCRETE_ACTION_COMMAND = environment.DISCRETE_ACTION_COMMAND +# TODO(mjrossetti): Rename this alias once Schedule Agent is merged / submitted: +is_discrete_action = environment.is_discrete_setpoint + + +def map_discrete_off_value(action_value: float) -> float: + """Maps the 'OFF' value for discrete actions to 0.0. + + The hybrid action environment uses 0 for OFF, while the base environment + uses -1.0 or less. We check for action_value <= 0 to be robust to float + imprecision. + + Args: + action_value: The current action value. + + Returns: + 0.0 if the action value is considered 'OFF', otherwise the original value. + """ + return 0.0 if action_value <= 0 else action_value + + +def update_action_record(record: ActionRecord) -> ActionRecord: + """Updates the action record to be aware of discrete actions.""" + if is_discrete_action(record.setpoint_name): + action_value = map_discrete_off_value(record.action_value) + return dataclasses.replace( + record, setpoint_type="DISCRETE", action_value=action_value + ) + return record + + +@gin.configurable +class HybridActionEnvironment(environment.Environment): + """SB Environment that exposes discrete and continuous actions.""" + + def _retrieve_field( + self, device_id: environment.DeviceId, field_name: environment.FieldName + ) -> environment.DeviceFieldId: + field_id = environment.generate_field_id( + device_id, field_name, self._id_map + ) + if (device_id, field_name) not in self._id_map: + self._id_map[(device_id, field_name)] = field_id + return field_id + + def _get_action_spec_and_normalizers_from_device_action_tuples( + self, + action_config: environment.ActionConfig, + device_action_tuples: Sequence[environment.DeviceActionTuple], + ) -> tuple[types.ArraySpec, environment.ActionNormalizerMap, Sequence[str]]: + """Applies the device_action_tuples to the action configurations.""" + action_normalizers = {} + action_names = [] + + discrete_action_names = [] + continuous_action_names = [] + + logging.info( + "Loading device-setpoint pairs from %d device_action_tuples.", + len(device_action_tuples), + ) + for device_action_tuple in device_action_tuples: + device_id = environment.DeviceId(device_action_tuple[0]) + setpoint_name = environment.FieldName(device_action_tuple[1]) + + # Get BaseActionNormalizer based on device and setpoint_name. + action_normalizer = self.action_normalizers.get(setpoint_name) + + if not action_normalizer: + raise ValueError("Missing a normalizer") + + field_id = self._retrieve_field(device_id, setpoint_name) + + if is_discrete_action(setpoint_name): + logging.info( + "Device %s has a discrete action %s", device_id, setpoint_name + ) + discrete_action_names.append(field_id) + else: + logging.info( + "Device %s has a continuous action %s", device_id, setpoint_name + ) + continuous_action_names.append(field_id) + + action_names.append(field_id) + + action_normalizers[setpoint_name] = action_normalizer + + action_spec = { + CONTINUOUS_ACTION: array_spec.BoundedArraySpec( + shape=(len(continuous_action_names),), + dtype=np.float32, + minimum=-1.0, + maximum=1.0, + name=CONTINUOUS_ACTION, + ), + DISCRETE_ACTION: array_spec.BoundedArraySpec( + shape=(len(discrete_action_names),), + dtype=np.int32, + minimum=0, + maximum=1, + name=DISCRETE_ACTION, + ), + } + logging.info( + "The action_spec from device_action_tuples contains %d actions: %s.", + len(action_names), + ", ".join(action_names), + ) + return action_spec, action_normalizers, action_names + + def _format_action( + self, action: types.NestedArray, action_names: Sequence[str] + ) -> types.NestedArray: + """Converts from hybrid to all real-valued actions.""" + if ( + not isinstance(action, dict) + or CONTINUOUS_ACTION not in action.keys() + or DISCRETE_ACTION not in action.keys() + ): + raise ValueError( + "Hybrid Action Environment requires an action dict with continuous" + " and discrete actions." + ) + + discrete_action = tf.reshape( + action[DISCRETE_ACTION], self._action_spec[DISCRETE_ACTION].shape + ) + discrete_dequeue = collections.deque(discrete_action) + continuous_dequeue = collections.deque(action[CONTINUOUS_ACTION]) + + if len(discrete_dequeue) + len(continuous_dequeue) != len(action_names): + raise ValueError( + f"The number of discrete actions was {len(discrete_dequeue)} and" + " continuous actions was {len(continuous_dequeue)}, did not add" + " up to the expected number of actions: {len(action_names)}" + ) + + merged_actions = [] + # Here we take a dictionary with discrete actions as integers and + # continuous actions as floats, and construct a list of floats in + # the order provided by action names. + # The discrete and continuous actions are already ordered, but + # they need to be merged into a single float list. + # Only discrete actions with DISCRETE_ACTION_COMMAND in the name + # are recognized as discrete. + for action_name in action_names: + if is_discrete_action(action_name): + discrete_action_value = discrete_dequeue.popleft() + + # The convention for the agent is 1 on and 0 off, but in the + # base building is (0.0, 1.0) on and [0.0, -1.0) off. + if discrete_action_value == 1: + merged_actions.append(1.0) + elif discrete_action_value == 0: + merged_actions.append(-1.0) + else: + raise NotImplementedError( + "Only [0, 1] discrete actions are supported now, but received a" + f" {discrete_action_value} for field {action_name}." + ) + + else: + continuous_action_value = continuous_dequeue.popleft() + merged_actions.append(continuous_action_value) + + if len(merged_actions) != len(action_names): + raise ValueError( + "The number of merged actions did not match the number of expected" + " actions, which may indicate that there is a discrete action that is" + " mislabeled." + ) + + return merged_actions + + def convert_to_hybrid( + self, action_values: environment.NormalizedActionValues + ) -> HybridAction: + """Converts a list of normalized action values to a hybrid action. + + Args: + action_values: A list of action values, in the same order as the action + names. + + Returns: + A HybridAction dictionary with discrete and continuous actions. + """ + hybrid_action: HybridAction = {CONTINUOUS_ACTION: [], DISCRETE_ACTION: []} + + for action_value, action_name in zip(action_values, self.action_names): + if is_discrete_action(action_name): + hybrid_action[DISCRETE_ACTION].append( + map_discrete_off_value(action_value) + ) + else: + hybrid_action[CONTINUOUS_ACTION].append(action_value) + return hybrid_action + + @property + def default_hybrid_action(self) -> HybridAction: + """The default action used to step the hybrid action environment.""" + return self.convert_to_hybrid(self.default_action_values) + + def get_action_records_from_normalized_values( + self, + normalized_values: environment.NormalizedActionValues, + ) -> Sequence[ActionRecord]: + """Converts normalized hybrid action values into action records.""" + records = super().get_action_records_from_normalized_values( + normalized_values + ) + return [update_action_record(record) for record in records] + + def get_action_records_from_native_values( + self, native_values: environment.NativeActionValues + ) -> Sequence[ActionRecord]: + """Converts native hybrid action values into action records.""" + records = super().get_action_records_from_native_values(native_values) + return [update_action_record(record) for record in records] diff --git a/smart_control/environment/hybrid_action_environment_test.py b/smart_control/environment/hybrid_action_environment_test.py new file mode 100644 index 00000000..cadcff37 --- /dev/null +++ b/smart_control/environment/hybrid_action_environment_test.py @@ -0,0 +1,283 @@ +"""Tests for hybrid action environment.""" + +from absl.testing import absltest +from absl.testing import parameterized +import numpy as np +import tensorflow as tf +from tf_agents.environments import utils +from tf_agents.specs import array_spec +from tf_agents.trajectories import time_step as ts + +# pylint: disable=g-bad-import-order we prefer local imports below packages +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import environment_test_utils +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.models import base_building +from smart_buildings.smart_control.models import base_reward_function +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.utils import bounded_action_normalizer +from smart_buildings.smart_control.utils import observation_normalizer + +SimpleBuildingHybridAction = environment_test_utils.SimpleBuildingHybridAction + + +class HybridActionEnvironmentTest(parameterized.TestCase, tf.test.TestCase): + + def _create_observation_normalizer(self): + normalization_constants = { + "temperature": smart_control_normalization_pb2.ContinuousVariableInfo( + id="temperature", sample_mean=310.0, sample_variance=50 * 50 + ), + "supply_water_setpoint": ( + smart_control_normalization_pb2.ContinuousVariableInfo( + id="supply_water_setpoint", + sample_mean=310.0, + sample_variance=50 * 50, + ) + ), + "air_flowrate": smart_control_normalization_pb2.ContinuousVariableInfo( + id="air_flowrate", sample_mean=0.5, sample_variance=4.0 + ), + "differential_pressure": ( + smart_control_normalization_pb2.ContinuousVariableInfo( + id="differential_pressure", + sample_mean=20000.0, + sample_variance=100000.0, + ) + ), + "percentage": smart_control_normalization_pb2.ContinuousVariableInfo( + id="percentage", sample_mean=0.5, sample_variance=1.0 + ), + "request_count": smart_control_normalization_pb2.ContinuousVariableInfo( + id="request_count", sample_mean=9, sample_variance=25.0 + ), + "measurement": smart_control_normalization_pb2.ContinuousVariableInfo( + id="measurement", sample_mean=0.0, sample_variance=1.0 + ), + } + + return observation_normalizer.StandardScoreObservationNormalizer( + normalization_constants + ) + + def _create_bounded_action_config(self, min_value, max_value): + action_normalizer = bounded_action_normalizer.BoundedActionNormalizer( + min_value, max_value + ) + run_command_normalizer = bounded_action_normalizer.BoundedActionNormalizer( + -1.0, 1.0 + ) + + action_normalizer_inits = { + "setpoint_1": action_normalizer, + "setpoint_2": action_normalizer, + "setpoint_3": action_normalizer, + "setpoint_4": action_normalizer, + "setpoint_5": action_normalizer, + "setpoint_6": action_normalizer, + "supervisor_run_command": run_command_normalizer, + } + + return environment.ActionConfig(action_normalizer_inits) + + @parameterized.named_parameters( + ( + "2_discrete_2_continuous", + [ + ("boiler_1", "setpoint_1"), + ("boiler_1", "supervisor_run_command"), + ("air_handler_5", "setpoint_6"), + ("air_handler_5", "supervisor_run_command"), + ], + 2, + 2, + ), + ( + "1_discrete_1_continuous", + [("boiler_1", "setpoint_1"), ("boiler_1", "supervisor_run_command")], + 1, + 1, + ), + ) + def test_init_device_action_tuples( + self, device_action_tuples, num_discrete_actions, num_continuous_actions + ): + building = SimpleBuildingHybridAction() + reward_function = environment_test_utils.SimpleRewardFunction() + action_config = self._create_bounded_action_config(200, 300) + obs_normalizer = self._create_observation_normalizer() + # Of the 6 possible setpoints, limit only to 2 using device_action_tuples. + + env = hybrid_action_environment.HybridActionEnvironment( + building, + reward_function, + obs_normalizer, + action_config, + device_action_tuples=device_action_tuples, + ) + env.reset() + + expected = { + "discrete_action": array_spec.BoundedArraySpec( + (num_discrete_actions,), + np.int32, + minimum=0, + maximum=1, + name="discrete_action", + ), + "continuous_action": array_spec.BoundedArraySpec( + (num_continuous_actions,), + np.float32, + minimum=-1, + maximum=1, + name="discrete_action", + ), + } + + self.assertEqual(env.action_spec(), expected) + + def test_validate_environment(self): + class TerminatingEnv(hybrid_action_environment.HybridActionEnvironment): + + def __init__( + self, + building: base_building.BaseBuilding, + reward_function: base_reward_function.BaseRewardFunction, + obs_normalizer, + action_config, + discount_factor: float = 1, + device_action_tuples=None, + ): + super().__init__( + building, + reward_function, + obs_normalizer, + action_config, + discount_factor, + device_action_tuples=device_action_tuples, + ) + self.counter = 0 + + def _step(self, action) -> ts.TimeStep: + self.counter += 1 + time_step = super()._step(action) + if self.counter < 100: + return time_step + return ts.termination(env._get_observation(), reward=0.0) + + building = SimpleBuildingHybridAction() + reward_function = environment_test_utils.SimpleRewardFunction() + action_config = self._create_bounded_action_config(200, 300) + obs_normalizer = self._create_observation_normalizer() + device_action_tuples = [ + ("boiler_1", "setpoint_1"), + ("boiler_1", "supervisor_run_command"), + ("air_handler_5", "setpoint_6"), + ("air_handler_5", "supervisor_run_command"), + ] + env = TerminatingEnv( + building, + reward_function, + obs_normalizer, + action_config, + 1.0, + device_action_tuples, + ) + + utils.validate_py_environment(env, episodes=5) + + +class HybridDefaultActionsTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.building = SimpleBuildingHybridAction() + self.reward_function = environment_test_utils.SimpleRewardFunction() + self.observation_normalizer = observation_normalizer.StandardScoreObservationNormalizer( # pylint: disable=line-too-long + { + "temperature": ( + smart_control_normalization_pb2.ContinuousVariableInfo( + id="temperature", + sample_mean=310.0, + sample_variance=2500.0, + ) + ) + } + ) + self.action_config = environment.ActionConfig({ + "supply_air_temp": bounded_action_normalizer.BoundedActionNormalizer( + 200, 300 + ), + "supervisor_run_command": ( + bounded_action_normalizer.BoundedActionNormalizer(-1, 1) + ), + }) + + @parameterized.named_parameters( + dict( + testcase_name="action_names_only", + default_actions={ + "ahu_1_supply_air_temp": 290.0, + "ahu_2_supply_air_temp": 295.0, + "ahu_1_supervisor_run_command": 1.0, + "ahu_2_supervisor_run_command": 1.0, + }, + expected_hybrid_actions={ + "continuous_action": [0.8, 0.9], + "discrete_action": [1.0, 1.0], + }, + ), + dict( + testcase_name="setpoint_names_only", + default_actions={ + "supply_air_temp": 290.0, + "supervisor_run_command": 1.0, + }, + expected_hybrid_actions={ + "continuous_action": [0.8, 0.8], + "discrete_action": [1.0, 1.0], + }, + ), + dict( + testcase_name="mixed_approach", + default_actions={ + "ahu_1_supply_air_temp": 292.0, + "ahu_2_supply_air_temp": 295.0, + "supervisor_run_command": 1.0, + }, + expected_hybrid_actions={ + "continuous_action": [0.84, 0.9], + "discrete_action": [1.0, 1.0], + }, + ), + ) + def test_hybrid_default_actions( + self, default_actions, expected_hybrid_actions + ): + env = hybrid_action_environment.HybridActionEnvironment( + building=self.building, + reward_function=self.reward_function, + observation_normalizer=self.observation_normalizer, + action_config=self.action_config, + device_action_tuples=[ + ("ahu_1", "supply_air_temp"), + ("ahu_2", "supply_air_temp"), + ("ahu_1", "supervisor_run_command"), + ("ahu_2", "supervisor_run_command"), + ], + default_actions=default_actions, + ) + self.assertSequenceAlmostEqual( + env.default_hybrid_action["continuous_action"], + expected_hybrid_actions["continuous_action"], + delta=0.001, + ) + self.assertSequenceAlmostEqual( + env.default_hybrid_action["discrete_action"], + expected_hybrid_actions["discrete_action"], + delta=0.001, + ) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/agents/base_agent.py b/smart_control/llm/agents/base_agent.py new file mode 100644 index 00000000..96ad6fd7 --- /dev/null +++ b/smart_control/llm/agents/base_agent.py @@ -0,0 +1,65 @@ +"""Base class for agents that use the control loop.""" + +import abc +from collections.abc import Mapping, Sequence +import dataclasses +from typing import Any + +from smart_buildings.smart_control.llm.schema import action_context +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 as reward_pb2 +from smart_buildings.smart_control.utils import serialization + + +@dataclasses.dataclass +class AgentErrorRecord: + """Record of an error produced by an agent. + + Attributes: + error_type: The class name of the exception. + error_message: The string representation of the error. + details: Structured error details (e.g. from Pydantic's ValidationError). + metadata: Extra metadata about the error (e.g. raw response text). + """ + + error_type: str + error_message: str + details: Sequence[Mapping[str, Any]] | None = None + metadata: Mapping[str, Any] | None = None + + @property + def json_metadata(self) -> serialization.SerializableData: + """A JSON-serializable representation of the error record.""" + return serialization.to_serializable(dataclasses.asdict(self)) + + +class BaseControlAgent(abc.ABC): + """An agent that chooses actions based on info from the environment. + + Attributes: + errors: A list of errors recorded by the agent during its operation. + """ + + def __init__(self): + self.errors: list[AgentErrorRecord] = [] + + @abc.abstractmethod + def get_action_context( + self, + observation_response: building_pb2.ObservationResponse | None = None, + reward_info: reward_pb2.RewardInfo | None = None, + ) -> action_context.ActionContext: + """Returns an action context based on the agent's strategy / policy. + + Args: + observation_response: The observation response from the environment. + reward_info: The reward info from the environment. + + Returns: + An action context based on the agent's strategy / policy. + """ + + @property + def json_metadata(self) -> serialization.SerializableData: + """Info about the agent and its setup, to be written to a JSON file.""" + return {"type": self.__class__.__name__} diff --git a/smart_control/llm/agents/base_agent_test.py b/smart_control/llm/agents/base_agent_test.py new file mode 100644 index 00000000..a2cae46f --- /dev/null +++ b/smart_control/llm/agents/base_agent_test.py @@ -0,0 +1,45 @@ +import json + +from absl.testing import absltest + +from smart_buildings.smart_control.llm.agents import base_agent + + +class ErrorRecordNestedExceptionsTest(absltest.TestCase): + + def setUp(self): + super().setUp() + nested_error = ValueError('Something went wrong') + + self.record = base_agent.AgentErrorRecord( + error_type='ValidationError', + error_message='Validation failed', + details=[{ + 'loc': ('field',), + 'ctx': {'error': nested_error}, + }], + metadata={'current_step': 4, 'response_txt': 'OOPS'}, + ) + + def test_json_metadata(self): + self.assertEqual( + self.record.json_metadata, + { + 'error_type': 'ValidationError', + 'error_message': 'Validation failed', + 'details': [ + { + 'loc': ['field'], + 'ctx': {'error': 'Something went wrong'}, + } + ], + 'metadata': {'current_step': 4, 'response_txt': 'OOPS'}, + }, + ) + + def test_json_metadata_is_serializable(self): + self.assertIsInstance(json.dumps(self.record.json_metadata), str) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/llm/agents/default_agent.py b/smart_control/llm/agents/default_agent.py new file mode 100644 index 00000000..a28ec4de --- /dev/null +++ b/smart_control/llm/agents/default_agent.py @@ -0,0 +1,126 @@ +"""Default policy agent. + +This agent employs a fixed strategy that uses the environment's default policy +values for all of its actions. + +This strategy is overly simplistic, but provides a decent foundation for +child classes to inherit from, and can be useful for testing and debugging the +agent control loop. +""" + +from typing import Final + +import numpy as np + +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.agents import base_agent +from smart_buildings.smart_control.llm.schema import action_context +from smart_buildings.smart_control.llm.schema import output_schema +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 as reward_pb2 +from smart_buildings.smart_control.utils import serialization + + +DEFAULT_JUSTIFICATION: Final[str] = "Default action." +DEFAULT_SETPOINT_JUSTIFICATION: Final[str] = "Default value." + + +class DefaultPolicyAgent(base_agent.BaseControlAgent): + """A control agent that uses the environment's default policy values. + + Attributes: + env: The environment to be controlled. Should be configured with default + policy values. + """ + + def __init__(self, env: environment.Environment, clip: bool = True): + """Initializes the instance. + + Args: + env: The environment to be controlled. Should be configured with + default policy values. + clip: Whether to clip setpoint values to the bounds of the valid range. If + `False`, raises `GuardrailsExceededError`. Otherwise, clips the + setpoint values to the valid range, and logs a record of the error. + Defaults to `True`. + """ + super().__init__() + self._clip = clip + self.env = self._validate_environment(env) + + def _validate_environment( + self, env: environment.Environment + ) -> environment.Environment: + """Ensures the environment has default values.""" + if env.action_names is None: + raise ValueError("Expecting environment to have action names.") + + if env.default_policy_values is None: + raise ValueError("Expecting environment to have default policy values.") + + if len(env.action_names) != len(env.default_policy_values): + raise ValueError( + "Expecting environment to have the same number of action names and" + " default policy values." + ) + + return env + + @property + def json_metadata(self) -> serialization.SerializableData: + """Info about the agent and its setup, to be written to a JSON file.""" + return super().json_metadata | { + "default_policy": { + "action_names": self.env.action_names, + "default_values": self.env.default_action_values, + }, + "clip": self._clip, + } + + @property + def action_context_class(self) -> type[action_context.ActionContext]: + """The action context class to be used by this agent.""" + if isinstance(self.env, hybrid_action_environment.HybridActionEnvironment): + return action_context.HybridActionContext + return action_context.ActionContext + + def get_default_action_context(self) -> action_context.ActionContext: + """Compiles an action context using the environment's default values.""" + + setpoints = [] + for action_name, normalized_value in zip( + self.env.action_names, self.env.default_action_values + ): + device_id, setpoint_name = self.env.id_map.inv[action_name] + normalizer = self.env.action_normalizers.get(setpoint_name) + if normalizer is None: + raise ValueError(f"No normalizer found for setpoint: {setpoint_name}") + + native_value = normalizer.setpoint_value(np.array(normalized_value)) + setpoints.append( + output_schema.DeviceSetpoint( + device_id=device_id, + setpoint_name=setpoint_name, + setpoint_value=native_value, + justification=DEFAULT_SETPOINT_JUSTIFICATION, + ) + ) + + return self.action_context_class( + env=self.env, + clip=self._clip, + timestamp=str(self.env.current_local_timestamp), + justification=DEFAULT_JUSTIFICATION, + validity_interval=self.env.time_step_mins, + setpoints=setpoints, + ) + + def get_action_context( + self, + observation_response: building_pb2.ObservationResponse | None = None, + reward_info: reward_pb2.RewardInfo | None = None, + ) -> action_context.ActionContext: + """The action context to be used within the agent control loop.""" + del observation_response, reward_info # Unused in this implementation. + return self.get_default_action_context() diff --git a/smart_control/llm/agents/default_agent_test.py b/smart_control/llm/agents/default_agent_test.py new file mode 100644 index 00000000..7e8bd40b --- /dev/null +++ b/smart_control/llm/agents/default_agent_test.py @@ -0,0 +1,203 @@ +import json +from unittest import mock + +from absl.testing import absltest +from absl.testing import parameterized +import pandas as pd + +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.agents import default_agent +from smart_buildings.smart_control.llm.schema import action_context + + +class AgentEnvironmentValidationsTest(parameterized.TestCase): + + AGENT_CLASS = default_agent.DefaultPolicyAgent + + def setUp(self): + super().setUp() + self.env = mock.create_autospec(environment.Environment, instance=True) + self.env.action_names = list(env_conftest.DEFAULT_ACTIONS.keys()) + self.env.default_policy_values = list(env_conftest.DEFAULT_ACTIONS.values()) + + def test_valid_environment(self): + agent = self.AGENT_CLASS(self.env) + self.assertIsInstance(agent, self.AGENT_CLASS) + + def test_validate_action_names(self): + self.env.action_names = None + + with self.assertRaisesRegex( + ValueError, "Expecting environment to have action names." + ): + self.AGENT_CLASS(self.env) + + def test_validate_default_values(self): + self.env.default_policy_values = None + + with self.assertRaisesRegex( + ValueError, "Expecting environment to have default policy values." + ): + self.AGENT_CLASS(self.env) + + def test_validate_number_of_action_names_and_default_values(self): + self.env.action_names = self.env.action_names[1:] + + with self.assertRaisesRegex( + ValueError, + "Expecting environment to have the same number of action names and" + " default policy values.", + ): + self.AGENT_CLASS(self.env) + + +class DefaultAgentTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.env = self._create_environment() + self.agent = self._create_agent(self.env) + + def _create_environment( + self, start_timestamp: pd.Timestamp | None = None + ) -> environment.Environment: + return env_conftest.create_environment( + layout=env_conftest.DEMO_LAYOUT, + default_actions=env_conftest.DEFAULT_ACTIONS, + start_timestamp=start_timestamp, + ) + + def _create_agent( + self, env: environment.Environment + ) -> default_agent.DefaultPolicyAgent: + return default_agent.DefaultPolicyAgent(env=env) + + def test_initialization(self): + self.assertIsInstance(self.agent, default_agent.DefaultPolicyAgent) + + def test_environment(self): + self.assertIsInstance(self.agent.env, environment.Environment) + + def test_json_metadata(self): + self.assertEqual( + self.agent.json_metadata, + { + "type": "DefaultPolicyAgent", + "default_policy": { + "action_names": self.env.action_names, + "default_values": self.env.default_action_values, + }, + "clip": True, + }, + ) + + def test_json_metadata_is_serializable(self): + self.assertEqual( + self.agent.json_metadata, + json.loads(json.dumps(self.agent.json_metadata, indent=2)), + ) + + def test_default_action_context(self): + ctx = self.agent.get_default_action_context() + self.assertIsInstance(ctx, action_context.ActionContext) + + with self.subTest(name="timestamp"): + self.assertEqual(ctx.timestamp, str(self.env.current_local_timestamp)) + + with self.subTest(name="justification"): + self.assertEqual(ctx.justification, default_agent.DEFAULT_JUSTIFICATION) + + with self.subTest(name="validity_interval"): + self.assertEqual(ctx.validity_interval, self.env.time_step_mins) + + with self.subTest(name="setpoints"): + self.assertLen(ctx.setpoints, len(self.env.action_names)) + + # Setpoint and device names should match the env's action names: + names = [(sp.device_id, sp.setpoint_name) for sp in ctx.sorted_setpoints] + self.assertEqual( + names, + [ + ("air_handler_1", "supply_air_heating_temperature_setpoint"), + ("boiler_1", "supply_water_setpoint"), + ("air_handler_2", "supply_air_heating_temperature_setpoint"), + ], + ) + + # Setpoint values should be native versions of the env's default values: + setpoint_values = [sp.setpoint_value for sp in ctx.setpoints] + self.assertSequenceAlmostEqual(setpoint_values, [290.0, 310.0, 290.0]) + + def test_get_action_context(self): + ctx = self.agent.get_action_context() + self.assertIsInstance(ctx, action_context.ActionContext) + self.assertEqual(ctx, self.agent.get_default_action_context()) + + +class DefaultHybridActionAgentTest(DefaultAgentTest): + + def _create_environment( + self, start_timestamp: pd.Timestamp | None = None + ) -> hybrid_action_environment.HybridActionEnvironment: + return env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT, + default_actions=env_conftest.DEFAULT_HYBRID_ACTIONS, + start_timestamp=start_timestamp, + ) + + def test_environment(self): + self.assertIsInstance( + self.agent.env, hybrid_action_environment.HybridActionEnvironment + ) + + def test_default_action_context(self): + ctx = self.agent.get_default_action_context() + self.assertIsInstance(ctx, action_context.ActionContext) + + with self.subTest(name="timestamp"): + self.assertEqual(ctx.timestamp, str(self.env.current_local_timestamp)) + + with self.subTest(name="justification"): + self.assertEqual(ctx.justification, default_agent.DEFAULT_JUSTIFICATION) + + with self.subTest(name="validity_interval"): + self.assertEqual(ctx.validity_interval, self.env.time_step_mins) + + with self.subTest(name="setpoints"): + self.assertLen(ctx.setpoints, len(self.env.action_names)) + self.assertSequenceAlmostEqual( + ctx.get_action_values(), self.env.default_action_values + ) + + # Setpoint and device names should match the env's action names: + names = [(sp.device_id, sp.setpoint_name) for sp in ctx.sorted_setpoints] + with self.subTest(name="setpoint_names"): + self.assertEqual( + names, + [ + ("air_handler_1", "supply_air_heating_temperature_setpoint"), + ("air_handler_1", "supervisor_run_command"), + ("boiler_1", "supply_water_setpoint"), + ("boiler_1", "supervisor_run_command"), + ("air_handler_2", "supply_air_heating_temperature_setpoint"), + ("air_handler_2", "supervisor_run_command"), + ], + ) + + # Setpoint values should be native versions of the env's default values: + setpoint_values = [sp.setpoint_value for sp in ctx.setpoints] + with self.subTest(name="setpoint_values"): + self.assertSequenceAlmostEqual( + setpoint_values, [290.0, 0, 310.0, 0, 290.0, 0] + ) + + def test_get_action_context(self): + ctx = self.agent.get_action_context() + self.assertIsInstance(ctx, action_context.ActionContext) + self.assertEqual(ctx, self.agent.get_default_action_context()) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/agents/llm_agent.py b/smart_control/llm/agents/llm_agent.py new file mode 100644 index 00000000..6b7032f8 --- /dev/null +++ b/smart_control/llm/agents/llm_agent.py @@ -0,0 +1,390 @@ +"""LLM agent. + +This agent uses a large language model (LLM) to determine its actions. The agent +can use any LLM service that implements the `BaseLLMService` interface. + +First, the agent gets current building conditions from the environment, and +passes this information to a promptmaker, which is responsible for dynamically +constructing a prompt. + +The agent then passes the prompt to the LLM using the configured LLM service. +The agent then validates the LLM's response to ensure it is JSON-formatted and +adheres to the specified "action" output schema. If the action is valid, the +agent stores this information for future reference, and returns the action to +the control loop. + +If the LLM isn't able to produce a valid response, the agent keeps a record of +the error(s), and tries again (with exponential backoff), until it receives a +valid response or reaches the maximum number of tries. + +If the agent doesn't receive a valid action after trying the maximum number of +times, it logs a record of this max retries exceeded error, and gracefully uses +a fallback action: + + + If a previous valid action is available, the agent uses a modified version + of its most recent action, except it uses the shortest possible validity + interval, to give the agent a chance to get a new action at the next + available opportunity. + + If a previous action isn't available, the agent falls back to using the + environment's normally scheduled default action. + +Since this agent inherits from the Schedule Policy Agent to determine the +normally scheduled action, it should be used in conjunction with a hybrid action +environment. +""" + +import re +from typing import Any, override + +from absl import logging +import backoff + +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.agents import base_agent +from smart_buildings.smart_control.llm.agents import schedule_agent +from smart_buildings.smart_control.llm.prompts import promptmaker as pm +from smart_buildings.smart_control.llm.schema import action_context +from smart_buildings.smart_control.llm.services import llm_service as llm +from smart_buildings.smart_control.llm.utils import schedule_tool as schedule_lib +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 as reward_pb2 +from smart_buildings.smart_control.utils import serialization +from smart_buildings.smart_control.utils import temperature_conversion as temp + +_MARKDOWN_CODE_BLOCK_RE = re.compile(r'```(?:json)?\s*(.*?)\s*```', re.DOTALL) + + +def parse_response_text(txt: str | None) -> str: + """Parses and cleans the raw text response from the LLM. + + The response text is expected to be a JSON-formatted string. In practice + we often see the response wrapped in a JSON-formatted markdown code block, + even when we instruct the LLM to not do that. Perhaps it sees the markdown + formatting in the prompt and thinks it should use markdown formatting in the + response as well. So this method will try to strip the markdown code block + formatting to ensure the text is valid JSON. + + Args: + txt: The raw response text returned by the LLM. + + Returns: + The LLM's textual response as a valid JSON-formatted string. + + Raises: + ValueError: If the response text is not a string. + """ + # FYI: When using the Gemini API, sometimes the response text is None. + # For example, in the case of a max tokens error. + if not isinstance(txt, str): + raise ValueError('Expecting a string response') + + # If the response is wrapped in a markdown code block, extract it: + match = _MARKDOWN_CODE_BLOCK_RE.search(txt) + if match: + return match.group(1).strip() + + # Otherwise, fallback to stripping standard markdown fences and whitespace: + return txt.replace('```json', '').replace('```', '').strip() + + +class MaxRetriesExceededError(Exception): + """Maximum number of retries met or exceeded.""" + + pass + + +class LLMAgent(schedule_agent.SchedulePolicyAgent): + """LLM agent. + + Attributes: + llm_service: The LLM service to use for generating responses. + output_schema_class: The Pydantic model class used to validate and parse the + LLM's JSON response. + temp_display_unit: The temperature unit used for displaying temperatures in + the LLM's response justifications. + promptmaker: The promptmaker instance used to construct the LLM prompt. + max_tries: The maximum number of times to attempt calling the LLM if parsing + or validation errors occur. After this limit is reached, the agent will + fallback to using the scheduled action context. + """ + + def __init__( + self, + *, + env: hybrid_action_environment.HybridActionEnvironment, + llm_service: llm.BaseLLMService, + promptmaker: pm.Promptmaker | None = None, + promptmaker_class: type[pm.Promptmaker] | None = None, + max_tries: int = 5, + clip: bool = True, + override_discrete_defaults: bool = True, + schedule_tool: schedule_lib.BuildingScheduleTool | None = None, + ): + """Initializes the instance. + + Pass either a promptmaker instance or a promptmaker class. The promptmaker + class will only be used if a promptmaker instance is not provided. The + promptmaker class is a convenience argument because we usually want to use + the same promptmaker arguments, and will just change the promptmaker class + to represent different buildings or custom validity intervals. + + Args: + env: The environment in which the agent will operate. + llm_service: The LLM service to use for generating responses. + promptmaker: The promptmaker instance used to construct the LLM prompt. + promptmaker_class: The promptmaker class used to construct the LLM prompt. + If a promptmaker instance is provided, this argument will be ignored, + otherwise a promptmaker instance will be created using this class, using + reasonable default arguments. + max_tries: The maximum number of times to attempt calling the LLM if + parsing or validation errors occur. + clip: Whether to clip the generated setpoints to be within the valid + ranges defined by the environment. + override_discrete_defaults: Whether to override discrete defaults when + getting the scheduled action context. + schedule_tool: Optionally provide a BuildingScheduleTool instance. + Otherwise, a schedule tool will be constructed using the agent's + environment and default schedule tool arguments. + """ + super().__init__( + env=env, + schedule_tool=schedule_tool, + clip=clip, + override_discrete_defaults=override_discrete_defaults, + ) + + self.llm_service = llm_service + self.promptmaker = self._setup_promptmaker(promptmaker, promptmaker_class) + self.output_schema_class = self.promptmaker.output_schema_class + self.temp_display_unit = self.promptmaker.temp_display_unit + self.max_tries = max_tries + + self._last_attempt_response_text: str | None = None + self._last_valid_llm_action: action_context.ActionContext | None = None + + # Wrap `_attempt_get_action_context` to retry with exponential backoff. + self._retry_attempt_get_action_context_with_backoff = backoff.on_exception( + wait_gen=backoff.expo, + exception=Exception, + max_tries=self.max_tries, + jitter=backoff.full_jitter, + on_backoff=self._on_backoff, + on_giveup=self._on_giveup, + )( + self._attempt_get_action_context # the method being wrapped + ) + + def _setup_promptmaker( + self, + promptmaker: pm.Promptmaker | None = None, + promptmaker_class: type[pm.Promptmaker] | None = None, + ) -> pm.Promptmaker: + """Sets up the promptmaker instance.""" + if (promptmaker is None and promptmaker_class is None) or ( + promptmaker is not None and promptmaker_class is not None + ): + raise ValueError( + 'Either a promptmaker instance or class must be provided, not both.' + ) + + return promptmaker or promptmaker_class( + env=self.env, + observation_response=None, + reward_info=None, + lazy_init_protos=True, + output_schema_class=action_context.HybridActionContext, + temp_display_unit=temp.TempUnit.FAHRENHEIT, + include_weights=True, + ) + + @override + @property + def json_metadata(self) -> serialization.SerializableData: + return super().json_metadata | { + 'llm_service': self.llm_service.json_metadata, + 'promptmaker': self.promptmaker.json_metadata, + 'output_schema': {'type': self.output_schema_class.__name__}, + 'temp_display_unit': self.temp_display_unit.value, + 'max_tries': self.max_tries, + } + + # PROMPT + + def make_prompt( + self, + observation_response: building_pb2.ObservationResponse, + reward_info: reward_pb2.RewardInfo, + ) -> str: + """Creates a prompt, using the provided promptmaker class. + + Args: + observation_response: The observation response from the environment. + reward_info: The reward info from the environment. + + Returns: + The prompt to be sent to the LLM. + """ + self.promptmaker.set_protos( + observation_response=observation_response, reward_info=reward_info + ) + return self.promptmaker.prompt + + # RESPONSE VALIDATION + + def validate_action_context(self, txt: str) -> action_context.ActionContext: + """Ensures the response text is in the expected JSON format. + + Args: + txt: The response text to validate. + + Raises: + pydantic.ValidationError: If the response text is not valid JSON. + + Returns: + The validated action context object. + """ + if issubclass(self.output_schema_class, action_context.ActionContext): + return self.output_schema_class.from_json( + txt=txt, env=self.env, clip=self._clip + ) + + action = self.output_schema_class.model_validate_json(txt) + return self.action_context_class( + env=self.env, clip=self._clip, **action.model_dump() + ) + + # ACTION + + def _attempt_get_action_context( + self, + prompt: str, + ) -> action_context.ActionContext: + """Attempts to get a valid action from the LLM. + + Clears and resets the last response text that has been received from the + LLM. + + FYI: When using the Gemini API, sometimes the response text is None. + For example, in the case of a max tokens error. + + Args: + prompt: The prompt to send to the LLM service. + + Raises: + ValueError: If the LLM service returns None. + JSONDecodeError: If the response text is string but not valid JSON. + pydantic.ValidationError: If the JSON doesn't adhere to the output schema. + + Returns: + A validated action context object. + """ + self._last_attempt_response_text = None + response_text = self.llm_service.get_response(prompt) + self._last_attempt_response_text = response_text + + if response_text is None: + raise ValueError('LLM service returned None') + + action = self.validate_action_context(parse_response_text(response_text)) + self._last_valid_llm_action = action + return action + + def _record_backoff_error( + self, + error_details: dict[str, Any], + ) -> None: + """Consolidates logic for recording error details returned by backoff. + + When using the @backoff.on_exception decorator, the details dictionary + passed to the on_backoff and on_giveup handler functions contains the + following keys: + + - target: The decorated function that is being retried. + - args: The positional arguments passed to the target function. + - kwargs: The keyword arguments passed to the target function. + - tries: The number of attempts made so far. + - elapsed: The time in seconds elapsed since the first attempt. + - exception: The exception instance that was caught and triggered the + backoff or giveup. + + Specifically for the on_backoff handler, the details dictionary also + includes: + + - wait: The calculated number of seconds to wait before the next retry + attempt. + + Args: + error_details: The error details returned by backoff. + """ + exception = error_details['exception'] + nested_errors = exception.errors() if hasattr(exception, 'errors') else None + + self.errors.append( + base_agent.AgentErrorRecord( + error_type=exception.__class__.__name__, + error_message=repr(exception), + details=nested_errors, + metadata={ + 'tries': error_details.get('tries'), + 'elapsed': error_details.get('elapsed'), + 'wait': error_details.get('wait'), + 'response_text': self._last_attempt_response_text, + }, + ) + ) + + def _on_backoff(self, details: dict[str, Any]) -> None: + """Records an error that occurred during a backoff retry.""" + logging.debug('ON BACKOFF: %r', details) + self._record_backoff_error(details) + + def _on_giveup(self, details: dict[str, Any]) -> None: + """Records final error and exhaustion of retries.""" + + # Record the final specific error that caused the giveup. + logging.debug('ON GIVEUP: %r', details) + self._record_backoff_error(details) + + # Record that max retries were exceeded. + exhaustion_error = base_agent.AgentErrorRecord( + error_type=MaxRetriesExceededError.__name__, + error_message=f'Max tries ({self.max_tries}) exceeded.', + metadata={}, + ) + self.errors.append(exhaustion_error) + + def get_action_context( + self, + observation_response: building_pb2.ObservationResponse | None = None, + reward_info: reward_pb2.RewardInfo | None = None, + ) -> action_context.ActionContext: + """Returns the action context to be used within the agent control loop. + + Args: + observation_response: The observation response from the environment. + reward_info: The reward info from the environment. + + Returns: + The action context to be used within the agent control loop. + """ + prompt = self.make_prompt(observation_response, reward_info) + try: + return self._retry_attempt_get_action_context_with_backoff(prompt) + except Exception: # pylint: disable=broad-except + # All retry attempts failed, and on_giveup has recorded the errors. + if self._last_valid_llm_action is not None: + logging.exception( + 'LLM MAX TRIES EXCEEDED. FALLING BACK TO PREVIOUS LLM ACTION...', + ) + return self._last_valid_llm_action.model_copy( + update={ + 'validity_interval': self.env.time_step_mins, + 'justification': 'Previous LLM action (max retries exceeded)', + } + ) + + logging.exception( + 'LLM MAX TRIES EXCEEDED. NO PREVIOUS LLM ACTION AVAILABLE. FALLING' + ' BACK TO SCHEDULED ACTION...', + ) + return self.get_scheduled_action_context() diff --git a/smart_control/llm/agents/llm_agent_test.py b/smart_control/llm/agents/llm_agent_test.py new file mode 100644 index 00000000..bf905c7a --- /dev/null +++ b/smart_control/llm/agents/llm_agent_test.py @@ -0,0 +1,563 @@ +import json +import time +from typing import get_args +from unittest import mock + +from absl.testing import absltest +from absl.testing import parameterized +import pydantic + +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.agents import llm_agent +from smart_buildings.smart_control.llm.agents import schedule_agent_test +from smart_buildings.smart_control.llm.prompts import promptmaker as pm +from smart_buildings.smart_control.llm.schema import action_context +from smart_buildings.smart_control.llm.schema import conftest as schema_conftest +from smart_buildings.smart_control.llm.schema import output_schema +from smart_buildings.smart_control.llm.services import llm_service +from smart_buildings.smart_control.llm.utils import schedule_tool as schedule_lib +from smart_buildings.smart_control.llm.utils import schedule_tool_test + + +class TextParsingTest(parameterized.TestCase): + + @parameterized.named_parameters( + dict(testcase_name='json_fence', input_text='```json\n{"a": 1}\n```'), + dict(testcase_name='plain_fence', input_text='```\n{"a": 1}\n```'), + dict(testcase_name='no_fences', input_text='{"a": 1}'), + dict( + testcase_name='text_around_fences', + input_text='Text\n```json\n{"a": 1}\n```\nMore text', + ), + ) + def test_parse_response_text_variants(self, input_text): + expected_text = json.dumps({'a': 1}) + self.assertEqual(llm_agent.parse_response_text(input_text), expected_text) + + @parameterized.named_parameters( + dict( + testcase_name='valid_json_valid_schema', + input_text=schema_conftest.create_hybrid_action_response(), + ), + dict( + testcase_name='valid_json_empty_setpoints', + input_text=schema_conftest.create_hybrid_action_response( + empty_setpoints=True + ), + ), + dict( + testcase_name='valid_json_missing_setpoint', + input_text=schema_conftest.create_hybrid_action_response( + missing_setpoint=True + ), + ), + dict( + testcase_name='valid_json_missing_field', + input_text=schema_conftest.create_hybrid_action_response( + missing_field=True + ), + ), + ) + def test_parse_response_text_valid_json_invalid_schema(self, input_text): + self.assertEqual(llm_agent.parse_response_text(input_text), input_text) + + def test_parse_response_text_non_string_input(self): + with self.assertRaisesRegex(ValueError, 'Expecting a string response'): + llm_agent.parse_response_text(None) + + +class LLMAgentTest( + schedule_agent_test.ScheduleHybridActionAgentTest, parameterized.TestCase +): + + env: hybrid_action_environment.HybridActionEnvironment + agent: llm_agent.LLMAgent + mock_llm_service: mock.MagicMock + schedule_tool: schedule_lib.BuildingScheduleTool + + def _create_agent( + self, env: hybrid_action_environment.HybridActionEnvironment + ) -> llm_agent.LLMAgent: + self.mock_llm_service = mock.create_autospec( + llm_service.BaseLLMService, instance=True, spec_set=True + ) + self.mock_llm_service.json_metadata = {'type': 'MockLLMService'} + self.schedule_tool = schedule_lib.BuildingScheduleTool(env=env) + return llm_agent.LLMAgent( + env=env, + llm_service=self.mock_llm_service, + promptmaker_class=pm.Promptmaker, + schedule_tool=self.schedule_tool, + ) + + def test_json_metadata(self): + self.assertEqual( + self.agent.json_metadata, + { + 'type': 'LLMAgent', + 'default_policy': { + 'action_names': [ + 'air_handler_1_supply_air_heating_temperature_setpoint', + 'air_handler_1_supervisor_run_command', + 'boiler_1_supply_water_setpoint', + 'boiler_1_supervisor_run_command', + 'air_handler_2_supply_air_heating_temperature_setpoint', + 'air_handler_2_supervisor_run_command', + ], + 'default_values': [0.0, -1.0, -1.0, -1.0, 0.0, -1.0], + }, + 'override_discrete_defaults': True, + 'schedule_policy': schedule_tool_test.SCHEDULE_METADATA, + 'llm_service': {'type': 'MockLLMService'}, + 'promptmaker': { + 'type': 'Promptmaker', + 'output_schema_class': 'HybridActionContext', + 'include_weights': True, + 'occupancy_mode_min': 10, + 'temp_display_unit': 'Fahrenheit', + 'building_info': { + 'stories': 'two', + 'sqft': 96_000, + 'location': 'Mountain View, California', + 'name': 'SB-1', + }, + }, + 'output_schema': {'type': 'HybridActionContext'}, + 'temp_display_unit': 'Fahrenheit', + 'max_tries': 5, + 'clip': True, + }, + ) + + # PROMPT + + def test_make_prompt(self): + observation_response = self.env.get_observation_response() + reward_info = self.env.get_reward_info() + prompt = self.agent.make_prompt(observation_response, reward_info) + self.assertIsInstance(prompt, str) + self.assertNotEmpty(prompt) + + # RESPONSE VALIDATION + + def test_validate_action_context(self): + valid_response_json = schema_conftest.create_hybrid_action_response() + ctx = self.agent.validate_action_context(valid_response_json) + self.assertIsInstance(ctx, action_context.ActionContext) + + def test_validate_action_context_invalid_json(self): + with self.assertRaisesRegex(json.JSONDecodeError, 'Expecting value'): + self.agent.validate_action_context('oops, invalid json') + + def test_validate_action_context_invalid_schema(self): + with self.assertRaisesRegex( + pydantic.ValidationError, r'validity_interval\n\s+Field required' + ): + self.agent.validate_action_context('{"valid": "json"}') + + def test_validate_action_context_missing_setpoint(self): + invalid_schema_json = schema_conftest.create_hybrid_action_response( + missing_setpoint=True + ) + with self.assertRaisesRegex( + pydantic.ValidationError, r'missing from the schema' + ): + self.agent.validate_action_context(invalid_schema_json) + + def test_validate_action_context_guardrails_exceeded(self): + invalid_schema_json = schema_conftest.create_hybrid_action_response( + ahu_1_run_command=1, + ahu_1_supply_air_temp=99999.0, + hws_run_command=1, + hws_supply_water_temp=99999.0, + ) + ctx = self.agent.validate_action_context(invalid_schema_json) + self.assertEqual( + ctx.guardrails_exceeded, + [ + action_context.GuardrailsExceededRecord( + device_id='air_handler_1', + setpoint_name='supply_air_heating_temperature_setpoint', + requested_value=99999.0, + setpoint_range=(285.0, 295.0), + clipped_value=295.0, + ), + action_context.GuardrailsExceededRecord( + device_id='boiler_1', + setpoint_name='supply_water_setpoint', + requested_value=99999.0, + setpoint_range=(310.0, 350.0), + clipped_value=350.0, + ), + ], + ) + + # GET ACTION + + def test_get_action_context_success(self): + valid_response_json = schema_conftest.create_hybrid_action_response() + self.mock_llm_service.get_response.return_value = valid_response_json + + ctx = self.agent.get_action_context() + self.assertIsInstance(ctx, action_context.ActionContext) + + with self.subTest(name='calls_the_llm'): + self.mock_llm_service.get_response.assert_called_once() + + with self.subTest(name='no_errors'): + self.assertEmpty(self.agent.errors) + + def test_get_action_context_fenced_response(self): + json_data = schema_conftest.create_hybrid_action_response() + fenced_response = ( + f'Here is the JSON you requested:\n```json\n{json_data}\n```\nI hope' + ' that helps!' + ) + self.mock_llm_service.get_response.return_value = fenced_response + + ctx = self.agent.get_action_context() + self.assertIsInstance(ctx, action_context.ActionContext) + + with self.subTest(name='calls_the_llm'): + self.mock_llm_service.get_response.assert_called_once() + + with self.subTest(name='no_errors'): + self.assertEmpty(self.agent.errors) + + +class AlternativeSchemaTestBase(absltest.TestCase): + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT, + default_actions=env_conftest.DEFAULT_HYBRID_ACTIONS, + ) + self.mock_llm_service = mock.create_autospec( + llm_service.BaseLLMService, instance=True, spec_set=True + ) + self.mock_llm_service.json_metadata = {'type': 'MockLLMService'} + valid_json = schema_conftest.create_hybrid_action_response() + self.mock_llm_service.get_response.return_value = valid_json + + +class LLMAgentSetpointsActionSchemaTest(AlternativeSchemaTestBase): + + def setUp(self): + super().setUp() + self.agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker_class=pm.Promptmaker, + ) + + def test_get_action_context(self): + ctx = self.agent.get_action_context() + self.assertIsInstance(ctx, action_context.ActionContext) + + +class LLMAgentCustomValidityIntervalTest(AlternativeSchemaTestBase): + + def setUp(self): + self.custom_intervals = [15, 30, 60, 90] + super().setUp() + self.output_schema_class = action_context.create_action_context_model( + custom_intervals=self.custom_intervals + ) + self.promptmaker = pm.Promptmaker( + env=self.env, + output_schema_class=self.output_schema_class, + lazy_init_protos=True, + ) + self.agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker=self.promptmaker, + ) + + def test_custom_validity_interval(self): + self.assertEqual( + get_args( + self.agent.output_schema_class.__annotations__['validity_interval'] + ), + tuple(self.custom_intervals), + ) + + with self.subTest(name='in_prompt'): + prompt = self.agent.make_prompt( + self.env.get_observation_response(), self.env.get_reward_info() + ) + self.assertIn(str(self.custom_intervals), prompt) + + def test_get_action_context(self): + valid_json = schema_conftest.create_hybrid_action_response() + self.mock_llm_service.get_response.return_value = valid_json + + ctx = self.agent.get_action_context() + self.assertIsInstance(ctx, action_context.ActionContext) + + +class LLMAgentPromptmakerValidationTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.mock_llm_service = mock.create_autospec( + llm_service.BaseLLMService, instance=True, spec_set=True + ) + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT, + default_actions=env_conftest.DEFAULT_HYBRID_ACTIONS, + ) + self.promptmaker_instance = pm.Promptmaker( + env=self.env, lazy_init_protos=True + ) + + def test_init_with_promptmaker_instance_succeeds(self): + agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker=self.promptmaker_instance, + ) + self.assertIsInstance(agent.promptmaker, pm.Promptmaker) + self.assertEqual(agent.promptmaker, self.promptmaker_instance) + + def test_init_with_promptmaker_class_succeeds(self): + agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker_class=pm.Promptmaker, + ) + self.assertIsInstance(agent.promptmaker, pm.Promptmaker) + + with self.subTest(name='uses_default_arguments'): + self.assertEqual( + agent.promptmaker.output_schema_class, + action_context.HybridActionContext, + ) + self.assertTrue(agent.promptmaker.lazy_init_protos) + self.assertTrue(agent.promptmaker.include_weights) + + def test_init_raises_error_with_neither_promptmaker_nor_class(self): + with self.assertRaisesRegex( + ValueError, + 'Either a promptmaker instance or class must be provided, not both.', + ): + llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker=None, + promptmaker_class=None, + ) + + def test_init_raises_error_with_both_promptmaker_and_class(self): + with self.assertRaisesRegex( + ValueError, + 'Either a promptmaker instance or class must be provided, not both.', + ): + llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker=self.promptmaker_instance, + promptmaker_class=pm.Promptmaker, + ) + + +class LLMAgentRetryTest(LLMAgentTest): + """Tests for retry and backoff behavior. + + NOTE: We need to mock time.sleep because of the retry logic used in LLMAgent, + which uses the backoff library to handle retries when the LLM fails to return + a valid response. By default, backoff attempts to wait between retries by + calling time.sleep. If we do not mock time.sleep, the unit tests will actually + pause and wait, but instead we are mocking it to return immediately. + """ + + @mock.patch.object(time, 'sleep', return_value=None) + def test_retry_succeeds_after_failures(self, mock_sleep): + valid_response_json = schema_conftest.create_hybrid_action_response() + self.mock_llm_service.get_response.side_effect = [ + RuntimeError('Service Fail 1'), # on_backoff records this + 'oops invalid json', # on_backoff records this + valid_response_json, + ] + agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker_class=pm.Promptmaker, + max_tries=3, + ) + + ctx = agent.get_action_context() + + # The agent should succeed on the 3rd attempt. + self.assertIsInstance(ctx, action_context.ActionContext) + self.assertEqual(self.mock_llm_service.get_response.call_count, 3) + + # 2 errors should be recorded by on_backoff. + self.assertLen(agent.errors, 2) + self.assertEqual(agent.errors[0].error_type, 'RuntimeError') + self.assertEqual(agent.errors[0].metadata['tries'], 1) + self.assertEqual(agent.errors[1].error_type, 'JSONDecodeError') + self.assertEqual(agent.errors[1].metadata['tries'], 2) + + @mock.patch.object(time, 'sleep', return_value=None) + def test_exceeds_max_retries_and_falls_back(self, mock_sleep): + self.mock_llm_service.get_response.side_effect = RuntimeError( + 'Always failing' + ) + agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker_class=pm.Promptmaker, + max_tries=2, + ) + # Mock scheduled action to confirm fallback. + scheduled_ctx = mock.MagicMock() + with mock.patch.object( + agent, + 'get_scheduled_action_context', + return_value=scheduled_ctx, + autospec=True, + ) as mock_get_scheduled: + ctx = agent.get_action_context() + + # Check that fallback occurred. + self.assertEqual(ctx, scheduled_ctx) + mock_get_scheduled.assert_called_once() + + # on_backoff is called for try 1, on_giveup for try 2. + # Total calls: 2. + # Total errors: + # 1st recorded by _on_backoff + # 2nd recorded by _on_giveup + # MaxRetriesExceededError recorded by _on_giveup + self.assertEqual(self.mock_llm_service.get_response.call_count, 2) + self.assertLen(agent.errors, 3) + + # Error from on_backoff + self.assertEqual(agent.errors[0].error_type, 'RuntimeError') + self.assertEqual(agent.errors[0].metadata['tries'], 1) + self.assertIsNotNone(agent.errors[0].metadata['wait']) + + # Error from on_giveup + self.assertEqual(agent.errors[1].error_type, 'RuntimeError') + self.assertEqual(agent.errors[1].metadata['tries'], 2) + self.assertIsNone(agent.errors[1].metadata['wait']) + + # Exhaustion error from on_giveup + self.assertEqual(agent.errors[2].error_type, 'MaxRetriesExceededError') + + @mock.patch.object(time, 'sleep', return_value=None) + def test_pydantic_error_details_on_giveup(self, mock_sleep): + invalid_schema_json = json.dumps({'validity_interval': 15, 'setpoints': []}) + self.mock_llm_service.get_response.return_value = invalid_schema_json + agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker_class=pm.Promptmaker, + max_tries=1, + ) + + agent.get_action_context() + + # on_giveup is called for try 1 because max_tries=1. + self.assertLen(agent.errors, 2) + err = agent.errors[0] + self.assertEqual(err.error_type, 'ValidationError') + self.assertEqual(err.metadata['tries'], 1) + + # Check that pydantic error details were recorded. + self.assertIsInstance(err.details, list) + self.assertNotEmpty(err.details) + self.assertEqual(err.details[0]['type'], 'missing') + self.assertEqual(err.details[0]['loc'], ('timestamp',)) + + @mock.patch.object(llm_agent.logging, 'exception') + @mock.patch.object(time, 'sleep', return_value=None) + def test_exceeds_max_retries_falls_back_to_previous_action( + self, mock_sleep, mock_exception + ): + valid_response_json = schema_conftest.create_hybrid_action_response( + validity_interval=15 + ) + self.mock_llm_service.get_response.side_effect = [ + valid_response_json, # First call succeeds + RuntimeError('Always failing'), # Second call fails + RuntimeError('Always failing'), # Third call fails (exceeds max_tries) + ] + agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker_class=pm.Promptmaker, + max_tries=2, + ) + + # 1. First call to get_action_context succeeds. + ctx1 = agent.get_action_context() + self.assertEqual(ctx1.validity_interval, 15) + + # 2. Second call to get_action_context fails all retries, should fallback to + # the previous successful action with the environment's time step interval. + ctx2 = agent.get_action_context() + mock_exception.assert_called_once_with( + 'LLM MAX TRIES EXCEEDED. FALLING BACK TO PREVIOUS LLM ACTION...' + ) + + self.assertEqual(ctx2.validity_interval, agent.env.time_step_mins) + self.assertEqual(ctx2.setpoints, ctx1.setpoints) + self.assertEqual( + ctx2.justification, 'Previous LLM action (max retries exceeded)' + ) + self.assertEqual(ctx2.timestamp, ctx1.timestamp) + + @mock.patch.object(llm_agent.logging, 'exception') + @mock.patch.object( + llm_agent.LLMAgent, 'get_scheduled_action_context', autospec=True + ) + @mock.patch.object(time, 'sleep', return_value=None) + def test_exceeds_max_retries_no_previous_action_falls_back_to_schedule( + self, mock_sleep, mock_get_scheduled, mock_exception + ): + self.mock_llm_service.get_response.side_effect = RuntimeError('OOPS') + + agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker_class=pm.Promptmaker, + max_tries=2, + ) + + scheduled_ctx = mock.MagicMock() + mock_get_scheduled.return_value = scheduled_ctx + + ctx = agent.get_action_context() + self.assertEqual(ctx, scheduled_ctx) + mock_get_scheduled.assert_called_once() + mock_exception.assert_called_once_with( + 'LLM MAX TRIES EXCEEDED. NO PREVIOUS LLM ACTION AVAILABLE. FALLING' + ' BACK TO SCHEDULED ACTION...' + ) + + +class LLMAgentNonActionContextSchemaTest(AlternativeSchemaTestBase): + + def setUp(self): + super().setUp() + self.agent = llm_agent.LLMAgent( + env=self.env, + llm_service=self.mock_llm_service, + promptmaker_class=pm.Promptmaker, + ) + + def test_validate_action_context_non_subclass(self): + self.agent.output_schema_class = output_schema.SetpointsAction + valid_response_json = schema_conftest.create_hybrid_action_response() + + ctx = self.agent.validate_action_context(valid_response_json) + + self.assertIsInstance(ctx, action_context.ActionContext) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/llm/agents/schedule_agent.py b/smart_control/llm/agents/schedule_agent.py new file mode 100644 index 00000000..2e2feb6e --- /dev/null +++ b/smart_control/llm/agents/schedule_agent.py @@ -0,0 +1,195 @@ +"""Schedule policy agent. + +This agent determines its actions based on the building's operational +schedule. Based on the current date and time, if the building is operational, +the agent will turn on all devices and use the environment's default setpoint +values. Otherwise, when the building is not operational, the agent will turn off +all devices. + +This agent requires a hybrid action environment, because it needs a mechanism +for turning devices on and off. +""" + +from typing import Final + +import numpy as np + +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.agents import default_agent +from smart_buildings.smart_control.llm.schema import action_context +from smart_buildings.smart_control.llm.schema import output_schema +from smart_buildings.smart_control.llm.utils import schedule_tool as schedule_lib +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 as reward_pb2 +from smart_buildings.smart_control.utils import serialization + + +NATIVE_ON: Final[float] = 1.0 +NATIVE_OFF: Final[float] = 0.0 + + +class SchedulePolicyAgent(default_agent.DefaultPolicyAgent): + """An agent that determines its actions based on the building's schedule. + + Based on the current date and time, if the building is operational, the agent + will turn on all devices and use the environment's default setpoint values. + Otherwise, when the building is not operational, the agent will turn off all + devices. + + Because it is possible (but not common) for an environment's default values to + specify a device should be off, if you want to preserve that behavior and + prevent those devices from being turned on during operational hours, set the + `override_discrete_defaults` to `False`, and the agent will respect those + default values. + + This agent is to be used in conjunction with a hybrid action environment, so + it has a mechanism for turning devices ON or OFF. + + Attributes: + schedule_tool: The BuildingScheduleTool instance used to determine the + building's operational schedule. + override_discrete_defaults: Whether to override the environment's default + values for discrete actions (e.g., turning devices ON/OFF) during + operational hours. If True, discrete devices will be turned ON during + operational hours, even if the default value is OFF. If False, the + default discrete values are respected. + """ + + def __init__( + self, + *, + env: hybrid_action_environment.HybridActionEnvironment, + clip: bool = True, + override_discrete_defaults: bool = True, + schedule_tool: schedule_lib.BuildingScheduleTool | None = None, + ): + """Initializes the instance. + + Args: + env: The hybrid action environment the agent will interact with. + clip: Whether to clip setpoint values to the bounds of the valid range. If + `False`, raises `GuardrailsExceededError` if setpoint values are out of + range. Otherwise, clips the setpoint values to the valid range, and logs + a record of the error. Defaults to `True`. + override_discrete_defaults: Whether to override the default policy values + for discrete actions during operational hours. By default, the agent + will turn on all devices during operational hours, potentially + overriding any default values that specify a device should be off. If + you have default values that specify a device should be off during + operational hours, set this option to `False` and the agent will respect + those defaults. + schedule_tool: Optionally provide a BuildingScheduleTool instance. + Otherwise, a schedule tool will be constructed using the agent's + environment and default schedule tool arguments. + """ + super().__init__(env=env, clip=clip) + self.schedule_tool = schedule_tool or schedule_lib.BuildingScheduleTool( + env=env, + ) + self.override_discrete_defaults = override_discrete_defaults + + @property + def json_metadata(self) -> serialization.SerializableData: + """Info to write into a JSON file. Needs to be serializable.""" + return super().json_metadata | { + "override_discrete_defaults": self.override_discrete_defaults, + "schedule_policy": self.schedule_tool.json_metadata, + } + + @property + def building_operational_mode(self) -> schedule_lib.BuildingOperationalMode: + """The building's operational mode.""" + return self.schedule_tool.building_operational_mode + + @property + def building_is_operational(self) -> bool: + """Whether the building is operational.""" + return self.schedule_tool.building_is_operational + + @property + def scheduled_justification(self) -> str: + return f"Scheduled action ({self.building_operational_mode.value.upper()})" + + @property + def scheduled_setpoint_justification(self) -> str: + return f"Scheduled value ({self.building_operational_mode.value.upper()})" + + def get_scheduled_native_value( + self, setpoint_name: str, native_value: float + ) -> float: + """Determines the scheduled native value for a given setpoint. + + This method will flip the value of discrete actions to ON or OFF, depending + on whether the building is operational or not. + + Because it is possible (but not common) for an environment's default values + to specify a device should be off, if you want to preserve that behavior and + prevent those devices from being turned on during operational hours, set the + `override_discrete_defaults` to `False`, and the agent will respect those + default values. + + Args: + setpoint_name: The name of a given setpoint. + native_value: The native action value for the given setpoint. + + Returns: + The scheduled native action value for the setpoint. + """ + if not hybrid_action_environment.is_discrete_action(setpoint_name): + return native_value + + if self.building_is_operational: + return NATIVE_ON if self.override_discrete_defaults else native_value + return NATIVE_OFF + + def get_scheduled_action_context(self) -> action_context.ActionContext: + """Gets an action context based on the building's operational schedule. + + This action context uses the environment's default policy values as a base, + but ensures devices are turned off during non-operational hours, and on + during operational hours. + + Returns: + An action context representing the scheduled action. + """ + setpoints = [] + for action_name, normalized_value in zip( + self.env.action_names, self.env.default_policy_values, strict=True + ): + device_id, setpoint_name = self.env.id_map.inv[action_name] + + normalizer = self.env.action_normalizers.get(setpoint_name) + if normalizer is None: + raise ValueError(f"No normalizer found for setpoint: {setpoint_name}") + + native_value = normalizer.setpoint_value(np.array(normalized_value)) + scheduled_native_value = self.get_scheduled_native_value( + setpoint_name=setpoint_name, native_value=native_value + ) + + setpoints.append( + output_schema.DeviceSetpoint( + device_id=device_id, + setpoint_name=setpoint_name, + setpoint_value=scheduled_native_value, + justification=self.scheduled_setpoint_justification, + ) + ) + + return self.action_context_class( + env=self.env, + clip=self._clip, + timestamp=str(self.env.current_local_timestamp), + justification=self.scheduled_justification, + validity_interval=self.env.time_step_mins, + setpoints=setpoints, + ) + + def get_action_context( + self, + observation_response: building_pb2.ObservationResponse | None = None, + reward_info: reward_pb2.RewardInfo | None = None, + ) -> action_context.ActionContext: + """Returns the action context for the environment.""" + del observation_response, reward_info # Unused in this implementation. + return self.get_scheduled_action_context() diff --git a/smart_control/llm/agents/schedule_agent_test.py b/smart_control/llm/agents/schedule_agent_test.py new file mode 100644 index 00000000..2af01b84 --- /dev/null +++ b/smart_control/llm/agents/schedule_agent_test.py @@ -0,0 +1,170 @@ +from unittest import mock + +from absl.testing import absltest +from absl.testing import parameterized + +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.llm.agents import default_agent_test +from smart_buildings.smart_control.llm.agents import schedule_agent +from smart_buildings.smart_control.llm.schema import action_context +from smart_buildings.smart_control.llm.utils import schedule_tool +from smart_buildings.smart_control.llm.utils import schedule_tool_test + +TIME_ZONE = "US/Pacific" + + +class ScheduleHybridActionAgentTest( + default_agent_test.DefaultHybridActionAgentTest +): + + agent: schedule_agent.SchedulePolicyAgent + + def _create_environment( + self, start_timestamp=schedule_tool_test.CURRENT_LOCAL_TIMESTAMP + ): + return super()._create_environment(start_timestamp=start_timestamp) + + def _create_agent(self, env): + return schedule_agent.SchedulePolicyAgent(env=env) + + def test_json_metadata(self): + self.assertEqual( + self.agent.json_metadata, + { + "type": "SchedulePolicyAgent", + "default_policy": { + "action_names": [ + "air_handler_1_supply_air_heating_temperature_setpoint", + "air_handler_1_supervisor_run_command", + "boiler_1_supply_water_setpoint", + "boiler_1_supervisor_run_command", + "air_handler_2_supply_air_heating_temperature_setpoint", + "air_handler_2_supervisor_run_command", + ], + "default_values": [0.0, -1.0, -1.0, -1.0, 0.0, -1.0], + }, + "clip": True, + "override_discrete_defaults": True, + "schedule_policy": schedule_tool_test.SCHEDULE_METADATA, + }, + ) + + def test_building_is_operational(self): + self.assertTrue(self.agent.building_is_operational) + + def test_building_operational_mode(self): + self.assertEqual( + self.agent.building_operational_mode, + schedule_tool.BuildingOperationalMode.ON, + ) + + def test_justifications(self): + self.assertEqual( + self.agent.scheduled_justification, + "Scheduled action (ON)", + ) + self.assertEqual( + self.agent.scheduled_setpoint_justification, + "Scheduled value (ON)", + ) + + def test_scheduled_action_context(self): + ctx = self.agent.get_scheduled_action_context() + self.assertIsInstance(ctx, action_context.HybridActionContext) + + with self.subTest(name="timestamp"): + self.assertEqual(ctx.timestamp, str(self.env.current_local_timestamp)) + + with self.subTest(name="justification"): + self.assertEqual(ctx.justification, self.agent.scheduled_justification) + + with self.subTest(name="validity_interval"): + self.assertEqual(ctx.validity_interval, self.env.time_step_mins) + + with self.subTest(name="setpoints"): + self.assertLen(ctx.setpoints, len(self.env.action_names)) + + # Setpoint and device names should match the env's action names: + names = [(sp.device_id, sp.setpoint_name) for sp in ctx.setpoints] + self.assertEqual( + names, + [ + ("air_handler_1", "supply_air_heating_temperature_setpoint"), + ("air_handler_1", "supervisor_run_command"), + ("boiler_1", "supply_water_setpoint"), + ("boiler_1", "supervisor_run_command"), + ("air_handler_2", "supply_air_heating_temperature_setpoint"), + ("air_handler_2", "supervisor_run_command"), + ], + ) + + # Setpoint values should be native versions of the env's default values + # overridden by schedule policy. + setpoint_values = [sp.setpoint_value for sp in ctx.setpoints] + self.assertSequenceAlmostEqual( + setpoint_values, [290.0, 1.0, 310.0, 1.0, 290.0, 1.0] + ) + + def test_get_action_context(self): + ctx = self.agent.get_action_context() + self.assertIsInstance(ctx, action_context.HybridActionContext) + self.assertEqual(ctx, self.agent.get_scheduled_action_context()) + + +class ScheduleScenariosTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT, + default_actions=env_conftest.DEFAULT_HYBRID_ACTIONS, + start_timestamp=schedule_tool_test.CURRENT_LOCAL_TIMESTAMP, + ) + + @parameterized.parameters( + # Parameters: + # setpoint_name, native_val, is_operational, will_override, expected_val + # ... + # Continuous setpoint, building is operational: + ("supply_air_heating_temperature_setpoint", 290.0, True, True, 290.0), + ("supply_air_heating_temperature_setpoint", 290.0, True, False, 290.0), + # Continuous setpoint, building is non-operational: + ("supply_air_heating_temperature_setpoint", 290.0, False, True, 290.0), + ("supply_air_heating_temperature_setpoint", 290.0, False, False, 290.0), + # Discrete action, building is non-operational + ("supervisor_run_command", 1.0, False, True, 0.0), + ("supervisor_run_command", 1.0, False, False, 0.0), + # Discrete action, building is operational, override defaults: + ("supervisor_run_command", 1.0, True, True, 1.0), # FLIPPED ON + ("supervisor_run_command", 0.0, True, True, 1.0), # FLIPPED ON + ("supervisor_run_command", -1.0, True, True, 1.0), # FLIPPED ON + # Discrete action, building is operational, do not override defaults: + ("supervisor_run_command", 1.0, True, False, 1.0), + ("supervisor_run_command", 0.0, True, False, 0.0), + ("supervisor_run_command", -1.0, True, False, -1.0), + ) + def test_get_scheduled_native_value( + self, + setpoint_name, + native_value, + building_is_operational, + override_discrete_defaults, + expected_value, + ): + mock_schedule_tool = mock.Mock() + type(mock_schedule_tool).building_is_operational = mock.PropertyMock( + return_value=building_is_operational + ) + agent = schedule_agent.SchedulePolicyAgent( + env=self.env, + schedule_tool=mock_schedule_tool, + override_discrete_defaults=override_discrete_defaults, + ) + self.assertEqual( + agent.get_scheduled_native_value(setpoint_name, native_value), + expected_value, + ) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/llm_environment_test.py b/smart_control/llm/llm_environment_test.py new file mode 100644 index 00000000..d38cfef9 --- /dev/null +++ b/smart_control/llm/llm_environment_test.py @@ -0,0 +1,726 @@ +"""More tests for the environment, to ensure the LLM agent can use it.""" + +import dataclasses + +from absl.testing import absltest +from absl.testing import parameterized +import mock +import pandas as pd + +from smart_buildings.smart_control.environment import conftest +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.models import base_building +from smart_buildings.smart_control.models import base_reward_function +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.utils import bounded_action_normalizer +from smart_buildings.smart_control.utils import building_image_generator +from smart_buildings.smart_control.utils import controller_writer +from smart_buildings.smart_control.utils import observation_normalizer + + +class LLMEnvironmentTest(parameterized.TestCase): + """Ensures the environment has what it needs for an LLM agent use case.""" + + def setUp(self): + super().setUp() + self.env = conftest.create_environment( + default_actions=conftest.DEFAULT_ACTIONS + ) + + def test_initialization(self): + self.assertIsInstance(self.env, environment.Environment) + + with self.subTest(name="building"): + self.assertIsInstance(self.env.building, base_building.BaseBuilding) + + with self.subTest(name="reward_function"): + self.assertIsInstance( + self.env.reward_function, base_reward_function.BaseRewardFunction + ) + + with self.subTest(name="observation_normalizer"): + self.assertIsInstance( + self.env.observation_normalizer, + observation_normalizer.StandardScoreObservationNormalizer, + ) + + with self.subTest(name="action_normalizers"): + self.assertIsInstance(self.env.action_normalizers, dict) + + bounded_normalizers = [ + isinstance(n, bounded_action_normalizer.BoundedActionNormalizer) + for n in self.env.action_normalizers.values() + ] + self.assertTrue(all(bounded_normalizers)) + + with self.subTest(name="default_actions"): + self.assertEqual( + self.env.default_action_values, conftest.DEFAULT_ACTION_VALUES + ) + + def test_properties(self): + with self.subTest(name="step_count"): + self.assertEqual(self.env.step_count, 0) + + with self.subTest(name="time_step_sec"): + self.assertEqual(self.env.time_step_sec, 300) + + with self.subTest(name="time_step_mins"): + self.assertEqual(self.env.time_step_mins, 5) + + with self.subTest(name="time_zone"): + self.assertEqual(self.env.time_zone, "US/Pacific") + + with self.subTest(name="current_simulation_timestamp"): + ts = self.env.current_simulation_timestamp + self.assertIsNone(ts.tz) + self.assertEqual(ts, pd.Timestamp("2021-06-07 12:00:01")) + + with self.subTest(name="current_local_timestamp"): + ts = self.env.current_local_timestamp + self.assertEqual(ts, pd.Timestamp("2021-06-07 12:00:01", tz="US/Pacific")) + + with self.subTest(name="json_metadata"): + expected_metadata = { + "type": "Environment", + "time_step_sec": 300.0, + "start_timestamp": "2021-06-07 12:00:01", + "end_timestamp": "2021-06-10 12:00:01", + "metrics_output_dir": None, + "action_names": [ + "air_handler_1_supply_air_heating_temperature_setpoint", + "boiler_1_supply_water_setpoint", + "air_handler_2_supply_air_heating_temperature_setpoint", + ], + "default_action_values": [0.0, -1.0, 0.0], + "reward_function": {"type": "SimpleRewardFunction"}, + "building": { + "n_devices": 4, + "n_zones": 2, + "device_ids": [ + "air_handler_1", + "boiler_1", + "air_handler_2", + "vav_1", + ], + "zone_ids": ["zone_1", "zone_2"], + }, + "occupancy": None, + } + self.assertEqual(self.env.json_metadata, expected_metadata) + + def test_json_metadata_with_occupancy(self): + self.env.building.occupancy = mock.MagicMock() + occupancy_metadata = {"type": "MockOccupancyModel"} + self.env.building.occupancy.json_metadata = occupancy_metadata + self.assertEqual(self.env.json_metadata["occupancy"], occupancy_metadata) + + def test_building_devices(self): + df = self.env.building.devices_df + self.assertIsInstance(df, pd.DataFrame) + + expected_records = [ + { + "device_id": "air_handler_1", + "namespace": "", + "code": "", + "zone_id": "zone_1", + "device_type_id": smart_control_building_pb2.DeviceInfo.AHU, + "device_type": "AHU", + }, + { + "device_id": "boiler_1", + "namespace": "", + "code": "", + "zone_id": "zone_1", + "device_type_id": smart_control_building_pb2.DeviceInfo.BLR, + "device_type": "BLR", + }, + { + "device_id": "air_handler_2", + "namespace": "", + "code": "", + "zone_id": "zone_2", + "device_type_id": smart_control_building_pb2.DeviceInfo.AHU, + "device_type": "AHU", + }, + { + "device_id": "vav_1", + "namespace": "", + "code": "", + "zone_id": "zone_2", + "device_type_id": smart_control_building_pb2.DeviceInfo.VAV, + "device_type": "VAV", + }, + ] + self.assertEqual(df.to_dict("records"), expected_records) + + def test_building_zones(self): + df = self.env.building.zones_df + self.assertIsInstance(df, pd.DataFrame) + + expected_records = [ + { + "building_id": "SimpleBuilding", + "zone_id": "zone_1", + "zone_type_id": smart_control_building_pb2.ZoneInfo.UNDEFINED, + "zone_type": "UNDEFINED", + "description": "zone_1", + "area": 0.0, + "floor": 0, + "device_ids": ["air_handler_1", "boiler_1"], + }, + { + "building_id": "SimpleBuilding", + "zone_id": "zone_2", + "zone_type_id": smart_control_building_pb2.ZoneInfo.UNDEFINED, + "zone_type": "UNDEFINED", + "description": "zone_2", + "area": 0.0, + "floor": 0, + "device_ids": ["air_handler_2", "vav_1"], + }, + ] + self.assertEqual(df.to_dict("records"), expected_records) + + def test_action_fields_df(self): + self.assertIsInstance(self.env.action_fields_df, pd.DataFrame) + records = self.env.action_fields_df.to_dict("records") + expected_records = [ + { + "action_name": "air_handler_1_supply_air_heating_temperature_setpoint", # pylint: disable=line-too-long + "device_id": "air_handler_1", + "device_type": "AHU", + "zone_id": "zone_1", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "setpoint_type": "CONTINUOUS", + "units": "Kelvin", + "max_native_value": 295.0, + "max_normalized_value": 1.0, + "min_native_value": 285.0, + "min_normalized_value": -1.0, + }, + { + "action_name": "boiler_1_supply_water_setpoint", + "device_id": "boiler_1", + "device_type": "BLR", + "zone_id": "zone_1", + "setpoint_name": "supply_water_setpoint", + "value_type": "VALUE_CONTINUOUS", + "setpoint_type": "CONTINUOUS", + "units": "Kelvin", + "max_native_value": 350.0, + "max_normalized_value": 1.0, + "min_native_value": 310.0, + "min_normalized_value": -1.0, + }, + { + "action_name": "air_handler_2_supply_air_heating_temperature_setpoint", # pylint: disable=line-too-long + "device_id": "air_handler_2", + "device_type": "AHU", + "zone_id": "zone_2", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "setpoint_type": "CONTINUOUS", + "units": "Kelvin", + "max_native_value": 295.0, + "max_normalized_value": 1.0, + "min_native_value": 285.0, + "min_normalized_value": -1.0, + }, + ] + self.assertCountEqual(records, expected_records) + + @parameterized.named_parameters( + dict( + testcase_name="records_from_normalized_values", + method_name="get_action_records_from_normalized_values", + values=conftest.NORMALIZED_ACTION_VALUES, + expect_df=False, + ), + dict( + testcase_name="df_from_normalized_values", + method_name="get_action_df_from_normalized_values", + values=conftest.NORMALIZED_ACTION_VALUES, + expect_df=True, + ), + dict( + testcase_name="records_from_native_values", + method_name="get_action_records_from_native_values", + values=conftest.NATIVE_ACTION_VALUES, + expect_df=False, + ), + dict( + testcase_name="df_from_native_values", + method_name="get_action_df_from_native_values", + values=conftest.NATIVE_ACTION_VALUES, + expect_df=True, + ), + ) + def test_get_action_records(self, method_name, values, expect_df): + result = getattr(self.env, method_name)(values) + if expect_df: + self.assertCountEqual( + result.to_dict("records"), conftest.ACTION_RECORDS + ) + else: + self.assertCountEqual( + [dataclasses.asdict(r) for r in result], + conftest.ACTION_RECORDS, + ) + + def test_step(self): + self.env.reset() + self.assertEqual(self.env.step_count, 0) + self.env.step([0, 0, 0]) # normalized action values + self.assertEqual(self.env.step_count, 1) + + def test_step_with_defaults(self): + self.env.reset() + self.assertEqual(self.env.step_count, 0) + self.env.step(self.env.default_action_values) + self.assertEqual(self.env.step_count, 1) + + def test_observations(self): + n_device_measurements = 4 # see all "_measurement" in conftest.LAYOUT + n_auxiliary_measurements = 7 + n_observations = n_device_measurements + n_auxiliary_measurements + self.assertEqual( + self.env.observation_spec(), + conftest.create_observation_spec(n_observations), + ) + + def test_actions(self): + self.assertEqual( + self.env.action_spec(), conftest.create_action_spec(n_continuous=3) + ) + self.assertSequenceEqual( + self.env.action_names, + [ + "air_handler_1_supply_air_heating_temperature_setpoint", + "boiler_1_supply_water_setpoint", + "air_handler_2_supply_air_heating_temperature_setpoint", + ], + ) + + +class LLMHybridActionEnvironmentTest(parameterized.TestCase): + """Ensures the environment has what it needs for an LLM agent use case.""" + + def setUp(self): + super().setUp() + self.env = conftest.create_hybrid_action_environment( + layout=conftest.DEMO_LAYOUT, + default_actions=conftest.DEFAULT_HYBRID_ACTIONS + ) + + def test_initialization(self): + self.assertIsInstance( + self.env, hybrid_action_environment.HybridActionEnvironment + ) + + with self.subTest(name="building"): + self.assertIsInstance(self.env.building, base_building.BaseBuilding) + + with self.subTest(name="reward_function"): + self.assertIsInstance( + self.env.reward_function, base_reward_function.BaseRewardFunction + ) + + with self.subTest(name="observation_normalizer"): + self.assertIsInstance( + self.env.observation_normalizer, + observation_normalizer.StandardScoreObservationNormalizer, + ) + + with self.subTest(name="action_normalizers"): + self.assertIsInstance(self.env.action_normalizers, dict) + + self.assertEqual( + set(type(n) for n in self.env.action_normalizers.values()), + {bounded_action_normalizer.BoundedActionNormalizer}, + ) + + with self.subTest(name="default_actions"): + self.assertEqual( + self.env.default_action_values, conftest.DEFAULT_HYBRID_ACTION_VALUES + ) + self.assertEqual( + self.env.default_hybrid_action, conftest.DEFAULT_HYBRID_ACTION_DICT + ) + + def test_building_devices(self): + df = self.env.building.devices_df + self.assertIsInstance(df, pd.DataFrame) + + expected_records = [ + { + "device_id": "air_handler_1", + "namespace": "", + "code": "", + "zone_id": "zone_1", + "device_type_id": smart_control_building_pb2.DeviceInfo.AHU, + "device_type": "AHU", + }, + { + "device_id": "boiler_1", + "namespace": "", + "code": "", + "zone_id": "zone_1", + "device_type_id": smart_control_building_pb2.DeviceInfo.BLR, + "device_type": "BLR", + }, + { + "device_id": "air_handler_2", + "namespace": "", + "code": "", + "zone_id": "zone_2", + "device_type_id": smart_control_building_pb2.DeviceInfo.AHU, + "device_type": "AHU", + }, + { + "device_id": "outside_air_sensor", + "namespace": "", + "code": "", + "zone_id": "zone_2", + "device_type_id": smart_control_building_pb2.DeviceInfo.UNDEFINED, + "device_type": "UNDEFINED", + }, + ] + self.assertEqual(df.to_dict("records"), expected_records) + + def test_building_zones(self): + df = self.env.building.zones_df + self.assertIsInstance(df, pd.DataFrame) + + expected_records = [ + { + "building_id": "SimpleBuilding", + "zone_id": "zone_1", + "zone_type_id": smart_control_building_pb2.ZoneInfo.UNDEFINED, + "zone_type": "UNDEFINED", + "description": "zone_1", + "area": 0.0, + "floor": 0, + "device_ids": ["air_handler_1", "boiler_1"], + }, + { + "building_id": "SimpleBuilding", + "zone_id": "zone_2", + "zone_type_id": smart_control_building_pb2.ZoneInfo.UNDEFINED, + "zone_type": "UNDEFINED", + "description": "zone_2", + "area": 0.0, + "floor": 0, + "device_ids": ["air_handler_2", "outside_air_sensor"], + }, + ] + self.assertEqual(df.to_dict("records"), expected_records) + + def test_properties(self): + with self.subTest(name="time_zone"): + self.assertEqual(self.env.time_zone, "US/Pacific") + + with self.subTest(name="current_simulation_timestamp"): + self.assertEqual( + self.env.current_simulation_timestamp, + pd.Timestamp("2021-06-07 12:00:01"), + ) + + with self.subTest(name="step_count"): + self.assertEqual(self.env.step_count, 0) + + with self.subTest(name="json_metadata"): + expected_metadata = { + "type": "HybridActionEnvironment", + "time_step_sec": 300.0, + "start_timestamp": "2021-06-07 12:00:01", + "end_timestamp": "2021-06-10 12:00:01", + "metrics_output_dir": None, + "action_names": [ + "air_handler_1_supply_air_heating_temperature_setpoint", + "air_handler_1_supervisor_run_command", + "boiler_1_supply_water_setpoint", + "boiler_1_supervisor_run_command", + "air_handler_2_supply_air_heating_temperature_setpoint", + "air_handler_2_supervisor_run_command", + ], + "default_action_values": [0.0, -1.0, -1.0, -1.0, 0.0, -1.0], + "reward_function": {"type": "SimpleRewardFunction"}, + "building": { + "n_devices": 4, + "n_zones": 2, + "device_ids": [ + "air_handler_1", + "boiler_1", + "air_handler_2", + "outside_air_sensor", + ], + "zone_ids": ["zone_1", "zone_2"], + }, + "occupancy": None, + } + self.assertEqual(self.env.json_metadata, expected_metadata) + + def test_action_fields_df(self): + df = self.env.action_fields_df + self.assertIsInstance(df, pd.DataFrame) + expected_records = [ + { + "action_name": "air_handler_1_supervisor_run_command", + "device_id": "air_handler_1", + "device_type": "AHU", + "zone_id": "zone_1", + "setpoint_name": "supervisor_run_command", + "value_type": "VALUE_CONTINUOUS", + "setpoint_type": "DISCRETE", + "units": "On/Off", + "max_native_value": 1.0, + "max_normalized_value": 1.0, + "min_native_value": 0.0, + "min_normalized_value": -1.0, + }, + { + "action_name": "air_handler_1_supply_air_heating_temperature_setpoint", # pylint: disable=line-too-long + "device_id": "air_handler_1", + "device_type": "AHU", + "zone_id": "zone_1", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "setpoint_type": "CONTINUOUS", + "units": "Kelvin", + "max_native_value": 295.0, + "max_normalized_value": 1.0, + "min_native_value": 285.0, + "min_normalized_value": -1.0, + }, + { + "action_name": "boiler_1_supervisor_run_command", + "device_id": "boiler_1", + "device_type": "BLR", + "zone_id": "zone_1", + "setpoint_name": "supervisor_run_command", + "value_type": "VALUE_CONTINUOUS", + "setpoint_type": "DISCRETE", + "units": "On/Off", + "max_native_value": 1.0, + "max_normalized_value": 1.0, + "min_native_value": 0.0, + "min_normalized_value": -1.0, + }, + { + "action_name": "boiler_1_supply_water_setpoint", + "device_id": "boiler_1", + "device_type": "BLR", + "zone_id": "zone_1", + "setpoint_name": "supply_water_setpoint", + "value_type": "VALUE_CONTINUOUS", + "setpoint_type": "CONTINUOUS", + "units": "Kelvin", + "max_native_value": 350.0, + "max_normalized_value": 1.0, + "min_native_value": 310.0, + "min_normalized_value": -1.0, + }, + { + "action_name": "air_handler_2_supervisor_run_command", + "device_id": "air_handler_2", + "device_type": "AHU", + "zone_id": "zone_2", + "setpoint_name": "supervisor_run_command", + "value_type": "VALUE_CONTINUOUS", + "setpoint_type": "DISCRETE", + "units": "On/Off", + "max_native_value": 1.0, + "max_normalized_value": 1.0, + "min_native_value": 0.0, + "min_normalized_value": -1.0, + }, + { + "action_name": "air_handler_2_supply_air_heating_temperature_setpoint", # pylint: disable=line-too-long + "device_id": "air_handler_2", + "device_type": "AHU", + "zone_id": "zone_2", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "value_type": "VALUE_CONTINUOUS", + "setpoint_type": "CONTINUOUS", + "units": "Kelvin", + "max_native_value": 295.0, + "max_normalized_value": 1.0, + "min_native_value": 285.0, + "min_normalized_value": -1.0, + }, + ] + self.assertCountEqual(df.to_dict("records"), expected_records) + + @parameterized.named_parameters( + dict( + testcase_name="records_from_normalized_values", + method_name="get_action_records_from_normalized_values", + values=conftest.NORMALIZED_HYBRID_ACTION_VALUES, + expect_df=False, + ), + dict( + testcase_name="df_from_normalized_values", + method_name="get_action_df_from_normalized_values", + values=conftest.NORMALIZED_HYBRID_ACTION_VALUES, + expect_df=True, + ), + dict( + testcase_name="records_from_native_values", + method_name="get_action_records_from_native_values", + values=conftest.NATIVE_HYBRID_ACTION_VALUES, + expect_df=False, + ), + dict( + testcase_name="df_from_native_values", + method_name="get_action_df_from_native_values", + values=conftest.NATIVE_HYBRID_ACTION_VALUES, + expect_df=True, + ), + ) + def test_get_action_records(self, method_name, values, expect_df): + result = getattr(self.env, method_name)(values) + if expect_df: + self.assertCountEqual( + result.to_dict("records"), conftest.HYBRID_ACTION_RECORDS + ) + else: + self.assertCountEqual( + [dataclasses.asdict(r) for r in result], + conftest.HYBRID_ACTION_RECORDS, + ) + + def test_step(self): + self.env.reset() + self.assertEqual(self.env.step_count, 0) + self.env.step({ + "discrete_action": [0, 0, 0], + "continuous_action": [-1.0, 0.0, 1.0], + }) + self.assertEqual(self.env.step_count, 1) + + def test_step_with_defaults(self): + self.env.reset() + self.assertEqual(self.env.step_count, 0) + self.env.step(self.env.default_hybrid_action) + self.assertEqual(self.env.step_count, 1) + + def test_convert_to_hybrid(self): + action_values = [-1.0, -1.0, 0.0, 1.0, 1.0, 1.0] + expected_hybrid_action = { + "discrete_action": [0.0, 1.0, 1.0], + "continuous_action": [-1.0, 0.0, 1.0], + } + hybrid_action = self.env.convert_to_hybrid(action_values) + self.assertEqual(hybrid_action, expected_hybrid_action) + + def test_observations(self): + n_device_measurements = 1 # see all "_measurement" in conftest.DEMO_LAYOUT + n_auxiliary_measurements = 7 + n_observations = n_device_measurements + n_auxiliary_measurements + with self.subTest(name="observation_spec"): + self.assertEqual( + self.env.observation_spec(), + conftest.create_observation_spec(n_observations), + ) + + def test_actions(self): + with self.subTest(name="action_spec"): + self.assertEqual( + self.env.action_spec(), + conftest.create_hybrid_action_spec(n_continuous=3, n_discrete=3), + ) + + with self.subTest(name="action_names"): + self.assertSequenceEqual( + self.env.action_names, + [ + "air_handler_1_supply_air_heating_temperature_setpoint", + "air_handler_1_supervisor_run_command", + "boiler_1_supply_water_setpoint", + "boiler_1_supervisor_run_command", + "air_handler_2_supply_air_heating_temperature_setpoint", + "air_handler_2_supervisor_run_command", + ], + ) + + +# +# METRICS WRITER TESTS +# + + +class EnvironmentMetricsWriterTest(parameterized.TestCase): + """Ensures the environment metrics are written.""" + + def setUp(self): + super().setUp() + self.metrics_path = self.create_tempdir().full_path + writer_factory = controller_writer.ProtoWriterFactory() + self.env = conftest.create_environment( + metrics_path=self.metrics_path, writer_factory=writer_factory + ) + + def test_metrics_writer(self): + self.assertIsInstance( + self.env._metrics_writer, controller_writer.ProtoWriter + ) + self.assertStartsWith( + self.env._metrics_writer._output_dir, self.metrics_path + ) + + def test_reset_writes_metrics(self): + # the setup for this test is a little more complex, since the reset() method + # creates a new metrics writer... + # so we are mocking the writer_factory.create method to return a mock writer + writer = mock.create_autospec(controller_writer.ProtoWriter, instance=True) + + with mock.patch.object( + self.env._writer_factory, "create", return_value=writer, autospec=True + ) as mock_create_method: + self.env.reset() + + mock_create_method.assert_called_once() + writer.write_device_infos.assert_called_once_with(self.env.building.devices) + writer.write_zone_infos.assert_called_once_with(self.env.building.zones) + + @parameterized.parameters("get_reward", "get_reward_info") + def test_reward_methods_write_metrics(self, method_name): + self.env._metrics_writer = mock.Mock() + + getattr(self.env, method_name)() + + with self.subTest(name="writes reward_info"): + self.env._metrics_writer.write_reward_info.assert_called_once() + + with self.subTest(name="writes reward_response"): + self.env._metrics_writer.write_reward_response.assert_called_once() + + @parameterized.parameters("get_observation_response", "_get_observation") + def test_observation_methods_write_metrics(self, method_name): + self.env._metrics_writer = mock.Mock() + self.env._building_image_generator = mock.create_autospec( + building_image_generator.BuildingImageGenerator, instance=True + ) + + getattr(self.env, method_name)() + + with self.subTest(name="writes observation_response"): + self.env._metrics_writer.write_observation_response.assert_called_once() + + with self.subTest(name="writes building image if generator is set"): + self.env._metrics_writer.write_building_image.assert_called_once() + + def test_step_writes_metrics(self): + self.env._metrics_writer = mock.Mock() + + self.env.step([0, 0, 0]) + + self.env._metrics_writer.write_action_response.assert_called_once() + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/loop/conftest.py b/smart_control/llm/loop/conftest.py new file mode 100644 index 00000000..e6840515 --- /dev/null +++ b/smart_control/llm/loop/conftest.py @@ -0,0 +1,54 @@ +"""Factories and helpers for control loop tests.""" + +from unittest import mock +import pandas as pd +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.llm.agents import default_agent +from smart_buildings.smart_control.llm.loop import control_loop +from smart_buildings.smart_control.utils import writer_lib + + +START_TIMESTAMP = pd.Timestamp('2025-12-12 00:00:00', tz='US/Pacific') + + +def create_loop( + start_timestamp: pd.Timestamp = START_TIMESTAMP, + loop_class: type[control_loop.ControlLoop] = control_loop.ControlLoop, + max_steps: int | None = 5, + hybrid: bool = True, + agent: default_agent.DefaultPolicyAgent | None = None, +) -> control_loop.ControlLoop: + """Creates a control loop, with a default agent, for testing purposes. + + Args: + start_timestamp: The start timestamp for the environment / building. + loop_class: The class of the loop to be created. + max_steps: The maximum number of steps to run the loop for. + hybrid: Whether to create a hybrid action environment. Default is True. + agent: The agent to use for the loop. A default agent will be created if + None. + + Returns: + A control loop, for testing purposes. + """ + + if hybrid: + env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT, + start_timestamp=start_timestamp, + default_actions=env_conftest.DEFAULT_HYBRID_ACTIONS, + ) + else: + env = env_conftest.create_environment( + layout=env_conftest.DEMO_LAYOUT, + start_timestamp=start_timestamp, + default_actions=env_conftest.DEFAULT_ACTIONS, + ) + + env._metrics_writer = mock.create_autospec( # pylint: disable=protected-access + writer_lib.BaseWriter, instance=True + ) + + agent = agent or default_agent.DefaultPolicyAgent(env=env, clip=True) + + return loop_class(agent=agent, max_steps=max_steps) diff --git a/smart_control/llm/loop/control_loop.py b/smart_control/llm/loop/control_loop.py new file mode 100644 index 00000000..9517ffe5 --- /dev/null +++ b/smart_control/llm/loop/control_loop.py @@ -0,0 +1,334 @@ +"""Agent control loop. + +The loop is a harness / driver to facilitate an agent's control of an +environment. The loop is responsible for getting observations from the +environment, getting actions from the agent, and stepping the environment to +apply those actions to the building. + +The loop runs a single episode, covering a specified number of days according to +the environment's configuration. It steps the environment on a regular time step +interval (usually every five minutes), as specified by the environment's +configuration. + +**Validity Interval** + +Some agents (like RL agents and baseline agents) may take actions +every time step, while others (like LLM agents) may choose to specify longer +validity intervals. The validity interval is the amount of time for which an +action is valid (i.e. the amount of time to wait before asking the agent for +another action). While the loop is waiting for the validity interval to expire, +it will apply the most recent action it has received, to step the environment +during every time step until the validity interval runs out. + +The loop will step the environment at every time step, but will only ask the +agent for a new action when the validity interval runs out. Agents like +baseline agents or RL agents that don't vary their validity intervals can use +the environment's time step interval in minutes, as a fixed default interval for +every action. Other agents like LLM agents may choose to specify longer validity +intervals, based on building conditions - for example an agent may choose to +wait two hours between actions, at night when conditions are stable and there +are no occupants in the building. + +The validity interval also acts as a cost-saving measure, as it can reduce the +number of API calls to the LLM (from around 288 to around 25 per day). + +**Action Context** + +The agent provides an action context object to the loop, which the loop uses to +step the environment. The action context contains the action itself, as well as +more context about the action, suchj as the validity interval, and +justifications / reasoning, as applicable. + +**Max Steps** + +The loop can be stopped early if a maximum number of steps is specified. This is +helpful for testing and debugging purposes. + +**Metrics** + +The basic control loop uses existing metrics writing functionality, triggering +protos to be written to file during each time step (see environment's methods to +get information about observations and rewards). +""" + +import logging +from typing import Any, Final + +import numpy as np +import pandas as pd +from tf_agents.trajectories import time_step as ts + +from smart_buildings.smart_control.llm.agents import default_agent +from smart_buildings.smart_control.proto import smart_control_reward_pb2 as reward_pb2 +from smart_buildings.smart_control.utils import writer_lib + +SerializableData = dict[str, Any] + +ACTION_REJECTION_REWARD: Final[float] = -np.inf + + +def get_clock_timestamp() -> pd.Timestamp: + """Returns the actual current clock timestamp.""" + return pd.Timestamp.now().replace(microsecond=0, nanosecond=0) + + +def parse_timestamp(timestamp: pd.Timestamp, time_zone: str) -> pd.Timestamp: + """Ensures that a timestamp is timezone-aware.""" + if timestamp.tzinfo is None: + return timestamp.tz_localize(time_zone) + return timestamp.tz_convert(time_zone) + + +class ControlLoop: + """An agentic control loop. + + The loop is responsible for stepping the environment on a regular basis. + + The agent is called to get an action whenever the validity interval runs out. + + If a maximum number of steps is specified, the loop will stop running after + that number of steps. + + The loop will keep track of the agent's cumulative rewards over time. + + Attributes: + agent: The agent to use for the loop. + env: The environment to use for the loop. + metrics_writer: The metrics writer to use for the loop. + max_steps: The maximum number of steps to run the loop for. + cum_reward: The cumulative reward for the loop. + results: The results of the loop. + """ + + def __init__( + self, + agent: default_agent.DefaultPolicyAgent, + max_steps: int | None = None, + ): + """Initializes the instance. + + Args: + agent: The agent to use for the loop. + max_steps: The maximum number of steps to run the loop for. If None, the + loop will run until the environment has ended. + """ + self.agent = agent + self.env = self.agent.env + self.metrics_writer = self._validate_metrics_writer(self.env.metrics_writer) + + self.max_steps = max_steps + + self.cum_reward = 0.0 + self.results = [] + + def _interval_has_expired(self, remaining_interval: pd.Timedelta) -> bool: + """Checks whether the validity interval has expired. + + If so, it is time to get a new action from the agent. + + Args: + remaining_interval: timedelta representing the remaining interval to wait + before getting a new action from the agent. + + Returns: + Whether or not the interval has expired. + """ + return remaining_interval <= self.time_step_interval + + def _max_steps_reached(self, max_step: int | None) -> bool: + return max_step is not None and self.current_step >= max_step + + def _action_rejected(self, time_step: ts.TimeStep) -> bool: + """Checks whether the action was rejected by the environment.""" + return (time_step.reward == ACTION_REJECTION_REWARD).any() + + # + # MAIN LOOP + # + + def run(self) -> None: + """Runs the control loop for a single episode.""" + self.write_metadata() + + max_step = ( + self.current_step + self.max_steps + if self.max_steps is not None + else None + ) + + # GET INITIAL STATE + + observation_response = self.env.get_observation_response() + reward_info, reward_response = self.env.get_reward_info_and_response() + + # GET INITIAL AGENT ACTION + + action_ctx = self.agent.get_action_context( + observation_response=observation_response, + reward_info=reward_info, + ) + action = action_ctx.get_action() + remaining_interval = pd.Timedelta(minutes=action_ctx.validity_interval) + + while True: + if self.episode_has_ended: + logging.info("EPISODE HAS ENDED. STOPPING...") + break + + if self._max_steps_reached(max_step): + logging.info("MAX STEPS REACHED. STOPPING...") + break + + # STEP THE ENV (USING WHATEVER ACTION IT HAS MOST RECENTLY RECEIVED) + + time_step = self.env.step(action) + if self._action_rejected(time_step): + logging.warning("ACTION REJECTED BY THE ENVIRONMENT.") + + reward = time_step.reward.item() + self.cum_reward += float(reward) + logging.info("REWARD: %r --> %r", reward, self.cum_reward) + + # UPDATE RESULTS + + self.update_results( + reward=reward, + reward_info=reward_info, + reward_response=reward_response, + ) + + # GET NEW STATE + + observation_response = self.env.get_observation_response() + reward_info, reward_response = self.env.get_reward_info_and_response() + + # UPDATE ACTION (AS NECESSARY) + + if self._interval_has_expired(remaining_interval): + # VALIDITY INTERVAL HAS EXPIRED. GET A NEW ACTION FROM THE AGENT. + action_ctx = self.agent.get_action_context( + observation_response=observation_response, + reward_info=reward_info, + ) + action = action_ctx.get_action() + remaining_interval = pd.Timedelta(minutes=action_ctx.validity_interval) + else: + # CONTINUE WAITING FOR VALIDITY INTERVAL TO EXPIRE + remaining_interval -= self.time_step_interval + + # EPISODE HAS ENDED + + self.write_results() + + # + # ENVIRONMENT PROPERTIES + # + + @property + def start_timestamp(self) -> pd.Timestamp: + """The start timestamp, in environment's local time zone.""" + return parse_timestamp(self.env.start_timestamp, self.env.time_zone) + + @property + def end_timestamp(self) -> pd.Timestamp: + """The end timestamp, in the environment's local time zone.""" + return parse_timestamp(self.env.end_timestamp, self.env.time_zone) + + @property + def days_per_episode(self) -> int: + """The number of steps per episode.""" + return self.env.num_days_in_episode + + @property + def time_step_interval(self) -> pd.Timedelta: + """The time step in minutes, as a pandas Timedelta.""" + return pd.Timedelta(minutes=self.env.time_step_mins) + + @property + def steps_per_day(self) -> int: + """The number of steps per day.""" + return int(pd.Timedelta(days=1) / self.time_step_interval) + + @property + def steps_per_episode(self) -> int: + """The number of steps per episode.""" + return self.env._num_timesteps_in_episode # pylint: disable=protected-access + + @property + def episode_has_ended(self) -> bool: + """Whether the episode has ended.""" + return self.env._has_episode_ended() # pylint: disable=protected-access + + @property + def current_step(self) -> int: + """The current step number.""" + return self.env._step_count # pylint: disable=protected-access + + @property + def current_local_timestamp(self) -> pd.Timestamp: + """The current local timestamp.""" + return self.env.current_local_timestamp + + # + # METRICS + # + + def _validate_metrics_writer( + self, writer: writer_lib.BaseWriter + ) -> writer_lib.BaseWriter: + """Validates the metrics writer.""" + if writer is None: + raise ValueError("Metrics writer is None.") + + if not hasattr(writer, "output_dir"): + raise ValueError("Metrics writer does not have output_dir attribute.") + + if not hasattr(writer, "write_json"): + raise ValueError("Metrics writer does not have write_json method.") + + return writer + + @property + def metrics_output_dir(self) -> Any: + """The directory to write metrics to.""" + return self.metrics_writer.output_dir + + def write_metadata(self) -> None: + """Writes the metadata to a file (before running the loop).""" + self.metrics_writer.write_json(self.json_metadata, "metadata.json") + + @property + def json_metadata(self) -> SerializableData: + """Info about the loop's initial state and input parameters.""" + return { + "start_timestamp": str(self.start_timestamp), + "end_timestamp": str(self.end_timestamp), + "days_per_episode": self.days_per_episode, + "time_step_mins": self.env.time_step_mins, + "steps_per_episode": self.steps_per_episode, + "env": self.env.json_metadata, + "agent": self.agent.json_metadata, + } + + def update_results( + self, reward: float, + reward_info: reward_pb2.RewardInfo, + reward_response: reward_pb2.RewardResponse, + ) -> None: + """Updates the results (after the current step has completed).""" + pass + + def write_results(self) -> None: + """Writes the results to a file (after the episode has completed).""" + self.metrics_writer.write_json(self.json_results, "results.json") + + @property + def json_results(self) -> SerializableData: + """Info about the loop's current / final state, after it has begun.""" + return { + "clock_timestamp": str(get_clock_timestamp()), + "current_timestamp": str(self.current_local_timestamp), + "current_step": self.current_step, + "cum_reward": self.cum_reward, + "results": self.results, + } diff --git a/smart_control/llm/loop/control_loop_test.py b/smart_control/llm/loop/control_loop_test.py new file mode 100644 index 00000000..7ee2b4cc --- /dev/null +++ b/smart_control/llm/loop/control_loop_test.py @@ -0,0 +1,350 @@ +from unittest import mock + +from absl.testing import absltest +import numpy as np +import pandas as pd +from tf_agents.trajectories import time_step as ts + +# pylint: disable=g-bad-import-order local package imports in their own section below third party packages +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.agents import default_agent +from smart_buildings.smart_control.llm.loop import conftest +from smart_buildings.smart_control.llm.loop import control_loop +from smart_buildings.smart_control.utils import writer_lib + + +CLOCK_TIMESTAMP = pd.Timestamp('2026-03-26 12:00:00') +EXAMPLE_TIME_STEP = ts.TimeStep( + step_type=ts.StepType.MID, + reward=np.array([10.0]), + discount=np.array(1.0), + observation=(), +) + + +class ClockTimestampTest(absltest.TestCase): + + def test_get_clock_timestamp(self): + with mock.patch.object( + pd.Timestamp, 'now', return_value=CLOCK_TIMESTAMP, autospec=True + ): + self.assertEqual( + control_loop.get_clock_timestamp(), + CLOCK_TIMESTAMP, + ) + + +class TimestampParserTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.time_zone = 'US/Pacific' + + def test_parse_timestamp_without_time_zone_localizes(self): + timestamp = pd.Timestamp('2025-12-12 00:00:00') + self.assertIsNone(timestamp.tzinfo) + self.assertEqual( + control_loop.parse_timestamp(timestamp, self.time_zone), + pd.Timestamp('2025-12-12 00:00:00', tz=self.time_zone), + ) + + def test_parse_timestamp_with_different_time_zone_converts(self): + timestamp = pd.Timestamp('2025-12-12 00:00:00', tz='UTC') + self.assertIsNotNone(timestamp.tzinfo) + self.assertEqual( + control_loop.parse_timestamp(timestamp, self.time_zone), + pd.Timestamp('2025-12-11 16:00:00', tz=self.time_zone), + ) + + def test_parse_timestamp_with_same_time_zone_remains_the_same(self): + timestamp = pd.Timestamp('2025-12-12 00:00:00', tz=self.time_zone) + self.assertIsNotNone(timestamp.tzinfo) + self.assertEqual( + control_loop.parse_timestamp(timestamp, self.time_zone), + pd.Timestamp('2025-12-12 00:00:00', tz=self.time_zone), + ) + + +class MetricsWriterValidationTest(absltest.TestCase): + + def _create_loop( + self, writer: writer_lib.BaseWriter + ) -> control_loop.ControlLoop: + env = env_conftest.create_hybrid_action_environment( + # writer_factory=lambda metrics_path: writer, + default_actions=env_conftest.DEFAULT_HYBRID_ACTIONS, + ) + agent = default_agent.DefaultPolicyAgent(env=env) + env._metrics_writer = writer + return control_loop.ControlLoop(agent=agent) + + def test_metrics_writer_with_valid_interface(self): + writer = mock.create_autospec(writer_lib.BaseWriter, instance=True) + self.assertTrue(hasattr(writer, 'output_dir')) + self.assertTrue(hasattr(writer, 'write_json')) + + loop = self._create_loop(writer=writer) + self.assertEqual(loop.metrics_writer, writer) + + def test_writer_without_output_dir_raises_error(self): + writer = mock.create_autospec(writer_lib.BaseWriter, instance=True) + del writer.output_dir + + with self.assertRaisesRegex( + ValueError, 'Metrics writer does not have output_dir attribute.' + ): + self._create_loop(writer=writer) + + def test_writer_without_write_json_method_raises_error(self): + writer = mock.create_autospec(writer_lib.BaseWriter, instance=True) + del writer.write_json + + with self.assertRaisesRegex( + ValueError, 'Metrics writer does not have write_json method.' + ): + self._create_loop(writer=writer) + + +class LoopTest(absltest.TestCase): + """Tests for the setup of the control loop, before it has run.""" + + def setUp(self): + super().setUp() + self.loop = conftest.create_loop(max_steps=5) + + def test_initialization(self): + self.assertIsInstance(self.loop, control_loop.ControlLoop) + + def test_agent(self): + self.assertIsInstance(self.loop.agent, default_agent.DefaultPolicyAgent) + + def test_env(self): + self.assertIsInstance( + self.loop.env, hybrid_action_environment.HybridActionEnvironment + ) + + def test_attributes(self): + with self.subTest(name='max_steps'): + self.assertEqual(self.loop.max_steps, 5) + + with self.subTest(name='cum_reward'): + self.assertEqual(self.loop.cum_reward, 0.0) + + # ENVIRONMENT ATTRIBUTES + + def test_timestamps(self): + with self.subTest(name='start_timestamp'): + self.assertEqual( + self.loop.start_timestamp, + pd.Timestamp('2025-12-12 00:00:00', tz='US/Pacific'), + ) + + with self.subTest(name='end_timestamp'): + self.assertEqual( + self.loop.end_timestamp, + pd.Timestamp('2025-12-15 00:00:00', tz='US/Pacific'), + ) + + with self.subTest(name='current_local_timestamp'): + self.assertEqual( + self.loop.current_local_timestamp, + self.loop.env.current_local_timestamp, + ) + + def test_step_attributes(self): + with self.subTest(name='days_per_episode'): + self.assertEqual(self.loop.days_per_episode, 3) + + with self.subTest(name='time_step_interval'): + self.assertEqual(self.loop.time_step_interval, pd.Timedelta(minutes=5)) + + with self.subTest(name='steps_per_day'): + self.assertEqual(self.loop.steps_per_day, 288) + + with self.subTest(name='steps_per_episode'): + self.assertEqual(self.loop.steps_per_episode, 864) + + with self.subTest(name='episode_has_ended'): + self.assertFalse(self.loop.episode_has_ended) + + with self.subTest(name='current_step'): + self.assertEqual(self.loop.current_step, 0) + + # METRICS + + def test_metrics_output_dir(self): + self.assertEqual( + self.loop.metrics_output_dir, self.loop.metrics_writer.output_dir + ) + + def test_write_metadata(self): + self.loop.env.metrics_writer.reset_mock() + self.loop.write_metadata() + self.loop.env.metrics_writer.write_json.assert_called_once_with( + self.loop.json_metadata, 'metadata.json' + ) + + def test_write_results(self): + self.loop.env.metrics_writer.reset_mock() + with mock.patch.object( + control_loop, + 'get_clock_timestamp', + return_value=CLOCK_TIMESTAMP, + autospec=True, + ): + self.loop.write_results() + self.loop.env.metrics_writer.write_json.assert_called_once_with( + self.loop.json_results, 'results.json' + ) + + def test_json_metadata(self): + self.assertEqual( + self.loop.json_metadata, + { + 'start_timestamp': '2025-12-12 00:00:00-08:00', + 'end_timestamp': '2025-12-15 00:00:00-08:00', + 'days_per_episode': 3, + 'time_step_mins': 5, + 'steps_per_episode': 864, + 'env': self.loop.env.json_metadata, + 'agent': self.loop.agent.json_metadata, + }, + ) + + +class LoopResultsTest(absltest.TestCase): + """Tests for the results of the control loop, after it has run.""" + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.loop = conftest.create_loop(max_steps=5) + + # RUN THE LOOP (SO WE CAN TEST THE RESULTS AFTERWARDS) + + original_step_function = cls.loop.env.step + def step_side_effect(*args, **kwargs): + time_step = original_step_function(*args, **kwargs) + return time_step._replace(reward=np.array([10.0])) + + with mock.patch.object( + cls.loop.env, 'step', side_effect=step_side_effect, autospec=True + ), mock.patch.object( + control_loop, + 'get_clock_timestamp', + autospec=True, + ) as mock_clock_timestamp: + mock_clock_timestamp.return_value = CLOCK_TIMESTAMP + cls.loop.run() + + def test_json_results(self): + with mock.patch.object( + control_loop, + 'get_clock_timestamp', + return_value=CLOCK_TIMESTAMP, + autospec=True, + ): + self.assertEqual( + self.loop.json_results, + { + 'clock_timestamp': '2026-03-26 12:00:00', + 'current_timestamp': '2025-12-12 00:25:00-08:00', + 'current_step': 5, + 'cum_reward': 50.0, + 'results': [] + }, + ) + + +class LoopEndsWhenEpisodeEndsTest(absltest.TestCase): + """Tests that the loop stops when episode has ended.""" + + def test_stops_when_episode_has_ended(self): + loop = conftest.create_loop(max_steps=None) + with mock.patch.object( + control_loop.ControlLoop, + 'episode_has_ended', + new_callable=mock.PropertyMock, + side_effect=[False, False, True], + ) as mock_ended: + loop.run() + + self.assertEqual(mock_ended.call_count, 3) + self.assertEqual(loop.current_step, 2) + + +class ActionRejectionTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.loop = conftest.create_loop(max_steps=1) + + def test_action_rejection_reward(self): + self.assertEqual(control_loop.ACTION_REJECTION_REWARD, -np.inf) + + def test_action_rejected_returns_true_when_reward_is_neg_inf(self): + time_step = ts.TimeStep( + step_type=ts.StepType.MID, + reward=np.array([control_loop.ACTION_REJECTION_REWARD]), + discount=np.array(1.0), + observation=(), + ) + self.assertTrue(self.loop._action_rejected(time_step)) + + def test_action_rejected_returns_false_when_reward_is_not_neg_inf(self): + self.assertFalse(self.loop._action_rejected(EXAMPLE_TIME_STEP)) + + +class IntervalTest(absltest.TestCase): + + def test_validity_interval(self): + loop = conftest.create_loop(max_steps=5) + action_ctx = mock.Mock() + action_ctx.validity_interval = 10 # minutes + action_ctx.get_action.return_value = env_conftest.DEFAULT_HYBRID_ACTIONS + + # All this mocking and patching helps the environment step very fast, to + # drastically reduce the time it takes to run this test. + def step_side_effect(*args, **kwargs): + del args, kwargs # Unused. + loop.env._step_count += 1 + return EXAMPLE_TIME_STEP + + with mock.patch.object( + loop.agent, + 'get_action_context', + return_value=action_ctx, + autospec=True, + ) as mock_get_action_context: + with mock.patch.object( + loop.env, + 'step', + side_effect=step_side_effect, + autospec=True, + ) as mock_step: + with mock.patch.object( + loop.env, + 'get_observation_response', + return_value=mock.Mock(), + autospec=True, + ): + with mock.patch.object( + loop.env, + 'get_reward_info_and_response', + return_value=(mock.Mock(), mock.Mock()), + autospec=True, + ): + loop.run() + + # The agent provides an initial action before the first step. + # The environment is stepped five times, once every five minutes, for a + # total duration of 25 minutes. Because the validity interval is 10 minutes, + # the agent is only asked to get an action twice more during this time (for + # a total of three actions). + self.assertEqual(mock_step.call_count, 5) + self.assertEqual(mock_get_action_context.call_count, 3) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/llm/prompts/base_promptmaker.py b/smart_control/llm/prompts/base_promptmaker.py new file mode 100644 index 00000000..286a30dc --- /dev/null +++ b/smart_control/llm/prompts/base_promptmaker.py @@ -0,0 +1,140 @@ +"""Base class for promptmakers. + +Promptmakers are responsible for compiling a prompt for an LLM. + +Promptmakers are set up to combine a user-provided 'base prompt' with output +formatting instructions automatically derived from a Pydantic model, to arrive +at the final 'prompt' which gets sent to the LLM. + +This base class can be flexibility used with any Pydantic model, but child +classes will use a specific Pydantic model suited for building control. +""" + +import abc +import textwrap +from typing import Any, Callable + +import langchain.output_parsers +import pydantic + +PydanticOutputParser = langchain.output_parsers.PydanticOutputParser + +SerializableData = dict[str, Any] + +DedentFunction = Callable[[str], str] + + +def full_dedent(txt: str) -> str: + """Removes all leading whitespace from each line in a string. + + While textwrap.dedent is designed to preserve the relative indentation within + a block of text, this function removes all leading whitespace from each line, + regardless of the relative indentation. + + This behavior is helpful when you want to define a prompt as a multiline + string inside a function or method, and you want to ensure all lines in the + resulting prompt are left-justified, ignoring any indentation used for + readability in the source code. + + This is also relevant when a prompt is dynamically compiled using + multiple sections, including nested sub-sections that are defined in their own + methods in the promptmaker class. This behavior can prevent stacking of + relative indentation from nested blocks of code. + + If you have a markdown multi-level list, you would want to use + textwrap.dedent instead, to preserve the relative indentation of the list. + + Args: + txt: The string to remove leading whitespace from. + + Returns: + The string with all leading whitespace removed. + """ + return '\n'.join(line.lstrip() for line in txt.strip().splitlines()) + + +class BasePromptmaker(abc.ABC): + """Base Promptmaker. + + A Promptmaker is responsible for compiling a prompt for an LLM. + + The Promptmaker uses a Pydantic model to provide formatting instructions that + result in the LLM producing reliable JSON formatted string responses. + + You override the `base_prompt` property to provide the main prompt, and the + `output_schema_class` argument to specify the Pydantic model used to provide + formatting instructions. Then the promptmaker combines your base prompt with + formatting instructions in the final `prompt` property, which you can send to + the LLM. + """ + + def __init__( + self, + output_schema_class: type[pydantic.BaseModel], + dedent: DedentFunction = textwrap.dedent, + ): + """Initializes the instance. + + Args: + output_schema_class: The pydantic model class used to provide JSON + response formatting instructions in the prompt. + dedent: The function used to remove leading whitespace from the prompt. + """ + self.output_schema_class = output_schema_class + self.dedent = dedent + + @property + @abc.abstractmethod + def base_prompt(self) -> str: + """The main prompt, fully hydrated with data as necessary. + + The `base_prompt` does not include formatting instructions, as they are + automatically added in the `prompt` property. + """ + + @property + def prompt(self) -> str: + """The final prompt, including response formatting instructions.""" + return self.dedent('\n\n'.join(( + self.base_prompt, + self.formatting_instructions_section, + ))) + + @property + def formatting_instructions_section(self) -> str: + """The section of the prompt containing formatting instructions.""" + return '\n'.join([ + '## Formatting Instructions\n', + ( + 'IMPORTANT: The output MUST be a single, valid JSON object ' + 'conforming to the schema below.' + ), + ( + 'Do NOT include any other text, explanations, pleasantries, or any ' + 'other content before or after the JSON object.' + ), + self.formatting_instructions, + ]) + + @property + def formatting_instructions(self) -> str: + """Formatting instructions for the desired LLM output structure.""" + return self.output_parser.get_format_instructions() + + @property + def output_parser(self) -> PydanticOutputParser: + """A parser that derives formatting instructions from a pydantic model.""" + return PydanticOutputParser(pydantic_object=self.output_schema_class) + + @property + def output_schema(self) -> dict[str, Any]: + """The JSON schema for the output.""" + return self.output_schema_class.model_json_schema() + + @property + def json_metadata(self) -> SerializableData: + """Metadata about the promptmaker, suitable for JSON serialization.""" + return { + 'type': self.__class__.__name__, + 'output_schema_class': self.output_schema_class.__name__, + } diff --git a/smart_control/llm/prompts/base_promptmaker_test.py b/smart_control/llm/prompts/base_promptmaker_test.py new file mode 100644 index 00000000..cd23e371 --- /dev/null +++ b/smart_control/llm/prompts/base_promptmaker_test.py @@ -0,0 +1,193 @@ +import json +import textwrap +from typing import Callable + +from absl.testing import absltest +import immutabledict +import langchain +import pydantic + +from smart_buildings.smart_control.llm.prompts import base_promptmaker +from smart_buildings.smart_control.llm.schema import conftest as schema_conftest + + +BASE_PROMPT = "What year was America founded?" + +EXPECTED_OUTPUT_SCHEMA = immutabledict.immutabledict({ + "title": "ExampleOutputSchema", + "description": ( + "Simple example implementation of an output schema, for testing" + " purposes." + ), + "type": "object", + "properties": { + "year": { + "description": "The year, as an integer.", + "title": "Year", + "type": "integer", + }, + "explanation": { + "description": ( + "The reasoning behind choosing this specific year." + ), + "title": "Explanation", + "type": "string", + }, + }, + "required": ["year", "explanation"], +}) + + +class ExampleOutputSchema(pydantic.BaseModel): + """Simple example implementation of an output schema, for testing purposes.""" + + year: int = pydantic.Field(description="The year, as an integer.") + + explanation: str = pydantic.Field( + description="The reasoning behind choosing this specific year." + ) + + +class ExamplePromptmaker(base_promptmaker.BasePromptmaker): + """Simple example implementation of BasePromptmaker, for testing purposes.""" + + def __init__(self, dedent: Callable[[str], str] = textwrap.dedent): + super().__init__(output_schema_class=ExampleOutputSchema, dedent=dedent) + + @property + def base_prompt(self) -> str: + return BASE_PROMPT + + +# +# TESTS +# + + +class DedentTest(absltest.TestCase): + """Tests to contrast different dedentation behavior.""" + + def setUp(self): + super().setUp() + self.base_prompt = """\ + Hello world! + Hello world! + """ + + def test_no_dedent_leaves_leading_whitespace(self): + pm = ExamplePromptmaker(dedent=lambda txt: txt) + self.assertEqual( + pm.dedent(self.base_prompt), + " Hello world!\n Hello world!\n ", + ) + + def test_textwrap_dedent_leaves_leading_relative_whitespace(self): + pm = ExamplePromptmaker(dedent=textwrap.dedent) + self.assertEqual( + pm.dedent(self.base_prompt), + "Hello world!\n Hello world!\n", + ) + + def test_full_dedent_removes_all_leading_whitespace(self): + pm = ExamplePromptmaker(dedent=base_promptmaker.full_dedent) + self.assertEqual( + pm.dedent(self.base_prompt), + "Hello world!\nHello world!", + ) + + +class BasePromptmakerTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.promptmaker = ExamplePromptmaker() + + def test_initialization(self): + self.assertIsInstance(self.promptmaker, base_promptmaker.BasePromptmaker) + self.assertEqual(self.promptmaker.output_schema_class, ExampleOutputSchema) + + def test_base_prompt(self): + self.assertEqual(self.promptmaker.base_prompt, BASE_PROMPT) + + def test_prompt(self): + self.assertEqual( + self.promptmaker.prompt, + f"{BASE_PROMPT}\n\n{self.promptmaker.formatting_instructions_section}", + ) + + def test_formatting_instructions_section(self): + self.assertEqual( + self.promptmaker.formatting_instructions_section, + ( + "## Formatting Instructions\n\n" + "IMPORTANT: The output MUST be a single, valid JSON object " + "conforming to the schema below.\n" + "Do NOT include any other text, explanations, pleasantries, or " + "any other content before or after the JSON object.\n" + f"{self.promptmaker.formatting_instructions}" + ), + ) + + def test_formatting_instructions(self): + instructions = self.promptmaker.formatting_instructions + self.assertIsInstance(instructions, str) + + parsed_schema = schema_conftest.parse_instructions_schema(instructions) + expected_schema = dict(EXPECTED_OUTPUT_SCHEMA) # a shallow copy + del expected_schema["title"] + del expected_schema["type"] + + with self.subTest(name="introduces_the_schema"): + self.assertStartsWith( + instructions, + "The output should be formatted as a JSON instance that conforms" + " to the JSON schema below.", + ) + + with self.subTest(name="provides_an_example_schema"): + self.assertIn( + ( + 'As an example, for the schema {"properties": {"foo": {"title":' + ' "Foo", "description": "a list of strings", "type": "array",' + ' "items": {"type": "string"}}}, "required": ["foo"]}\nthe' + ' object {"foo": ["bar", "baz"]} is a well-formatted instance of' + ' the schema. The object {"properties": {"foo": ["bar", "baz"]}}' + ' is not well-formatted.' + ), + instructions, + ) + + with self.subTest(name="provides_output_schema"): + self.assertEqual(parsed_schema, expected_schema) + self.assertEndsWith( + instructions, + "Here is the output schema:\n```\n" + + json.dumps(expected_schema) + + "\n```", + ) + + def test_output_parser(self): + self.assertIsInstance( + self.promptmaker.output_parser, + langchain.output_parsers.PydanticOutputParser, + ) + self.assertEqual( + self.promptmaker.output_parser.pydantic_object, + ExampleOutputSchema, + ) + + def test_output_schema(self): + self.assertEqual(self.promptmaker.output_schema, EXPECTED_OUTPUT_SCHEMA) + + def test_json_metadata(self): + self.assertEqual( + self.promptmaker.json_metadata, + { + "type": "ExamplePromptmaker", + "output_schema_class": "ExampleOutputSchema", + }, + ) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/prompts/floor_based_promptmaker.py b/smart_control/llm/prompts/floor_based_promptmaker.py new file mode 100644 index 00000000..186f4ca9 --- /dev/null +++ b/smart_control/llm/prompts/floor_based_promptmaker.py @@ -0,0 +1,35 @@ +"""Promptmaker class with floor-specific zone comfort info.""" + +import functools +import pandas as pd + +from smart_buildings.smart_control.llm.prompts import promptmaker as pm + + +class FloorBasedPromptmaker(pm.Promptmaker): + """Updated promptmaker class, with floor-specific zone comfort info.""" + + @functools.cached_property + def zone_conditions_histogram_by_floor(self) -> pd.DataFrame: + """A histogram of zone conditions by floor.""" + return self.reward_info_parser.get_zone_conditions_histogram_by_floor( + zones=self.env.building.zones + ).T + + @property + def zone_conditions_subsection(self) -> str: + """A section describing the current conditions in the building.""" + + return self.dedent(f""" + ### Current Zone Temperatures + + The table below conveys the comfort conditions across all zones in the building, by floor: + + {self.zone_conditions_histogram_by_floor.to_markdown(index=True)} + + The row 'occupancy_count' shows the total number of occupants building-wide at a specific temperature. + The row 'setpoint_mask' indicates with a '0' if the temperature is within comfort range, a '-1' if the temperature is too cold, and a '1' if the temperature is too hot. + The row 'setpoint_range' indicates with '+' if the temperature is inside the acceptable range, and '-' if it is outside. + The row 'exposed_count' indicates the count of occupants being exposed to unacceptable comfort conditions. + The rows starting with 'occ@floor' show the normalized distribution of zone counts for each floor at that temperature. + """) diff --git a/smart_control/llm/prompts/floor_based_promptmaker_test.py b/smart_control/llm/prompts/floor_based_promptmaker_test.py new file mode 100644 index 00000000..c8967faf --- /dev/null +++ b/smart_control/llm/prompts/floor_based_promptmaker_test.py @@ -0,0 +1,95 @@ +from absl.testing import absltest + +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.llm.prompts import floor_based_promptmaker +from smart_buildings.smart_control.utils import temperature_conversion as tc + + +class FloorBasedPromptmakerTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.zone_reward_configs = { + 'zone_1': { + 'zone_air_temperature': 292.1, + 'heating_setpoint_temperature': 294.0, + 'cooling_setpoint_temperature': 296.0, + 'average_occupancy': 5.0, + }, + 'zone_2': { + 'zone_air_temperature': 296.2, + 'heating_setpoint_temperature': 294.0, + 'cooling_setpoint_temperature': 296.0, + 'average_occupancy': 10.0, + }, + 'zone_3': { + 'zone_air_temperature': 297.9, + 'heating_setpoint_temperature': 294.0, + 'cooling_setpoint_temperature': 296.0, + 'average_occupancy': 3.0, + }, + } + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.MULTI_FLOOR_LAYOUT, + zone_reward_configs=self.zone_reward_configs, + ) + self.pm = floor_based_promptmaker.FloorBasedPromptmaker( + env=self.env, temp_display_unit=tc.TempUnit.KELVIN + ) + + def test_zone_conditions_histogram_by_floor(self): + df = self.pm.zone_conditions_histogram_by_floor + # The histogram is transposed in FloorBasedPromptmaker. + # Index should include occupancy_count, setpoint_range, exposed_count, + # and floor distribution(s). + self.assertIn('occupancy_count', df.index) + self.assertIn('setpoint_range', df.index) + self.assertIn('exposed_count', df.index) + + floor_rows = [i for i in df.index if str(i).startswith('occ@floor')] + self.assertCountEqual(floor_rows, ['occ@floor1', 'occ@floor2']) + + # Global occupancy: 5 at 292, 10 at 296, 3 at 298. + self.assertEqual(df.loc['occupancy_count', 292.0], 5) + self.assertEqual(df.loc['occupancy_count', 296.0], 10) + self.assertEqual(df.loc['occupancy_count', 298.0], 3) + + # Floor 1 distribution: zone_1 (temp 292) and zone_2 (temp 296). + # Since they are normalized, each should be 0.5 at their respective bins. + self.assertEqual(df.loc['occ@floor1', 292.0], 0.5) + self.assertEqual(df.loc['occ@floor1', 296.0], 0.5) + + # Floor 2 distribution: zone_3 (temp 298). + self.assertEqual(df.loc['occ@floor2', 298.0], 1.0) + + def test_zone_conditions_histogram_by_floor_is_always_kelvin(self): + # Setup promptmaker with Fahrenheit as display unit + pm = floor_based_promptmaker.FloorBasedPromptmaker( + env=self.env, + temp_display_unit=tc.TempUnit.FAHRENHEIT, + ) + + df = pm.zone_conditions_histogram_by_floor + + # Even though display unit is F, the table data passed to LLM stays in K. + # Global occupancy: 5 at 292, 10 at 296, 3 at 298. + self.assertEqual(df.loc['occupancy_count', 292.0], 5) + self.assertEqual(df.loc['occupancy_count', 296.0], 10) + self.assertEqual(df.loc['occupancy_count', 298.0], 3) + + # Verify the prompt text mentions Fahrenheit + self.assertIn('communicate temperatures in Fahrenheit', pm.base_prompt) + + def test_current_conditions_section(self): + section = self.pm.current_conditions_section + self.assertIn('## Current Conditions', section) + self.assertIn('### Current Zone Temperatures', section) + self.assertIn('by floor:', section) + self.assertIn("The rows starting with 'occ@floor'", section) + + table = self.pm.zone_conditions_histogram_by_floor.to_markdown(index=True) + self.assertIn(table, section) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/llm/prompts/generator.py b/smart_control/llm/prompts/generator.py new file mode 100644 index 00000000..f122e02d --- /dev/null +++ b/smart_control/llm/prompts/generator.py @@ -0,0 +1,53 @@ +"""Utilities for generating example prompts. + +Creates an example prompt and writes it to a markdown file in the "examples" +directory. This helps facilitate developer reviews of the prompt. Once written, +you can use the text editor's markdown preview functionality to view the prompt +and verify the formatting renders correctly. +""" + +import os +from typing import Type + +from absl import logging + +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.prompts import promptmaker + + +def write_prompt_md( + promptmaker_class: Type[promptmaker.Promptmaker], + include_weights: bool, + dirpath: str, + filename: str, +) -> None: + """Generates an example prompt and writes it to a markdown file. + + Args: + promptmaker_class: The promptmaker class to use. + include_weights: Whether to include weights in the prompt. + dirpath: The directory to write the markdown file to. + filename: The name of the markdown file to write. + """ + + logging.info("LOADING ENVIRONMENT...") + env = hybrid_action_environment.HybridActionEnvironment() + logging.info("Current local timestamp: %s", env.current_local_timestamp) + env.reset() + + logging.info("CREATING PROMPTMAKER: %s...", promptmaker_class.__name__) + pm = promptmaker_class( + env=env, include_weights=include_weights + ) + + logging.info("SETTING UP EXAMPLE PROMPTS DIRECTORY...") + examples_dirpath = os.path.join(dirpath, "examples") + os.makedirs(examples_dirpath, exist_ok=True) + + logging.info("WRITING PROMPT TO %s...", filename) + md_filepath = os.path.join(examples_dirpath, filename) + with open(md_filepath, "w") as f: + f.write(pm.prompt) + f.write("\n") + + logging.info("DONE") diff --git a/smart_control/llm/prompts/promptmaker.py b/smart_control/llm/prompts/promptmaker.py new file mode 100644 index 00000000..40ed6f54 --- /dev/null +++ b/smart_control/llm/prompts/promptmaker.py @@ -0,0 +1,556 @@ +"""Promptmaker for optimal control of HVAC systems in smart buildings. + +This promptmaker extends the base promptmaker class to create a prompt for +controlling HVAC systems in smart buildings. + +It uses the SetpointsAction pydantic model to provide formatting instructions +for the LLM response, to include a validity interval, overall strategy, a list +of setpoints and corresponding setpoint-specific justifications. + +This promptmaker constructs a basic non-opinionated prompt that could be used +as a basis for more specialized child classes. Prompts are expected to be an +active area of experimentation, so this class is designed to support +extensibility. + +The promptmaker uses a number of 'sections' that comprise the prompt. Each +section is a piece of the prompt that serves a specific purpose. By inheriting +from the promptmaker class, you can override specific sections to customize +the prompt without having to rewrite the entire prompt. + +In terms of content formatting, we are using Markdown. Research suggests this +may help the LLM better understand the organizational structure of the content. +See 'Does Prompt Formatting Have Any Impact on LLM Performance?' by He, et al. + +We are also using new-line characters to separate each sentence, keeping each +sentence fully contained on the same line. There is research to suggest that +new-line characters are effective delimiters for helping the LLM understand the +content (specifically examples) and generate a better response. See: 'A single +character can make or break your LLM evals' by Jingtong Su, et al. +""" + +import dataclasses +from typing import Any, Callable, Final + +import pandas as pd + +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import hybrid_action_environment as hybrid_env +from smart_buildings.smart_control.llm.prompts import base_promptmaker +from smart_buildings.smart_control.llm.schema import output_schema +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 as reward_pb2 +from smart_buildings.smart_control.utils import temperature_conversion as tc +from smart_buildings.smart_control.utils.proto_parsers import observation_response_parser as or_parser +from smart_buildings.smart_control.utils.proto_parsers import reward_info_parser as ri_parser + +SerializableData = dict[str, Any] + +# TODO(mjrossetti): Consider importing these constants from other more central +# locations related to the devices, once they are available there. +AHU_STATIC_PRESSURE_SETPOINT: Final[str] = "static_pressure_setpoint" +AHU_SUPPLY_AIR_TEMPERATURE_SETPOINT: Final[str] = "supply_air_temperature_setpoint" # pylint: disable=line-too-long +HWS_DIFFERENTIAL_PRESSURE_SETPOINT: Final[str] = "differential_pressure_setpoint" # pylint: disable=line-too-long +HWS_SUPPLY_WATER_TEMPERATURE_SETPOINT: Final[str] = "supply_water_setpoint" + + +@dataclasses.dataclass +class BuildingInfo: + """Information about the building under control. + + This information is provided to the LLM to give it context about the building. + + Attributes: + stories: The number of stories in the building. + sqft: The square footage of the building. + location: The location of the building. + name: The name of the building, if applicable. + """ + name: str = "SB-1" + stories: str = "two" + sqft: int = 96_000 + location: str = "Mountain View, California" + + +class Promptmaker(base_promptmaker.BasePromptmaker): + """Promptmaker for building control. + + This specific promptmaker assumes you are using a HybridActionEnvironment. + """ + + def __init__( + self, + env: environment.Environment, + *, + observation_response: building_pb2.ObservationResponse | None = None, + reward_info: reward_pb2.RewardInfo | None = None, + building_info: BuildingInfo | None = None, + output_schema_class: ( + type[output_schema.SetpointsAction] | None + ) = output_schema.SetpointsAction, + dedent: Callable[[str], str] = base_promptmaker.full_dedent, + include_weights: bool = False, + occupancy_mode_min: int = 10, + temp_display_unit: tc.TempUnit | str = tc.TempUnit.FAHRENHEIT, + lazy_init_protos: bool = False, + ): + """Initializes the instance. + + Args: + env: The environment containing information about the building, + observation space, action space, reward function, etc. + observation_response: The observation response from the environment. If + None, the observation response will be retrieved from the environment. + reward_info: The reward info from the environment. If None, the reward + info will be retrieved from the environment. + building_info: Information about the building being controlled, such as + the number of stories, square footage, and location. + output_schema_class: The pydantic model class used to provide JSON + response formatting instructions in the prompt. Uses the pre-configured + `SetpointsAction` model by default. To use custom validity interval + options, construct a custom output schema class using the + `output_schema.create_action_model` function, and pass that class here. + dedent: The function used to remove leading whitespace from the prompt. + Uses the `full_dedent` function by default, because otherwise the + inserted tables seem to be aligned to the left of the rest of the + content. + include_weights: Whether to include the reward function weights in the + prompt. + occupancy_mode_min: The minimum number of occupants in the building to + be considered in occupancy mode. + temp_display_unit: The temperature unit to be used by the LLM in its + justifications and reasoning. All input temperatures are in Kelvin. + lazy_init_protos: Whether to lazily setup the observation + response and reward info. If False, (by default), the protos + should be passed in during initialization, or will automatically be set, + for convenience. If True, the protos are expected to be passed in after + initialization, using the `set_protos` method. + """ + super().__init__(output_schema_class=output_schema_class, dedent=dedent) + self.env = env + self.include_weights = include_weights + self.occupancy_mode_min = occupancy_mode_min + self.temp_display_unit = tc.assign_temp_unit(temp_display_unit) + self.building_info = building_info or BuildingInfo() + self.lazy_init_protos = lazy_init_protos + self._observation_response_parser: ( + or_parser.ObservationResponseParser | None + ) = None + self._reward_info_parser: ri_parser.RewardInfoParser | None = None + + if not self.lazy_init_protos: + self.set_protos( + observation_response=observation_response, + reward_info=reward_info, + ) + + def set_protos( + self, + observation_response: building_pb2.ObservationResponse | None, + reward_info: reward_pb2.RewardInfo | None, + ) -> None: + """Sets up the observation response and reward info parsers. + + If you lazy initialized the protos, you must call this method to set them. + + Args: + observation_response: The observation response from the environment. If + None, the observation response will be retrieved from the environment. + reward_info: The reward info from the environment. If None, the reward + info will be retrieved from the environment. + """ + self._observation_response_parser = self._setup_observation_response( + observation_response=observation_response, + ) + self._reward_info_parser = self._setup_reward_info(reward_info=reward_info) + + def _setup_observation_response( + self, + observation_response: building_pb2.ObservationResponse | None = None, + ) -> or_parser.ObservationResponseParser: + """Returns an observation response parser. + + Args: + observation_response: The observation response from the environment. If + None, the observation response will be retrieved from the environment. + + Returns: + An observation response parser. + """ + if observation_response is None: + observation_response = self.env.get_observation_response() + + return or_parser.ObservationResponseParser( + observation_response=observation_response + ) + + def _setup_reward_info( + self, reward_info: reward_pb2.RewardInfo | None = None + ) -> ri_parser.RewardInfoParser: + """Returns a reward info parser. + + Args: + reward_info: The reward info from the environment. If None, the reward + info will be retrieved from the environment. + + Returns: + A reward info parser. + """ + if reward_info is None: + reward_info = self.env.get_reward_info() + + return ri_parser.RewardInfoParser(reward_info=reward_info) + + @property + def observation_response_parser(self) -> or_parser.ObservationResponseParser: + """The observation response parser. Assumed to have been set up already.""" + if self._observation_response_parser is None: + raise ValueError("Observation response parser is None.") + return self._observation_response_parser + + @property + def reward_info_parser(self) -> ri_parser.RewardInfoParser: + """The reward info parser. Assumed to have been set up already.""" + if self._reward_info_parser is None: + raise ValueError("Reward info parser is None.") + return self._reward_info_parser + + # DATA AND PROPERTIES + + @property + def json_metadata(self) -> SerializableData: + """Info to write into a JSON file. Needs to be serializable.""" + return super().json_metadata | { + "include_weights": self.include_weights, + "occupancy_mode_min": self.occupancy_mode_min, + "temp_display_unit": self.temp_display_unit.value, + "building_info": dataclasses.asdict(self.building_info), + } + + @property + def building_info_series(self) -> pd.Series: + """A pandas.Series describing the building information.""" + return pd.Series( + dataclasses.asdict(self.building_info), + name="building_info" + ) + + @property + def setpoints_df(self) -> pd.DataFrame: + """A dataframe describing the devices and setpoints under control. + + Includes information about the range of possible native values for each + setpoint. + + The LLM will use the device_id and setpoint_name values as a composite key + to uniquely identify setpoints in its responses. + + Returns: + A dataframe describing the devices and setpoints under control. + """ + df = self.env.action_fields_df[[ + "device_id", + "setpoint_name", + "setpoint_type", + "units", + "min_native_value", + "max_native_value", + ]].copy() + return df.sort_values(by=["device_id", "setpoint_name"]).reset_index( + drop=True + ) + + @property + def weights(self) -> dict[str, float] | None: + """Returns the reward function weights, if available.""" + if hasattr(self.env.reward_function, "weights"): + weights = self.env.reward_function.weights.copy() + # Rename "productivity_weight" to "comfort_weight": + if "productivity_weight" in weights: + weights["comfort_weight"] = weights.pop("productivity_weight") + return weights + return None + + @property + def weights_series(self) -> pd.Series | None: + """A pandas.Series describing the reward function weights, if available.""" + if self.weights is not None: + return pd.Series(self.weights, name="weight") + + @property + def validity_intervals(self) -> list[int]: + """A list of validity intervals (in minutes) for the LLM to choose from.""" + return self.output_schema["properties"]["validity_interval"]["enum"] + + # PROMPT CONTENT + + @property + def base_prompt(self) -> str: + """The base prompt, excluding formatting instructions.""" + return "\n\n".join([ + "# Agent Instructions", + self.objectives_section, + self.zone_info_section, + self.occupancy_modes_section, + self.hvac_system_guidelines_section, + self.action_guidelines_section, + self.current_conditions_section, + self.current_action_section, + ]) + + @property + def objectives_section(self) -> str: + """A section describing the LLM's role and objectives. + + Includes the reward function weights, if available and enabled via the + `include_weights` argument. + + Returns: + A section describing the LLM's role and objectives. + """ + + section = self.dedent(f""" + ## Objectives + + ### Role + + You are a skilled, experienced, and innovative operator of a commercial office building. + You possess in-depth and complete knowledge about HVAC systems, as well as ASHRAE standards and certifications. + Your job is to optimally control HVAC devices in a given commercial office building. + + **Building Information**: + + {self.building_info_series.to_markdown(index=True)} + + ### Overall Goal + + As the building operator, your **Optimal Control Objectives** are to: + + + Minimize energy consumption / costs, and + + Minimize carbon emissions, and + + Maintain occupant comfort (a.k.a. productivity) + + This is a multi-objective optimization problem, where you must balance competing objectives. + """) + + weights_series = self.weights_series + if self.include_weights and weights_series is not None: + section += "\n\n" + self.dedent(f""" + ### Reward Function Weights + + We have assigned a weight to designate the importance of each objective. + Your job is to maximize the weighted sum of the objectives, placing a higher priority on objectives with greater weights. + The weights are designated in the table below: + + {weights_series.to_markdown(index=True)} + """) + + return self.dedent(section) + + @property + def zone_info_section(self) -> str: + """A section describing zone related terminology.""" + + return self.dedent(""" + ## Zone Information + + A **zone** is a room, or space in the office building that is potentially occupied by humans, and must be conditioned for comfort when occupied. + + ### Zone Comfort + + The **zone air temperature** is the average temperature in a zone and the measure of comfort in the zone. + + The **zone air heating setpoint** is the minimum temperature that zone is allowed to be, without actively heating the zone. + It's like the minimum of the occupant comfort range. + The **zone air cooling setpoint** is the maximum temperature that zone is allowed to be, without actively cooling the zone. + It's like the maximum of the occupant comfort range. + The zone air heating temperature setpoint is always below the zone air cooling temperature setpoint. + + Ideally: `zone air heating setpoint < zone air temperature if occupied < zone air cooling setpoint` + """) + + @property + def occupancy_modes_section(self) -> str: + """A section describing and contrasting the different occupancy modes.""" + + # TODO(mjrossetti): Add a table of hourly occupancy trends, for each day of + # the week. + + return self.dedent(f""" + ## Occupancy Modes + + You should operate the building in an occupancy mode and an efficiency mode. + + **Occupancy mode** is when the building has at least {self.occupancy_mode_min} occupants. + When in occupancy mode, you should try to maintain zone air temperatures within comfort range (for all occupied zones), while also minimizing energy consumption and carbon emissions. + + **Efficiency mode** is when the building has fewer than {self.occupancy_mode_min} occupants. + When in efficiency mode, your only objective should be to SIGNIFICANTLY reduce energy consumption and carbon emissions. + + ### Heating and Cooling Guidelines + + To save energy, you should transition from efficiency mode to occupancy mode in the morning as late as possible, but early enough to ensure the building is in setpoints when the occupants arrive. + Depending on the outside air temperature, the building will take some time to get into setpoint ranges, especially in the mornings before transitioning from efficiency mode to occupancy mode. + Therefore, you must apply heating or cooling early enough to ensure that the setpoint temperatures are met before occupancy mode setpoints are applied. + + Time it takes to increase zone air temperature by 1 degree Fahrenheit: + + + Under standard conditions with lower outside air temperature, and active heating, it takes 10 minutes. + + Under standard conditions with higher outside air temperature, and no active cooling, it takes 20 minutes. + + Time it takes to decrease zone air temperature by 1 degree Fahrenheit: + + + Under standard conditions with higher outside air temperature, and active cooling, it takes 10 minutes. + + Under standard conditions with lower outside air temperature, and with no active heating, it takes 20 minutes. + """) + + @property + def hvac_system_guidelines_section(self) -> str: + """A section describing building-specific HVAC system setup and guidelines. + + This section describes the HVAC devices under control, and provides + guidance for controlling them. + """ + + return self.dedent(f""" + ## HVAC System Control Guidelines + + There are two systems under your control, with three devices total. + The Air Handler System (AHS) includes two air handler / air conditioner devices (AC-1 and AC-2). + The Hot Water System (HWS) includes one boiler device (BLR). + + ### Devices and Setpoints + + **AC-1**: Air Conditioner / Air Handler Unit (for all zones on the first floor) + + * '{hybrid_env.DISCRETE_ACTION_COMMAND}': you can turn the device ON (1) and OFF (0) + * '{AHU_STATIC_PRESSURE_SETPOINT}': you can increase/decrease airflow by increasing/decreasing static pressure + * '{AHU_SUPPLY_AIR_TEMPERATURE_SETPOINT}': you can cool the zones by lowering the supply air temperature + + **AC-2**: Air Conditioner / Air Handler Unit (for all zones on the second floor) + + * '{hybrid_env.DISCRETE_ACTION_COMMAND}': you can turn the device ON (1) and OFF (0) + * '{AHU_STATIC_PRESSURE_SETPOINT}': you can increase/decrease airflow by increasing/decreasing static pressure + * '{AHU_SUPPLY_AIR_TEMPERATURE_SETPOINT}': you can cool the zones by lowering the supply air temperature + + **BLR**: Boiler (for both floors): + + * '{hybrid_env.DISCRETE_ACTION_COMMAND}': you can turn the device ON (1) and OFF (0) + * '{HWS_DIFFERENTIAL_PRESSURE_SETPOINT}': you can increase/decrease water flow to the zones by increasing/decreasing differential pressure + * '{HWS_SUPPLY_WATER_TEMPERATURE_SETPOINT}': you can heat the zones by increasing the water supply temperature + + ### Air Conditioner (AC) / Air Handler (AHU) Guidelines + + Turning on an AC will consume electricity by running the air blowers and running the refrigeration compressors. + Turning them off will not consume any electricity, but will also remove air cooling and ventilation. + + Lowering an AC's supply air temperature below outside air temperature will cause the compressor to run, consuming electricity, and will cool the zones. + Setting the supply air temperature only enables you to cool, but not heat the zones. + + Increasing an AC's static pressure will increase air circulation through the zones, which results in cooling or heating the zones. + + ### Boiler (BLR) Guidelines + + Lowering the boiler's supply water temperature will reduce carbon emission, but will also reduce the ability to heat zones. + + ### Zone Temperature Control Guidelines + + If a zone is occupied and the zone air temperature is below the zone air heating temperature setpoint, the VAV in the zone will request air flow and hot water circulation to heat the zone. + You control air flow by managing the AHU static pressure setpoints, and hot water circulation by managing the HWS differential pressure and supply water temperature setpoints. + + If the zone is occupied and the zone air temperature is above the zone air cooling temperature setpoint, the VAV in the zone will request cool air from the AHU. + You control the amount of cooling by managing the AHU static pressure and supply air temperature setpoints. + """) + + @property + def action_guidelines_section(self) -> str: + """A section describing the action space.""" + + return self.dedent(f""" + ## Action Guidelines + + Throughout the day, you will be prompted to choose your actions. + Your actions will be used to control the HVAC systems in the building. + An action requires a value and justification for each of the device setpoints listed below. + + {self.setpoints_df.to_markdown(index=False)} + + Note about temperature units: + All temperatures will be reported to you in Kelvin. + The temperatures you choose to set should be in Kelvin. + However, in your textual responses and justifications only, + you should communicate temperatures in {self.temp_display_unit.value} instead, + accurately converting and translating between units as necessary. + """) + + @property + def current_conditions_section(self) -> str: + """A section describing the current conditions in the building.""" + + # TODO(mjrossetti): Add upcoming temperature forecast for at least the next + # six hours, using interpolation and caching strategies. + + return self.dedent(f""" + ## Current Conditions + + The current local time is: {self.env.current_local_timestamp.strftime('%A, %B %d, %Y %l:%M %p %Z')}. + + The current outside air temperature is: {self.observation_response_parser.outside_air_temp:.1f} Kelvin. + + Total number of zones: {len(self.env.building.zones)} + + Current number of occupants: {self.reward_info_parser.total_occupancy}. + + Current number of occupants exposed to unacceptable comfort conditions: {self.reward_info_parser.num_occupants_uncomfortable}. + + {self.zone_conditions_subsection} + + ### Current Power Consumption + + The table below shows the current energy consumption for each device: + + {self.reward_info_parser.energy_consumption_df_watts.to_markdown(index=False)} + """) + + @property + def zone_conditions_subsection(self) -> str: + """A subsection describing the current zone conditions. + + For floor-by-floor occupant comfort, see the FloorBasedPromptmaker class. + """ + + return self.dedent(f""" + ### Current Zone Temperatures + + The table below conveys the comfort conditions across all zones in the building: + + {self.reward_info_parser.zone_conditions_histogram.to_markdown(index=True)} + + The first two rows show the number of zones and the number of occupants at a specific temperature. + The row marked 'temperature setpoint range' makes a '+' for a temperature inside acceptable range, and a '-' for a temperature outside of acceptable range. + The row labeled 'count of occupants exposed' indicates the count of all occupants being exposed to unacceptable comfort conditions. + """) + + @property + def current_action_section(self) -> str: + """A section containing guidance for choosing the next action.""" + + return self.dedent(f""" + ## Current Action + + First, observe the building conditions (including occupancy levels, outside air temperature, zone air temperatures, energy consumption levels, etc.), and use this information to devise an overall strategy for your next action. + + According to your strategy, decide to turn each device ON (1) or OFF (0), using their discrete '{hybrid_env.DISCRETE_ACTION_COMMAND}' setpoints. + + For each device, also decide on values for that device's continuous setpoints. + NOTE: even if the devices are off, you still need to supply values for these continuous setpoints, however they will not be used, so it is ok to choose a value in the middle of the setpoint range. + + Provide an overall justification explaining your strategy in a sentence or two. + Also provide a justification for each setpoint you chose in a sentence or two. + + Finally, select a validity interval from the following options: {self.validity_intervals}. + The **validity interval** is the number of minutes the setpoints will remain in effect. + Choose long validity times when under steady conditions, and only apply short validity intervals when the building is undergoing high amount of change. + After the validity interval expires, you will be allowed to assign new setpoints. + + IMPORTANT NOTE: you MUST structure your response according to the "Formatting Instructions" below. + """) diff --git a/smart_control/llm/prompts/promptmaker_test.py b/smart_control/llm/prompts/promptmaker_test.py new file mode 100644 index 00000000..ae051956 --- /dev/null +++ b/smart_control/llm/prompts/promptmaker_test.py @@ -0,0 +1,463 @@ +from absl.testing import absltest +from absl.testing import parameterized + +import pandas as pd + +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.llm.prompts import promptmaker +from smart_buildings.smart_control.llm.schema import output_schema +from smart_buildings.smart_control.utils.proto_parsers import observation_response_parser +from smart_buildings.smart_control.utils.proto_parsers import reward_info_parser + + +WEIGHTS = { + 'energy_cost_weight': 0.3, + 'carbon_emission_weight': 0.2, + 'productivity_weight': 0.5, +} + +WEIGHTS_INCLUDED_CONTENT = ( + 'We have assigned a weight to designate the importance of each objective.' +) + +BUILDING_INFO = { + 'stories': 'two', + 'sqft': 96_000, + 'location': 'Mountain View, California', + 'name': 'SB-1', +} + + +class PromptmakerTest(absltest.TestCase): + """Tests for the Promptmaker class, with weights present but not included.""" + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + self.env.reward_function.weights = WEIGHTS + self.pm = promptmaker.Promptmaker(env=self.env) + self.expected_promtpmaker_type = 'Promptmaker' + + def test_initialization(self): + self.assertIsInstance(self.pm, promptmaker.Promptmaker) + + def test_attributes(self): + with self.subTest(name='required_attributes'): + self.assertEqual( + self.pm.output_schema_class, + output_schema.SetpointsAction, + ) + self.assertEqual(self.pm.env, self.env) + + with self.subTest(name='configuration_attributes'): + self.assertFalse(self.pm.include_weights) + self.assertEqual(self.pm.occupancy_mode_min, 10) + self.assertEqual(self.pm.temp_display_unit, 'Fahrenheit') + + with self.subTest(name='building_info'): + building_info = self.pm.building_info + self.assertIsInstance(building_info, promptmaker.BuildingInfo) + self.assertEqual(building_info.stories, 'two') + self.assertEqual(building_info.sqft, 96_000) + self.assertEqual(building_info.location, 'Mountain View, California') + + with self.subTest(name='proto_parsers'): + self.assertFalse(self.pm.lazy_init_protos) + self.assertIsInstance( + self.pm.observation_response_parser, + observation_response_parser.ObservationResponseParser, + ) + self.assertIsInstance( + self.pm.reward_info_parser, + reward_info_parser.RewardInfoParser, + ) + + # PROPERTIES + + def test_json_metadata(self): + json_metadata = self.pm.json_metadata + + with self.subTest(name='type'): + self.assertEqual(json_metadata['type'], self.expected_promtpmaker_type) + + with self.subTest(name='include_weights'): + self.assertEqual(json_metadata['include_weights'], False) + + with self.subTest(name='occupancy_mode_min'): + self.assertEqual(json_metadata['occupancy_mode_min'], 10) + + with self.subTest(name='temp_display_unit'): + self.assertEqual(json_metadata['temp_display_unit'], 'Fahrenheit') + + with self.subTest(name='building_info'): + self.assertEqual(json_metadata['building_info'], BUILDING_INFO) + + def test_weights(self): + self.assertEqual( + self.pm.weights, + { + 'energy_cost_weight': 0.3, + 'carbon_emission_weight': 0.2, + 'comfort_weight': 0.5, + }, + ) + + def test_setpoints_df(self): + df = self.pm.setpoints_df + self.assertIsInstance(df, pd.DataFrame) + + expected_records = [ + { + 'device_id': 'air_handler_1', + 'setpoint_name': 'supervisor_run_command', + 'setpoint_type': 'DISCRETE', + 'units': 'On/Off', + 'min_native_value': 0.0, + 'max_native_value': 1.0, + }, + { + 'device_id': 'air_handler_1', + 'setpoint_name': 'supply_air_heating_temperature_setpoint', + 'setpoint_type': 'CONTINUOUS', + 'units': 'Kelvin', + 'min_native_value': 285.0, + 'max_native_value': 295.0, + }, + { + 'device_id': 'air_handler_2', + 'setpoint_name': 'supervisor_run_command', + 'setpoint_type': 'DISCRETE', + 'units': 'On/Off', + 'min_native_value': 0.0, + 'max_native_value': 1.0, + }, + { + 'device_id': 'air_handler_2', + 'setpoint_name': 'supply_air_heating_temperature_setpoint', + 'setpoint_type': 'CONTINUOUS', + 'units': 'Kelvin', + 'min_native_value': 285.0, + 'max_native_value': 295.0, + }, + { + 'device_id': 'boiler_1', + 'setpoint_name': 'supervisor_run_command', + 'setpoint_type': 'DISCRETE', + 'units': 'On/Off', + 'min_native_value': 0.0, + 'max_native_value': 1.0, + }, + { + 'device_id': 'boiler_1', + 'setpoint_name': 'supply_water_setpoint', + 'setpoint_type': 'CONTINUOUS', + 'units': 'Kelvin', + 'min_native_value': 310.0, + 'max_native_value': 350.0, + }, + ] + self.assertListEqual(df.to_dict('records'), expected_records) + + def test_validity_intervals(self): + self.assertEqual( + self.pm.validity_intervals, + [5, 10, 15, 20, 30, 45, 60, 75, 90, 120], + ) + + # PROMPT CONTENT + + def test_prompt(self): + prompt = self.pm.prompt + with self.subTest(name='objectives_section'): + self.assertIn(self.pm.objectives_section, prompt) + + with self.subTest(name='zone_info_section'): + self.assertIn(self.pm.zone_info_section, prompt) + + with self.subTest(name='occupancy_modes_section'): + self.assertIn(self.pm.occupancy_modes_section, prompt) + + with self.subTest(name='hvac_system_guidelines_section'): + self.assertIn(self.pm.hvac_system_guidelines_section, prompt) + + with self.subTest(name='action_guidelines_section'): + self.assertIn(self.pm.action_guidelines_section, prompt) + + with self.subTest(name='current_conditions_section'): + self.assertIn(self.pm.current_conditions_section, prompt) + + with self.subTest(name='current_action_section'): + self.assertIn(self.pm.current_action_section, prompt) + + with self.subTest(name='formatting_instructions_section'): + self.assertIn(self.pm.formatting_instructions_section, prompt) + + def test_objectives_section(self): + section = self.pm.objectives_section + self.assertIn('## Objectives', section) + self.assertIn('### Role', section) + self.assertIn('### Overall Goal', section) + + with self.subTest(name='includes_building_info'): + self.assertIn('**Building Information**', section) + table = self.pm.building_info_series.to_markdown(index=True) + self.assertIn(table, section) + + with self.subTest(name='weights_present_but_not_included'): + self.assertIsNotNone(self.env.reward_function.weights) + self.assertNotIn(WEIGHTS_INCLUDED_CONTENT, section) + + def test_zone_info_section(self): + section = self.pm.zone_info_section + self.assertIn('## Zone Information', section) + self.assertIn('### Zone Comfort', section) + + def test_occupancy_modes_section(self): + section = self.pm.occupancy_modes_section + self.assertIn('## Occupancy Modes', section) + self.assertIn('### Heating and Cooling Guidelines', section) + + with self.subTest(name='uses_occupancy_mode_min'): + self.assertIn( + '**Occupancy mode** is when the building has at least 10 occupants.', + section, + ) + self.assertIn( + '**Efficiency mode** is when the building has fewer than 10' + ' occupants.', + section, + ) + + def test_hvac_system_guidelines_section(self): + section = self.pm.hvac_system_guidelines_section + + with self.subTest(name='contains_section_headers'): + self.assertIn('## HVAC System Control Guidelines', section) + self.assertIn('### Devices and Setpoints', section) + self.assertIn( + '### Air Conditioner (AC) / Air Handler (AHU) Guidelines', + section, + ) + self.assertIn('### Boiler (BLR) Guidelines', section) + self.assertIn('### Zone Temperature Control Guidelines', section) + + with self.subTest(name='mentions_specific_devices'): + self.assertIn( + '**AC-1**: Air Conditioner / Air Handler Unit (for all zones on the' + ' first floor)', + section, + ) + self.assertIn( + '**AC-2**: Air Conditioner / Air Handler Unit (for all zones on the' + ' second floor)', + section, + ) + self.assertIn('**BLR**: Boiler (for both floors)', section) + + with self.subTest(name='mentions_key_setpoints'): + self.assertIn("'supervisor_run_command'", section) + self.assertIn("'static_pressure_setpoint'", section) + self.assertIn("'supply_air_temperature_setpoint'", section) + self.assertIn("'differential_pressure_setpoint'", section) + self.assertIn("'supply_water_setpoint'", section) + + def test_action_guidelines_section(self): + section = self.pm.action_guidelines_section + + with self.subTest(name='contains_section_header'): + self.assertIn('## Action Guidelines', section) + + with self.subTest(name='includes_device_setpoints_table'): + self.assertIn(self.pm.setpoints_df.to_markdown(index=False), section) + + with self.subTest(name='includes_temp_display_unit'): + self.assertIn( + 'you should communicate temperatures in Fahrenheit instead', + section, + ) + + def test_current_conditions_section(self): + section = self.pm.current_conditions_section + + with self.subTest(name='contains_section_headers'): + self.assertIn('## Current Conditions', section) + self.assertIn('### Current Zone Temperatures', section) + self.assertIn('### Current Power Consumption', section) + + with self.subTest(name='includes_current_local_time'): + self.assertIn( + 'The current local time is: Monday, June 07, 2021 12:00 PM PDT', + section, + ) + + with self.subTest(name='includes_current_outside_air_temperature'): + self.assertIn( + 'The current outside air temperature is: 295.0 Kelvin', + section, + ) + + with self.subTest(name='includes_occupant_counts'): + self.assertIn('Total number of zones: 2', section) + self.assertIn( + 'Current number of occupants: 10', + section, + ) + self.assertIn( + 'Current number of occupants exposed to unacceptable comfort' + ' conditions: 0', + section, + ) + + parser = self.pm.reward_info_parser + self.assertIsNotNone(parser) + + # pytype: disable=attribute-error + with self.subTest(name='includes_current_zone_temperatures_table'): + table = parser.zone_conditions_histogram.to_markdown(index=True) + self.assertIn(table, section) + + with self.subTest(name='includes_current_power_consumption_table'): + table = parser.energy_consumption_df_watts.to_markdown(index=False) + self.assertIn(table, section) + # pytype: enable=attribute-error + + def test_current_action_section(self): + section = self.pm.current_action_section + + with self.subTest(name='contains_section_header'): + self.assertIn('## Current Action', section) + + with self.subTest(name='specifies_discrete_action_commands'): + self.assertIn( + 'According to your strategy, decide to turn each device ON (1) or OFF' + " (0), using their discrete 'supervisor_run_command' setpoints.", + section, + ) + + with self.subTest(name='specifies_validity_interval_options'): + self.assertIn( + 'Finally, select a validity interval from the following options:' + ' [5, 10, 15, 20, 30, 45, 60, 75, 90, 120]', + section, + ) + + def test_formatting_instructions_section(self): + section = self.pm.formatting_instructions_section + self.assertIn('## Formatting Instructions', section) + + +class PromptmakerWeightsUnavailableTest(absltest.TestCase): + """Tests for the Promptmaker class, with weights not present.""" + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + + def test_weights_not_requested_or_present(self): + pm = promptmaker.Promptmaker(env=self.env) + # Weights are not requested: + self.assertFalse(pm.include_weights) + # Weights are not present: + self.assertFalse(hasattr(self.env.reward_function, 'weights')) + + section = pm.objectives_section + self.assertNotIn(WEIGHTS_INCLUDED_CONTENT, section) + + def test_weights_requested_but_not_present(self): + pm = promptmaker.Promptmaker(env=self.env, include_weights=True) + # Weights are requested: + self.assertTrue(pm.include_weights) + # Weights are not present: + self.assertFalse(hasattr(self.env.reward_function, 'weights')) + + section = pm.objectives_section + self.assertNotIn(WEIGHTS_INCLUDED_CONTENT, section) + + +class PromptmakerWeightsInclusionTest(absltest.TestCase): + """Tests for the Promptmaker class, with weights present and included.""" + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + self.env.reward_function.weights = WEIGHTS + self.pm = promptmaker.Promptmaker(env=self.env, include_weights=True) + + def test_weights(self): + self.assertEqual( + self.pm.weights, + { + 'energy_cost_weight': 0.3, + 'carbon_emission_weight': 0.2, + 'comfort_weight': 0.5, + }, + ) + + def test_weights_included(self): + weights = self.pm.weights + self.assertIsInstance(weights, dict) + + section = self.pm.objectives_section + self.assertIn(WEIGHTS_INCLUDED_CONTENT, section) + weights_table = pd.Series(weights, name='weight').to_markdown(index=True) + self.assertIn(weights_table, section) + + +class PromptmakerLazyInitProtosTest(parameterized.TestCase): + + ATTRIBUTE_NAMES = ( + dict( + testcase_name='base_prompt', + attribute_name='base_prompt', + ), + dict( + testcase_name='current_conditions_section', + attribute_name='current_conditions_section', + ), + ) + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + self.pm = promptmaker.Promptmaker(self.env, lazy_init_protos=True) + + @parameterized.named_parameters(*ATTRIBUTE_NAMES) + def test_lazy_init_protos_raises_when_protos_not_set(self, attribute_name): + self.assertIsNone(self.pm._observation_response_parser) + self.assertIsNone(self.pm._reward_info_parser) + + with self.assertRaisesRegex( + ValueError, 'Observation response parser is None.' + ): + _ = getattr(self.pm, attribute_name) + + @parameterized.named_parameters(*ATTRIBUTE_NAMES) + def test_lazy_init_protos_ok_when_protos_are_set(self, attribute_name): + self.assertIsNone(self.pm._observation_response_parser) + self.assertIsNone(self.pm._reward_info_parser) + + self.pm.set_protos( + observation_response=self.env.get_observation_response(), + reward_info=self.env.get_reward_info(), + ) + self.assertIsInstance( + self.pm.observation_response_parser, + observation_response_parser.ObservationResponseParser, + ) + self.assertIsInstance( + self.pm.reward_info_parser, + reward_info_parser.RewardInfoParser, + ) + _ = getattr(self.pm, attribute_name) # No error thrown. + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/llm/prompts/sb1/examples/example_floor_based_prompt.md b/smart_control/llm/prompts/sb1/examples/example_floor_based_prompt.md new file mode 100644 index 00000000..c815135f --- /dev/null +++ b/smart_control/llm/prompts/sb1/examples/example_floor_based_prompt.md @@ -0,0 +1,228 @@ +# Agent Instructions + +## Objectives + +### Role + +You are a skilled, experienced, and innovative operator of a commercial office building. +You possess in-depth and complete knowledge about HVAC systems, as well as ASHRAE standards and certifications. +Your job is to optimally control HVAC devices in a given commercial office building. + +**Building Information**: + +| | building_info | +|:---------|:--------------------------| +| name | SB-1 | +| stories | two | +| sqft | 96000 | +| location | Mountain View, California | + +### Overall Goal + +As the building operator, your **Optimal Control Objectives** are to: + ++ Minimize energy consumption / costs, and ++ Minimize carbon emissions, and ++ Maintain occupant comfort (a.k.a. productivity) + +This is a multi-objective optimization problem, where you must balance competing objectives. + +### Reward Function Weights + +We have assigned a weight to designate the importance of each objective. +Your job is to maximize the weighted sum of the objectives, placing a higher priority on objectives with greater weights. +The weights are designated in the table below: + +| | weight | +|:-----------------------|---------:| +| energy_cost_weight | 0.2 | +| carbon_emission_weight | 0.2 | +| comfort_weight | 0.6 | + +## Zone Information + +A **zone** is a room, or space in the office building that is potentially occupied by humans, and must be conditioned for comfort when occupied. + +### Zone Comfort + +The **zone air temperature** is the average temperature in a zone and the measure of comfort in the zone. + +The **zone air heating setpoint** is the minimum temperature that zone is allowed to be, without actively heating the zone. +It's like the minimum of the occupant comfort range. +The **zone air cooling setpoint** is the maximum temperature that zone is allowed to be, without actively cooling the zone. +It's like the maximum of the occupant comfort range. +The zone air heating temperature setpoint is always below the zone air cooling temperature setpoint. + +Ideally: `zone air heating setpoint < zone air temperature if occupied < zone air cooling setpoint` + +## Occupancy Modes + +You should operate the building in an occupancy mode and an efficiency mode. + +**Occupancy mode** is when the building has at least 10 occupants. +When in occupancy mode, you should try to maintain zone air temperatures within comfort range (for all occupied zones), while also minimizing energy consumption and carbon emissions. + +**Efficiency mode** is when the building has fewer than 10 occupants. +When in efficiency mode, your only objective should be to SIGNIFICANTLY reduce energy consumption and carbon emissions. + +### Heating and Cooling Guidelines + +To save energy, you should transition from efficiency mode to occupancy mode in the morning as late as possible, but early enough to ensure the building is in setpoints when the occupants arrive. +Depending on the outside air temperature, the building will take some time to get into setpoint ranges, especially in the mornings before transitioning from efficiency mode to occupancy mode. +Therefore, you must apply heating or cooling early enough to ensure that the setpoint temperatures are met before occupancy mode setpoints are applied. + +Time it takes to increase zone air temperature by 1 degree Fahrenheit: + ++ Under standard conditions with lower outside air temperature, and active heating, it takes 10 minutes. ++ Under standard conditions with higher outside air temperature, and no active cooling, it takes 20 minutes. + +Time it takes to decrease zone air temperature by 1 degree Fahrenheit: + ++ Under standard conditions with higher outside air temperature, and active cooling, it takes 10 minutes. ++ Under standard conditions with lower outside air temperature, and with no active heating, it takes 20 minutes. + +## HVAC System Control Guidelines + +There are two systems under your control, with three devices total. +The Air Handler System (AHS) includes two air handler / air conditioner devices (AC-1 and AC-2). +The Hot Water System (HWS) includes one boiler device (BLR). + +### Devices and Setpoints + +**AC-1**: Air Conditioner / Air Handler Unit (for all zones on the first floor) + +* 'supervisor_run_command': you can turn the device ON (1) and OFF (0) +* 'static_pressure_setpoint': you can increase/decrease airflow by increasing/decreasing static pressure +* 'supply_air_temperature_setpoint': you can cool the zones by lowering the supply air temperature + +**AC-2**: Air Conditioner / Air Handler Unit (for all zones on the second floor) + +* 'supervisor_run_command': you can turn the device ON (1) and OFF (0) +* 'static_pressure_setpoint': you can increase/decrease airflow by increasing/decreasing static pressure +* 'supply_air_temperature_setpoint': you can cool the zones by lowering the supply air temperature + +**BLR**: Boiler (for both floors): + +* 'supervisor_run_command': you can turn the device ON (1) and OFF (0) +* 'differential_pressure_setpoint': you can increase/decrease water flow to the zones by increasing/decreasing differential pressure +* 'supply_water_setpoint': you can heat the zones by increasing the water supply temperature + +### Air Conditioner (AC) / Air Handler (AHU) Guidelines + +Turning on an AC will consume electricity by running the air blowers and running the refrigeration compressors. +Turning them off will not consume any electricity, but will also remove air cooling and ventilation. + +Lowering an AC's supply air temperature below outside air temperature will cause the compressor to run, consuming electricity, and will cool the zones. +Setting the supply air temperature only enables you to cool, but not heat the zones. + +Increasing an AC's static pressure will increase air circulation through the zones, which results in cooling or heating the zones. + +### Boiler (BLR) Guidelines + +Lowering the boiler's supply water temperature will reduce carbon emission, but will also reduce the ability to heat zones. + +### Zone Temperature Control Guidelines + +If a zone is occupied and the zone air temperature is below the zone air heating temperature setpoint, the VAV in the zone will request air flow and hot water circulation to heat the zone. +You control air flow by managing the AHU static pressure setpoints, and hot water circulation by managing the HWS differential pressure and supply water temperature setpoints. + +If the zone is occupied and the zone air temperature is above the zone air cooling temperature setpoint, the VAV in the zone will request cool air from the AHU. +You control the amount of cooling by managing the AHU static pressure and supply air temperature setpoints. + +## Action Guidelines + +Throughout the day, you will be prompted to choose your actions. +Your actions will be used to control the HVAC systems in the building. +An action requires a value and justification for each of the device setpoints listed below. + +| device_id | setpoint_name | setpoint_type | units | min_native_value | max_native_value | +|:------------|:--------------------------------------|:----------------|:--------|-------------------:|-------------------:| +| ahs | ahu_1_static_pressure_setpoint | CONTINUOUS | Pascal | 0 | 20000 | +| ahs | ahu_1_supervisor_run_command | DISCRETE | On/Off | 0 | 1 | +| ahs | ahu_1_supply_air_temperature_setpoint | CONTINUOUS | Kelvin | 285 | 305 | +| ahs | ahu_2_static_pressure_setpoint | CONTINUOUS | Pascal | 0 | 20000 | +| ahs | ahu_2_supervisor_run_command | DISCRETE | On/Off | 0 | 1 | +| ahs | ahu_2_supply_air_temperature_setpoint | CONTINUOUS | Kelvin | 285 | 305 | +| hws | differential_pressure | CONTINUOUS | Pascal | 0 | 20 | +| hws | supervisor_run_command | DISCRETE | On/Off | 0 | 1 | +| hws | supply_water_setpoint | CONTINUOUS | Kelvin | 310 | 350 | + +Note about temperature units: +All temperatures will be reported to you in Kelvin. +The temperatures you choose to set should be in Kelvin. +However, in your textual responses and justifications only, +you should communicate temperatures in Fahrenheit instead, +accurately converting and translating between units as necessary. + +## Current Conditions + +The current local time is: Monday, December 16, 2024 12:00 AM PST. + +The current outside air temperature is: 285.1 Kelvin. + +Total number of zones: 126 + +Current number of occupants: 0. + +Current number of occupants exposed to unacceptable comfort conditions: 0. + +### Current Zone Temperatures + +The table below conveys the comfort conditions across all zones in the building, by floor: + +| | 290.0 | 291.0 | 292.0 | 293.0 | 294.0 | 295.0 | 296.0 | 297.0 | 298.0 | 299.0 | 300.0 | +|:----------------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------| +| occupancy_count | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| setpoint_mask | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | +| setpoint_range | + | + | + | + | + | + | + | + | + | - | - | +| exposed_count | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| occ@floor0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | + +The row 'occupancy_count' shows the total number of occupants building-wide at a specific temperature. +The row 'setpoint_range' indicates with '+' if the temperature is inside the acceptable range, and '-' if it is outside. +The row 'exposed_count' indicates the count of occupants being exposed to unacceptable comfort conditions. +The rows starting with 'occ@floor' show the normalized distribution of zone counts for each floor at that temperature. + +### Current Power Consumption + +The table below shows the current energy consumption for each device: + +| device_type | device_id | metric | description | rate_watts | consumption_kwh | +|:--------------|:------------|:----------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------:|------------------:| +| AHU | ahs | blower_electrical_energy_rate | Cumulative electrical power in W applied to blowers. | 0 | 0 | +| AHU | ahs | air_conditioning_electrical_energy_rate | Cumulative electrical energy rate applied in W for air conditioning. This represents the total power applied for running refrigeration or heat pump cycles (includes running a compressor and pumps to recirculate refrigerant). | 0 | 0 | +| BLR | hws | pump_electrical_energy_rate | Cumulative electrical power in W for water recirculation pumps. | 0 | 0 | +| BLR | hws | natural_gas_heating_energy_rate | Energy rate consumed in W by natural gas for heating water. | 467.875 | 0.0389896 | + +## Current Action + +First, observe the building conditions (including occupancy levels, outside air temperature, zone air temperatures, energy consumption levels, etc.), and use this information to devise an overall strategy for your next action. + +According to your strategy, decide to turn each device ON (1) or OFF (0), using their discrete 'supervisor_run_command' setpoints. + +For each device, also decide on values for that device's continuous setpoints. +NOTE: even if the devices are off, you still need to supply values for these continuous setpoints, however they will not be used, so it is ok to choose a value in the middle of the setpoint range. + +Provide an overall justification explaining your strategy in a sentence or two. +Also provide a justification for each setpoint you chose in a sentence or two. + +Finally, select a validity interval from the following options: [5, 10, 15, 20, 30, 45, 60, 75, 90, 120]. +The **validity interval** is the number of minutes the setpoints will remain in effect. +Choose long validity times when under steady conditions, and only apply short validity intervals when the building is undergoing high amount of change. +After the validity interval expires, you will be allowed to assign new setpoints. + +IMPORTANT NOTE: you MUST structure your response according to the "Formatting Instructions" below. + +## Formatting Instructions + +IMPORTANT: The output MUST be a single, valid JSON object conforming to the schema below. +Do NOT include any other text, explanations, pleasantries, or any other content before or after the JSON object. +The output should be formatted as a JSON instance that conforms to the JSON schema below. + +As an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]} +the object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted. + +Here is the output schema: +``` +{"$defs": {"DeviceSetpoint": {"description": "A single device setpoint.\n\nA device is uniquely identified by a composite key consisting of the device\nidentifier and the setpoint name.\n\nAttributes:\n device_id: The unique identifier of the device (e.g. 'boiler-123-xyz').\n setpoint_name: The name of the setpoint (e.g. 'supply_water_temperature').\n setpoint_value: The requested value to be set (e.g. 120.0).\n justification: The reason for choosing this specific device setting.", "properties": {"device_id": {"description": "The unique identifier of the device.", "title": "Device Id", "type": "string"}, "setpoint_name": {"description": "The name of the setpoint.", "title": "Setpoint Name", "type": "string"}, "setpoint_value": {"description": "The requested value to be set.", "title": "Setpoint Value", "type": "number"}, "justification": {"description": "The reason for choosing this specific device setting.", "title": "Justification", "type": "string"}}, "required": ["device_id", "setpoint_name", "setpoint_value", "justification"], "title": "DeviceSetpoint", "type": "object"}}, "description": "A flexible action model for setting any number of setpoints.\n\nAttributes:\n timestamp: The time the action is taken (in the building's local timezone).\n justification: The overall reason for taking this action. Includes a brief\n description of why the action is justified, as well as the desired\n outcome of the action as a whole.\n setpoints: A list of setpoints.\n validity_interval: The amount of time in minutes the setpoints should remain\n in effect before prompting for a new action.", "properties": {"timestamp": {"description": "The time the action is taken, formatted as 'YYYY-MM-DD HH:MM:SS', assumed to be in the building's local timezone.", "title": "Timestamp", "type": "string"}, "justification": {"description": "The overall reason for taking this action. Includes a brief description of why the action is justified, as well as the desired outcome of the action as a whole.", "title": "Justification", "type": "string"}, "setpoints": {"description": "A list of setpoints.", "items": {"$ref": "#/$defs/DeviceSetpoint"}, "title": "Setpoints", "type": "array"}, "validity_interval": {"description": "The number of minutes the setpoints should remain in effect before prompting for a new action.", "enum": [5, 10, 15, 20, 30, 45, 60, 75, 90, 120], "title": "Validity Interval", "type": "integer"}}, "required": ["timestamp", "justification", "setpoints", "validity_interval"]} +``` diff --git a/smart_control/llm/prompts/sb1/examples/example_prompt.md b/smart_control/llm/prompts/sb1/examples/example_prompt.md new file mode 100644 index 00000000..064b92a2 --- /dev/null +++ b/smart_control/llm/prompts/sb1/examples/example_prompt.md @@ -0,0 +1,226 @@ +# Agent Instructions + +## Objectives + +### Role + +You are a skilled, experienced, and innovative operator of a commercial office building. +You possess in-depth and complete knowledge about HVAC systems, as well as ASHRAE standards and certifications. +Your job is to optimally control HVAC devices in a given commercial office building. + +**Building Information**: + +| | building_info | +|:---------|:--------------------------| +| name | SB-1 | +| stories | two | +| sqft | 96000 | +| location | Mountain View, California | + +### Overall Goal + +As the building operator, your **Optimal Control Objectives** are to: + ++ Minimize energy consumption / costs, and ++ Minimize carbon emissions, and ++ Maintain occupant comfort (a.k.a. productivity) + +This is a multi-objective optimization problem, where you must balance competing objectives. + +### Reward Function Weights + +We have assigned a weight to designate the importance of each objective. +Your job is to maximize the weighted sum of the objectives, placing a higher priority on objectives with greater weights. +The weights are designated in the table below: + +| | weight | +|:-----------------------|---------:| +| energy_cost_weight | 0.2 | +| carbon_emission_weight | 0.2 | +| comfort_weight | 0.6 | + +## Zone Information + +A **zone** is a room, or space in the office building that is potentially occupied by humans, and must be conditioned for comfort when occupied. + +### Zone Comfort + +The **zone air temperature** is the average temperature in a zone and the measure of comfort in the zone. + +The **zone air heating setpoint** is the minimum temperature that zone is allowed to be, without actively heating the zone. +It's like the minimum of the occupant comfort range. +The **zone air cooling setpoint** is the maximum temperature that zone is allowed to be, without actively cooling the zone. +It's like the maximum of the occupant comfort range. +The zone air heating temperature setpoint is always below the zone air cooling temperature setpoint. + +Ideally: `zone air heating setpoint < zone air temperature if occupied < zone air cooling setpoint` + +## Occupancy Modes + +You should operate the building in an occupancy mode and an efficiency mode. + +**Occupancy mode** is when the building has at least 10 occupants. +When in occupancy mode, you should try to maintain zone air temperatures within comfort range (for all occupied zones), while also minimizing energy consumption and carbon emissions. + +**Efficiency mode** is when the building has fewer than 10 occupants. +When in efficiency mode, your only objective should be to SIGNIFICANTLY reduce energy consumption and carbon emissions. + +### Heating and Cooling Guidelines + +To save energy, you should transition from efficiency mode to occupancy mode in the morning as late as possible, but early enough to ensure the building is in setpoints when the occupants arrive. +Depending on the outside air temperature, the building will take some time to get into setpoint ranges, especially in the mornings before transitioning from efficiency mode to occupancy mode. +Therefore, you must apply heating or cooling early enough to ensure that the setpoint temperatures are met before occupancy mode setpoints are applied. + +Time it takes to increase zone air temperature by 1 degree Fahrenheit: + ++ Under standard conditions with lower outside air temperature, and active heating, it takes 10 minutes. ++ Under standard conditions with higher outside air temperature, and no active cooling, it takes 20 minutes. + +Time it takes to decrease zone air temperature by 1 degree Fahrenheit: + ++ Under standard conditions with higher outside air temperature, and active cooling, it takes 10 minutes. ++ Under standard conditions with lower outside air temperature, and with no active heating, it takes 20 minutes. + +## HVAC System Control Guidelines + +There are two systems under your control, with three devices total. +The Air Handler System (AHS) includes two air handler / air conditioner devices (AC-1 and AC-2). +The Hot Water System (HWS) includes one boiler device (BLR). + +### Devices and Setpoints + +**AC-1**: Air Conditioner / Air Handler Unit (for all zones on the first floor) + +* 'supervisor_run_command': you can turn the device ON (1) and OFF (0) +* 'static_pressure_setpoint': you can increase/decrease airflow by increasing/decreasing static pressure +* 'supply_air_temperature_setpoint': you can cool the zones by lowering the supply air temperature + +**AC-2**: Air Conditioner / Air Handler Unit (for all zones on the second floor) + +* 'supervisor_run_command': you can turn the device ON (1) and OFF (0) +* 'static_pressure_setpoint': you can increase/decrease airflow by increasing/decreasing static pressure +* 'supply_air_temperature_setpoint': you can cool the zones by lowering the supply air temperature + +**BLR**: Boiler (for both floors): + +* 'supervisor_run_command': you can turn the device ON (1) and OFF (0) +* 'differential_pressure_setpoint': you can increase/decrease water flow to the zones by increasing/decreasing differential pressure +* 'supply_water_setpoint': you can heat the zones by increasing the water supply temperature + +### Air Conditioner (AC) / Air Handler (AHU) Guidelines + +Turning on an AC will consume electricity by running the air blowers and running the refrigeration compressors. +Turning them off will not consume any electricity, but will also remove air cooling and ventilation. + +Lowering an AC's supply air temperature below outside air temperature will cause the compressor to run, consuming electricity, and will cool the zones. +Setting the supply air temperature only enables you to cool, but not heat the zones. + +Increasing an AC's static pressure will increase air circulation through the zones, which results in cooling or heating the zones. + +### Boiler (BLR) Guidelines + +Lowering the boiler's supply water temperature will reduce carbon emission, but will also reduce the ability to heat zones. + +### Zone Temperature Control Guidelines + +If a zone is occupied and the zone air temperature is below the zone air heating temperature setpoint, the VAV in the zone will request air flow and hot water circulation to heat the zone. +You control air flow by managing the AHU static pressure setpoints, and hot water circulation by managing the HWS differential pressure and supply water temperature setpoints. + +If the zone is occupied and the zone air temperature is above the zone air cooling temperature setpoint, the VAV in the zone will request cool air from the AHU. +You control the amount of cooling by managing the AHU static pressure and supply air temperature setpoints. + +## Action Guidelines + +Throughout the day, you will be prompted to choose your actions. +Your actions will be used to control the HVAC systems in the building. +An action requires a value and justification for each of the device setpoints listed below. + +| device_id | setpoint_name | setpoint_type | units | min_native_value | max_native_value | +|:------------|:--------------------------------------|:----------------|:--------|-------------------:|-------------------:| +| ahs | ahu_1_static_pressure_setpoint | CONTINUOUS | Pascal | 0 | 20000 | +| ahs | ahu_1_supervisor_run_command | DISCRETE | On/Off | 0 | 1 | +| ahs | ahu_1_supply_air_temperature_setpoint | CONTINUOUS | Kelvin | 285 | 305 | +| ahs | ahu_2_static_pressure_setpoint | CONTINUOUS | Pascal | 0 | 20000 | +| ahs | ahu_2_supervisor_run_command | DISCRETE | On/Off | 0 | 1 | +| ahs | ahu_2_supply_air_temperature_setpoint | CONTINUOUS | Kelvin | 285 | 305 | +| hws | differential_pressure | CONTINUOUS | Pascal | 0 | 20 | +| hws | supervisor_run_command | DISCRETE | On/Off | 0 | 1 | +| hws | supply_water_setpoint | CONTINUOUS | Kelvin | 310 | 350 | + +Note about temperature units: +All temperatures will be reported to you in Kelvin. +The temperatures you choose to set should be in Kelvin. +However, in your textual responses and justifications only, +you should communicate temperatures in Fahrenheit instead, +accurately converting and translating between units as necessary. + +## Current Conditions + +The current local time is: Monday, December 16, 2024 12:00 AM PST. + +The current outside air temperature is: 285.1 Kelvin. + +Total number of zones: 126 + +Current number of occupants: 0. + +Current number of occupants exposed to unacceptable comfort conditions: 0. + +### Current Zone Temperatures + +The table below conveys the comfort conditions across all zones in the building: + +| | 290.0K | 291.0K | 292.0K | 293.0K | 294.0K | 295.0K | 296.0K | 297.0K | 298.0K | 299.0K | 300.0K | +|:---------------------------|:---------|:---------|:---------|:---------|:---------|:---------|:---------|:---------|:---------|:---------|:---------| +| count of zones | 0 | 0 | 0 | 0 | 126 | 0 | 0 | 0 | 0 | 0 | 0 | +| count of occupants | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| temperature setpoint range | + | + | + | + | + | + | + | + | + | - | - | +| count of occupants exposed | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +The first two rows show the number of zones and the number of occupants at a specific temperature. +The row marked 'temperature setpoint range' makes a '+' for a temperature inside acceptable range, and a '-' for a temperature outside of acceptable range. +The row labeled 'count of occupants exposed' indicates the count of all occupants being exposed to unacceptable comfort conditions. + +### Current Power Consumption + +The table below shows the current energy consumption for each device: + +| device_type | device_id | metric | description | rate_watts | consumption_kwh | +|:--------------|:------------|:----------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------:|------------------:| +| AHU | ahs | blower_electrical_energy_rate | Cumulative electrical power in W applied to blowers. | 0 | 0 | +| AHU | ahs | air_conditioning_electrical_energy_rate | Cumulative electrical energy rate applied in W for air conditioning. This represents the total power applied for running refrigeration or heat pump cycles (includes running a compressor and pumps to recirculate refrigerant). | 0 | 0 | +| BLR | hws | pump_electrical_energy_rate | Cumulative electrical power in W for water recirculation pumps. | 0 | 0 | +| BLR | hws | natural_gas_heating_energy_rate | Energy rate consumed in W by natural gas for heating water. | 467.875 | 0.0389896 | + +## Current Action + +First, observe the building conditions (including occupancy levels, outside air temperature, zone air temperatures, energy consumption levels, etc.), and use this information to devise an overall strategy for your next action. + +According to your strategy, decide to turn each device ON (1) or OFF (0), using their discrete 'supervisor_run_command' setpoints. + +For each device, also decide on values for that device's continuous setpoints. +NOTE: even if the devices are off, you still need to supply values for these continuous setpoints, however they will not be used, so it is ok to choose a value in the middle of the setpoint range. + +Provide an overall justification explaining your strategy in a sentence or two. +Also provide a justification for each setpoint you chose in a sentence or two. + +Finally, select a validity interval from the following options: [5, 10, 15, 20, 30, 45, 60, 75, 90, 120]. +The **validity interval** is the number of minutes the setpoints will remain in effect. +Choose long validity times when under steady conditions, and only apply short validity intervals when the building is undergoing high amount of change. +After the validity interval expires, you will be allowed to assign new setpoints. + +IMPORTANT NOTE: you MUST structure your response according to the "Formatting Instructions" below. + +## Formatting Instructions + +IMPORTANT: The output MUST be a single, valid JSON object conforming to the schema below. +Do NOT include any other text, explanations, pleasantries, or any other content before or after the JSON object. +The output should be formatted as a JSON instance that conforms to the JSON schema below. + +As an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]} +the object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted. + +Here is the output schema: +``` +{"$defs": {"DeviceSetpoint": {"description": "A single device setpoint.\n\nA device is uniquely identified by a composite key consisting of the device\nidentifier and the setpoint name.\n\nAttributes:\n device_id: The unique identifier of the device (e.g. 'boiler-123-xyz').\n setpoint_name: The name of the setpoint (e.g. 'supply_water_temperature').\n setpoint_value: The requested value to be set (e.g. 120.0).\n justification: The reason for choosing this specific device setting.", "properties": {"device_id": {"description": "The unique identifier of the device.", "title": "Device Id", "type": "string"}, "setpoint_name": {"description": "The name of the setpoint.", "title": "Setpoint Name", "type": "string"}, "setpoint_value": {"description": "The requested value to be set.", "title": "Setpoint Value", "type": "number"}, "justification": {"description": "The reason for choosing this specific device setting.", "title": "Justification", "type": "string"}}, "required": ["device_id", "setpoint_name", "setpoint_value", "justification"], "title": "DeviceSetpoint", "type": "object"}}, "description": "A flexible action model for setting any number of setpoints.\n\nAttributes:\n timestamp: The time the action is taken (in the building's local timezone).\n justification: The overall reason for taking this action. Includes a brief\n description of why the action is justified, as well as the desired\n outcome of the action as a whole.\n setpoints: A list of setpoints.\n validity_interval: The amount of time in minutes the setpoints should remain\n in effect before prompting for a new action.", "properties": {"timestamp": {"description": "The time the action is taken, formatted as 'YYYY-MM-DD HH:MM:SS', assumed to be in the building's local timezone.", "title": "Timestamp", "type": "string"}, "justification": {"description": "The overall reason for taking this action. Includes a brief description of why the action is justified, as well as the desired outcome of the action as a whole.", "title": "Justification", "type": "string"}, "setpoints": {"description": "A list of setpoints.", "items": {"$ref": "#/$defs/DeviceSetpoint"}, "title": "Setpoints", "type": "array"}, "validity_interval": {"description": "The number of minutes the setpoints should remain in effect before prompting for a new action.", "enum": [5, 10, 15, 20, 30, 45, 60, 75, 90, 120], "title": "Validity Interval", "type": "integer"}}, "required": ["timestamp", "justification", "setpoints", "validity_interval"]} +``` diff --git a/smart_control/llm/prompts/sb1/generator.py b/smart_control/llm/prompts/sb1/generator.py new file mode 100644 index 00000000..14e00456 --- /dev/null +++ b/smart_control/llm/prompts/sb1/generator.py @@ -0,0 +1,51 @@ +"""Example prompt generator for Building 'SB-1'. + +To run this script using blaze: + +```sh +blaze run //third_party/py/smart_buildings/smart_control/llm/prompts/sb1:generator +``` + +Arguments: + + --include_weights: Whether to include weights in the prompt (default: True). + --md_filename: Filename for the markdown file (default: 'example_prompt.md'). +""" # pylint: disable=line-too-long + +import os + +from absl import app +from absl import flags + +from smart_buildings.smart_control.configs.resources.sb1.config_utils import full_config +from smart_buildings.smart_control.llm.prompts import generator +from smart_buildings.smart_control.llm.prompts.sb1 import sb1_promptmaker + +INCLUDE_WEIGHTS = flags.DEFINE_boolean( + "include_weights", True, "Include weights in the prompt." +) + + +def main(_) -> None: + """Loads environment, creates prompt, and writes to markdown file.""" + + print("SETTING GIN CONFIG...") + full_config.set_gin_config() + + generator.write_prompt_md( + promptmaker_class=sb1_promptmaker.SB1Promptmaker, + include_weights=INCLUDE_WEIGHTS.value, + dirpath=os.path.dirname(os.path.realpath(__file__)), + filename="example_prompt.md", + ) + + generator.write_prompt_md( + promptmaker_class=sb1_promptmaker.SB1FloorBasedPromptmaker, + include_weights=INCLUDE_WEIGHTS.value, + dirpath=os.path.dirname(os.path.realpath(__file__)), + filename="example_floor_based_prompt.md", + ) + + +if __name__ == "__main__": + app.run(main) diff --git a/smart_control/llm/prompts/sb1/sb1_promptmaker.py b/smart_control/llm/prompts/sb1/sb1_promptmaker.py new file mode 100644 index 00000000..d424218c --- /dev/null +++ b/smart_control/llm/prompts/sb1/sb1_promptmaker.py @@ -0,0 +1,16 @@ +"""Promptmaker for Building SB-1. + +This is a building-specific promptmaker used to generate prompts for controlling +Building 'SB-1'. +""" + +from smart_buildings.smart_control.llm.prompts import promptmaker as pm +from smart_buildings.smart_control.llm.prompts import floor_based_promptmaker as fbpm + + +class SB1Promptmaker(pm.Promptmaker): + """Promptmaker for Building 'SB-1'.""" + + +class SB1FloorBasedPromptmaker(fbpm.FloorBasedPromptmaker): + """Floor-based Promptmaker for Building 'SB-1'.""" diff --git a/smart_control/llm/prompts/sb1/sb1_promptmaker_test.py b/smart_control/llm/prompts/sb1/sb1_promptmaker_test.py new file mode 100644 index 00000000..3e1b22b8 --- /dev/null +++ b/smart_control/llm/prompts/sb1/sb1_promptmaker_test.py @@ -0,0 +1,51 @@ +from absl.testing import absltest + +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.llm.prompts import promptmaker_test +from smart_buildings.smart_control.llm.prompts.sb1 import sb1_promptmaker + + +class SB1PromptmakerTest(promptmaker_test.PromptmakerTest): + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + self.env.reward_function.weights = promptmaker_test.WEIGHTS + self.pm = sb1_promptmaker.SB1Promptmaker(env=self.env) + self.expected_promtpmaker_type = 'SB1Promptmaker' + + def test_initialization(self): + self.assertIsInstance(self.pm, sb1_promptmaker.SB1Promptmaker) + + +class SB1FloorBasedPromptmakerTest(promptmaker_test.PromptmakerTest): + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + self.env.reward_function.weights = promptmaker_test.WEIGHTS + self.pm = sb1_promptmaker.SB1FloorBasedPromptmaker(env=self.env) + self.expected_promtpmaker_type = 'SB1FloorBasedPromptmaker' + + def test_initialization(self): + self.assertIsInstance(self.pm, sb1_promptmaker.SB1FloorBasedPromptmaker) + + def test_current_conditions_section(self): + section = self.pm.current_conditions_section + self.assertIn('## Current Conditions', section) + self.assertIn('### Current Zone Temperatures', section) + self.assertIn('by floor:', section) + self.assertIn("The row 'occupancy_count'", section) + self.assertIn("The rows starting with 'occ@floor'", section) + + # Check if the table is present + table = self.pm.zone_conditions_histogram_by_floor.to_markdown(index=True) + self.assertIn(table, section) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/llm/schema/action_context.py b/smart_control/llm/schema/action_context.py new file mode 100644 index 00000000..c42f59c1 --- /dev/null +++ b/smart_control/llm/schema/action_context.py @@ -0,0 +1,387 @@ +"""Action Context is an LLM output schema with awareness of the environment. + +**Setpoint Content Validations** + +The Action Context uses its environment to validate the content of the setpoints +in the requested action. If a given setpoint value is outside the valid range +as defined by that setpoint's action normalizer (thus exceeding the guardrails), +an error will be raised if the `clip` option is set to `False`. However, by +default, if the `clip` option is set to `True`, the setpoints will be clipped to +the bounds of the valid setpoint range, and a record of the error will be stored +(instead of being raised). For example, if the valid range for a setpoint is +[10, 20], and the LLM requests a value of 25, with clipping enabled, the value +will be clipped to 20, and a record of the error will be available in the +`guardrails_exceeded` attribute. + +**Action Formatting** + +The Action Context also uses its environment to convert the setpoints into a +format suitable for stepping the environment. The `ActionContext` class should +be used in conjunction with a normal continuous action `Environment`, whereas +the `HybridActionContext` class should be used with a `HybridActionEnvironment`. +Regardless of which class is used, the `get_action` method produces a properly +formatted action that can be used to step the environment. +""" + +import abc +from collections.abc import Sequence, Collection +import dataclasses +import json +from typing import Any, Literal, Self + +import pandas as pd +import pydantic + +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.schema import output_schema + +SteppableActionType = ( + environment.NormalizedActionValues + | hybrid_action_environment.HybridAction +) + + +# +# ERRORS +# + + +class GuardrailsExceededError(ValueError): + """Requested setpoint value is outside the normalizer range.""" + + +@dataclasses.dataclass(frozen=True) +class GuardrailsExceededRecord: + """Information about a requested setpoint value that is out of range. + + Attributes: + device_id: The device identifer. + setpoint_name: The name of the setpoint for the given device. + requested_value: The requested setpoint value. + setpoint_range: The valid range of setpoint values accepted by the + environment. + clipped_value: The setpoint value after being clipped to the valid range. + """ + device_id: str + setpoint_name: str + requested_value: float + setpoint_range: tuple[float, float] + clipped_value: float + + +# +# SCHEMA +# + + +class Steppable(abc.ABC): + """An action schema that produces an action that can step an environment.""" + + @abc.abstractmethod + def get_action( + self, + ) -> SteppableActionType: + """Returns an action used to step the environment.""" + + +class ActionContext(output_schema.SetpointsAction, Steppable): + """A `SetpointsAction` with awareness of the environment. + + This `ActionContext` class should be used in conjunction with a normal + continuous action `Environment`. + """ + + # We are using the environment for validation of the setpoints, but it is not + # part of the Pydantic model schema itself. Because validation runs during + # the parent class initialization, the environment must be assigned + # beforehand, so we use an object.__setattr__() approach. However, Pydantic + # v2's __getattr__ intercepts access to the environment during validation, + # which causes an AttributeError. Defining __slots__ forces the environment + # to be managed via Python's slot mechanism, bypassing Pydantic's + # __getattr__ and allowing it to be accessed during validation. + # + # TODO: b/496194630 - It might make more sense to make this a separate class, + # instead of inheriting from the schema class. + # + __slots__ = ("_env", "_clip", "_guardrails_exceeded") + _env: environment.Environment + _clip: bool + _guardrails_exceeded: list[GuardrailsExceededRecord] + + def __init__( + self, env: environment.Environment, *, clip: bool = True, **kwargs + ): + """Initializes the instance. + + Args: + env: The environment to use for validation. + clip: Governs the behavior when an agent requests a setpoint value that is + outside of the valid range. If `True`, clips the setpoint values to the + bounds of the valid range, and logs a record of the error, but does not + halt execution. This is the default behavior. Otherwise, if `False`, + will raise a `GuardrailsExceededError` and halt execution. + **kwargs: Arguments to pass to initialize the `SetpointsAction` schema. + + Raises: + GuardrailsExceededError: If `clip` is `False` and any setpoint value is + outside the valid range defined by the environment's normalizers. + """ + object.__setattr__(self, "_env", env) + object.__setattr__(self, "_clip", clip) + object.__setattr__(self, "_guardrails_exceeded", []) + super().__init__(**kwargs) + + @classmethod + def from_json( + cls, txt: str, env: environment.Environment, *, clip: bool = True + ) -> Self: + """Creates an instance from a JSON string, while passing extra attributes. + + The LLM responds with a JSON-formatted string, but we need to pass the + environment and clip attributes to the class constructor as well. So this + method solves that problem. + + This method is meant to act as a replacement for Pydantic's + `model_validate_json` method, which we would normally use, but cannot use + with this class due to its custom `__init__` signature. + + Args: + txt: The JSON-formatted string to parse and validate. + env: The environment to use for validation. + clip: Governs the behavior when an agent requests a setpoint value that is + outside of the valid range. If `True`, clips the setpoint values to the + bounds of the valid range, and logs a record of the error, but does not + halt execution. This is the default behavior. Otherwise, if `False`, + will raise a `GuardrailsExceededError` and halt execution. + + Returns: + An instance of the class. + """ + return cls(env=env, clip=clip, **json.loads(txt)) + + @property + def env(self) -> environment.Environment: + """The environment.""" + return self._env + + @property + def clip(self) -> bool: + """Whether to clip setpoint values to the bounds of the valid range.""" + return self._clip + + @property + def guardrails_exceeded(self) -> Collection[GuardrailsExceededRecord]: + """A list of guardrails errors that occurred during validation.""" + return self._guardrails_exceeded + + @pydantic.model_validator(mode="after") + def validate_setpoint_contents(self) -> Self: + """Ensures all env action names are present, and values are in range.""" + setpoint_action_names = set() + + # CHECK SETPOINTS THAT ARE PRESENT IN THE SCHEMA + for setpoint in self.setpoints: + device_id = setpoint.device_id + setpoint_name = setpoint.setpoint_name + try: + action_name = self.env.id_map[(device_id, setpoint_name)] + except KeyError as err: + raise ValueError( + f"Setpoint for ({device_id!r}, {setpoint_name!r}) not found in the" + f" environment" + ) from err + setpoint_action_names.add(action_name) + + normalizer = self.env.action_normalizers.get(setpoint_name) + if normalizer is None: + raise ValueError( + f"Normalizer not found for setpoint: {action_name!r}" + ) + + setpoint_value = setpoint.setpoint_value + setpoint_min = normalizer.setpoint_min # min native value + setpoint_max = normalizer.setpoint_max # max native value + if not (setpoint_min <= setpoint_value <= setpoint_max): + if self._clip: + clipped_value = max(setpoint_min, min(setpoint_value, setpoint_max)) + self._guardrails_exceeded.append( + GuardrailsExceededRecord( + device_id=device_id, + setpoint_name=setpoint_name, + requested_value=setpoint_value, + setpoint_range=(setpoint_min, setpoint_max), + clipped_value=clipped_value, + ) + ) + setpoint.setpoint_value = clipped_value + else: + raise GuardrailsExceededError( + f"Value {setpoint_value} for setpoint ({device_id!r}," + f" {setpoint_name!r}) is outside expected range [{setpoint_min}," + f" {setpoint_max}]" + ) + + missing_action_names = set(self.env.action_names) - setpoint_action_names + if missing_action_names: + raise ValueError( + "The following setpoints are expected by the environment but are" + f" missing from the schema: {missing_action_names}" + ) + + return self + + @property + def sorted_setpoints(self) -> Sequence[output_schema.DeviceSetpoint]: + """The setpoints, in the same order as the environment's action names.""" + return sorted( + self.setpoints, + key=lambda sp: self.env.action_names.index( + self.env.id_map[(sp.device_id, sp.setpoint_name)] + ), + ) + + def get_action_values(self) -> environment.NormalizedActionValues: + """Returns the normalized values used to step the `Environment`. + + Returns: + A list of normalized action values, sorted in the same order as the + environment's action names. + """ + normalized_values = [] + for sp in self.sorted_setpoints: + action_name = self.env.id_map[(sp.device_id, sp.setpoint_name)] + normalizer = self.env.action_normalizers.get(sp.setpoint_name) + if normalizer is None: + raise ValueError(f"No normalizer found for setpoint: {action_name!r}.") + normalized_values.append(normalizer.agent_value(sp.setpoint_value)) + return normalized_values + + def get_action(self) -> SteppableActionType: + """Returns the action used to step the environment.""" + return self.get_action_values() + + @property + def setpoint_records(self) -> list[dict[str, Any]]: + """The setpoints as a list of records (dictionaries).""" + return [ + { + "timestamp": self.timestamp, + "validity_interval": self.validity_interval, + "justification": self.justification, + "action_name": self.env.id_map[(sp.device_id, sp.setpoint_name)], + "device_id": sp.device_id, + "setpoint_name": sp.setpoint_name, + "setpoint_value": sp.setpoint_value, + "setpoint_justification": sp.justification, + } + for sp in self.sorted_setpoints + ] + + @property + def setpoints_df(self) -> pd.DataFrame: + """The setpoints as a pandas DataFrame.""" + return pd.DataFrame(self.setpoint_records) + + @property + def flattened_setpoints_record(self) -> dict[str, Any]: + """A flattened dictionary of setpoint records. No nesting. + + The dictionary has keys for each action_name and setpoint value, + and a second set of keys for each action_name and setpoint justification. + """ + record = { + "timestamp": self.timestamp, + "validity_interval": self.validity_interval, + "justification": self.justification, + } + for sp in self.sorted_setpoints: + action_name = self.env.id_map[(sp.device_id, sp.setpoint_name)] + record[action_name] = sp.setpoint_value + record[f"{action_name}_justification"] = sp.justification + return record + + +class HybridActionContext(ActionContext, Steppable): + """A `SetpointsAction` with awareness of the environment. + + This class should be used in conjunction with a `HybridActionEnvironment`. + """ + + _env: hybrid_action_environment.HybridActionEnvironment + + def __init__( + self, + env: hybrid_action_environment.HybridActionEnvironment, + *, + clip: bool = True, + **kwargs, + ): + """Initializes the instance. + + Args: + env: The hybrid action environment to use for validation. + clip: Governs the behavior when an agent requests a setpoint value that is + outside of the valid range. If `True`, clips the setpoint values to the + bounds of the valid range, and logs a record of the error, but does not + halt execution. This is the default behavior. Otherwise, if `False`, + will raise a `GuardrailsExceededError` and halt execution. + **kwargs: Arguments to pass to initialize the `SetpointsAction` schema. + + Raises: + GuardrailsExceededError: If `clip` is `False` and any setpoint value is + outside the valid range defined by the environment's normalizers. + """ + super().__init__(env=env, clip=clip, **kwargs) + + def get_hybrid_action(self) -> hybrid_action_environment.HybridAction: + """Returns the hybrid action used to step a `HybridActionEnvironment`.""" + return self.env.convert_to_hybrid(self.get_action_values()) + + def get_action(self) -> SteppableActionType: + """Returns the action used to step the environment.""" + return self.get_hybrid_action() + + +def create_action_context_model( + custom_intervals: Sequence[int], + *, + hybrid: bool = True, +) -> type[ActionContext]: + """Creates an action context model class, using custom validity intervals. + + Args: + custom_intervals: A list of intervals in minutes. Represents the range of + possible options the LLM has to choose from. + hybrid: Whether to create a hybrid action context model class. + + Returns: + A Pydantic model class based on `ActionContext`, but defined using the + provided set of custom validity intervals. + """ + custom_intervals = sorted(set(custom_intervals)) + ValidityIntervalOptions = Literal[*custom_intervals] # pytype: disable=invalid-annotation # pydantic needs it this way + + fields = { + "validity_interval": ( + ValidityIntervalOptions, + pydantic.Field( + description=output_schema.VALIDITY_INTERVAL_DESCRIPTION + ), + ) + } + + if hybrid: + base_class = HybridActionContext + model_name = "HybridActionContextWithCustomInterval" + else: + base_class = ActionContext + model_name = "ActionContextWithCustomInterval" + + model = pydantic.create_model( + model_name, + **fields, + __base__=base_class, + ) + model.__doc__ = base_class.__doc__ + return model diff --git a/smart_control/llm/schema/action_context_test.py b/smart_control/llm/schema/action_context_test.py new file mode 100644 index 00000000..6e061380 --- /dev/null +++ b/smart_control/llm/schema/action_context_test.py @@ -0,0 +1,578 @@ +from typing import get_args +from unittest import mock + +from absl.testing import absltest +import pandas as pd +import pydantic +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.schema import action_context +from smart_buildings.smart_control.llm.schema import conftest as schema_conftest +from smart_buildings.smart_control.llm.schema import output_schema_test + + +class ActionContextTest(output_schema_test.ActionTest): + + def setUp(self): + super().setUp() + self.env = env_conftest.create_environment(layout=env_conftest.DEMO_LAYOUT) + self.action_ctx = schema_conftest.create_action_context(env=self.env) + + def test_initialization(self): + self.assertIsInstance(self.action_ctx, action_context.ActionContext) + + def test_env(self): + self.assertIsInstance(self.action_ctx.env, environment.Environment) + + def test_clip(self): + self.assertTrue(self.action_ctx.clip) + + def test_guardrails_exceeded(self): + self.assertEmpty(self.action_ctx.guardrails_exceeded) + + def test_sorted_setpoints(self): + names_from_setpoints = [ + (sp.device_id, sp.setpoint_name) + for sp in self.action_ctx.sorted_setpoints + ] + names_from_env = [ + self.env.id_map.inv[action_name] + for action_name in self.env.action_names + ] + self.assertEqual(names_from_setpoints, names_from_env) + + def test_get_action_values(self): + self.assertEqual(self.action_ctx.get_action_values(), [-1.0, -1.0, -1.0]) + + def test_get_action_values_normalizer_not_found_raises(self): + with mock.patch.dict(self.env.action_normalizers, {}, clear=True): + with self.assertRaisesRegex( + ValueError, + "No normalizer found for setpoint:" + " 'air_handler_1_supply_air_heating_temperature_setpoint'.", + ): + self.action_ctx.get_action_values() + + def test_get_action_values_device_id_not_found_raises(self): + self.action_ctx.setpoints[0].device_id = "OOPS" + with self.assertRaisesRegex( + KeyError, "\\('OOPS', 'supply_air_heating_temperature_setpoint'\\)" + ): + self.action_ctx.get_action_values() + + def test_get_action_values_setpoint_name_not_found_raises(self): + self.action_ctx.setpoints[0].setpoint_name = "OOPS" + with self.assertRaisesRegex(KeyError, "\\('air_handler_1', 'OOPS'\\)"): + self.action_ctx.get_action_values() + + def test_setpoints_df(self): + df = self.action_ctx.setpoints_df + expected_df = pd.DataFrame([ + { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "action_name": ( + "air_handler_1_supply_air_heating_temperature_setpoint" + ), + "device_id": "air_handler_1", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_value": 285.0, + "setpoint_justification": "To cool the air.", + }, + { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "action_name": "boiler_1_supply_water_setpoint", + "device_id": "boiler_1", + "setpoint_name": "supply_water_setpoint", + "setpoint_value": 310.0, + "setpoint_justification": "To heat the water.", + }, + { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "action_name": ( + "air_handler_2_supply_air_heating_temperature_setpoint" + ), + "device_id": "air_handler_2", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_value": 285.0, + "setpoint_justification": "To cool the air.", + }, + ]) + pd.testing.assert_frame_equal(df, expected_df) + + def test_flattened_setpoints_record(self): + record = self.action_ctx.flattened_setpoints_record + expected_record = { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "air_handler_1_supply_air_heating_temperature_setpoint": 285.0, + "air_handler_1_supply_air_heating_temperature_setpoint_justification": ( + "To cool the air." + ), + "boiler_1_supply_water_setpoint": 310.0, + "boiler_1_supply_water_setpoint_justification": "To heat the water.", + "air_handler_2_supply_air_heating_temperature_setpoint": 285.0, + "air_handler_2_supply_air_heating_temperature_setpoint_justification": ( + "To cool the air." + ), + } + self.assertDictEqual(record, expected_record) + + +class HybridActionContextTest(output_schema_test.HybridActionTest): + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + self.action_ctx = schema_conftest.create_hybrid_action_context(env=self.env) + + def test_initialization(self): + self.assertIsInstance(self.action_ctx, action_context.HybridActionContext) + + def test_env(self): + self.assertIsInstance( + self.action_ctx.env, + hybrid_action_environment.HybridActionEnvironment, + ) + + def test_clip(self): + self.assertTrue(self.action_ctx.clip) + + def test_guardrails_exceeded(self): + self.assertEmpty(self.action_ctx.guardrails_exceeded) + + def test_get_action_values(self): + self.assertEqual( + self.action_ctx.get_action_values(), [-1.0, 1.0, -1.0, 1.0, -1.0, 1.0] + ) + + def test_get_action_values_normalizer_not_found_raises(self): + with mock.patch.dict(self.env.action_normalizers, {}, clear=True): + with self.assertRaisesRegex( + ValueError, + "No normalizer found for setpoint:" + " 'air_handler_1_supply_air_heating_temperature_setpoint'.", + ): + self.action_ctx.get_action_values() + + def test_get_action_values_device_id_not_found_raises(self): + self.action_ctx.setpoints[0].device_id = "OOPS" + with self.assertRaisesRegex( + KeyError, "\\('OOPS', 'supervisor_run_command'\\)" + ): + self.action_ctx.get_action_values() + + def test_get_action_values_setpoint_name_not_found_raises(self): + self.action_ctx.setpoints[0].setpoint_name = "OOPS" + with self.assertRaisesRegex(KeyError, "\\('air_handler_1', 'OOPS'\\)"): + self.action_ctx.get_action_values() + + def test_get_hybrid_action(self): + self.assertEqual( + self.action_ctx.get_hybrid_action(), + { + "continuous_action": [-1.0, -1.0, -1.0], + "discrete_action": [1.0, 1.0, 1.0], + }, + ) + + def test_setpoints_df(self): + df = self.action_ctx.setpoints_df + expected_df = pd.DataFrame([ + { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "action_name": ( + "air_handler_1_supply_air_heating_temperature_setpoint" + ), + "device_id": "air_handler_1", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_value": 285.0, + "setpoint_justification": "To cool the air.", + }, + { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "action_name": "air_handler_1_supervisor_run_command", + "device_id": "air_handler_1", + "setpoint_name": "supervisor_run_command", + "setpoint_value": 1.0, + "setpoint_justification": "To turn the device on.", + }, + { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "action_name": "boiler_1_supply_water_setpoint", + "device_id": "boiler_1", + "setpoint_name": "supply_water_setpoint", + "setpoint_value": 310.0, + "setpoint_justification": "To heat the water.", + }, + { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "action_name": "boiler_1_supervisor_run_command", + "device_id": "boiler_1", + "setpoint_name": "supervisor_run_command", + "setpoint_value": 1.0, + "setpoint_justification": "To turn the device on.", + }, + { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "action_name": ( + "air_handler_2_supply_air_heating_temperature_setpoint" + ), + "device_id": "air_handler_2", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_value": 285.0, + "setpoint_justification": "To cool the air.", + }, + { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "action_name": "air_handler_2_supervisor_run_command", + "device_id": "air_handler_2", + "setpoint_name": "supervisor_run_command", + "setpoint_value": 1.0, + "setpoint_justification": "To turn the device on.", + }, + ]) + pd.testing.assert_frame_equal(df, expected_df) + + def test_flattened_setpoints_record(self): + record = self.action_ctx.flattened_setpoints_record + expected_record = { + "timestamp": "2025-01-01 12:00:00", + "validity_interval": 60, + "justification": "These are my overall goals.", + "air_handler_1_supervisor_run_command": 1.0, + "air_handler_1_supervisor_run_command_justification": ( + "To turn the device on." + ), + "air_handler_2_supervisor_run_command": 1.0, + "air_handler_2_supervisor_run_command_justification": ( + "To turn the device on." + ), + "boiler_1_supervisor_run_command": 1.0, + "boiler_1_supervisor_run_command_justification": ( + "To turn the device on." + ), + "air_handler_1_supply_air_heating_temperature_setpoint": 285.0, + "air_handler_1_supply_air_heating_temperature_setpoint_justification": ( + "To cool the air." + ), + "air_handler_2_supply_air_heating_temperature_setpoint": 285.0, + "air_handler_2_supply_air_heating_temperature_setpoint_justification": ( + "To cool the air." + ), + "boiler_1_supply_water_setpoint": 310.0, + "boiler_1_supply_water_setpoint_justification": "To heat the water.", + } + self.assertDictEqual(record, expected_record) + + +# +# CONSTRUCTOR TESTS +# + + +class ActionContextFromJsonTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.env = env_conftest.create_environment(layout=env_conftest.DEMO_LAYOUT) + self.schema = schema_conftest.create_action() + self.json = self.schema.model_dump_json() + self.action_ctx = action_context.ActionContext.from_json( + txt=self.json, env=self.env, clip=True + ) + + def test_json(self): + self.assertIsInstance(self.json, str) + + def test_initialization(self): + self.assertIsInstance(self.action_ctx, action_context.ActionContext) + + def test_extra_attributes(self): + self.assertIs(self.action_ctx.env, self.env) + self.assertTrue(self.action_ctx.clip) + self.assertEmpty(self.action_ctx.guardrails_exceeded) + + def test_schema_contents(self): + with self.subTest("timestamp"): + self.assertEqual(self.action_ctx.timestamp, self.schema.timestamp) + + with self.subTest("justification"): + self.assertEqual(self.action_ctx.justification, self.schema.justification) + + with self.subTest("validity_interval"): + self.assertEqual( + self.action_ctx.validity_interval, self.schema.validity_interval + ) + + with self.subTest("setpoints"): + self.assertEqual(self.action_ctx.setpoints, self.schema.setpoints) + + +class HybridActionContextFromJsonTest(ActionContextFromJsonTest): + + def setUp(self): + super().setUp() + self.env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + self.schema = schema_conftest.create_hybrid_action() + self.json = self.schema.model_dump_json() + self.action_ctx = action_context.HybridActionContext.from_json( + txt=self.json, env=self.env, clip=True + ) + + def test_initialization(self): + self.assertIsInstance( + self.action_ctx, action_context.HybridActionContext + ) + + +# +# GUARDRAILS / VALIDATION TESTS +# + + +class ActionContextGuardrailsTest(absltest.TestCase): + """Tests for guardrails behavior when clipping is disabled.""" + + CLIPPING_ENABLED = False + + def setUp(self): + super().setUp() + self.env = env_conftest.create_environment(layout=env_conftest.DEMO_LAYOUT) + self.schema = schema_conftest.create_action() + self.clip = self.CLIPPING_ENABLED + + def test_device_id_not_found_raises(self): + self.schema.setpoints[0].device_id = "OOPS" + with self.assertRaisesRegex( + pydantic.ValidationError, + "Setpoint for \\('OOPS', 'supply_air_heating_temperature_setpoint'\\)" + " not found in the environment", + ): + action_context.ActionContext( + env=self.env, clip=self.clip, **self.schema.model_dump() + ) + + def test_setpoint_name_not_found_raises(self): + self.schema.setpoints[0].setpoint_name = "OOPS" + with self.assertRaisesRegex( + pydantic.ValidationError, + "Setpoint for \\('air_handler_1', 'OOPS'\\) not found in the" + " environment", + ): + action_context.ActionContext( + env=self.env, clip=self.clip, **self.schema.model_dump() + ) + + def test_normalizer_not_found_raises(self): + with mock.patch.dict(self.env.action_normalizers, {}, clear=True): + with self.assertRaisesRegex( + pydantic.ValidationError, + "Normalizer not found for setpoint:" + " 'air_handler_1_supply_air_heating_temperature_setpoint'.", + ): + action_context.ActionContext( + env=self.env, clip=self.clip, **self.schema.model_dump() + ) + + def test_missing_setpoint_raises(self): + self.schema.setpoints.pop() + with self.assertRaisesRegex( + pydantic.ValidationError, + "The following setpoints are expected by the environment but are" + " missing from the schema:.*'boiler_1_supply_water_setpoint'", + ): + action_context.ActionContext( + env=self.env, clip=self.clip, **self.schema.model_dump() + ) + + # TESTS WHERE CLIPPING OPTION IS RELEVANT + + def test_clipping_option(self): + self.assertFalse(self.clip) + + def test_setpoint_value_above_range(self): + self.schema.setpoints[0].setpoint_value = 300.0 # Above range + with self.assertRaisesRegex( + pydantic.ValidationError, + " Value 300.0 for setpoint \\('air_handler_1'.*" + "'supply_air_heating_temperature_setpoint'\\) is outside expected" + " range \\[285\\.0, 295\\.0\\]", + ): + action_context.ActionContext( + env=self.env, clip=self.clip, **self.schema.model_dump() + ) + + def test_setpoint_value_below_range(self): + self.schema.setpoints[0].setpoint_value = 200.0 # Below range + with self.assertRaisesRegex( + pydantic.ValidationError, + " Value 200.0 for setpoint \\('air_handler_1'.*" + "'supply_air_heating_temperature_setpoint'\\) is outside expected" + " range \\[285\\.0, 295\\.0\\]", + ): + action_context.ActionContext( + env=self.env, clip=self.clip, **self.schema.model_dump() + ) + + +class ActionContextGuardrailsClippingTest(ActionContextGuardrailsTest): + """Tests for guardrails behavior when clipping is enabled.""" + + CLIPPING_ENABLED = True + + def test_clipping_option(self): + self.assertTrue(self.clip) + + def test_setpoint_value_above_range(self): + self.schema.setpoints[0].setpoint_value = 300.0 # Above range + action_ctx = action_context.ActionContext( + env=self.env, clip=self.clip, **self.schema.model_dump() + ) + + with self.subTest(name="clips_value_to_max"): + self.assertEqual(action_ctx.setpoints[0].setpoint_value, 295.0) # Max + + with self.subTest(name="logs_guardrails_error"): + self.assertLen(action_ctx.guardrails_exceeded, 1) + self.assertEqual( + action_ctx.guardrails_exceeded[0], + action_context.GuardrailsExceededRecord( + device_id="air_handler_1", + setpoint_name="supply_air_heating_temperature_setpoint", + requested_value=300.0, + setpoint_range=(285.0, 295.0), + clipped_value=295.0, + ), + ) + + def test_setpoint_value_below_range(self): + self.schema.setpoints[0].setpoint_value = 200.0 # Below range + action_ctx = action_context.ActionContext( + env=self.env, clip=self.clip, **self.schema.model_dump() + ) + + with self.subTest(name="clips_value_to_min"): + self.assertEqual(action_ctx.setpoints[0].setpoint_value, 285.0) # Min + + with self.subTest(name="logs_guardrails_error"): + self.assertLen(action_ctx.guardrails_exceeded, 1) + self.assertEqual( + action_ctx.guardrails_exceeded[0], + action_context.GuardrailsExceededRecord( + device_id="air_handler_1", + setpoint_name="supply_air_heating_temperature_setpoint", + requested_value=200.0, + setpoint_range=(285.0, 295.0), + clipped_value=285.0, + ), + ) + + +# +# CUSTOM VALIDITY INTERVALS +# + + +class ActionContextWithCustomValidityIntervalsTest(absltest.TestCase): + + IS_HYBRID = False + + def setUp(self): + super().setUp() + self.custom_intervals = [15, 30, 45, 60] + self.schema = action_context.create_action_context_model( + custom_intervals=self.custom_intervals, + hybrid=self.IS_HYBRID, + ) + + def test_initialization(self): + self.assertTrue(issubclass(self.schema, action_context.ActionContext)) + self.assertFalse( + issubclass(self.schema, action_context.HybridActionContext) + ) + + def test_validity_interval_options(self): + self.assertCountEqual( + get_args(self.schema.__annotations__["validity_interval"]), + self.custom_intervals, + ) + + +class HybridActionContextWithCustomValidityIntervalsTest( + ActionContextWithCustomValidityIntervalsTest +): + + IS_HYBRID = True + + def test_initialization(self): + self.assertTrue(issubclass(self.schema, action_context.ActionContext)) + self.assertTrue(issubclass(self.schema, action_context.HybridActionContext)) + + +# +# FACTORY FUNCTION TESTS +# + + +class ActionContextFactoryTest(absltest.TestCase): + + def test_defaults(self): + action_ctx = schema_conftest.create_action_context() + self.assertIsInstance(action_ctx, action_context.ActionContext) + + def test_overrides(self): + env = env_conftest.create_environment(layout=env_conftest.DEMO_LAYOUT) + action = schema_conftest.create_action() + action.justification = "Custom justification." + + action_ctx = schema_conftest.create_action_context(env=env, action=action) + self.assertIsInstance(action_ctx, action_context.ActionContext) + self.assertEqual(action_ctx.justification, "Custom justification.") + + +class HybridActionContextFactoryTest(ActionContextFactoryTest): + + def test_defaults(self): + action_ctx = schema_conftest.create_hybrid_action_context() + self.assertIsInstance(action_ctx, action_context.HybridActionContext) + + def test_overrides(self): + env = env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + action = schema_conftest.create_hybrid_action() + action.justification = "Custom justification." + + action_ctx = schema_conftest.create_hybrid_action_context( + env=env, action=action + ) + self.assertIsInstance(action_ctx, action_context.HybridActionContext) + self.assertEqual(action_ctx.justification, "Custom justification.") + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/schema/conftest.py b/smart_control/llm/schema/conftest.py new file mode 100644 index 00000000..fc4af960 --- /dev/null +++ b/smart_control/llm/schema/conftest.py @@ -0,0 +1,386 @@ +"""Test helpers for LLM prompts and output schema models. + +Contains objects for representing the LLM's response in string format, as well +as the corresponding Pydantic models parsed from those strings. + +Provides actions for both the continuous and hybrid action environments. +""" + +from collections.abc import Sequence +import json +import re +import textwrap +from typing import Any + +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.environment import hybrid_action_environment +from smart_buildings.smart_control.llm.schema import action_context +from smart_buildings.smart_control.llm.schema import output_schema + +DISCRETE_ACTION_COMMAND = hybrid_action_environment.DISCRETE_ACTION_COMMAND + +DEFAULT_VALIDITY_INTERVALS = output_schema.DEFAULT_VALIDITY_INTERVALS + +EXAMPLE_TIMESTAMP = "2025-01-01 12:00:00" +EXAMPLE_JUSTIFICATION = "These are my overall goals." +EXAMPLE_DEVICE_JUSTIFICATION = "The reason for choosing this setpoint value." + + +def parse_instructions_schema(instructions: str) -> dict[str, Any] | None: + """Parses a string containing a Pydantic schema, returns the schema data.""" + instructions = textwrap.dedent(instructions).strip() + match = re.search(r"```\n({.*})\n```", instructions, re.DOTALL) + if match: + json_string = match.group(1) + try: + schema = json.loads(json_string) + return schema + except json.JSONDecodeError: + return None + return None + + +# +# DEVICE SETPOINTS +# + + +def create_supply_air_heating_temperature_setpoint( + device_id: str = "air_handler_0", + setpoint_value: float = 285.0, + justification: str = "To cool the air.", +) -> output_schema.DeviceSetpoint: + """Creates a supply air heating temperature setpoint for a specific device.""" + return output_schema.DeviceSetpoint( + device_id=device_id, + setpoint_name="supply_air_heating_temperature_setpoint", + setpoint_value=setpoint_value, + justification=justification, + ) + + +def create_supply_water_setpoint( + device_id: str = "boiler_0", + setpoint_value: float = 310.0, + justification: str = "To heat the water.", +) -> output_schema.DeviceSetpoint: + """Creates a supply water temperature setpoint for a specific device.""" + return output_schema.DeviceSetpoint( + device_id=device_id, + setpoint_name="supply_water_setpoint", + setpoint_value=setpoint_value, + justification=justification, + ) + + +def create_supervisor_run_command_setpoint( + device_id: str = "air_handler_0", + setpoint_value: float = 1, + justification: str = "To turn the device on.", +) -> output_schema.DeviceSetpoint: + """Creates a supervisor run command setpoint for a specific device.""" + return output_schema.DeviceSetpoint( + device_id=device_id, + setpoint_name=DISCRETE_ACTION_COMMAND, + setpoint_value=setpoint_value, + justification=justification, + ) + + +# +# ACTIONS (CONTINUOUS) +# + + +def create_action_response( + ahu_1_supply_air_temp: float = 285.0, # -1.0 (bottom of range) + ahu_2_supply_air_temp: float = 295.0, # 1.0 (top of range) + hws_supply_water_temp: float = 330.0, # 0.0 (middle of range) + empty_setpoints: bool = False, + missing_setpoint: bool = False, + missing_field: bool = False, + validity_interval: int = 60 +) -> str: + """Creates an action response for the continuous action environment. + + Provides convenience arguments for creating invalid responses. Only one of + these arguments (empty_setpoints, missing_setpoint, missing_field) should be + set to True at a time. + + Args: + ahu_1_supply_air_temp: The setpoint temp in Kelvin for AHU-1. + ahu_2_supply_air_temp: The setpoint temp in Kelvin for AHU-2. + hws_supply_water_temp: The setpoint temp in Kelvin for HWS. + empty_setpoints: Whether to remove all setpoints from the response, to make + it invalid. + missing_setpoint: Whether to remove a setpoint from the response, to make it + invalid (from the environment's perspective only). + missing_field: Whether to remove a field from a setpoint, to make it + invalid. + validity_interval: The selected validity interval, in minutes. + + Returns: + The action response as a JSON-formatted string. + """ + + action_data = { + "timestamp": EXAMPLE_TIMESTAMP, + "justification": EXAMPLE_JUSTIFICATION, + "validity_interval": validity_interval, + "setpoints": [ + { + "device_id": "air_handler_1", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_value": ahu_1_supply_air_temp, + "justification": EXAMPLE_DEVICE_JUSTIFICATION, + }, + { + "device_id": "boiler_1", + "setpoint_name": "supply_water_setpoint", + "setpoint_value": hws_supply_water_temp, + "justification": EXAMPLE_DEVICE_JUSTIFICATION, + }, + { + "device_id": "air_handler_2", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_value": ahu_2_supply_air_temp, + "justification": EXAMPLE_DEVICE_JUSTIFICATION, + }, + ], + } + + if sum([empty_setpoints, missing_setpoint, missing_field]) > 1: + raise ValueError( + "Only one of empty_setpoints, missing_setpoint, or missing_field can be" + " set to True at a time." + ) + + if missing_field: + del action_data["setpoints"][0]["justification"] + + if missing_setpoint: + del action_data["setpoints"][0] + + if empty_setpoints: + action_data["setpoints"] = [] + + # Convert data to a JSON-formatted string (to resemble the LLM's response): + return textwrap.dedent(json.dumps(action_data, indent=2)) + + +def create_action() -> output_schema.SetpointsAction: + return output_schema.SetpointsAction( + timestamp=EXAMPLE_TIMESTAMP, + justification=EXAMPLE_JUSTIFICATION, + validity_interval=60, + setpoints=[ + create_supply_air_heating_temperature_setpoint("air_handler_1"), + create_supply_air_heating_temperature_setpoint("air_handler_2"), + create_supply_water_setpoint("boiler_1"), + ], + ) + + +def create_action_context( + env: environment.Environment | None = None, + action: output_schema.SetpointsAction | None = None, +) -> action_context.ActionContext: + """Creates an action context for the continuous action environment.""" + env = env or env_conftest.create_environment(layout=env_conftest.DEMO_LAYOUT) + action = action or create_action() + return action_context.ActionContext(env=env, **action.model_dump()) + + +def create_action_with_custom_intervals( + validity_intervals: Sequence[int] = DEFAULT_VALIDITY_INTERVALS, + selected_interval: int = 60, +)-> output_schema.SetpointsAction: + """Creates a SetpointsAction with custom validity intervals. + + Args: + validity_intervals: The list of possible validity intervals in minutes. + selected_interval: The selected validity interval in minutes. + + Returns: + A SetpointsAction object with custom validity intervals. + """ + model_class = output_schema.create_action_model( + custom_intervals=validity_intervals + ) + + return model_class( + timestamp=EXAMPLE_TIMESTAMP, + justification=EXAMPLE_JUSTIFICATION, + validity_interval=selected_interval, + setpoints=[ + create_supply_air_heating_temperature_setpoint("air_handler_1"), + create_supply_air_heating_temperature_setpoint("air_handler_2"), + create_supply_water_setpoint("boiler_1"), + ], + ) + + +# +# ACTIONS (HYBRID) +# + + +def create_hybrid_action_response( + ahu_1_supply_air_temp: float = 285.0, # -1.0 (bottom of range) + ahu_2_supply_air_temp: float = 295.0, # 1.0 (top of range) + hws_supply_water_temp: float = 330.0, # 0.0 (middle of range) + ahu_1_run_command: int = 1, # ON + ahu_2_run_command: int = 1, # ON + hws_run_command: int = 1, # ON + empty_setpoints: bool = False, + missing_setpoint: bool = False, + missing_field: bool = False, + validity_interval: int = 60 +) -> str: + """Creates an action response for the hybrid action environment. + + Provides convenience arguments for creating invalid responses. Only one of + these arguments (empty_setpoints, missing_setpoint, missing_field) should be + set to True at a time. + + Args: + ahu_1_supply_air_temp: The setpoint temp in Kelvin for AHU-1. + ahu_2_supply_air_temp: The setpoint temp in Kelvin for AHU-2. + hws_supply_water_temp: The setpoint temp in Kelvin for HWS. + ahu_1_run_command: The run command for AHU-1. + ahu_2_run_command: The run command for AHU-2. + hws_run_command: The run command for HWS. + empty_setpoints: Whether to remove all setpoints from the response, to make + it invalid. + missing_setpoint: Whether to remove a setpoint from the response, to make it + invalid (from the environment's perspective only). + missing_field: Whether to remove a field from a setpoint, to make it + invalid. + validity_interval: The selected validity interval, in minutes. + + Returns: + The action response as a JSON-formatted string. + """ + + action_data = { + "timestamp": EXAMPLE_TIMESTAMP, + "validity_interval": validity_interval, + "justification": EXAMPLE_JUSTIFICATION, + "setpoints": [ + { + "device_id": "air_handler_1", + "setpoint_name": DISCRETE_ACTION_COMMAND, + "setpoint_value": ahu_1_run_command, + "justification": EXAMPLE_DEVICE_JUSTIFICATION, + }, + { + "device_id": "air_handler_2", + "setpoint_name": DISCRETE_ACTION_COMMAND, + "setpoint_value": ahu_2_run_command, + "justification": EXAMPLE_DEVICE_JUSTIFICATION, + }, + { + "device_id": "boiler_1", + "setpoint_name": DISCRETE_ACTION_COMMAND, + "setpoint_value": hws_run_command, + "justification": EXAMPLE_DEVICE_JUSTIFICATION, + }, + { + "device_id": "air_handler_1", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_value": ahu_1_supply_air_temp, + "justification": EXAMPLE_DEVICE_JUSTIFICATION, + }, + { + "device_id": "air_handler_2", + "setpoint_name": "supply_air_heating_temperature_setpoint", + "setpoint_value": ahu_2_supply_air_temp, + "justification": EXAMPLE_DEVICE_JUSTIFICATION, + }, + { + "device_id": "boiler_1", + "setpoint_name": "supply_water_setpoint", + "setpoint_value": hws_supply_water_temp, + "justification": EXAMPLE_DEVICE_JUSTIFICATION, + }, + ], + } + + if sum([empty_setpoints, missing_setpoint, missing_field]) > 1: + raise ValueError( + "Only one of empty_setpoints, missing_setpoint, or missing_field can be" + " set to True at a time." + ) + + if missing_setpoint: + del action_data["setpoints"][0] + + if missing_field: + del action_data["setpoints"][0]["justification"] + + if empty_setpoints: + action_data["setpoints"] = [] + + # Convert data to a JSON-formatted string (to resemble the LLM's response): + return textwrap.dedent(json.dumps(action_data, indent=2)) + + +def create_hybrid_action() -> output_schema.SetpointsAction: + return output_schema.SetpointsAction( + timestamp=EXAMPLE_TIMESTAMP, + justification=EXAMPLE_JUSTIFICATION, + validity_interval=60, + setpoints=[ + create_supervisor_run_command_setpoint("air_handler_1"), + create_supervisor_run_command_setpoint("air_handler_2"), + create_supervisor_run_command_setpoint("boiler_1"), + create_supply_air_heating_temperature_setpoint("air_handler_1"), + create_supply_air_heating_temperature_setpoint("air_handler_2"), + create_supply_water_setpoint("boiler_1"), + ], + ) + + +def create_hybrid_action_context( + env: hybrid_action_environment.HybridActionEnvironment | None = None, + action: output_schema.SetpointsAction | None = None, +) -> action_context.HybridActionContext: + """Creates an action context for the hybrid action environment.""" + env = env or env_conftest.create_hybrid_action_environment( + layout=env_conftest.DEMO_LAYOUT + ) + action = action or create_hybrid_action() + return action_context.HybridActionContext(env=env, **action.model_dump()) + + +def create_hybrid_action_with_custom_intervals( + validity_intervals: Sequence[int] = DEFAULT_VALIDITY_INTERVALS, + selected_interval: int = 60, +) -> output_schema.SetpointsAction: + """Creates a SetpointsAction with hybrid action and custom validity intervals. + + Args: + validity_intervals: The list of possible validity intervals in minutes. + selected_interval: The selected validity interval in minutes. + + Returns: + A SetpointsAction object with custom validity intervals. + """ + model_class = output_schema.create_action_model( + custom_intervals=validity_intervals + ) + + return model_class( + timestamp=EXAMPLE_TIMESTAMP, + justification=EXAMPLE_JUSTIFICATION, + validity_interval=selected_interval, + setpoints=[ + create_supervisor_run_command_setpoint("air_handler_1"), + create_supervisor_run_command_setpoint("air_handler_2"), + create_supervisor_run_command_setpoint("boiler_1"), + create_supply_air_heating_temperature_setpoint("air_handler_1"), + create_supply_air_heating_temperature_setpoint("air_handler_2"), + create_supply_water_setpoint("boiler_1"), + ], + ) diff --git a/smart_control/llm/schema/formatting_instructions_test.py b/smart_control/llm/schema/formatting_instructions_test.py new file mode 100644 index 00000000..571595be --- /dev/null +++ b/smart_control/llm/schema/formatting_instructions_test.py @@ -0,0 +1,202 @@ +"""Tests for formatting instructions produced by output schema models. + +When prompting the LLM, we use the Langchain output parser to automatically +generate formatting instructions to be included in the prompt. These +instructions are derived from the output schema model, and include a +description of the desired output, as well as the schema itself. +""" + +import textwrap + +from absl.testing import absltest +import langchain.output_parsers + +from smart_buildings.smart_control.llm.schema import conftest +from smart_buildings.smart_control.llm.schema import output_schema + +PydanticOutputParser = langchain.output_parsers.PydanticOutputParser + + +class SchemaParserTest(absltest.TestCase): + """Tests for the schema parser helper function.""" + + def test_parse_instructions_schema(self): + instructions = textwrap.dedent(""" + ``` + { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + } + ``` + """) + schema = conftest.parse_instructions_schema(instructions) + self.assertDictEqual( + schema, + { + 'type': 'object', + 'properties': { + 'name': { + 'type': 'string', + }, + }, + }, + ) + + def test_parse_instructions_schema_invalid(self): + instructions = 'oops' + schema = conftest.parse_instructions_schema(instructions) + self.assertIsNone(schema) + + def test_parse_instructions_schema_malformed_json(self): + instructions = textwrap.dedent(""" + ``` + { + "invalid": json + } + ``` + """) + schema = conftest.parse_instructions_schema(instructions) + self.assertIsNone(schema) + + +class BaseFormattingInstructionsTest: + """For testing formatting instructions produced by output schema models.""" + + MODEL_CLASS = None # to be set by subclasses + EXPECTED_INTERVALS = None # to be set by subclasses + + def setUp(self): + super().setUp() + self.model_class = self.MODEL_CLASS + self.parser = PydanticOutputParser(pydantic_object=self.model_class) + self.instructions = self.parser.get_format_instructions() + self.schema = conftest.parse_instructions_schema(self.instructions) + + def test_formatting_instructions(self): + self.assertIsInstance(self.instructions, str) + self.assertIn( + 'The output should be formatted as a JSON instance that conforms to the' + ' JSON schema below.', + self.instructions, + ) + + def test_schema(self): + self.assertIsInstance(self.schema, dict) + self.assertCountEqual( + self.schema.keys(), + ['$defs', 'description', 'properties', 'required'], + ) + + +class FormattingInstructionsTest(BaseFormattingInstructionsTest, absltest.TestCase): # pylint: disable=line-too-long + + MODEL_CLASS = output_schema.SetpointsAction + EXPECTED_INTERVALS = list(output_schema.DEFAULT_VALIDITY_INTERVALS) + + def test_schema_required_fields(self): + self.assertCountEqual( + self.schema['required'], + [ + 'timestamp', + 'justification', + 'setpoints', + 'validity_interval', + ], + ) + + def test_schema_properties(self): + self.assertDictEqual( + self.schema['properties'], + { + 'setpoints': { + 'description': 'A list of setpoints.', + 'items': {'$ref': '#/$defs/DeviceSetpoint'}, + 'title': 'Setpoints', + 'type': 'array', + }, + 'timestamp': { + 'description': output_schema.TIMESTAMP_DESCRIPTION, + 'title': 'Timestamp', + 'type': 'string', + }, + 'justification': { + 'description': output_schema.JUSTIFICATION_DESCRIPTION, + 'title': 'Justification', + 'type': 'string', + }, + 'validity_interval': { + 'description': output_schema.VALIDITY_INTERVAL_DESCRIPTION, + 'enum': self.EXPECTED_INTERVALS, + 'title': 'Validity Interval', + 'type': 'integer', + }, + }, + ) + + def test_schema_defs(self): + self.assertListEqual(list(self.schema['$defs'].keys()), ['DeviceSetpoint']) + + schema_def = self.schema['$defs']['DeviceSetpoint'] + expected = { + 'description': ( + 'A single device setpoint.\n\nA device is uniquely identified by' + ' a composite key consisting of the device\nidentifier and the' + ' setpoint name.\n\nAttributes:\n device_id: The unique' + " identifier of the device (e.g. 'boiler-123-xyz').\n " + ' setpoint_name: The name of the setpoint (e.g.' + " 'supply_water_temperature').\n setpoint_value: The requested" + ' value to be set (e.g. 120.0).\n justification: The reason for' + ' choosing this specific device setting.' + ), + 'properties': { + 'device_id': { + 'description': 'The unique identifier of the device.', + 'title': 'Device Id', + 'type': 'string', + }, + 'setpoint_name': { + 'description': 'The name of the setpoint.', + 'title': 'Setpoint Name', + 'type': 'string', + }, + 'setpoint_value': { + 'description': 'The requested value to be set.', + 'title': 'Setpoint Value', + 'type': 'number', + }, + 'justification': { + 'description': ( + 'The reason for choosing this specific device setting.' + ), + 'title': 'Justification', + 'type': 'string', + }, + }, + 'required': [ + 'device_id', + 'setpoint_name', + 'setpoint_value', + 'justification', + ], + 'title': 'DeviceSetpoint', + 'type': 'object', + } + self.assertDictEqual(schema_def, expected) + + +class CustomIntervalInstructionsTest(FormattingInstructionsTest): + + CUSTOM_INTERVALS = [5, 10, 15, 20] + + MODEL_CLASS = output_schema.create_action_model( + custom_intervals=CUSTOM_INTERVALS + ) + EXPECTED_INTERVALS = CUSTOM_INTERVALS + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/llm/schema/output_schema.py b/smart_control/llm/schema/output_schema.py new file mode 100644 index 00000000..c75dda28 --- /dev/null +++ b/smart_control/llm/schema/output_schema.py @@ -0,0 +1,161 @@ +"""Model classes for defining the structure of LLM responses. + +Includes models for the individual device setpoints, as well as action +models that contain any number of setpoints, and represent the full response +from an LLM, including other context such as the overall goals of the action. + +For flexibility, we define a base action model which uses a default +set of validity interval options, however we also provide a method for +creating a model that uses a custom set of validity interval options. + +The action model class itself is used to provide LLM formatting instructions, +which are derived from the model class schema. + +When the LLM responds, its response can be used to initialize the action model +class, and can be validated using the model class validator. +""" + +from collections.abc import Sequence +from typing import Literal, TypeAlias + +import pydantic + +from smart_buildings.smart_control.utils import serialization + +Field = pydantic.Field + +DEFAULT_VALIDITY_INTERVALS = (5, 10, 15, 20, 30, 45, 60, 75, 90, 120) +DefaultValidityIntervalOptions: TypeAlias = Literal[*DEFAULT_VALIDITY_INTERVALS] # pytype: disable=invalid-annotation # pydantic needs it this way + +TIMESTAMP_DESCRIPTION = ( + "The time the action is taken, formatted as 'YYYY-MM-DD HH:MM:SS', assumed" + " to be in the building's local timezone." +) + +JUSTIFICATION_DESCRIPTION = ( + "The overall reason for taking this action. Includes a brief description" + " of why the action is justified, as well as the desired outcome of the" + " action as a whole." +) + +VALIDITY_INTERVAL_DESCRIPTION = ( + "The number of minutes the setpoints should remain in effect before" + " prompting for a new action." +) + + +class DeviceSetpoint(pydantic.BaseModel): + """A single device setpoint. + + A device is uniquely identified by a composite key consisting of the device + identifier and the setpoint name. + + Attributes: + device_id: The unique identifier of the device (e.g. 'boiler-123-xyz'). + setpoint_name: The name of the setpoint (e.g. 'supply_water_temperature'). + setpoint_value: The requested value to be set (e.g. 120.0). + justification: The reason for choosing this specific device setting. + """ + + device_id: str = Field( + description="The unique identifier of the device." + ) + + setpoint_name: str = Field( + description="The name of the setpoint." + ) + + setpoint_value: float = Field(description="The requested value to be set.") + + justification: str = Field( + description="The reason for choosing this specific device setting." + ) + + @property + def json_metadata(self) -> serialization.SerializableData: + """JSON-serializable metadata.""" + return self.model_dump() + + +class SetpointsAction(pydantic.BaseModel): + """A flexible action model for setting any number of setpoints. + + Attributes: + timestamp: The time the action is taken (in the building's local timezone). + justification: The overall reason for taking this action. Includes a brief + description of why the action is justified, as well as the desired + outcome of the action as a whole. + setpoints: A list of setpoints. + validity_interval: The amount of time in minutes the setpoints should remain + in effect before prompting for a new action. + """ + + timestamp: str = Field(description=TIMESTAMP_DESCRIPTION) + + justification: str = Field(description=JUSTIFICATION_DESCRIPTION) + + setpoints: list[DeviceSetpoint] = Field(description="A list of setpoints.") + + validity_interval: DefaultValidityIntervalOptions = Field( + description=VALIDITY_INTERVAL_DESCRIPTION + ) + + @pydantic.field_validator("setpoints") + @classmethod + def validate_setpoints( + cls, v: Sequence[DeviceSetpoint] + ) -> Sequence[DeviceSetpoint]: + """Ensures the setpoints are present.""" + if not v: + raise ValueError("The setpoints list cannot be empty.") + return v + + def find_setpoint( + self, device_id: str, setpoint_name: str + ) -> DeviceSetpoint | None: + """Returns the setpoint matching the given device id and setpoint name.""" + for setpoint in self.setpoints: + if ( + setpoint.device_id == device_id + and setpoint.setpoint_name == setpoint_name + ): + return setpoint + return None + + @property + def json_metadata(self) -> serialization.SerializableData: + """Serializable metadata.""" + return self.model_dump() + + +def create_action_model( + custom_intervals: Sequence[int], + model_name: str = "SetpointsActionWithCustomInterval", +) -> type[SetpointsAction]: + """Creates an agent action model class, using custom validity intervals. + + Args: + custom_intervals: A list of intervals in minutes. Represents the range of + possible options the LLM has to choose from. + model_name: The name of the action model class to be created. + + Returns: + A Pydantic model class based on `SetpointsAction`, but defined using the + provided set of custom validity intervals. + """ + custom_intervals = sorted(list(set(custom_intervals))) + ValidityIntervalOptions = Literal[*custom_intervals] # pytype: disable=invalid-annotation # pydantic needs it this way + + fields = { + "validity_interval": ( + ValidityIntervalOptions, + Field(description=VALIDITY_INTERVAL_DESCRIPTION), + ) + } + model = pydantic.create_model( + model_name, + **fields, + __base__=SetpointsAction, + ) + model.__doc__ = SetpointsAction.__doc__ + return model diff --git a/smart_control/llm/schema/output_schema_test.py b/smart_control/llm/schema/output_schema_test.py new file mode 100644 index 00000000..0d9a547a --- /dev/null +++ b/smart_control/llm/schema/output_schema_test.py @@ -0,0 +1,202 @@ +"""Tests for LLM response output schema models. + +These tests ensure the output schema models can be initialized. However, the +promptmaker actually uses them to generate formatting instructions. Tests for +that functionality are defined in the "formatting_instructions_test.py" file. +""" + +from typing import get_args + +from absl.testing import absltest +import pydantic + +from smart_buildings.smart_control.llm.schema import conftest +from smart_buildings.smart_control.llm.schema import output_schema + +DeviceSetpoint = output_schema.DeviceSetpoint +SetpointsAction = output_schema.SetpointsAction + +EXAMPLE_TIMESTAMP = conftest.EXAMPLE_TIMESTAMP +EXAMPLE_JUSTIFICATION = conftest.EXAMPLE_JUSTIFICATION + + +# +# ACTIONS (CONTINUOUS) +# + + +class ActionValidationsTest(absltest.TestCase): + """Tests for Pydantic model validations, for continuous actions. + + This ensures the model will raise errors if required fields are missing, or if + the data is otherwise not in the expected format. + """ + + def setUp(self): + super().setUp() + self.creation_function = conftest.create_action_response + + def test_valid_setpoints(self): + response_text = self.creation_function() + action = SetpointsAction.model_validate_json(response_text) + self.assertIsInstance(action, SetpointsAction) + + def test_empty_setpoints_raises(self): + response_text = self.creation_function(empty_setpoints=True) + with self.assertRaisesRegex( + pydantic.ValidationError, "setpoints list cannot be empty" + ): + SetpointsAction.model_validate_json(response_text) + + def test_missing_setpoint_ok_beware(self): + # The schema doesn't know about which of the environment's setpoints are + # required. Those validations should happen at the environment level. + response_text = self.creation_function(missing_setpoint=True) + action = SetpointsAction.model_validate_json(response_text) + self.assertIsInstance(action, SetpointsAction) + + def test_missing_field_raises(self): + response_text = self.creation_function(missing_field=True) + with self.assertRaisesRegex(pydantic.ValidationError, "Field required"): + SetpointsAction.model_validate_json(response_text) + + +class ActionTest(absltest.TestCase): + """Tests for the basic action model that uses default validity intervals.""" + + def setUp(self): + super().setUp() + self.n_setpoints_expected = 3 + self.expected_setpoint_names = [ + "supply_air_heating_temperature_setpoint", + "supply_air_heating_temperature_setpoint", + "supply_water_setpoint", + ] + self.action = conftest.create_action() + + def test_validity_interval_options(self): + self.assertCountEqual( + get_args(self.action.__class__.__annotations__["validity_interval"]), + output_schema.DEFAULT_VALIDITY_INTERVALS, + ) + + def test_initialization(self): + self.assertIsInstance(self.action, SetpointsAction) + + def test_attributes(self): + with self.subTest("timestamp"): + self.assertEqual(self.action.timestamp, EXAMPLE_TIMESTAMP) + + with self.subTest("justification"): + self.assertEqual(self.action.justification, EXAMPLE_JUSTIFICATION) + + with self.subTest("validity_interval"): + self.assertEqual(self.action.validity_interval, 60) + + with self.subTest("setpoints"): + self.assertLen(self.action.setpoints, self.n_setpoints_expected) + + names = [setpoint.setpoint_name for setpoint in self.action.setpoints] + self.assertEqual(names, self.expected_setpoint_names) + + for i, setpoint in enumerate(self.action.setpoints): + with self.subTest(f"setpoint at index {i}"): + self.assertIsInstance(setpoint, DeviceSetpoint) + + # TESTS FOR FIND_SETPOINT METHOD: + + def test_find_setpoint_invalid_device_id(self): + setpoint = self.action.find_setpoint( + device_id="oops", setpoint_name="supply_water_setpoint" + ) + self.assertIsNone(setpoint) + + def test_find_setpoint_invalid_setpoint_name(self): + setpoint = self.action.find_setpoint( + device_id="boiler_0", setpoint_name="oops") + self.assertIsNone(setpoint) + + def test_find_setpoint(self): + setpoint = self.action.find_setpoint( + device_id="boiler_1", setpoint_name="supply_water_setpoint" + ) + self.assertIsInstance(setpoint, DeviceSetpoint) + + with self.subTest("attributes"): + self.assertEqual(setpoint.device_id, "boiler_1") + self.assertEqual(setpoint.setpoint_name, "supply_water_setpoint") + self.assertEqual(setpoint.setpoint_value, 310.0) + + +class ActionWithCustomValidityIntervalsTest(ActionTest): + """Tests for the action model that uses custom validity intervals.""" + + def setUp(self): + super().setUp() + self.custom_intervals = [15, 30, 45, 60] + self.action = conftest.create_action_with_custom_intervals( + validity_intervals=self.custom_intervals, + selected_interval=60, + ) + + def test_validity_interval_options(self): + self.assertCountEqual( + get_args(self.action.__class__.__annotations__["validity_interval"]), + self.custom_intervals, + ) + + +# +# ACTIONS (HYBRID) +# + + +class HybridActionValidationsTest(ActionValidationsTest): + """Tests for Pydantic model validations, for hybrid actions. + + This ensures the model will raise errors if required fields are missing, or if + the data is otherwise not in the expected format. + """ + + def setUp(self): + super().setUp() + self.creation_function = conftest.create_hybrid_action_response + + +class HybridActionTest(ActionTest): + """Tests for the hybrid action model that uses default validity intervals.""" + + def setUp(self): + super().setUp() + self.n_setpoints_expected = 6 + self.expected_setpoint_names = [ + "supervisor_run_command", + "supervisor_run_command", + "supervisor_run_command", + "supply_air_heating_temperature_setpoint", + "supply_air_heating_temperature_setpoint", + "supply_water_setpoint", + ] + self.action = conftest.create_hybrid_action() + + +class HybridActionWithCustomValidityIntervalsTest(HybridActionTest): + """Tests for the hybrid action model that uses custom validity intervals.""" + + def setUp(self): + super().setUp() + self.custom_intervals = [15, 30, 45, 60] + self.action = conftest.create_hybrid_action_with_custom_intervals( + validity_intervals=self.custom_intervals, + selected_interval=60, + ) + + def test_validity_interval_options(self): + self.assertCountEqual( + get_args(self.action.__class__.__annotations__["validity_interval"]), + self.custom_intervals, + ) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/services/conftest.py b/smart_control/llm/services/conftest.py new file mode 100644 index 00000000..65588a3e --- /dev/null +++ b/smart_control/llm/services/conftest.py @@ -0,0 +1,126 @@ +"""Helpers for testing LLM services. + +The tests will implement mocked responses by default. + +To test the actual responses returned by the Gemini API, optionally set the +`TEST_GEMINI_SERVICE_LIVE` environment variable to 'true'. + +To test the actual responses returned by the Vertex AI API, optionally set the +`TEST_VERTEX_SERVICE_LIVE` environment variable to 'true'. +""" + +import os +from unittest import mock + +import dotenv +from google import genai +from google.auth import credentials +from smart_buildings.smart_control.llm.services import gemini_service +from smart_buildings.smart_control.llm.services import llm_service +from smart_buildings.smart_control.llm.services import vertex_service + + +dotenv.load_dotenv() + +TEST_GEMINI_SERVICE_LIVE = bool( + os.getenv("TEST_GEMINI_SERVICE_LIVE", default="false").lower() == "true" +) +TEST_VERTEX_SERVICE_LIVE = bool( + os.getenv("TEST_VERTEX_SERVICE_LIVE", default="false").lower() == "true" +) + +SKIP_REASON = "Skip API Calls in tests by default." + +PROMPT_TEXT = "What year was America founded?" +RESPONSE_TEXT = ( + "The United States was founded in 1776 after the Declaration of " + "Independence." +) + + +class FakeLLMService(llm_service.BaseLLMService): + """Generic Fake LLM Service, used for testing.""" + + def __init__(self, response_text: str = RESPONSE_TEXT): + self._temperature = 0.0 + self._response_text = response_text + + @property + def model_name(self) -> str: + return "fake-model" + + @property + def temperature(self) -> float: + return self._temperature + + def get_response(self, prompt: str) -> str: + return self._response_text + + +def create_fake_llm_service( + response_text: str = RESPONSE_TEXT, +) -> FakeLLMService: + """Creates a fake version of a generic LLM Service. + + It will return the specified response text instead of making an API call. + + Args: + response_text: The text to return from the LLM Service. + + Returns: + A fake version of the LLM Service. + """ + return FakeLLMService(response_text=response_text) + + +def create_mock_gemini_service( + response_text: str = RESPONSE_TEXT, +) -> gemini_service.GeminiService: + """Creates a mock version of the Gemini Service. + + It will return the specified response text instead of making an API call. + + Args: + response_text: The text to return from the Gemini Service. If not provided, + a default response text will be used. + + Returns: + A mock version of the Gemini Service. + """ + # mocked dependencies: + client = mock.create_autospec(genai.Client, instance=True) + generate_content_response = mock.MagicMock() + generate_content_response.text = response_text + client.models.generate_content.return_value = generate_content_response + + # dependency injection: + return gemini_service.GeminiService(api_key="fake_api_key", client=client) + + +def create_mock_vertex_service( + response_text: str = RESPONSE_TEXT, # pylint: disable=unused-argument +) -> vertex_service.VertexAIService: + """Creates a mock version of the Vertex AI Service. + + It will return the specified response text instead of making an API call. + + Args: + response_text: The text to return from the Vertex AI Service. If not + provided, a default response text will be used. + + Returns: + A mock version of the Vertex AI Service. + """ + # mocked credentials: + creds = mock.create_autospec(credentials.Credentials, instance=True) + + # mocked client: + client = mock.create_autospec(genai.Client, instance=True) + generate_content_response = mock.MagicMock() + generate_content_response.text = response_text + client.models.generate_content.return_value = generate_content_response + + # dependency injection: + return vertex_service.VertexAIService( + project_id="not-a-real-project", credentials=creds, client=client + ) diff --git a/smart_control/llm/services/gemini_service.py b/smart_control/llm/services/gemini_service.py new file mode 100644 index 00000000..f752694b --- /dev/null +++ b/smart_control/llm/services/gemini_service.py @@ -0,0 +1,219 @@ +# pylint: disable=line-too-long +r"""A Gemini service that uses the Gemini API directly, using an API key. + +Run with blaze: + +```shell +$ blaze run //third_party/py/smart_buildings/smart_control/llm/services:gemini_service_script +``` + +Run with python: + +```shell +$ python -m smart_buildings.smart_control.llm.services.gemini_service +``` + +Optional flags: + --gemini_api_key: API key to use for the Gemini API. + --gemini_model_temperature: The model temperature. + +Example: + +```shell +$ blaze run //third_party/py/smart_buildings/smart_control/llm/services:gemini_service_script -- \ + --gemini_api_key= --gemini_model_temperature=0.5 +``` +""" +# pylint: enable=line-too-long + +import abc +import getpass +import os +from typing import Any, Sequence + +from absl import app +from absl import flags +import dotenv +from google import genai +from smart_buildings.smart_control.llm.services import llm_service + + +dotenv.load_dotenv() + +GEMINI_API_KEY = os.getenv('GEMINI_API_KEY') +MODEL_NAME = os.getenv('GEMINI_MODEL_NAME', default='gemini-2.0-flash') + +TEMPERATURE = 0.1 +TOP_P = 0.95 +TOP_K = 40 +MAX_OUTPUT_TOKENS = 1024 + + +FLAGS = flags.FLAGS + +flags.DEFINE_string( + name='gemini_api_key', + default=None, + help='API key to use for the Gemini API.', +) + +flags.DEFINE_string( + name='gemini_model_temperature', default=None, help='The model temperature.' +) + + +class BaseGeminiService(llm_service.BaseLLMService, metaclass=abc.ABCMeta): + """A Gemini service interface allowing for flexible credentials approaches. + + Attributes: + model_name: The name of the Gemini model to use. + temperature: Controls the randomness of the output. Higher values mean more + random, lower values mean more deterministic. + top_p: Nucleus sampling parameter. Considers the smallest set of tokens + whose cumulative probability exceeds this value. + top_k: Top-k sampling parameter. Considers the top k most likely tokens at + each step. + max_output_tokens: The maximum number of tokens to generate. + generation_config: The generation config to use for the model. + api_key: The API key to use for the Gemini API. + client: The model client. + """ + + def __init__( + self, + model_name: str = MODEL_NAME, + temperature: float = TEMPERATURE, + top_p: float = TOP_P, + top_k: float = TOP_K, + max_output_tokens: int = MAX_OUTPUT_TOKENS, + ): + """Initializes a Gemini service interface. + + Args: + model_name: The name of the Gemini model to use. + temperature: Controls the randomness of the output. Higher values mean + more random, lower values mean more deterministic. + top_p: Nucleus sampling parameter. Considers the smallest set of tokens + whose cumulative probability exceeds this value. + top_k: Top-k sampling parameter. Considers the top k most likely tokens at + each step. + max_output_tokens: The maximum number of tokens to generate. + """ + self._model_name = model_name + self._temperature = temperature + self.top_p = top_p + self.top_k = top_k + self._max_output_tokens = max_output_tokens + + @property + def json_metadata(self) -> dict[str, Any]: + """Info to write into a JSON file. Needs to be serializable.""" + return { + 'type': self.__class__.__name__, + 'model_name': self.model_name, + 'generation_config': self.generation_config, + } + + @property + def model_name(self) -> str: + return self._model_name + + @property + def temperature(self) -> float: + return self._temperature + + @property + def max_output_tokens(self) -> int: + return self._max_output_tokens + + @property + @abc.abstractmethod + def client(self) -> genai.Client: + """Returns a client for the Gemini service.""" + + @property + def generation_config(self) -> dict[str, Any]: + return { + 'temperature': self.temperature, + 'top_p': self.top_p, + 'top_k': self.top_k, + 'max_output_tokens': self.max_output_tokens, + } + + def get_response(self, prompt: str) -> str: + """Returns the response from the Gemini model.""" + response = self.client.models.generate_content( + model=self.model_name, contents=prompt, config=self.generation_config + ) + return response.text + + +class GeminiService(BaseGeminiService): + """A Gemini service that uses the Gemini API directly, using an API key. + + Will use the `GEMINI_API_KEY` environment variable if provided. + """ + + def __init__( + self, + api_key: str = GEMINI_API_KEY, + model_name: str = MODEL_NAME, + temperature: float = TEMPERATURE, + top_p: float = TOP_P, + top_k: float = TOP_K, + max_output_tokens: int = MAX_OUTPUT_TOKENS, + client: genai.Client | None = None, + ): + """Initializes the Gemini service. + + Args: + api_key: The API key for the Gemini API. Will use the `GEMINI_API_KEY` + environment variable if provided. + model_name: The name of the Gemini model to use. + temperature: Controls the randomness of the output. Higher values mean + more random, lower values mean more deterministic. + top_p: Nucleus sampling parameter. Considers the smallest set of tokens + whose cumulative probability exceeds this value. + top_k: Top-k sampling parameter. Considers the top k most likely tokens at + each step. + max_output_tokens: The maximum number of tokens to generate. + client: An optional client to use for the Gemini API. Primarily used to + facilitate dependency injection during testing. If not provided, a new + client will be created using the specified api_key. + """ + super().__init__( + model_name=model_name, + temperature=temperature, + top_p=top_p, + top_k=top_k, + max_output_tokens=max_output_tokens, + ) + + if not api_key: + raise ValueError( + 'Please provide an api_key, or set the GEMINI_API_KEY ' + 'environment variable.' + ) + self.api_key = api_key + + self._client = client or genai.Client(api_key=self.api_key) + + @property + def client(self) -> genai.Client: + return self._client + + +def main(argv: Sequence[str]) -> None: + if len(argv) > 1: + raise app.UsageError('Too many command-line arguments.') + + api_key = FLAGS.gemini_api_key or getpass.getpass('API Key: ') or GEMINI_API_KEY # pylint: disable=line-too-long + temp = FLAGS.gemini_model_temperature or input('Temperature: ') or TEMPERATURE + service = GeminiService(api_key=api_key, temperature=temp) + + user_prompt = input('Prompt: ') or 'When was America founded?' + print(service.get_response(user_prompt)) + + +if __name__ == '__main__': + app.run(main) diff --git a/smart_control/llm/services/gemini_service_test.py b/smart_control/llm/services/gemini_service_test.py new file mode 100644 index 00000000..385689a2 --- /dev/null +++ b/smart_control/llm/services/gemini_service_test.py @@ -0,0 +1,69 @@ +"""Tests for Gemini LLM service.""" + +import unittest +from unittest import mock + +from absl.testing import absltest +from google import genai +from smart_buildings.smart_control.llm.services import conftest +from smart_buildings.smart_control.llm.services.gemini_service import GeminiService # pylint: disable=g-importing-member + +FAKE_API_KEY = "not-a-real-api-key" + + +class GeminiServiceTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.service = GeminiService(api_key=FAKE_API_KEY) + + def test_api_key(self): + self.assertEqual(self.service.api_key, FAKE_API_KEY) + + def test_client(self): + self.assertIsInstance(self.service.client, genai.Client) + + def test_temperature(self): + self.assertEqual(self.service.temperature, 0.1) + + def test_generation_config(self): + config = self.service.generation_config + expected_config = { + "temperature": 0.1, + "top_p": 0.95, + "top_k": 40, + "max_output_tokens": 1024, + } + self.assertEqual(config, expected_config) + + @unittest.skipUnless(conftest.TEST_GEMINI_SERVICE_LIVE, conftest.SKIP_REASON) + def test_get_response(self): + response = self.service.get_response(conftest.PROMPT_TEXT) + self.assertIsInstance(response, str) + + def test_get_response_mocked(self): + client = mock.create_autospec(genai.Client, instance=True) + generate_content_response = mock.MagicMock() + generate_content_response.text = conftest.RESPONSE_TEXT + client.models.generate_content.return_value = generate_content_response + + service = GeminiService(api_key=FAKE_API_KEY, client=client) + response = service.get_response(conftest.PROMPT_TEXT) + self.assertIsInstance(response, str) + self.assertEqual(response, conftest.RESPONSE_TEXT) + + +class MockedGeminiServiceTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.service = conftest.create_mock_gemini_service() + + def test_get_response(self): + response = self.service.get_response(conftest.PROMPT_TEXT) + self.assertIsInstance(response, str) + self.assertEqual(response, conftest.RESPONSE_TEXT) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/services/llm_service.py b/smart_control/llm/services/llm_service.py new file mode 100644 index 00000000..8038acc3 --- /dev/null +++ b/smart_control/llm/services/llm_service.py @@ -0,0 +1,31 @@ +"""Provides a generic interface for an LLM service.""" + +import abc +from typing import Any + + +class BaseLLMService(metaclass=abc.ABCMeta): + """Base class defining the common interface for an LLM service.""" + + @property + def json_metadata(self) -> dict[str, Any]: + """Info to write into a JSON file. Needs to be serializable.""" + return { + "type": self.__class__.__name__, + "model_name": self.model_name, + "temperature": self.temperature, + } + + @property + @abc.abstractmethod + def model_name(self) -> str: + """Returns the LLM model name.""" + + @property + @abc.abstractmethod + def temperature(self) -> float: + """Returns the LLM temperature.""" + + @abc.abstractmethod + def get_response(self, prompt: str) -> str | None: + """Returns the LLM's textual response from a given prompt.""" diff --git a/smart_control/llm/services/llm_service_test.py b/smart_control/llm/services/llm_service_test.py new file mode 100644 index 00000000..18e8ec3c --- /dev/null +++ b/smart_control/llm/services/llm_service_test.py @@ -0,0 +1,22 @@ +"""Tests for the Base LLM Service interface.""" + +from absl.testing import absltest +from smart_buildings.smart_control.llm.services import conftest + + +class LlmServiceTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.service = conftest.create_fake_llm_service() + + def test_temperature(self): + self.assertEqual(self.service.temperature, 0.0) + + def test_get_response(self): + response = self.service.get_response(conftest.PROMPT_TEXT) + self.assertEqual(response, conftest.RESPONSE_TEXT) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/services/vertex_service.py b/smart_control/llm/services/vertex_service.py new file mode 100644 index 00000000..1128a864 --- /dev/null +++ b/smart_control/llm/services/vertex_service.py @@ -0,0 +1,94 @@ +"""A Gemini Service that uses the Vertex AI platform, and a GCP project.""" + +import os +from typing import Any + +import dotenv +from google import auth +from google import genai +from google.genai import types +from smart_buildings.smart_control.llm.services import gemini_service + + +dotenv.load_dotenv() + +CREDENTIALS = os.getenv("GOOGLE_APPLICATION_CREDENTIALS") +PROJECT_ID = os.getenv("VERTEX_AI_PROJECT_ID", default="smart-buildings-dev") +LOCATION = os.getenv("VERTEX_AI_LOCATION", default="us-central1") +MODEL_NAME = os.getenv("VERTEX_AI_MODEL_NAME", default="gemini-2.5-flash") + +SAFETY_DISABLED = ( + types.SafetySetting( + category="HARM_CATEGORY_DANGEROUS_CONTENT", threshold="BLOCK_NONE" + ), + types.SafetySetting( + category="HARM_CATEGORY_HARASSMENT", threshold="BLOCK_NONE" + ), + types.SafetySetting( + category="HARM_CATEGORY_HATE_SPEECH", threshold="BLOCK_NONE" + ), + types.SafetySetting( + category="HARM_CATEGORY_SEXUALLY_EXPLICIT", threshold="BLOCK_NONE" + ), +) + + +class VertexAIService(gemini_service.BaseGeminiService): + """A Gemini Service that uses Vertex AI and a GCP project. + + Attributes: + project_id: The GCP project ID to use for the Vertex AI service. + location: The GCP location to use for the Vertex AI service. + credentials: The credentials to use for the Vertex AI service. + safety_settings: The safety settings to use for the Vertex AI service. + client: The client to use for the Vertex AI service. + """ + + def __init__( + self, + project_id: str | None = PROJECT_ID, + location: str = LOCATION, + model_name: str = MODEL_NAME, + temperature: float = gemini_service.TEMPERATURE, + top_p: float = gemini_service.TOP_P, + top_k: float = gemini_service.TOP_K, + max_output_tokens: int = gemini_service.MAX_OUTPUT_TOKENS, + safety_settings: list[types.SafetySetting] | None = None, + credentials: auth.credentials.Credentials | None = None, + client: genai.Client | None = None, + ): + super().__init__( + model_name=model_name, + temperature=temperature, + top_p=top_p, + top_k=top_k, + max_output_tokens=max_output_tokens, + ) + + self.project_id = project_id + self.location = location + self.credentials = credentials or CREDENTIALS + self.safety_settings = safety_settings or SAFETY_DISABLED + + # use default credentials if not provided: + if not self.credentials and not self.project_id: + self.credentials, self.project_id = auth.default() + + self._client = client or genai.Client( + vertexai=True, + project=self.project_id, + location=self.location, + credentials=self.credentials, + ) + + @property + def client(self) -> genai.Client: + """Returns a client for the Vertex AI service.""" + return self._client + + @property + def generation_config(self) -> dict[str, Any]: + """Returns the generation config for the Vertex AI service.""" + config = super().generation_config.copy() + config["safety_settings"] = self.safety_settings + return config diff --git a/smart_control/llm/services/vertex_service_test.py b/smart_control/llm/services/vertex_service_test.py new file mode 100644 index 00000000..4438c4f5 --- /dev/null +++ b/smart_control/llm/services/vertex_service_test.py @@ -0,0 +1,92 @@ +"""Tests for Vertex AI LLM service.""" + +import unittest +from unittest import mock + +from absl.testing import absltest +from google import genai +from google.auth import credentials +from smart_buildings.smart_control.llm.services import conftest +from smart_buildings.smart_control.llm.services import vertex_service + + +class VertexAIServiceTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.service = vertex_service.VertexAIService() + + def test_project_id(self): + self.assertEqual(self.service.project_id, 'smart-buildings-dev') + + def test_location(self): + self.assertEqual(self.service.location, 'us-central1') + + def test_model_name(self): + self.assertEqual(self.service.model_name, 'gemini-2.5-flash') + + def test_temperature(self): + self.assertEqual(self.service.temperature, 0.1) + + @unittest.skipUnless(conftest.TEST_VERTEX_SERVICE_LIVE, conftest.SKIP_REASON) + def test_credentials(self): + self.assertIsInstance(self.service.credentials, credentials.Credentials) + + def test_client(self): + self.assertIsInstance(self.service.client, genai.Client) + + def test_generation_config(self): + config = self.service.generation_config + self.assertIsInstance(config, dict) # or genai.types.GenerationConfig + expected_config = { + 'temperature': 0.1, + 'top_p': 0.95, + 'top_k': 40, + 'max_output_tokens': 1024, + 'safety_settings': vertex_service.SAFETY_DISABLED, + } + self.assertEqual(config, expected_config) + + @unittest.skipUnless(conftest.TEST_VERTEX_SERVICE_LIVE, conftest.SKIP_REASON) + def test_get_response(self): + response = self.service.get_response(conftest.PROMPT_TEXT) + # non-deterministic result from real service, just checking the type: + self.assertIsInstance(response, str) + + def test_get_response_mocked(self): + # mocked credentials: + creds = mock.create_autospec(credentials.Credentials, instance=True) + + # mocked client: + client = mock.create_autospec(genai.Client, instance=True) + generate_content_response = mock.MagicMock() + generate_content_response.text = conftest.RESPONSE_TEXT + client.models.generate_content.return_value = generate_content_response + + # dependency injection: + service = vertex_service.VertexAIService( + project_id='not-a-real-project', credentials=creds, client=client + ) + + # test the response: + response = service.get_response(conftest.PROMPT_TEXT) + self.assertIsInstance(response, str) + self.assertEqual(response, conftest.RESPONSE_TEXT) + + +class MockedVertexAIServiceTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.service = conftest.create_mock_vertex_service() + + def test_credentials(self): + self.assertIsInstance(self.service.credentials, credentials.Credentials) + + def test_get_response(self): + response = self.service.get_response(conftest.PROMPT_TEXT) + self.assertEqual(response, conftest.RESPONSE_TEXT) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/llm/utils/schedule_models.py b/smart_control/llm/utils/schedule_models.py new file mode 100644 index 00000000..134833b9 --- /dev/null +++ b/smart_control/llm/utils/schedule_models.py @@ -0,0 +1,306 @@ +"""Schedule models. + +These models represent the daily and weekly operational schedules for a given +building, and are used by the schedule tool to determine the operational mode +of the building, based on the current day and time. + +These daily and weekly schedules are meant to provide general templates that are +applied to all weeks, and are not tied to specific dates. As such, they also do +not account for holidays, which should be incorporated separately. + +The models use timezone-aware on and off times, to ensure accurate comparisons. +""" + +import calendar +from collections.abc import Mapping, Sequence +import dataclasses +import datetime +from typing import Any, Self +import zoneinfo + +# FYI: The calendar module may use different day names depending on the locale. +# We assume the calendar is set to the English locale. +DAY_NAMES = tuple(calendar.day_name) # ("Monday", "Tuesday", etc.) + + +def str_to_time_with_zone(time_str: str, time_zone: str) -> datetime.time: + """Returns a datetime.time object that is timezone aware.""" + tzinfo = zoneinfo.ZoneInfo(time_zone) + return datetime.time.fromisoformat(time_str).replace(tzinfo=tzinfo) + + +def display_time(time: datetime.time | None) -> str | None: + """Displays a given time as a string. + + This method is used for display and JSON serialization purposes only, not for + comparisons. + + It needs to handle None values because the daily schedule's on and off times + can be None (which designates a non-operational day). + + Args: + time: The time to convert, or None. + + Returns: + The time as a string, like "07:00", or None. + """ + return time.strftime("%H:%M") if time is not None else None + + +@dataclasses.dataclass(frozen=True) +class DailySchedule: + """The planned operational schedule for a given day of week. + + This model assumes that there is a single operational period for the day, and + that the building and its devices should be "ON" during the hours between the + `on_time` and `off_time`, and "OFF" otherwise. + + A given day should have both an `on_time` and `off_time` (to designate an + operational day), or neither (using None values to designate a non-operational + day). If present, both times must be timezone aware, and share the same time + zone. When comparing a time to the on_time and off_time, the comparison time + must also be timezone aware, and have the same time zone (see the + `is_during_operational_hours` method for more details). + + Attributes: + day_name: The name of the day of the week (e.g. "Monday"). + on_time: The time of day when devices should be turned on, or None. + off_time: The time of day when devices should be turned off, or None. + time_zone: The time zone used for the on_time and off_time. Required, even + if the on_time and off_time are None. + """ + day_name: str + time_zone: str = "UTC" + on_time: datetime.time | None = None + off_time: datetime.time | None = None + + # VALIDATIONS + + def __post_init__(self) -> None: + self._validate_day_name() + self._validate_time_zone() + self._validate_times() + self._validate_times_zones() + self._validate_times_start_after_end() + + def _validate_day_name(self) -> None: + """Ensures the day name is valid.""" + if self.day_name not in DAY_NAMES: + raise ValueError( + f"Unknown day name: {self.day_name}. Expecting one of: {DAY_NAMES}." + ) + + def _validate_time_zone(self) -> None: + """Ensures the time zone is present and valid.""" + if self.time_zone is None: + raise ValueError("The time zone must be specified.") + + try: + self.tzinfo # pylint: disable=pointless-statement + except zoneinfo.ZoneInfoNotFoundError as err: + raise ValueError(f"Invalid time zone: {self.time_zone}.") from err + + def _validate_times(self) -> None: + """Ensures both times are present, or neither are.""" + if (self.on_time is None and self.off_time is not None) or ( + self.on_time is not None and self.off_time is None + ): + raise ValueError( + "The on_time and off_time must both be specified, or both be None." + ) + + def _validate_times_zones(self) -> None: + """Ensures both times have a time zone, and they match the schedule.""" + if self.on_time is None or self.off_time is None: + return + + if self.on_time.tzinfo is None: + raise ValueError("The on_time needs to have a time zone.") + + if self.off_time.tzinfo is None: + raise ValueError("The off_time needs to have a time zone.") + + if ( + self.on_time.tzinfo != self.tzinfo + or self.off_time.tzinfo != self.tzinfo + ): + raise ValueError( + "The on_time and off_time must have the same time zone, and it must " + f"match the schedule's time zone: {self.time_zone}." + ) + + def _validate_times_start_after_end(self) -> None: + """Ensures the on_time is before the off_time.""" + if self.on_time is not None and self.off_time is not None: + if self.on_time >= self.off_time: + raise ValueError("The on_time must be before the off_time.") + + # CONSTRUCTOR + + @classmethod + def from_times( + cls, + *, + day_name: str, + on_time: str | None, + off_time: str | None, + time_zone: str | None = "UTC", + ) -> Self: + """Creates a DailySchedule from 24-hr time strings. + + This method allows you to pass timezone-naive strings for convenience. It + will apply the specified time zone to each of the times to ensure they are + both timezone aware. + + Args: + day_name: The name of the day of the week (e.g. "Monday"). + on_time: The time of day when devices should be turned on, as a string + like "07:00", or None if the day is not operational. + off_time: The time of day when devices should be turned off, as a string + like "19:00", or None if the day is not operational. + time_zone: The time zone to use for the on_time and off_time. Defaults to + "UTC". + + Returns: + A DailySchedule instance. + """ + if on_time is not None: + on_time = str_to_time_with_zone(on_time, time_zone=time_zone) + + if off_time is not None: + off_time = str_to_time_with_zone(off_time, time_zone=time_zone) + + return cls( + day_name=day_name, + on_time=on_time, + off_time=off_time, + time_zone=time_zone, + ) + + # METHODS AND PROPERTIES + + @property + def tzinfo(self) -> zoneinfo.ZoneInfo: + """Information about the given time zone, as a zoneinfo.ZoneInfo object.""" + return zoneinfo.ZoneInfo(self.time_zone) + + @property + def is_operational_day(self) -> bool: + """Whether this day is scheduled to be an operational day.""" + return self.on_time is not None and self.off_time is not None + + def is_during_operational_hours(self, time: datetime.time) -> bool: + """Determines if the given time is within the scheduled hours. + + The comparison time needs to be timezone-aware, and have the same time zone + as the on_time and off_time, which have both already been validated to have + the same time zone. + + Note about edge cases: The start time is considered operational (inclusive), + but the end time is considered non-operational (exclusive). + + Args: + time: The time to check. Must be timezone aware, and have the same time + zone as the schedule. + + Returns: + A boolean indicating whether the given time falls within the scheduled + hours. + """ + if time.tzinfo is None: + raise ValueError("The comparison time must have a time zone.") + + if str(time.tzinfo) != str(self.tzinfo): + raise ValueError( + "The comparison time must have the same time zone as the schedule." + ) + + if not self.is_operational_day: + return False + + return self.on_time <= time < self.off_time + + +@dataclasses.dataclass(frozen=True) +class WeeklySchedule: + """The operational schedule for a given week. + + The weekly schedule contains a daily schedule for each day of the week. + + Attributes: + daily_schedules: A sequence of DailySchedules for each day of the week. + """ + + daily_schedules: Sequence[DailySchedule] + + # VALIDATIONS + + def __post_init__(self) -> None: + self._validate_all_days() + + def _validate_all_days(self) -> None: + """Ensures all expected day names are present.""" + day_names = [schedule.day_name for schedule in self.daily_schedules] + if sorted(day_names) != sorted(DAY_NAMES): + raise ValueError( + f"Weekly schedule must have a schedule for each day of the week." + f" Expected: {DAY_NAMES}, got: {day_names}." + ) + + # CONSTRUCTOR + + @classmethod + def from_dict( + cls, + schedule_dict: Mapping[str, Sequence[str | None]], + time_zone: str | None = "UTC", + ) -> Self: + """Creates a WeeklySchedule from a dictionary of DailySchedules.""" + return cls([ + DailySchedule.from_times( + day_name=day_name, + on_time=on_time, + off_time=off_time, + time_zone=time_zone, + ) + for day_name, (on_time, off_time) in schedule_dict.items() + ]) + + # PROPERTIES AND METHODS + + @property + def time_zone(self) -> str: + """The time zone used for all the daily schedules.""" + return self.daily_schedules[0].time_zone + + def get_daily_schedule(self, day_name: str) -> DailySchedule: + """Returns the daily schedule for the given day of week. + + Args: + day_name: The name of the day of the week (e.g. "Monday"). + + Raises: + ValueError: If the day name is not in the weekly schedule. + + Returns: + The DailySchedule instance for the given day of week. + """ + for schedule in self.daily_schedules: + if schedule.day_name == day_name: + return schedule + raise ValueError(f"Unknown day name: {day_name}") + + @property + def json_metadata(self) -> dict[str, Any]: + """Info about the weekly schedule, in a JSON serializable format.""" + daily_schedules_dict = { + schedule.day_name: { + "on_time": display_time(schedule.on_time), + "off_time": display_time(schedule.off_time), + } + for schedule in self.daily_schedules + } + return { + "time_zone": self.time_zone, + "daily_schedules": daily_schedules_dict, + } diff --git a/smart_control/llm/utils/schedule_models_test.py b/smart_control/llm/utils/schedule_models_test.py new file mode 100644 index 00000000..28026b72 --- /dev/null +++ b/smart_control/llm/utils/schedule_models_test.py @@ -0,0 +1,346 @@ +import datetime +import zoneinfo + +from absl.testing import absltest +from absl.testing import parameterized +from smart_buildings.smart_control.llm.utils import schedule_models + +UTC = "UTC" +EST = "America/New_York" +PST = "America/Los_Angeles" + +UTC_INFO = zoneinfo.ZoneInfo(UTC) +EST_INFO = zoneinfo.ZoneInfo(EST) +PST_INFO = zoneinfo.ZoneInfo(PST) + +TIME = datetime.time(8, 0) # timezone naive +TIME_UTC = datetime.time(8, 0, tzinfo=UTC_INFO) +TIME_PST = datetime.time(8, 0, tzinfo=PST_INFO) +TIME_EST = datetime.time(8, 0, tzinfo=EST_INFO) + +OFF_TIME = datetime.time(18, 0) # timezone naive +OFF_TIME_UTC = datetime.time(18, 0, tzinfo=UTC_INFO) +OFF_TIME_PST = datetime.time(18, 0, tzinfo=PST_INFO) +OFF_TIME_EST = datetime.time(18, 0, tzinfo=EST_INFO) + + +class TimeConversionsTest(parameterized.TestCase): + + @parameterized.named_parameters( + dict( + testcase_name="naive_time_str_to_utc", + time_str="08:00", + time_zone=UTC, + expected=TIME_UTC, + ), + dict( + testcase_name="naive_time_str_to_eastern", + time_str="08:00", + time_zone=EST, + expected=TIME_EST, + ), + dict( + testcase_name="naive_time_str_to_pacific", + time_str="08:00", + time_zone=PST, + expected=TIME_PST, + ), + dict( + testcase_name="tz_eastern", + time_str="08:00", + time_zone=EST, + expected=TIME_EST, + ), + ) + def test_str_to_time_with_zone(self, time_str, time_zone, expected): + self.assertEqual( + schedule_models.str_to_time_with_zone(time_str, time_zone), expected + ) + + +# +# DAILY SCHEDULE TESTS +# + + +class OperationalDailyScheduleTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.schedule = schedule_models.DailySchedule.from_times( + day_name="Monday", on_time="08:00", off_time="18:00" + ) + + def test_init(self): + self.assertIsInstance(self.schedule, schedule_models.DailySchedule) + + def test_attributes(self): + self.assertEqual(self.schedule.day_name, "Monday") + self.assertEqual(self.schedule.on_time, TIME_UTC) + self.assertEqual(self.schedule.off_time, OFF_TIME_UTC) + self.assertEqual(self.schedule.time_zone, UTC) + + def test_is_operational_day(self): + self.assertTrue(self.schedule.is_operational_day) + + @parameterized.named_parameters( + dict(testcase_name="during_hours", hour=12, minute=0, expected=True), + dict(testcase_name="before_hours", hour=7, minute=0, expected=False), + dict(testcase_name="after_hours", hour=19, minute=0, expected=False), + dict(testcase_name="start_of_hours", hour=8, minute=0, expected=True), + dict(testcase_name="end_of_hours", hour=18, minute=0, expected=False), + ) + def test_is_during_operational_hours(self, hour, minute, expected): + self.assertEqual( + self.schedule.is_during_operational_hours( + datetime.time(hour, minute, tzinfo=UTC_INFO) + ), + expected, + ) + + def test_is_during_operational_hours_with_wrong_time_zone_raises(self): + with self.assertRaisesRegex( + ValueError, + "The comparison time must have the same time zone as the schedule.", + ): + self.schedule.is_during_operational_hours( + datetime.time(12, 0, tzinfo=PST_INFO) + ) + + def test_is_during_operational_hours_with_naive_time_raises(self): + with self.assertRaisesRegex( + ValueError, + "The comparison time must have a time zone.", + ): + self.schedule.is_during_operational_hours(datetime.time(12, 0)) + + +class NonOperationalDailyScheduleTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.schedule = schedule_models.DailySchedule.from_times( + day_name="Monday", on_time=None, off_time=None + ) + + def test_init(self): + self.assertIsInstance(self.schedule, schedule_models.DailySchedule) + + def test_attributes(self): + self.assertEqual(self.schedule.day_name, "Monday") + self.assertIsNone(self.schedule.on_time) + self.assertIsNone(self.schedule.off_time) + + def test_is_operational_day(self): + self.assertFalse(self.schedule.is_operational_day) + + @parameterized.parameters( + datetime.time(12, 0, tzinfo=UTC_INFO), + datetime.time(7, 0, tzinfo=UTC_INFO), + datetime.time(19, 0, tzinfo=UTC_INFO), + ) + def test_is_during_operational_hours(self, time): + self.assertFalse(self.schedule.is_during_operational_hours(time)) + + +class DailyScheduleValidationsTest(absltest.TestCase): + + def test_invalid_day_name_raises(self): + with self.assertRaisesRegex(ValueError, "Unknown day name: Funday"): + schedule_models.DailySchedule.from_times( + day_name="Funday", on_time="08:00", off_time="18:00" + ) + + def test_missing_on_time_raises(self): + with self.assertRaisesRegex( + ValueError, + "The on_time and off_time must both be specified, or both be None.", + ): + schedule_models.DailySchedule.from_times( + day_name="Monday", on_time=None, off_time="18:00" + ) + + def test_missing_off_time_raises(self): + with self.assertRaisesRegex( + ValueError, + "The on_time and off_time must both be specified, or both be None.", + ): + schedule_models.DailySchedule.from_times( + day_name="Monday", on_time="08:00", off_time=None + ) + + def test_on_after_off_raises(self): + with self.assertRaisesRegex( + ValueError, "The on_time must be before the off_time." + ): + schedule_models.DailySchedule.from_times( + day_name="Monday", on_time="18:00", off_time="08:00" + ) + + def test_same_on_and_off_raises(self): + with self.assertRaisesRegex( + ValueError, "The on_time must be before the off_time." + ): + schedule_models.DailySchedule.from_times( + day_name="Monday", on_time="08:00", off_time="08:00" + ) + + def test_invalid_time_zone_raises(self): + with self.assertRaisesRegex(ValueError, "Invalid time zone: OOPS"): + schedule_models.DailySchedule.from_times( + day_name="Monday", + on_time=None, + off_time=None, + time_zone="OOPS", + ) + + def test_naive_on_time_raises(self): + with self.assertRaisesRegex( + ValueError, "The on_time needs to have a time zone." + ): + schedule_models.DailySchedule( + day_name="Monday", + on_time=TIME, + off_time=OFF_TIME_UTC, + time_zone=UTC, + ) + + def test_naive_off_time_raises(self): + with self.assertRaisesRegex( + ValueError, "The off_time needs to have a time zone." + ): + schedule_models.DailySchedule( + day_name="Monday", + on_time=TIME_UTC, + off_time=OFF_TIME, + time_zone=UTC, + ) + + def test_mismatched_on_time_tz_raises(self): + with self.assertRaisesRegex( + ValueError, + "The on_time and off_time must have the same time zone", + ): + schedule_models.DailySchedule( + day_name="Monday", + on_time=TIME_PST, + off_time=OFF_TIME_UTC, + time_zone=UTC, + ) + + def test_mismatched_off_time_tz_raises(self): + with self.assertRaisesRegex( + ValueError, + "The on_time and off_time must have the same time zone", + ): + schedule_models.DailySchedule( + day_name="Monday", + on_time=TIME_UTC, + off_time=OFF_TIME_PST, + time_zone=UTC, + ) + + +# +# WEEKLY SCHEDULE TESTS +# + + +class WeeklyScheduleTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.schedule_dict = { + "Monday": ("06:00", "19:00"), + "Tuesday": ("06:00", "19:00"), + "Wednesday": ("06:00", "19:00"), + "Thursday": ("06:00", "19:00"), + "Friday": ("09:00", "17:00"), + "Saturday": (None, None), + "Sunday": (None, None), + } + self.weekly_schedule = schedule_models.WeeklySchedule.from_dict( + schedule_dict=self.schedule_dict, time_zone=UTC + ) + + def test_init(self): + self.assertIsInstance(self.weekly_schedule, schedule_models.WeeklySchedule) + + def test_day_names(self): + self.assertLen(self.weekly_schedule.daily_schedules, 7) + + day_names = [ + schedule.day_name for schedule in self.weekly_schedule.daily_schedules + ] + self.assertCountEqual(day_names, list(schedule_models.DAY_NAMES)) + + def test_time_zone(self): + self.assertEqual(self.weekly_schedule.time_zone, UTC) + + def test_get_daily_schedule(self): + monday_schedule = self.weekly_schedule.get_daily_schedule("Monday") + self.assertEqual(monday_schedule.day_name, "Monday") + self.assertEqual( + monday_schedule.on_time, datetime.time(6, 0, tzinfo=UTC_INFO) + ) + self.assertEqual( + monday_schedule.off_time, datetime.time(19, 0, tzinfo=UTC_INFO) + ) + + def test_get_daily_schedule_with_invalid_day_name_raises(self): + with self.assertRaisesRegex(ValueError, "Unknown day name: Funday"): + self.weekly_schedule.get_daily_schedule("Funday") + + def test_json_metadata(self): + self.assertEqual( + self.weekly_schedule.json_metadata, + { + "time_zone": UTC, + "daily_schedules": { + "Monday": {"on_time": "06:00", "off_time": "19:00"}, + "Tuesday": {"on_time": "06:00", "off_time": "19:00"}, + "Wednesday": {"on_time": "06:00", "off_time": "19:00"}, + "Thursday": {"on_time": "06:00", "off_time": "19:00"}, + "Friday": {"on_time": "09:00", "off_time": "17:00"}, + "Saturday": {"on_time": None, "off_time": None}, + "Sunday": {"on_time": None, "off_time": None}, + }, + }, + ) + + +class WeeklyScheduleValidationsTest(absltest.TestCase): + + def test_missing_day_raises(self): + with self.assertRaisesRegex( + ValueError, + "Weekly schedule must have a schedule for each day of the week.", + ): + schedule_models.WeeklySchedule.from_dict( + {"Monday": ("08:00", "18:00")}, time_zone=PST + ) + + def test_extra_day_raises(self): + # FYI because dictionaries don't allow duplicate keys, we can't use the + # WeeklySchedule.from_dict constructor to test this validation. + with self.assertRaisesRegex( + ValueError, + "Weekly schedule must have a schedule for each day of the week.", + ): + from_times = schedule_models.DailySchedule.from_times + on_time = "08:00" + off_time = "18:00" + schedule_models.WeeklySchedule([ + from_times(day_name="Monday", on_time=on_time, off_time=off_time), + from_times(day_name="Tuesday", on_time=on_time, off_time=off_time), + from_times(day_name="Wednesday", on_time=on_time, off_time=off_time), + from_times(day_name="Thursday", on_time=on_time, off_time=off_time), + from_times(day_name="Friday", on_time=on_time, off_time=off_time), + from_times(day_name="Saturday", on_time=None, off_time=None), + from_times(day_name="Sunday", on_time=None, off_time=None), + from_times(day_name="Sunday", on_time=None, off_time=None), # Extra + ]) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/llm/utils/schedule_tool.py b/smart_control/llm/utils/schedule_tool.py new file mode 100644 index 00000000..937e62b0 --- /dev/null +++ b/smart_control/llm/utils/schedule_tool.py @@ -0,0 +1,374 @@ +"""Schedule tool. + +This tool provides information about the building's operational schedule, by +accessing information such as the current date and time from the environment. + +**Operational Modes** + +This tool can be used by an agent to determine if the building's devices should +be ON or OFF, based on the time of day, day of week, and holiday calendar. + +**Weekly Schedule** + +By default, this tool assumes that workdays are Mondays through Fridays, and +that operational hours are from 7:00 AM to 7:00 PM, but these values can be +customized. This includes the ability to specify different operational hours for +different days of the week. See the `schedule_models.WeeklySchedule` class for +more details. + +**Holiday Calendar** + +We anticipate the need to customize the holiday calendar, because we will be +supporting buildings across different countries. And because even within a given +country, different localities, companies, and building operators may observe +slightly different holiday schedules. + +By default, this tool uses the `holiday.USFederalHolidayCalendar` to determine +the holidays, which provides a good baseline for US-based buildings. However, +you can specify a different holiday calendar, as long as it implements the +`holiday.AbstractHolidayCalendar` interface from pandas (as illustrated by the +example below). + +```python +from pandas.tseries import holiday + +class MyCustomHolidayCalendar(holiday.AbstractHolidayCalendar): + rules = [ + holiday.Holiday("Founder's Day", month=7, day=1), + holiday.Holiday("My Birthday", month=9, day=1), + ] +``` +""" + +import abc +import datetime +import enum +from typing import Any, Final, TypeAlias + +import pandas as pd +from pandas.tseries import holiday + +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.llm.utils import schedule_models + +SerializableData: TypeAlias = dict[str, Any] + + +class BuildingOperationalMode(enum.Enum): + """The operational mode of the building (and its devices).""" + + ON = "ON" + OFF = "OFF" + +OPERATIONAL_MODES = tuple(mode.value for mode in BuildingOperationalMode) + + +DEFAULT_WEEKLY_SCHEDULE: Final[schedule_models.WeeklySchedule] = ( + schedule_models.WeeklySchedule.from_dict( + schedule_dict={ + "Monday": ("07:00", "19:00"), + "Tuesday": ("07:00", "19:00"), + "Wednesday": ("07:00", "19:00"), + "Thursday": ("07:00", "19:00"), + "Friday": ("07:00", "19:00"), + "Saturday": (None, None), + "Sunday": (None, None), + }, + time_zone="US/Pacific", + ) +) + + +class BaseSchedule(abc.ABC): + """Abstract interface providing info about a building's operational schedule. + + Requires a child class to implement the `time_zone` and + `current_local_timestamp` properties, using the building's local time zone. + + Determines if the building's devices should be ON or OFF, based on the time of + day, day of week, and holiday calendar. + + For the holiday calendar, the US federal holiday calendar will be used by + default, however you can customize this by passing in your own implementation + of the `holiday.AbstractHolidayCalendar` interface from pandas. + + The start and end dates are optionally used to filter the range of holidays + included. If not specified, holidays from all available years will be + included. + + Attributes: + time_zone: The time zone to use for all date and time calculations. + current_local_timestamp: The current date and time in the local time zone. + weekly_schedule: The operational hours for each day of the week, using the + building's local time zone. + cal: The holiday calendar to use for determining holidays. Defaults to the + US federal holiday calendar. + start_date: The start date for the holiday calendar (optional). + end_date: The end date for the holiday calendar (optional). + n_upcoming_holidays: The number of upcoming holidays to return. + """ + + def __init__( + self, + weekly_schedule: schedule_models.WeeklySchedule | None = None, + cal: holiday.AbstractHolidayCalendar | None = None, + start_date: str | None = None, + end_date: str | None = None, + n_upcoming_holidays: int = 5, + ): + """Initializes the instance. + + Args: + weekly_schedule: The operational schedule for the week. Defaults to + `DEFAULT_WEEKLY_SCHEDULE`. + cal: The holiday calendar to use for determining holidays. The calendar + must implement the `holiday.AbstractHolidayCalendar` interface. + By default, the US federal holiday calendar is used. + start_date: The start date used to optionally filter the list of + holidays. Defaults to None. + end_date: The end date used to optionally filter the list of + holidays. Defaults to None. + n_upcoming_holidays: The number of upcoming holidays to return. + """ + self.weekly_schedule = weekly_schedule or DEFAULT_WEEKLY_SCHEDULE + self.start_date = start_date + self.end_date = end_date + self.cal = cal or holiday.USFederalHolidayCalendar() + self.n_upcoming_holidays = n_upcoming_holidays + + # + # BASE CONTRACT + # + + @property + @abc.abstractmethod + def time_zone(self) -> str: + """The time zone used for all timestamps and comparisons.""" + raise NotImplementedError + + @property + @abc.abstractmethod + def current_local_timestamp(self) -> pd.Timestamp: + """The current (timezone-aware) date and time in the local timezone.""" + raise NotImplementedError + + # + # IMPLEMENTATION METHODS + # + + @property + def json_metadata(self) -> SerializableData: + """Info to write into a JSON file. Needs to be serializable.""" + holidays_df = self.upcoming_holidays_df.copy() + holidays_df["date"] = holidays_df["date"].dt.strftime("%Y-%m-%d") + holidays_df = holidays_df.rename(columns={"holiday": "name"}) + holidays = holidays_df[["date", "name", "day_name"]].to_dict("records") + + return { + "weekly_schedule": self.weekly_schedule.json_metadata, + "start_date": self.start_date, + "end_date": self.end_date, + "upcoming_holidays": holidays, + } + + # CURRENT DATE AND TIME + + @property + def current_year(self) -> int: + """The current year, in the building's local timezone.""" + return self.current_local_timestamp.year + + @property + def current_date(self) -> datetime.date: + """The current date, in the building's local timezone.""" + return self.current_local_timestamp.date() + + @property + def current_date_str(self) -> str: + """The current date as a string, in the building's local timezone.""" + return self.current_local_timestamp.strftime("%Y-%m-%d") + + @property + def current_time(self) -> datetime.time: + """The current (timezone-aware) time, in the building's local timezone.""" + return self.current_local_timestamp.timetz() + + @property + def current_time_str(self) -> str: + """The current time as a string, in the building's local timezone.""" + return self.current_local_timestamp.strftime("%H:%M") + + @property + def current_weekday_name(self) -> str: + """The current day of the week, in the building's local timezone.""" + return self.current_local_timestamp.strftime("%A") # > "Monday" + + # HOLIDAY CALENDAR + + def _get_holidays( + self, return_name: bool = False + ) -> pd.DatetimeIndex | pd.Series: + """Returns the holidays as a DatetimeIndex or a Series. + + Args: + return_name: Whether to return the holidays as a Series. + + Returns: + A DatetimeIndex or a Series of the holidays. + """ + return self.cal.holidays( + start=self.start_date, end=self.end_date, return_name=return_name + ) + + @property + def holidays(self) -> set[str]: + """The holiday calendar, as a set of string dates (like '2025-01-01').""" + return { + d.strftime("%Y-%m-%d") + for d in self._get_holidays(return_name=False) + } + + @property + def holidays_df(self) -> pd.DataFrame: + """The holiday calendar, as a DataFrame.""" + df = self._get_holidays(return_name=True).reset_index() + df.columns = ["date", "holiday"] + df["day_of_year"] = df["date"].dt.dayofyear + df["year"] = df["date"].dt.year + df["day_name"] = df["date"].dt.day_name() + return df + + @property + def upcoming_holidays_df(self) -> pd.DataFrame: + """The next few upcoming holidays, as a DataFrame. + + Use the `n_upcoming_holidays` initialization argument to customize the + number of holidays to be included. + + Note: It is possible for this dataframe to contain fewer than the requested + number of holidays, depending on the current date and the end date. + + Returns: + A DataFrame of the next few upcoming holidays, sorted by date ascending. + """ + df = self.holidays_df[self.holidays_df["date"].dt.date >= self.current_date] + df.sort_values(by="date", inplace=True) + return df.head(self.n_upcoming_holidays) + + @property + def upcoming_holidays(self) -> list[str]: + """The next few upcoming holidays. + + Use the `n_upcoming_holidays` initialization argument to customize the + number of holidays to return. + + Note: It is possible for this list to contain fewer than the requested + number of holidays, depending on the current date and the end date. + + Returns: + A list of strings, like '2025-01-01', sorted by date ascending. + """ + return self.upcoming_holidays_df["date"].dt.strftime("%Y-%m-%d").tolist() + + @property + def is_holiday(self) -> bool: + """Whether the current date is a holiday.""" + return self.current_date_str in self.holidays + + # WEEKLY SCHEDULE + + @property + def current_daily_schedule(self) -> schedule_models.DailySchedule: + """The daily schedule for the current day of week.""" + return self.weekly_schedule.get_daily_schedule(self.current_weekday_name) + + @property + def is_workday(self) -> bool: + """Whether the current date is a workday (not considering holidays).""" + return self.current_daily_schedule.is_operational_day + + # CURRENT OPERATIONAL STATUS + + @property + def is_operational_day(self) -> bool: + """Whether the current date is an operational day.""" + return self.is_workday and not self.is_holiday + + @property + def is_during_operational_hours(self) -> bool: + """Whether the current time is during operational hours.""" + return self.current_daily_schedule.is_during_operational_hours( + self.current_time + ) + + @property + def building_is_operational(self) -> bool: + """Whether the building is operational.""" + return self.is_operational_day and self.is_during_operational_hours + + @property + def building_operational_mode(self) -> BuildingOperationalMode: + """The building's operational mode.""" + if self.building_is_operational: + return BuildingOperationalMode.ON + else: + return BuildingOperationalMode.OFF + + +class ScheduleTool(BaseSchedule): + """Schedule tool using the current date and time in a specified time zone.""" + + def __init__(self, time_zone: str = "UTC", **kwargs): + """Initializes the instance. + + Args: + time_zone: The time zone to use for all date and time calculations. + Defaults to UTC. + **kwargs: Keyword arguments to pass to the base class. + """ + super().__init__(**kwargs) + self._time_zone = time_zone + + @property + def time_zone(self) -> str: + """Returns the time zone used for all date and time calculations.""" + return self._time_zone + + @property + def current_local_timestamp(self) -> pd.Timestamp: + """The current date and time in the local timezone.""" + return pd.Timestamp.now(tz=self.time_zone) + + +class BuildingScheduleTool(BaseSchedule): + """A tool for accessing information about the building's operational schedule. + + Uses the time zone and current local timestamp from the environment to + determine if the building's devices should be ON or OFF, based on the time of + day, day of week, and holiday calendar. + + Attributes: + env: The environment to use for getting the time zone and current timestamp. + **kwargs: Keyword arguments to pass to the base class. + """ + + def __init__(self, env: environment.Environment, **kwargs): + """Initializes the instance. + + Args: + env: The environment to use for getting the time zone and current + timestamp. + **kwargs: Keyword arguments to pass to the base class. + """ + super().__init__(**kwargs) + self.env = env + + @property + def time_zone(self) -> str: + """The building's local time zone, from the environment.""" + return self.env.time_zone + + @property + def current_local_timestamp(self) -> pd.Timestamp: + """The current date and time, in the building's local timezone.""" + return self.env.current_local_timestamp diff --git a/smart_control/llm/utils/schedule_tool_test.py b/smart_control/llm/utils/schedule_tool_test.py new file mode 100644 index 00000000..f956a3a0 --- /dev/null +++ b/smart_control/llm/utils/schedule_tool_test.py @@ -0,0 +1,381 @@ +import datetime +from unittest import mock +import zoneinfo + +from absl.testing import absltest +from absl.testing import parameterized +import pandas as pd +from pandas.tseries import holiday + +from smart_buildings.smart_control.environment import conftest as env_conftest +from smart_buildings.smart_control.llm.utils import schedule_models +from smart_buildings.smart_control.llm.utils import schedule_tool + +BuildingOperationalMode = schedule_tool.BuildingOperationalMode + +TIME_ZONE = "US/Pacific" +CURRENT_LOCAL_TIMESTAMP = pd.Timestamp("2021-06-01 12:00:00", tz=TIME_ZONE) + +UPCOMING_HOLIDAYS = ( + { + "date": pd.Timestamp("2021-06-18 00:00:00"), + "holiday": "Juneteenth National Independence Day", + "day_of_year": 169, + "year": 2021, + "day_name": "Friday", + }, + { + "date": pd.Timestamp("2021-07-05 00:00:00"), + "holiday": "Independence Day", + "day_of_year": 186, + "year": 2021, + "day_name": "Monday", + }, + { + "date": pd.Timestamp("2021-09-06 00:00:00"), + "holiday": "Labor Day", + "day_of_year": 249, + "year": 2021, + "day_name": "Monday", + }, + { + "date": pd.Timestamp("2021-10-11 00:00:00"), + "holiday": "Columbus Day", + "day_of_year": 284, + "year": 2021, + "day_name": "Monday", + }, + { + "date": pd.Timestamp("2021-11-11 00:00:00"), + "holiday": "Veterans Day", + "day_of_year": 315, + "year": 2021, + "day_name": "Thursday", + }, +) + +SCHEDULE_SCENARIOS = ( + { + "testcase_name": "weekday_morning", + "timestamp": pd.Timestamp("2025-12-12 08:00:00", tz=TIME_ZONE), + "weekday_name": "Friday", + "is_workday": True, + "is_holiday": False, + "is_operational_day": True, + "is_during_operational_hours": True, + "is_operational": True, + "operational_mode": schedule_tool.BuildingOperationalMode.ON, + }, + { + "testcase_name": "weekday_afternoon", + "timestamp": pd.Timestamp("2025-12-12 15:30:00", tz=TIME_ZONE), + "weekday_name": "Friday", + "is_workday": True, + "is_holiday": False, + "is_operational_day": True, + "is_during_operational_hours": True, + "is_operational": True, + "operational_mode": schedule_tool.BuildingOperationalMode.ON, + }, + { + "testcase_name": "weekday_nighttime", + "timestamp": pd.Timestamp("2025-12-12 02:00:00", tz=TIME_ZONE), + "weekday_name": "Friday", + "is_workday": True, + "is_holiday": False, + "is_operational_day": True, + "is_during_operational_hours": False, + "is_operational": False, + "operational_mode": schedule_tool.BuildingOperationalMode.OFF, + }, + { + "testcase_name": "holiday_daytime", # Christmas, a Thursday + "timestamp": pd.Timestamp("2025-12-25 11:00:00", tz=TIME_ZONE), + "weekday_name": "Thursday", + "is_workday": True, + "is_holiday": True, + "is_operational_day": False, + "is_during_operational_hours": True, + "is_operational": False, + "operational_mode": schedule_tool.BuildingOperationalMode.OFF, + }, + { + "testcase_name": "weekend_nighttime", + "timestamp": pd.Timestamp("2025-12-13 02:00:00", tz=TIME_ZONE), + "weekday_name": "Saturday", + "is_workday": False, + "is_holiday": False, + "is_operational_day": False, + "is_during_operational_hours": False, + "is_operational": False, + "operational_mode": schedule_tool.BuildingOperationalMode.OFF, + }, +) + +SCHEDULE_METADATA = { + "weekly_schedule": { + "time_zone": "US/Pacific", + "daily_schedules": { + "Monday": {"on_time": "07:00", "off_time": "19:00"}, + "Tuesday": {"on_time": "07:00", "off_time": "19:00"}, + "Wednesday": {"on_time": "07:00", "off_time": "19:00"}, + "Thursday": {"on_time": "07:00", "off_time": "19:00"}, + "Friday": {"on_time": "07:00", "off_time": "19:00"}, + "Saturday": {"on_time": None, "off_time": None}, + "Sunday": {"on_time": None, "off_time": None}, + }, + }, + "start_date": None, + "end_date": None, + "upcoming_holidays": [ + { + "date": "2021-06-18", + "name": "Juneteenth National Independence Day", + "day_name": "Friday", + }, + { + "date": "2021-07-05", + "name": "Independence Day", + "day_name": "Monday", + }, + {"date": "2021-09-06", "name": "Labor Day", "day_name": "Monday"}, + {"date": "2021-10-11", "name": "Columbus Day", "day_name": "Monday"}, + {"date": "2021-11-11", "name": "Veterans Day", "day_name": "Thursday"}, + ], +} + + +class ScheduleToolTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.mock_timestamp_now = self.enter_context( + mock.patch.object(pd.Timestamp, "now", autospec=True) + ) + self.mock_timestamp_now.return_value = CURRENT_LOCAL_TIMESTAMP + self.schedule = schedule_tool.ScheduleTool(time_zone=TIME_ZONE) + self.expected_class = schedule_tool.ScheduleTool + + def test_initialization(self): + self.assertIsInstance(self.schedule, self.expected_class) + + def test_weekly_schedule(self): + self.assertIsInstance( + self.schedule.weekly_schedule, schedule_models.WeeklySchedule + ) + + def test_time_zone(self): + self.assertEqual(self.schedule.time_zone, TIME_ZONE) + + def test_holiday_calendar(self): + self.assertIsNone(self.schedule.start_date) + self.assertIsNone(self.schedule.end_date) + self.assertIsInstance(self.schedule.cal, holiday.USFederalHolidayCalendar) + + # CURRENT DATE AND TIME + + def test_date_time_properties(self): + with self.subTest(name="current_local_timestamp"): + self.assertEqual( + self.schedule.current_local_timestamp, CURRENT_LOCAL_TIMESTAMP + ) + + with self.subTest(name="current_year"): + self.assertEqual(self.schedule.current_year, 2021) + + with self.subTest(name="current_date"): + self.assertEqual(self.schedule.current_date, datetime.date(2021, 6, 1)) + self.assertEqual(self.schedule.current_date_str, "2021-06-01") + + with self.subTest(name="current_time"): + self.assertEqual( + self.schedule.current_time, + datetime.time(12, 0, tzinfo=zoneinfo.ZoneInfo(TIME_ZONE)), + ) + self.assertEqual(self.schedule.current_time_str, "12:00") + + # HOLIDAY CALENDAR + + def test_get_holidays(self): + with self.subTest(name="as_index"): + holidays = self.schedule._get_holidays(return_name=False) + self.assertIsInstance(holidays, pd.DatetimeIndex) + + with self.subTest(name="as_series"): + holidays = self.schedule._get_holidays(return_name=True) + self.assertIsInstance(holidays, pd.Series) + + def test_holidays(self): + holidays = self.schedule.holidays + self.assertIsInstance(holidays, set) + self.assertGreaterEqual(len(holidays), 2474) + self.assertIn("1970-01-01", holidays) + self.assertIn("2200-12-25", holidays) + + def test_holidays_df(self): + df = self.schedule.holidays_df + self.assertIsInstance(df, pd.DataFrame) + self.assertGreaterEqual(len(df), 2474) + self.assertListEqual( + df.columns.tolist(), + ["date", "holiday", "day_of_year", "year", "day_name"], + ) + + holidays = df["date"].dt.strftime("%Y-%m-%d").tolist() + self.assertIn("1970-01-01", holidays) + self.assertIn("2200-12-25", holidays) + + def test_upcoming_holidays_df(self): + self.assertEqual( + self.schedule.upcoming_holidays_df.to_dict("records"), + list(UPCOMING_HOLIDAYS), + ) + + def test_upcoming_holidays(self): + self.assertEqual( + self.schedule.upcoming_holidays, + [h["date"].strftime("%Y-%m-%d") for h in UPCOMING_HOLIDAYS], + ) + + def test_is_holiday(self): + self.assertFalse(self.schedule.is_holiday) + + def test_json_metadata(self): + self.assertEqual(self.schedule.json_metadata, SCHEDULE_METADATA) + + # DAY OF WEEK + + def test_current_weekday_name(self): + self.assertEqual(self.schedule.current_weekday_name, "Tuesday") + + def test_is_workday(self): + self.assertTrue(self.schedule.is_workday) + + # CURRENT OPERATIONAL STATUS + + def test_is_operational_day(self): + self.assertTrue(self.schedule.is_operational_day) + + def test_is_during_operational_hours(self): + self.assertTrue(self.schedule.is_during_operational_hours) + + def test_building_is_operational(self): + self.assertTrue(self.schedule.building_is_operational) + + def test_building_operational_mode(self): + self.assertEqual( + self.schedule.building_operational_mode, + schedule_tool.BuildingOperationalMode.ON, + ) + + +class BuildingScheduleToolTest(ScheduleToolTest): + + def setUp(self): + super().setUp() + self.env = env_conftest.create_environment( + start_timestamp=CURRENT_LOCAL_TIMESTAMP + ) + self.schedule = schedule_tool.BuildingScheduleTool(env=self.env) + self.expected_class = schedule_tool.BuildingScheduleTool + + +# +# SCENARIO TESTS +# + + +class ScheduleScenariosTest(parameterized.TestCase): + """Performs scenario testing for different operational modes.""" + + @parameterized.named_parameters(*SCHEDULE_SCENARIOS) + def test_building_operation_schedule( + self, + timestamp, + weekday_name, + is_workday, + is_holiday, + is_operational_day, + is_during_operational_hours, + is_operational, + operational_mode, + ): + env = env_conftest.create_environment(start_timestamp=timestamp) + schedule = schedule_tool.BuildingScheduleTool(env=env) + with self.subTest(name="current_date_and_time"): + self.assertEqual(schedule.current_local_timestamp, timestamp) + self.assertEqual(schedule.current_weekday_name, weekday_name) + self.assertEqual(schedule.is_workday, is_workday) + self.assertEqual( + schedule.is_during_operational_hours, is_during_operational_hours + ) + + with self.subTest(name="holiday_calendar"): + self.assertEqual(schedule.is_holiday, is_holiday) + + with self.subTest(name="operational_status"): + self.assertEqual(schedule.is_operational_day, is_operational_day) + self.assertEqual(schedule.building_is_operational, is_operational) + self.assertEqual( + schedule.building_operational_mode, operational_mode + ) + + +# +# CUSTOM HOLIDAY CALENDAR TESTS +# + + +class MyCustomHolidayCalendar(holiday.AbstractHolidayCalendar): + """Custom holiday calendar for testing.""" + + rules = [ + holiday.Holiday("Founder's Day", month=7, day=1), + holiday.Holiday("My Birthday", month=9, day=1), + ] + + +class CustomHolidayScheduleTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.mock_timestamp_now = self.enter_context( + mock.patch.object(pd.Timestamp, "now", autospec=True) + ) + self.custom_calendar = MyCustomHolidayCalendar() + + @parameterized.named_parameters( + dict( + testcase_name="founders_day", + timestamp="2024-07-01 10:00:00", + is_holiday=True, + ), + dict( + testcase_name="my_birthday", + timestamp="2024-09-01 10:00:00", + is_holiday=True, + ), + dict( + testcase_name="christmas_day", + timestamp="2024-12-25 10:00:00", + is_holiday=False, + ), + dict( + testcase_name="new_years_day", + timestamp="2025-01-01 10:00:00", + is_holiday=False, + ), + ) + def test_custom_holidays(self, timestamp, is_holiday): + self.mock_timestamp_now.return_value = pd.Timestamp( + timestamp, tz=TIME_ZONE + ) + schedule = schedule_tool.ScheduleTool( + time_zone=TIME_ZONE, + cal=self.custom_calendar, + ) + self.assertEqual(schedule.is_holiday, is_holiday) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/models/BUILD b/smart_control/models/BUILD deleted file mode 100644 index 578afd33..00000000 --- a/smart_control/models/BUILD +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Top-level BUILD for Smart Buildings Smart Control - -load("//devtools/python/blaze:pytype.bzl", "pytype_strict_library") - -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -licenses(["notice"]) - -pytype_strict_library( - name = "base_building", - srcs = ["base_building.py"], - deps = [ - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -pytype_strict_library( - name = "base_reward_function", - srcs = ["base_reward_function.py"], - deps = [ - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -pytype_strict_library( - name = "base_energy_cost", - srcs = ["base_energy_cost.py"], - deps = [ - "//third_party/py/absl/logging", - "//third_party/py/pandas", - ], -) - -pytype_strict_library( - name = "base_occupancy", - srcs = ["base_occupancy.py"], - deps = [ - "//third_party/py/pandas", - ], -) - -pytype_strict_library( - name = "base_normalizer", - srcs = ["base_normalizer.py"], - deps = [ - "//third_party/py/numpy", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/tf_agents/specs", - ], -) diff --git a/smart_control/models/__init__.py b/smart_control/models/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/models/base_building.py b/smart_control/models/base_building.py index 6e2e104d..a5b69bef 100644 --- a/smart_control/models/base_building.py +++ b/smart_control/models/base_building.py @@ -4,41 +4,54 @@ """ import abc -from typing import Sequence +from collections.abc import Sequence +import itertools +from typing import Any import pandas as pd +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 as reward_pb2 +from smart_buildings.smart_control.utils.proto_parsers import device_info_parser +from smart_buildings.smart_control.utils.proto_parsers import zone_info_parser -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 +SerializableData = dict[str, Any] -class BaseBuilding(metaclass=abc.ABCMeta): +class BaseBuilding(abc.ABC): """Base class for a controllable building for reinforcement learning.""" + def __init__(self, zones: Sequence[building_pb2.ZoneInfo] | None = None): + """Initializes the instance. + + Args: + zones: A list of thermal zones in the building. + """ + self._zones = list(zones) if zones else [] + @property @abc.abstractmethod - def reward_info(self) -> smart_control_reward_pb2.RewardInfo: - """Returns a message with data to compute the instantaneous reward.""" + def reward_info(self) -> reward_pb2.RewardInfo: + """A message containing data to compute the instantaneous reward.""" @abc.abstractmethod def request_observations( - self, observation_request: smart_control_building_pb2.ObservationRequest - ) -> smart_control_building_pb2.ObservationResponse: + self, observation_request: building_pb2.ObservationRequest + ) -> building_pb2.ObservationResponse: """Queries the building for its current state.""" @abc.abstractmethod def request_observations_within_time_interval( self, - observation_request: smart_control_building_pb2.ObservationRequest, + observation_request: building_pb2.ObservationRequest, start_timestamp: pd.Timestamp, end_timestamp: pd.Timestamp, - ) -> Sequence[smart_control_building_pb2.ObservationResponse]: + ) -> Sequence[building_pb2.ObservationResponse]: """Queries the building for observations between start and end times.""" @abc.abstractmethod def request_action( - self, action_request: smart_control_building_pb2.ActionRequest - ) -> smart_control_building_pb2.ActionResponse: + self, action_request: building_pb2.ActionRequest + ) -> building_pb2.ActionResponse: """Issues a command to the building to change one or more setpoints.""" @abc.abstractmethod @@ -51,18 +64,65 @@ def reset(self) -> None: @property @abc.abstractmethod - def devices(self) -> Sequence[smart_control_building_pb2.DeviceInfo]: - """Lists the devices that can be queried and/or controlled.""" + def devices(self) -> Sequence[building_pb2.DeviceInfo]: + """The devices that can be queried and/or controlled in the building.""" @property - @abc.abstractmethod - def zones(self) -> Sequence[smart_control_building_pb2.ZoneInfo]: - """Lists the zones in the building managed by the RL agent.""" + def devices_df(self) -> pd.DataFrame: + """A DataFrame listing the building's devices.""" + return pd.DataFrame( + device_info_parser.DeviceInfoParser(d).as_dict for d in self.devices + ) + + @property + def action_fields_df(self) -> pd.DataFrame: + """DataFrame containing the combined action fields of all building devices.""" + return pd.DataFrame( + r.as_dict + for r in itertools.chain.from_iterable( + device_info_parser.DeviceInfoParser(device).action_fields + for device in self.devices + ) + ) + + @property + def observable_fields_df(self) -> pd.DataFrame: + """DataFrame containing the combined observable fields of all building devices.""" + return pd.DataFrame( + r.as_dict + for r in itertools.chain.from_iterable( + device_info_parser.DeviceInfoParser(device).observable_fields + for device in self.devices + ) + ) + + @property + def fields_df(self) -> pd.DataFrame: + """DataFrame containing the combined fields of all building devices.""" + return pd.DataFrame( + r.as_dict + for r in itertools.chain.from_iterable( + device_info_parser.DeviceInfoParser(device).fields + for device in self.devices + ) + ) + + @property + def zones(self) -> Sequence[building_pb2.ZoneInfo]: + """Sequence of thermal zones in the building managed by the RL agent.""" + return self._zones + + @property + def zones_df(self) -> pd.DataFrame: + """A DataFrame listing the building's thermal zones.""" + return pd.DataFrame( + zone_info_parser.ZoneInfoParser(z).as_dict for z in self.zones + ) @property @abc.abstractmethod def current_timestamp(self) -> pd.Timestamp: - """Lists the current local time of the building.""" + """The current local timestamp of the building.""" @abc.abstractmethod def render(self, path: str) -> None: @@ -70,14 +130,24 @@ def render(self, path: str) -> None: @abc.abstractmethod def is_comfort_mode(self, current_time: pd.Timestamp) -> bool: - """Returns True if building is in comfort mode.""" + """Whether or not the building is in comfort mode at the given timestamp.""" @property @abc.abstractmethod def num_occupants(self) -> int: - """Returns the number of occupants in building.""" + """The number of occupants currently in the building.""" @property @abc.abstractmethod def time_step_sec(self) -> float: - """Returns the amount of time between time steps.""" + """The length of the time step, in seconds.""" + + @property + def json_metadata(self) -> SerializableData: + """A JSON-serializable dictionary of metadata about the building.""" + return { + 'n_devices': len(self.devices), + 'n_zones': len(self.zones), + 'device_ids': self.devices_df['device_id'].tolist(), + 'zone_ids': self.zones_df['zone_id'].tolist(), + } diff --git a/smart_control/models/base_building_test.py b/smart_control/models/base_building_test.py new file mode 100644 index 00000000..d5fde4ae --- /dev/null +++ b/smart_control/models/base_building_test.py @@ -0,0 +1,206 @@ +"""Tests for the base building.""" + +from typing import Sequence + +from absl.testing import absltest +import pandas as pd +from smart_buildings.smart_control.models import base_building +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 + + +class _MockBuilding(base_building.BaseBuilding): + # consider moving the environment_test_utils.SimpleBuilding class here + # and updating all references + def __init__(self, devices, zones): + super().__init__(zones=zones) + self._devices = devices + + @property + def reward_info(self) -> smart_control_reward_pb2.RewardInfo: + pass + + def request_observations(self, observation_request): + pass + + def request_observations_within_time_interval( + self, observation_request, start_timestamp, end_timestamp + ): + pass + + def request_action(self, action_request): + pass + + def wait_time(self): + pass + + def reset(self): + pass + + @property + def devices(self) -> Sequence[smart_control_building_pb2.DeviceInfo]: + return self._devices + + @property + def current_timestamp(self) -> pd.Timestamp: + pass + + def render(self, path: str) -> None: + pass + + def is_comfort_mode(self, current_time: pd.Timestamp) -> bool: + pass + + @property + def num_occupants(self) -> int: + pass + + @property + def time_step_sec(self) -> float: + pass + + +class BaseBuildingTest(absltest.TestCase): + + def test_devices_df(self): + device = smart_control_building_pb2.DeviceInfo( + device_id='d1', + namespace='ns1', + code='c1', + zone_id='z1', + device_type=smart_control_building_pb2.DeviceInfo.DeviceType.VAV, + observable_fields={ + 'obs1': ( + smart_control_building_pb2.DeviceInfo.ValueType.VALUE_CONTINUOUS + ) + }, + action_fields={ + 'act1': smart_control_building_pb2.DeviceInfo.ValueType.VALUE_BINARY + }, + ) + building = _MockBuilding(devices=[device], zones=[]) + + expected_records = [{ + 'device_id': 'd1', + 'namespace': 'ns1', + 'code': 'c1', + 'zone_id': 'z1', + 'device_type_id': 4, + 'device_type': 'VAV', + }] + + self.assertEqual(building.devices_df.to_dict('records'), expected_records) + + def test_device_fields_dfs(self): + device = smart_control_building_pb2.DeviceInfo( + device_id='d1', + namespace='ns1', + code='c1', + zone_id='z1', + device_type=smart_control_building_pb2.DeviceInfo.DeviceType.VAV, + observable_fields={ + 'obs1': ( + smart_control_building_pb2.DeviceInfo.ValueType.VALUE_CONTINUOUS + ) + }, + action_fields={ + 'act1': smart_control_building_pb2.DeviceInfo.ValueType.VALUE_BINARY + }, + ) + building = _MockBuilding(devices=[device], zones=[]) + + expected_observable_fields = [{ + 'device_id': 'd1', + 'field_name': 'obs1', + 'field_type_id': 1, + 'field_type': 'VALUE_CONTINUOUS', + }] + expected_action_fields = [{ + 'device_id': 'd1', + 'field_name': 'act1', + 'field_type_id': 4, + 'field_type': 'VALUE_BINARY', + }] + expected_fields = [ + { + 'device_id': 'd1', + 'field_name': 'act1', + 'field_type_id': 4, + 'field_type': 'VALUE_BINARY', + 'is_observable': False, + 'is_actionable': True, + }, + { + 'device_id': 'd1', + 'field_name': 'obs1', + 'field_type_id': 1, + 'field_type': 'VALUE_CONTINUOUS', + 'is_observable': True, + 'is_actionable': False, + }, + ] + + self.assertEqual( + building.observable_fields_df.to_dict('records'), + expected_observable_fields + ) + self.assertEqual( + building.action_fields_df.to_dict('records'), expected_action_fields + ) + self.assertEqual( + building.fields_df.to_dict('records'), expected_fields + ) + + def test_zones_df(self): + zone = smart_control_building_pb2.ZoneInfo( + zone_id='z1', + building_id='b1', + zone_description='desc1', + area=100.0, + devices=['d1', 'd2'], + zone_type=smart_control_building_pb2.ZoneInfo.ZoneType.ROOM, + floor=1, + ) + building = _MockBuilding(devices=[], zones=[zone]) + + expected_records = [{ + 'building_id': 'b1', + 'zone_id': 'z1', + 'zone_type_id': 1, + 'zone_type': 'ROOM', + 'description': 'desc1', + 'area': 100.0, + 'floor': 1, + 'device_ids': ['d1', 'd2'], + }] + + self.assertEqual(building.zones_df.to_dict('records'), expected_records) + + def test_zone_floor_mappings(self): + building = _MockBuilding( + devices=[], + zones=[ + smart_control_building_pb2.ZoneInfo(zone_id='z1', floor=5), + smart_control_building_pb2.ZoneInfo(zone_id='z2', floor=10), + ], + ) + self.assertEqual(building.zones_df['floor'].tolist(), [5, 10]) + + def test_json_metadata(self): + devices = [smart_control_building_pb2.DeviceInfo(device_id='device_1')] + zones = [ + smart_control_building_pb2.ZoneInfo(zone_id='zone_1'), + smart_control_building_pb2.ZoneInfo(zone_id='zone_2'), + ] + building = _MockBuilding(devices=devices, zones=zones) + expected_metadata = { + 'n_devices': 1, + 'n_zones': 2, + 'device_ids': ['device_1'], + 'zone_ids': ['zone_1', 'zone_2'], + } + self.assertEqual(building.json_metadata, expected_metadata) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/models/base_energy_cost.py b/smart_control/models/base_energy_cost.py index 960d8b12..0a6503c4 100644 --- a/smart_control/models/base_energy_cost.py +++ b/smart_control/models/base_energy_cost.py @@ -1,4 +1,4 @@ -"""Base class for energy cost and carbon, for use in reward function.""" +"""A base class for energy cost and carbon for use in reward function.""" import abc @@ -35,7 +35,7 @@ def cost( def carbon( self, start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float ) -> float: - """Returns the mass of carbon emitted from the energy consumption. + """Returns the mass of carbon emitted from the enegy consumption. The energy-to-carbon emission is source specific. Assuming a constant rate of energy consumption (W) of the time interval bounded by diff --git a/smart_control/models/base_normalizer.py b/smart_control/models/base_normalizer.py index 47bd7132..e21a28e6 100644 --- a/smart_control/models/base_normalizer.py +++ b/smart_control/models/base_normalizer.py @@ -5,7 +5,7 @@ import numpy as np from tf_agents import specs -from smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_building_pb2 class BaseObservationNormalizer(metaclass=abc.ABCMeta): diff --git a/smart_control/models/base_occupancy.py b/smart_control/models/base_occupancy.py index bb9b0b5a..0c7d875a 100644 --- a/smart_control/models/base_occupancy.py +++ b/smart_control/models/base_occupancy.py @@ -8,9 +8,12 @@ """ import abc +from typing import Any import pandas as pd +SerializableData = dict[str, Any] + class BaseOccupancy(metaclass=abc.ABCMeta): """Provides the RL agent information about how many people are in a zone.""" @@ -32,3 +35,8 @@ def average_zone_occupancy( average number of people in the zone for the interval. """ pass + + @property + def json_metadata(self) -> SerializableData: + """A JSON-serializable dictionary of metadata about the occupancy.""" + return {"type": self.__class__.__name__} diff --git a/smart_control/models/base_reward_function.py b/smart_control/models/base_reward_function.py index 48e6f8d2..304a5767 100644 --- a/smart_control/models/base_reward_function.py +++ b/smart_control/models/base_reward_function.py @@ -1,8 +1,9 @@ """Base class for smart buildings reward function.""" import abc +from typing import Any -from smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 class BaseRewardFunction(metaclass=abc.ABCMeta): @@ -13,3 +14,8 @@ def compute_reward( self, reward_info: smart_control_reward_pb2.RewardInfo ) -> smart_control_reward_pb2.RewardResponse: """Returns the real-valued reward for the current state of the building.""" + + @property + def json_metadata(self) -> dict[str, Any]: + """Info to write into a JSON file. Needs to be serializable.""" + return {"type": self.__class__.__name__,} diff --git a/smart_control/models/base_world_model.py b/smart_control/models/base_world_model.py new file mode 100644 index 00000000..239d993a --- /dev/null +++ b/smart_control/models/base_world_model.py @@ -0,0 +1,102 @@ +"""An abstract base class to be used by a model-based RL algorithm (MPPI).""" + +import abc +from typing import Any, List, Mapping, TypeAlias +import numpy as np +import tensorflow as tf +from tf_agents.environments import py_environment +from tf_agents.environments import tf_py_environment + +StateKey: TypeAlias = str +StateValue: TypeAlias = Any +StateType: TypeAlias = Mapping[StateKey, StateValue] +DiscreteActionMapping: TypeAlias = dict[int, list[float]] + + +class BaseWorldModel(abc.ABC): + """Abstract base class for a world model used by the MPPI planner.""" + + def __init__(self): + """Initializes the world model's parameters.""" + self.all_z_dim: int = 0 + self.all_z_max: List[float] = [] + self.all_z_min: List[float] = [] + self.continuous_action_normalizers: Mapping[str, Any] = {} + self.discrete_action_normalizers: Mapping[str, Any] = {} + self.k_dim: int = 0 + self.offset: List[int] = [] + self.par_size: List[int] = [] + self.z_max: List[float] = [] + self.z_min: List[float] = [] + + @abc.abstractmethod + def next( + self, action: tf.Tensor + ) -> tuple[tf.Tensor, tf.Tensor, tf.Tensor, tf.Tensor]: + """Predicts the next state, reward, and continuation probability. + + Args: + action: A tensor representing the action to take. + + Returns: + A tuple of: + s_pred_tensor: Predicted next state. + reward_tensor: Predicted reward. + continue_prob: Probability of continuing. + r2: An optional secondary reward tensor, which may be used for + specific environments or for intrinsic rewards. Current implementation + of MPPI does not use it. + """ + + @abc.abstractmethod + def get_state(self) -> StateType: + """Saves a snapshot of the internal state of the model's environment. + + This is used by the planner to save the state of the simulation environment + so that it can be restored later to explore different trajectories. + Basically, it is required to be able to reset the environment to the + pristine state. While reset might work for some environments, it is not + always possible to restore the environment to a previous state exactly. + Hence, we use this method to save a snapshot of the environment's state, + which might not be possible to achieve using the environment's reset() + method. + + Returns: + A dictionary representing the state of the environment. + """ + + @abc.abstractmethod + def set_state(self, state_dict: StateType): + """Restores the internal state of the model's environment. + + This is used by the planner to restore the state of the simulation + environment to a previously saved state. + + Args: + state_dict: A dictionary representing the state of the environment, as + returned by `get_state` + """ + pass + + @property + @abc.abstractmethod + def env(self) -> py_environment.PyEnvironment: + """Returns the underlying environment.""" + + @property + @abc.abstractmethod + def discrete_action_mapping(self) -> DiscreteActionMapping: + """Returns the mapping from discrete action index to supervisor commands.""" + + @discrete_action_mapping.setter + @abc.abstractmethod + def discrete_action_mapping(self, value: DiscreteActionMapping): + pass + + @abc.abstractmethod + def create_action_dict(self, k: int, z: np.ndarray) -> Mapping[str, Any]: + """Creates a dictionary of actions for the environment.""" + + @abc.abstractmethod + def synchronize(self, source_env: tf_py_environment.TFPyEnvironment): + """Synchronizes the planning environment with the acting environment.""" diff --git a/smart_control/notebooks/CQL_Demo.ipynb b/smart_control/notebooks/CQL_Demo.ipynb index ae9dd64a..b2b49e7b 100644 --- a/smart_control/notebooks/CQL_Demo.ipynb +++ b/smart_control/notebooks/CQL_Demo.ipynb @@ -85,28 +85,28 @@ "import reverb\n", "import mediapy as media\n", "from IPython.display import clear_output\n", - "from smart_control.environment import environment\n", - "from smart_control.proto import smart_control_building_pb2\n", - "from smart_control.proto import smart_control_normalization_pb2\n", - "from smart_control.reward import electricity_energy_cost\n", - "from smart_control.reward import natural_gas_energy_cost\n", - "from smart_control.reward import setpoint_energy_carbon_regret\n", - "from smart_control.reward import setpoint_energy_carbon_reward\n", - "from smart_control.simulator import randomized_arrival_departure_occupancy\n", - "from smart_control.simulator import rejection_simulator_building\n", - "from smart_control.simulator import simulator_building\n", - "from smart_control.simulator import step_function_occupancy\n", - "from smart_control.simulator import stochastic_convection_simulator\n", - "from smart_control.utils import bounded_action_normalizer\n", - "from smart_control.utils import building_renderer\n", - "from smart_control.utils import controller_reader\n", - "from smart_control.utils import controller_writer\n", - "from smart_control.utils import conversion_utils\n", - "from smart_control.utils import observation_normalizer\n", - "from smart_control.utils import reader_lib\n", - "from smart_control.utils import writer_lib\n", - "from smart_control.utils import histogram_reducer\n", - "from smart_control.utils import environment_utils\n", + "from smart_buildings.smart_control.environment import environment\n", + "from smart_buildings.smart_control.proto import smart_control_building_pb2\n", + "from smart_buildings.smart_control.proto import smart_control_normalization_pb2\n", + "from smart_buildings.smart_control.reward import electricity_energy_cost\n", + "from smart_buildings.smart_control.reward import natural_gas_energy_cost\n", + "from smart_buildings.smart_control.reward import setpoint_energy_carbon_regret\n", + "from smart_buildings.smart_control.reward import setpoint_energy_carbon_reward\n", + "from smart_buildings.smart_control.simulator import randomized_arrival_departure_occupancy\n", + "from smart_buildings.smart_control.simulator import rejection_simulator_building\n", + "from smart_buildings.smart_control.simulator import simulator_building\n", + "from smart_buildings.smart_control.simulator import step_function_occupancy\n", + "from smart_buildings.smart_control.simulator import stochastic_convection_simulator\n", + "from smart_buildings.smart_control.utils import bounded_action_normalizer\n", + "from smart_buildings.smart_control.utils import building_renderer\n", + "from smart_buildings.smart_control.utils import controller_reader\n", + "from smart_buildings.smart_control.utils import controller_writer\n", + "from smart_buildings.smart_control.utils import conversion_utils\n", + "from smart_buildings.smart_control.utils import observation_normalizer\n", + "from smart_buildings.smart_control.utils import reader_lib\n", + "from smart_buildings.smart_control.utils import writer_lib\n", + "from smart_buildings.smart_control.utils import histogram_reducer\n", + "from smart_buildings.smart_control.utils import environment_utils\n", "import tensorflow as tf\n", "from tf_agents.agents.cql.cql_sac_agent import CqlSacAgent\n", "from tf_agents.agents.sac import sac_agent\n", diff --git a/smart_control/notebooks/DDPG_Demo.ipynb b/smart_control/notebooks/DDPG_Demo.ipynb index 3c7a5eac..5ba5cada 100644 --- a/smart_control/notebooks/DDPG_Demo.ipynb +++ b/smart_control/notebooks/DDPG_Demo.ipynb @@ -70,28 +70,28 @@ "import mediapy as media\n", "from IPython.display import clear_output\n", "import sys\n", - "from smart_control.environment import environment\n", - "from smart_control.proto import smart_control_building_pb2\n", - "from smart_control.proto import smart_control_normalization_pb2\n", - "from smart_control.reward import electricity_energy_cost\n", - "from smart_control.reward import natural_gas_energy_cost\n", - "from smart_control.reward import setpoint_energy_carbon_regret\n", - "from smart_control.reward import setpoint_energy_carbon_reward\n", - "from smart_control.simulator import randomized_arrival_departure_occupancy\n", - "from smart_control.simulator import rejection_simulator_building\n", - "from smart_control.simulator import simulator_building\n", - "from smart_control.simulator import step_function_occupancy\n", - "from smart_control.simulator import stochastic_convection_simulator\n", - "from smart_control.utils import bounded_action_normalizer\n", - "from smart_control.utils import building_renderer\n", - "from smart_control.utils import controller_reader\n", - "from smart_control.utils import controller_writer\n", - "from smart_control.utils import conversion_utils\n", - "from smart_control.utils import observation_normalizer\n", - "from smart_control.utils import reader_lib\n", - "from smart_control.utils import writer_lib\n", - "from smart_control.utils import histogram_reducer\n", - "from smart_control.utils import environment_utils\n", + "from smart_buildings.smart_control.environment import environment\n", + "from smart_buildings.smart_control.proto import smart_control_building_pb2\n", + "from smart_buildings.smart_control.proto import smart_control_normalization_pb2\n", + "from smart_buildings.smart_control.reward import electricity_energy_cost\n", + "from smart_buildings.smart_control.reward import natural_gas_energy_cost\n", + "from smart_buildings.smart_control.reward import setpoint_energy_carbon_regret\n", + "from smart_buildings.smart_control.reward import setpoint_energy_carbon_reward\n", + "from smart_buildings.smart_control.simulator import randomized_arrival_departure_occupancy\n", + "from smart_buildings.smart_control.simulator import rejection_simulator_building\n", + "from smart_buildings.smart_control.simulator import simulator_building\n", + "from smart_buildings.smart_control.simulator import step_function_occupancy\n", + "from smart_buildings.smart_control.simulator import stochastic_convection_simulator\n", + "from smart_buildings.smart_control.utils import bounded_action_normalizer\n", + "from smart_buildings.smart_control.utils import building_renderer\n", + "from smart_buildings.smart_control.utils import controller_reader\n", + "from smart_buildings.smart_control.utils import controller_writer\n", + "from smart_buildings.smart_control.utils import conversion_utils\n", + "from smart_buildings.smart_control.utils import observation_normalizer\n", + "from smart_buildings.smart_control.utils import reader_lib\n", + "from smart_buildings.smart_control.utils import writer_lib\n", + "from smart_buildings.smart_control.utils import histogram_reducer\n", + "from smart_buildings.smart_control.utils import environment_utils\n", "import tensorflow as tf\n", "from tf_agents.agents.ddpg import ddpg_agent\n", "from tf_agents.drivers import py_driver\n", diff --git a/smart_control/notebooks/Map_Device_Locations.ipynb b/smart_control/notebooks/Map_Device_Locations.ipynb new file mode 100644 index 00000000..e28749f6 --- /dev/null +++ b/smart_control/notebooks/Map_Device_Locations.ipynb @@ -0,0 +1,183 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "last_runtime": { + "build_target": "//corp/ml/smart_buildings/smart_control/notebook:smart_buildings_control_colab_kernel", + "kind": "private" + } + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Map VAV Locations\n", + "\n", + "##Background\n", + "\n", + "The goal of the Smart Buildings Control project is to use Reinforcment Learning to control the HVAC systems of real Google Buildings. An important part of this process is to be able to easily oboard new buildings to our pipeline. This notebook provides an easy to use tool to label the locations of VAVs in a real building.\n", + "\n", + "## Why do we need this?\n", + "The locations of VAVs in a building is very important. Each VAV gives us a reading, but without knowing where these VAVs are located, they quickly become variables in a black box.\n", + "\n", + "To truly understand how our agents are performing, it is important that we have some tools to open this black box. A key such tool is visualization. If we can visualize what is going in a real building, we can contextualize how our agent is doing, and see how VAVs react based on their location relative to neighboring VAVs.\n", + "\n", + "Below is an example of what a visualization of a real building might look like, with different colors representing the different temperatures being read at each VAV:\n", + "\n", + "![example_of_building_visual.png](data:image/png;base64,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)\n", + "\n", + "In order to render this, we need to know where each VAV is located.\n", + "\n", + "##The Data\n", + "The information we are given about the VAV locations in the building will look something like this:\n", + "![Screenshot 2022-08-02 3.10.53 PM.png](data:image/png;base64,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)\n", + "\n", + "If we clean up the image a bit we can get a cleaner image like:\n", + "\n", + "![zones_1_cleaned_lucas.png](data:image/png;base64,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)\n", + "\n", + "The goal of this notebook is to ingest this cleaned image, and provide an easy UI for labeling which VAV (as found in the first image), goes with which connected component (of the second image)." + ], + "metadata": { + "id": "IvwIfHgAuJlr" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GTR_VwE5C9G9" + }, + "outputs": [], + "source": [ + "#@title Load and Display Floorplan Data\n", + "\n", + "import json\n", + "import numpy as np\n", + "from IPython import display\n", + "import os\n", + "\n", + "floor_plan_path = os.path.join(os.dirname(__file__), \"..\", \"..\", \"configs\", \"resources\", \"sb1\" \"double_resolution_zone_1_2.npy\") #@param {type:\"string\"}\n", + "\n", + "with open(floor_plan_path, \"rb\") as fp:\n", + " zone = np.load(fp)\n", + "zone[zone==2] = 0\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.cm as cm\n", + "plt.imshow(np.logical_not(zone), cmap=cm.gray)" + ] + }, + { + "cell_type": "code", + "source": [ + "#@title Get Connected Components via Depth First Search\n", + "\n", + "\n", + "marked = {}\n", + "list_of_zones = []\n", + "for i in range(zone.shape[0]):\n", + " for j in range(zone.shape[1]):\n", + " if (i,j) in marked:\n", + " continue\n", + " if zone[i][j] == 1:\n", + " continue\n", + "\n", + " queue = [(i,j)]\n", + " list_of_zone = []\n", + " while queue:\n", + " coords = queue.pop()\n", + " if coords in marked:\n", + " continue\n", + "\n", + " if coords[0] < 0 or coords[1] < 0 or coords[0] >= zone.shape[0] or coords[1] >= zone.shape[1]:\n", + " continue\n", + " if zone[coords[0]][coords[1]] == 1:\n", + " continue\n", + " queue.append((coords[0],coords[1]+1))\n", + " queue.append((coords[0]+1,coords[1]))\n", + " queue.append((coords[0],coords[1]-1))\n", + " queue.append((coords[0]-1,coords[1]))\n", + " marked[coords] = True\n", + " list_of_zone.append(coords)\n", + " list_of_zones.append(list_of_zone)\n", + "\n", + "\n" + ], + "metadata": { + "id": "xqf4pOnoDJUm", + "cellView": "form" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title Iterate over each component and ask for its VAV ID\n", + "\n", + "plt.figure(figsize=(10,10), dpi=100)\n", + "name_map = {}\n", + "for zone_number in range(len(list_of_zones)):\n", + " edited = zone.copy()\n", + " for i in list_of_zones[zone_number]:\n", + " edited[i[0]][i[1]] = 1\n", + " plt.imshow(np.logical_not(edited), cmap=cm.gray)\n", + " display.display(plt.gcf())\n", + " zone_name = input()\n", + " name_map[zone_name] = zone_number\n", + " display.clear_output(wait=True)\n", + "name_to_cv_list = {}\n", + "for k,v in name_map.items():\n", + " name_to_cv_list[k] = list_of_zones[v]" + ], + "metadata": { + "id": "E8WQaCwPEhtH", + "cellView": "form" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title Save and Download Files\n", + "\n", + "\n", + "with open('list_of_zones.json', 'w') as convert_file:\n", + " convert_file.write(json.dumps(list_of_zones))\n", + "\n", + "\n", + "with open('name_map.json', 'w') as convert_file:\n", + " convert_file.write(json.dumps(name_map))\n" + ], + "metadata": { + "id": "VBb7y64LEISr" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "with open('name_to_cv_list.json', 'w') as convert_file:\n", + " convert_file.write(json.dumps(name_to_cv_list))\n" + ], + "metadata": { + "id": "BoxU0cADyBbd" + }, + "execution_count": null, + "outputs": [] + } + ] +} diff --git a/smart_control/notebooks/SAC_Demo.ipynb b/smart_control/notebooks/SAC_Demo.ipynb index a93429f7..79921a20 100644 --- a/smart_control/notebooks/SAC_Demo.ipynb +++ b/smart_control/notebooks/SAC_Demo.ipynb @@ -85,28 +85,28 @@ "import reverb\n", "import mediapy as media\n", "from IPython.display import clear_output\n", - "from smart_control.environment import environment\n", - "from smart_control.proto import smart_control_building_pb2\n", - "from smart_control.proto import smart_control_normalization_pb2\n", - "from smart_control.reward import electricity_energy_cost\n", - "from smart_control.reward import natural_gas_energy_cost\n", - "from smart_control.reward import setpoint_energy_carbon_regret\n", - "from smart_control.reward import setpoint_energy_carbon_reward\n", - "from smart_control.simulator import randomized_arrival_departure_occupancy\n", - "from smart_control.simulator import rejection_simulator_building\n", - "from smart_control.simulator import simulator_building\n", - "from smart_control.simulator import step_function_occupancy\n", - "from smart_control.simulator import stochastic_convection_simulator\n", - "from smart_control.utils import bounded_action_normalizer\n", - "from smart_control.utils import building_renderer\n", - "from smart_control.utils import controller_reader\n", - "from smart_control.utils import controller_writer\n", - "from smart_control.utils import conversion_utils\n", - "from smart_control.utils import observation_normalizer\n", - "from smart_control.utils import reader_lib\n", - "from smart_control.utils import writer_lib\n", - "from smart_control.utils import histogram_reducer\n", - "from smart_control.utils import environment_utils\n", + "from smart_buildings.smart_control.environment import environment\n", + "from smart_buildings.smart_control.proto import smart_control_building_pb2\n", + "from smart_buildings.smart_control.proto import smart_control_normalization_pb2\n", + "from smart_buildings.smart_control.reward import electricity_energy_cost\n", + "from smart_buildings.smart_control.reward import natural_gas_energy_cost\n", + "from smart_buildings.smart_control.reward import setpoint_energy_carbon_regret\n", + "from smart_buildings.smart_control.reward import setpoint_energy_carbon_reward\n", + "from smart_buildings.smart_control.simulator import randomized_arrival_departure_occupancy\n", + "from smart_buildings.smart_control.simulator import rejection_simulator_building\n", + "from smart_buildings.smart_control.simulator import simulator_building\n", + "from smart_buildings.smart_control.simulator import step_function_occupancy\n", + "from smart_buildings.smart_control.simulator import stochastic_convection_simulator\n", + "from smart_buildings.smart_control.utils import bounded_action_normalizer\n", + "from smart_buildings.smart_control.utils import building_renderer\n", + "from smart_buildings.smart_control.utils import controller_reader\n", + "from smart_buildings.smart_control.utils import controller_writer\n", + "from smart_buildings.smart_control.utils import conversion_utils\n", + "from smart_buildings.smart_control.utils import observation_normalizer\n", + "from smart_buildings.smart_control.utils import reader_lib\n", + "from smart_buildings.smart_control.utils import writer_lib\n", + "from smart_buildings.smart_control.utils import histogram_reducer\n", + "from smart_buildings.smart_control.utils import environment_utils\n", "import tensorflow as tf\n", "from tf_agents.agents.sac import sac_agent\n", "from tf_agents.agents.sac import tanh_normal_projection_network\n", @@ -151,10 +151,10 @@ " logging.info(*args)\n", " print(*args)\n", "\n", - "data_path = \"third_party/py/smart_buildings/smart_control/configs/resources/sb1/\" #@param {type:\"string\"}\n", - "metrics_path = \"/usr/local/google/home/metrics\" #@param {type:\"string\"}\n", - "output_data_path = '/usr/local/google/home/smart_buildings/smart_control/sb_colab_demo' #@param {type:\"string\"}\n", - "root_dir = \"/usr/local/google/root\" #@param {type:\"string\"}\n", + "data_path = \"/home/gabriel-user/projects/sbsim-2/sbsim/smart_control/configs/resources/sb1/\" #@param {type:\"string\"}\n", + "metrics_path = \"/home/gabriel-user/projects/sbsim-2/sbsim/garbage/metrics\" #@param {type:\"string\"}\n", + "output_data_path = '/home/gabriel-user/projects/sbsim-2/sbsim/output_data_path' #@param {type:\"string\"}\n", + "root_dir = \"/home/gabriel-user/projects/sbsim-2/sbsim/garbage\" #@param {type:\"string\"}\n", "\n", "\n", "@gin.configurable\n", @@ -2090,7 +2090,8 @@ "\n", "tf_policy = agent.policy\n", "agent_policy = py_tf_eager_policy.PyTFEagerPolicy(\n", - " tf_policy, use_tf_function=True)\n" + " tf_policy, use_tf_function=True)\n", + "\n" ] }, { diff --git a/smart_control/notebooks/Simulator_Scenarios_Demo.ipynb b/smart_control/notebooks/Simulator_Scenarios_Demo.ipynb new file mode 100644 index 00000000..487e799e --- /dev/null +++ b/smart_control/notebooks/Simulator_Scenarios_Demo.ipynb @@ -0,0 +1,1009 @@ +{ + "cells": [ + { + "cell_type": "code", + "source": [ + "#@title Setup\n", + "\n", + "import os\n", + "import gin\n", + "import matplotlib.dates as mdates\n", + "import matplotlib.pyplot as plt\n", + "from IPython.display import display\n", + "\n", + "from smart_buildings.smart_control.environment import environment, hybrid_action_environment\n", + "from smart_buildings.smart_control.proto import smart_control_building_pb2\n", + "from smart_buildings.smart_control.proto import smart_control_reward_pb2\n", + "from smart_buildings.smart_control.reward import setpoint_energy_carbon_regret\n", + "from smart_buildings.smart_control.reward import electricity_energy_cost\n", + "from smart_buildings.smart_control.reward import natural_gas_energy_cost\n", + "from smart_buildings.smart_control.simulator import base_convection_simulator\n", + "from smart_buildings.smart_control.simulator import building\n", + "from smart_buildings.smart_control.simulator import hvac\n", + "from smart_buildings.smart_control.simulator import hvac_floorplan_based\n", + "from smart_buildings.smart_control.simulator import stochastic_convection_simulator\n", + "from smart_buildings.smart_control.simulator import tf_simulator\n", + "from smart_buildings.smart_control.simulator import randomized_arrival_departure_occupancy\n", + "from smart_buildings.smart_control.simulator import simulator_building\n", + "from smart_buildings.smart_control.utils import building_renderer\n", + "from smart_buildings.smart_control.utils import conversion_utils\n", + "from smart_buildings.smart_control.utils import real_building_temperature_array_generator as temp_array\n", + "from smart_buildings.smart_control.utils import environment_utils\n", + "from smart_buildings.smart_control.utils import observation_normalizer\n", + "\n", + "floor_plan_path = os.path.join(os.dirname(__file__), \"..\", \"..\", \"configs\", \"resources\", \"sb1\", \"double_resolution_zone_1_2.npy\") #@param {type:\"string\"}\n", + "\n", + "def plot_hvac_data_with_timestamps(data_tuples):\n", + " \"\"\"\n", + " Parses and plots HVAC data from tuples, including explicit timestamps.\n", + "\n", + " Args:\n", + " data_tuples: List of (temps, setpoints, outside_air, pd_timestamp)\n", + " temps: list of k floats\n", + " setpoints: list of [low, high]\n", + " outside_air: float scalar\n", + " pd_timestamp: pandas.Timestamp object\n", + " \"\"\"\n", + "\n", + " if not data_tuples:\n", + " print(\"No data to plot.\")\n", + " return\n", + "\n", + " # 1. Parse Data\n", + " # Initialize lists to hold the components\n", + " timestamps = []\n", + " oa_data = []\n", + " sp_low_data = []\n", + " sp_high_data = []\n", + "\n", + " # Check the consistency of 'k' (number of temperature sensors)\n", + " k = len(data_tuples[0][0]) if data_tuples else 0\n", + " if k == 0:\n", + " print(\"Temps list is empty in the first tuple.\")\n", + " return\n", + "\n", + " # Pre-allocate list of lists for the 'k' temp sensors\n", + " temp_traces = [[] for _ in range(k)]\n", + "\n", + " # Unpack the 4 elements from the tuple\n", + " for t_list, sp_list, oa_val, timestamp in data_tuples:\n", + " timestamps.append(timestamp)\n", + " oa_data.append(oa_val)\n", + " sp_low_data.append(sp_list[0])\n", + " sp_high_data.append(sp_list[1])\n", + "\n", + " # Distribute the k temps into their respective trace lists\n", + " for i in range(k):\n", + " temp_traces[i].append(t_list[i])\n", + "\n", + " # Convert timestamps list to datetime objects for matplotlib\n", + " mpl_timestamps = [ts.to_pydatetime() for ts in timestamps]\n", + "\n", + " fig, ax = plt.subplots(figsize=(12, 6))\n", + "\n", + " # Plot Setpoint Range (Green)\n", + " ax.fill_between(mpl_timestamps, sp_low_data, sp_high_data,\n", + " color='green', alpha=0.3, label='Setpoint Range')\n", + "\n", + " # Plot Outside Air (Blue)\n", + " ax.plot(mpl_timestamps, oa_data, color='blue', linewidth=2, label='Outside Air')\n", + "\n", + " # Plot Temps (Yellow)\n", + " for i, trace in enumerate(temp_traces):\n", + " label = 'Temps' if i == 0 else \"_nolegend_\" # Only label the first one\n", + " # Use a slightly transparent color if k is large\n", + " ax.plot(mpl_timestamps, trace, color='#FFD700', linewidth=1.5, alpha=0.7, label=label)\n", + "\n", + " ax.set_ylabel('Temperature (°C)')\n", + " ax.set_xlabel('Time')\n", + " ax.set_title(f'HVAC System Monitor ({k} Zone Sensors)')\n", + "\n", + " # Format X-axis to handle dates nicely\n", + " ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d\\n%H:%M'))\n", + " fig.autofmt_xdate()\n", + "\n", + " ax.grid(True, linestyle='--', alpha=0.6)\n", + " ax.legend(loc='upper left')\n", + "\n", + " plt.tight_layout()\n", + " plt.show()\n" + ], + "metadata": { + "id": "6cqXMPGYdjQE" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + " #@title Config\n", + "\n", + "def get_config(high_temp,low_temp):\n", + " gin_config_contents=f\"\"\"\n", + " ########a#######################################################\n", + " # Low occupancy, constant setpoint\n", + " ###############################################################\n", + "\n", + " ##########################\n", + " ### WEATHER CONTROLLER\n", + " ##########################\n", + "\n", + " # ORIGINAL:\n", + " convection_coefficient = 100.0\n", + " ambient_high_temp = {high_temp}#280#305 # K\n", + " ambient_low_temp = {low_temp}#280#305 # K\n", + "\n", + " sim/WeatherController:\n", + " default_low_temp = %ambient_low_temp\n", + " default_high_temp = %ambient_high_temp\n", + " convection_coefficient = %convection_coefficient\n", + "\n", + " weather_controller = @sim/WeatherController()\n", + "\n", + "\n", + "\n", + "\n", + " ##########################\n", + " ### BUILDING\n", + " ##########################\n", + "\n", + " initial_temp = 294.0\n", + " control_volume_cm = 10 #20\n", + " floor_height_cm = 300.0\n", + "\n", + " #floor_plan_filepath = \"/cns/oz-d/home/smart_buildings/control/floor_plan/floorplans_1_2.npy\"\n", + " #floor_plan_filepath = \"/cns/oz-d/home/smart_buildings/control/floor_plan/double_uniform_zone_1_2.npy\"\n", + " #floor_plan_filepath = \"/third_party/py/smart_buildings/smart_control/configs/resources/us_mtv_1055/double_resolution_zone_1_2.npy\"\n", + " floor_plan_filepath = \"{floor_plan_path}\"\n", + " zone_map_filepath = \"{floor_plan_path}\"\n", + "\n", + " exterior_cv_conductivity = 5.5 #0.05 # Biggest cause of divergence\n", + " exterior_cv_density = 1.0\n", + " exterior_cv_heat_capacity = 700.0\n", + "\n", + " interior_wall_cv_conductivity = 50.0\n", + " interior_wall_cv_density = 1.0\n", + " interior_wall_cv_heat_capacity = 700.0\n", + "\n", + " interior_cv_conductivity = 50.0\n", + " interior_cv_density = 0.1#1.0\n", + " interior_cv_heat_capacity = 700\n", + "\n", + " inside_air_properties/MaterialProperties:\n", + " conductivity = %interior_cv_conductivity\n", + " heat_capacity = %interior_cv_heat_capacity\n", + " density = %interior_cv_density\n", + "\n", + " inside_wall_properties/MaterialProperties:\n", + " conductivity = %interior_wall_cv_conductivity\n", + " heat_capacity = %interior_wall_cv_heat_capacity\n", + " density = %interior_wall_cv_density\n", + "\n", + " building_exterior_properties/MaterialProperties:\n", + " conductivity = %exterior_cv_conductivity\n", + " heat_capacity = %exterior_cv_heat_capacity\n", + " density = %exterior_cv_density\n", + "\n", + " sim/FloorPlanBasedBuilding:\n", + " cv_size_cm = %control_volume_cm\n", + " floor_height_cm = %floor_height_cm\n", + " initial_temp = %initial_temp\n", + " inside_air_properties = @inside_air_properties/MaterialProperties()\n", + " inside_wall_properties = @inside_wall_properties/MaterialProperties()\n", + " building_exterior_properties = @building_exterior_properties/MaterialProperties()\n", + " floor_plan_filepath = %floor_plan_filepath\n", + " zone_map_filepath = %zone_map_filepath\n", + " #save_debugging_images = False\n", + " #convection_simulator = @StochasticConvectionSimulator()\n", + "\n", + "\n", + " ##########################\n", + " ### SCHEDULE ...\n", + " ### https://source.corp.google.com/piper///depot/google3/corp/ml/smart_buildings/smart_control/configs/real_building/us_mtv_1055/base_config.gin;l=7?q=%23%20HVAC%20heating%2Fcooling%20schedule&ct=os&sq=package:piper%20file:%2F%2Fdepot%2Fgoogle3%20-file:google3%2Fexperimental\n", + " ##########################\n", + "\n", + " morning_start_hour = 6\n", + " evening_start_hour = 19\n", + " heating_setpoint_day = 294\n", + " cooling_setpoint_day = 297\n", + " heating_setpoint_night = 289\n", + " cooling_setpoint_night = 298\n", + " time_zone=\"US/Pacific\"\n", + "\n", + " hvac/SetpointSchedule:\n", + " morning_start_hour = %morning_start_hour\n", + " evening_start_hour = %evening_start_hour\n", + " comfort_temp_window = (%heating_setpoint_day, %cooling_setpoint_day)\n", + " eco_temp_window = (%heating_setpoint_night, %cooling_setpoint_night)\n", + " time_zone = %time_zone\n", + "\n", + "\n", + "\n", + " ##########################\n", + " ### HVAC\n", + " ##########################\n", + "\n", + " water_pump_differential_head = 6.0\n", + " water_pump_efficiency = 0.98\n", + " reheat_water_setpoint = 360.0\n", + " boiler_heating_rate = 0.5 # K / min\n", + " boiler_cooling_rate = 0.1 # K / min\n", + "\n", + " fan_static_pressure = 10000.0\n", + " fan_efficiency = 0.9\n", + "\n", + " air_handler_heating_setpoint = 285.0\n", + " air_handler_cooling_setpoint = 298.0\n", + " air_handler_recirculation_ratio = 0.3\n", + "\n", + " vav_max_air_flowrate = 2.0#0.035\n", + " vav_reheat_water_flowrate = 0.03\n", + "\n", + " # hvac/AirHandler:\n", + " # recirculation = %air_handler_recirculation_ratio\n", + " # heating_air_temp_setpoint = %air_handler_heating_setpoint\n", + " # cooling_air_temp_setpoint = %air_handler_cooling_setpoint\n", + " # fan_static_pressure = %fan_static_pressure\n", + " # fan_efficiency = %fan_efficiency\n", + " # max_air_flow_rate = 8.67\n", + " # sim_weather_controller = %weather_controller\n", + "\n", + " floor_1_rooms = [\n", + " 'zone_id_1', 'zone_id_2', 'zone_id_3', 'zone_id_4', 'zone_id_5', 'zone_id_6', 'zone_id_7', 'zone_id_8', 'zone_id_9', 'zone_id_10',\n", + " 'zone_id_11', 'zone_id_12', 'zone_id_13', 'zone_id_14', 'zone_id_15', 'zone_id_16', 'zone_id_17', 'zone_id_18', 'zone_id_19', 'zone_id_20',\n", + " 'zone_id_21', 'zone_id_22', 'zone_id_23', 'zone_id_24', 'zone_id_25', 'zone_id_26', 'zone_id_27', 'zone_id_28', 'zone_id_29', 'zone_id_30',\n", + " 'zone_id_31', 'zone_id_32', 'zone_id_33', 'zone_id_34', 'zone_id_35', 'zone_id_36', 'zone_id_37', 'zone_id_38', 'zone_id_39', 'zone_id_40',\n", + " 'zone_id_41', 'zone_id_42', 'zone_id_43', 'zone_id_44', 'zone_id_45', 'zone_id_46', 'zone_id_47', 'zone_id_48', 'zone_id_49', 'zone_id_50',\n", + " 'zone_id_51', 'zone_id_52', 'zone_id_53'\n", + " ]\n", + "\n", + " floor_2_rooms = [\n", + " 'zone_id_54', 'zone_id_55', 'zone_id_56', 'zone_id_57', 'zone_id_58', 'zone_id_59', 'zone_id_60', 'zone_id_61', 'zone_id_62', 'zone_id_63',\n", + " 'zone_id_64', 'zone_id_65', 'zone_id_66', 'zone_id_67', 'zone_id_68', 'zone_id_69', 'zone_id_70', 'zone_id_71', 'zone_id_72', 'zone_id_73',\n", + " 'zone_id_74', 'zone_id_75', 'zone_id_76', 'zone_id_77', 'zone_id_78', 'zone_id_79', 'zone_id_80', 'zone_id_81', 'zone_id_82', 'zone_id_83',\n", + " 'zone_id_84', 'zone_id_85', 'zone_id_86', 'zone_id_87', 'zone_id_88', 'zone_id_89', 'zone_id_90', 'zone_id_91', 'zone_id_92', 'zone_id_93',\n", + " 'zone_id_94', 'zone_id_95', 'zone_id_96', 'zone_id_97', 'zone_id_98', 'zone_id_99', 'zone_id_100', 'zone_id_101', 'zone_id_102', 'zone_id_103',\n", + " 'zone_id_104', 'zone_id_105', 'zone_id_106', 'zone_id_107', 'zone_id_108', 'zone_id_109', 'zone_id_110', 'zone_id_111', 'zone_id_112', 'zone_id_113',\n", + " 'zone_id_114', 'zone_id_115', 'zone_id_116', 'zone_id_117', 'zone_id_118', 'zone_id_119', 'zone_id_120', 'zone_id_121', 'zone_id_122', 'zone_id_123',\n", + " 'zone_id_124', 'zone_id_125', 'zone_id_126'\n", + " ]\n", + "\n", + " ahu_1/AirHandler:\n", + " recirculation = %air_handler_recirculation_ratio\n", + " heating_air_temp_setpoint = %air_handler_heating_setpoint\n", + " cooling_air_temp_setpoint = %air_handler_cooling_setpoint\n", + " fan_static_pressure = %fan_static_pressure\n", + " fan_efficiency = %fan_efficiency\n", + " max_air_flow_rate = 8.67\n", + " sim_weather_controller = %weather_controller\n", + " device_id = 'ahu_1'\n", + "\n", + " ahu_2/AirHandler:\n", + " recirculation = %air_handler_recirculation_ratio\n", + " heating_air_temp_setpoint = %air_handler_heating_setpoint\n", + " cooling_air_temp_setpoint = %air_handler_cooling_setpoint\n", + " fan_static_pressure = %fan_static_pressure\n", + " fan_efficiency = %fan_efficiency\n", + " max_air_flow_rate = 8.67\n", + " sim_weather_controller = %weather_controller\n", + " device_id = 'ahu_2'\n", + "\n", + " hvac/AirHandlerSystem:\n", + " ahus = {{\n", + " @ahu_1/AirHandler(): %floor_1_rooms,\n", + " @ahu_2/AirHandler(): %floor_2_rooms,\n", + " }}\n", + " device_id = 'ahu'\n", + "\n", + " hvac/WaterPump:\n", + " water_pump_differential_head = %water_pump_differential_head\n", + " water_pump_efficiency = %water_pump_efficiency\n", + "\n", + " hvac/Boiler:\n", + " reheat_water_setpoint = %reheat_water_setpoint\n", + " heating_rate = %boiler_heating_rate\n", + " cooling_rate = %boiler_cooling_rate\n", + "\n", + " hvac/HotWaterSystem:\n", + " pump = @hvac/WaterPump()\n", + " boiler = @hvac/Boiler()\n", + " device_id = 'hws'\n", + "\n", + "\n", + " sim/FloorPlanBasedHvac:\n", + " air_handler = @hvac/AirHandlerSystem()\n", + " hot_water_system = @hvac/HotWaterSystem()\n", + " schedule = @hvac/SetpointSchedule()\n", + " vav_max_air_flow_rate = %vav_max_air_flowrate\n", + " vav_reheat_max_water_flow_factor = %vav_reheat_water_flowrate\n", + "\n", + "\n", + " ##########################\n", + " ### SIMULATOR\n", + " ##########################\n", + " # shuffle parameters\n", + " StochasticConvectionSimulator.p = 1.0\n", + " StochasticConvectionSimulator.distance = -1\n", + " StochasticConvectionSimulator.seed = 5\n", + "\n", + " # Finite difference settings.\n", + " time_step_sec = 300\n", + " convergence_threshold = 0.01\n", + " iteration_limit = 100\n", + " iteration_warning = 20\n", + " start_timestamp = '2023-07-10 19:00' # '2021-04-01 00:00'\n", + "\n", + " sim/to_timestamp.date_str = %start_timestamp\n", + "\n", + " #sim_building/SimulatorFlexibleGeometries:\n", + " sim_building/TFSimulator:\n", + " building = @sim/FloorPlanBasedBuilding()\n", + " hvac = @sim/FloorPlanBasedHvac()\n", + " weather_controller = %weather_controller\n", + " time_step_sec = %time_step_sec\n", + " convergence_threshold = %convergence_threshold\n", + " iteration_limit = %iteration_limit\n", + " iteration_warning = %iteration_warning\n", + " start_timestamp = @sim/to_timestamp()\n", + "\n", + "\n", + " work_occupancy = 1\n", + " nonwork_occupancy = 0.1\n", + " # occupancy_start_time = '07:00:00'\n", + " # occupancy_end_time = '17:00:00'\n", + " occupancy_start/local_time.time_str = %occupancy_start_time\n", + " occupancy_end/local_time.time_str = %occupancy_end_time\n", + "\n", + "\n", + " randomized_occupancy/RandomizedArrivalDepartureOccupancy:\n", + " zone_assignment = %work_occupancy\n", + " earliest_expected_arrival_hour = 3\n", + " latest_expected_arrival_hour = 12\n", + " earliest_expected_departure_hour = 13\n", + " latest_expected_departure_hour = 23\n", + " time_step_sec = %time_step_sec\n", + "\n", + "\n", + " #SimulatorBuilding.simulator = @sim_building/SimulatorFlexibleGeometries()\n", + " SimulatorBuilding.simulator = @sim_building/TFSimulator()\n", + " # SimulatorBuilding.occupancy = @step_function_occupancy/StepFunctionOccupancy()\n", + " SimulatorBuilding.occupancy = @randomized_occupancy/RandomizedArrivalDepartureOccupancy()\n", + "\n", + "\n", + " ##########################\n", + " ### REWARDS\n", + " ##########################\n", + "\n", + " productivity_personhour_usd = 300.00\n", + "\n", + " productivity_midpoint_delta_temp = 1.5\n", + " decay_stiffness = 4.3\n", + "\n", + " electricity_weight = 1.0\n", + " carbon_weight = 1.0\n", + "\n", + " reward_normalizer_shift = 0.0\n", + " reward_normalizer_scale = 450.0\n", + "\n", + " max_productivity_personhour_usd = 300.00\n", + " min_productivity_personhour_usd = 100.00\n", + " productivity_midpoint_delta = 0.5\n", + " productivity_decay_stiffness = 4.3\n", + "\n", + " max_electricity_rate=160000\n", + " max_natural_gas_rate=400000\n", + "\n", + " productivity_weight=0.2\n", + " energy_cost_weight=0.4\n", + " carbon_emission_weight=0.4\n", + "\n", + " SetpointEnergyCarbonRegretFunction.max_productivity_personhour_usd = %max_productivity_personhour_usd\n", + " SetpointEnergyCarbonRegretFunction.min_productivity_personhour_usd = %min_productivity_personhour_usd\n", + " SetpointEnergyCarbonRegretFunction.max_electricity_rate = %max_electricity_rate\n", + " SetpointEnergyCarbonRegretFunction.max_natural_gas_rate = %max_natural_gas_rate\n", + " SetpointEnergyCarbonRegretFunction.productivity_decay_stiffness = %productivity_decay_stiffness\n", + " SetpointEnergyCarbonRegretFunction.productivity_midpoint_delta = %productivity_midpoint_delta\n", + " SetpointEnergyCarbonRegretFunction.electricity_energy_cost = @ElectricityEnergyCost()\n", + " SetpointEnergyCarbonRegretFunction.natural_gas_energy_cost = @NaturalGasEnergyCost()\n", + " SetpointEnergyCarbonRegretFunction.productivity_weight = %productivity_weight\n", + " SetpointEnergyCarbonRegretFunction.energy_cost_weight= %energy_cost_weight\n", + " SetpointEnergyCarbonRegretFunction.carbon_emission_weight = %carbon_emission_weight\n", + "\n", + "\n", + " ##########################\n", + " ### ACTIONS\n", + " ##########################\n", + "\n", + " # Action Normalization Parameters -> edited to match real building: https://source.corp.google.com/piper///depot/google3/corp/ml/smart_buildings/smart_control/configs/real_building/us_mtv_1055/base_config.gin;rcl=520286766;l=89\n", + " supply_water_bounded_action_normalizer/set_action_normalization_constants.min_normalized_value = -1.\n", + " supply_water_bounded_action_normalizer/set_action_normalization_constants.max_normalized_value = 1.0\n", + " supply_water_bounded_action_normalizer/set_action_normalization_constants.min_native_value = 310 #300.0\n", + " supply_water_bounded_action_normalizer/set_action_normalization_constants.max_native_value = 350.0\n", + "\n", + " supply_air_heating_temperature_setpoint/set_action_normalization_constants.min_normalized_value = -1.\n", + " supply_air_heating_temperature_setpoint/set_action_normalization_constants.max_normalized_value = 1.\n", + " supply_air_heating_temperature_setpoint/set_action_normalization_constants.min_native_value = 285 #275.0\n", + " supply_air_heating_temperature_setpoint/set_action_normalization_constants.max_native_value = 295.0\n", + "\n", + " supply_air_temperature_setpoint/set_action_normalization_constants.min_normalized_value = -1.\n", + " supply_air_temperature_setpoint/set_action_normalization_constants.max_normalized_value = 1.\n", + " supply_air_temperature_setpoint/set_action_normalization_constants.min_native_value = 285 #275.0\n", + " supply_air_temperature_setpoint/set_action_normalization_constants.max_native_value = 305.0\n", + "\n", + " differential_pressure_setpoint/set_action_normalization_constants.min_normalized_value = -1.\n", + " differential_pressure_setpoint/set_action_normalization_constants.max_normalized_value = 1.\n", + " differential_pressure_setpoint/set_action_normalization_constants.min_native_value = 0 #275.0\n", + " differential_pressure_setpoint/set_action_normalization_constants.max_native_value = 20.0\n", + "\n", + " static_pressure_setpoint/set_action_normalization_constants.min_normalized_value = -1.\n", + " static_pressure_setpoint/set_action_normalization_constants.max_normalized_value = 1.\n", + " static_pressure_setpoint/set_action_normalization_constants.min_native_value = 0 #275.0\n", + " static_pressure_setpoint/set_action_normalization_constants.max_native_value = 20000.0\n", + "\n", + " run_command/set_action_normalization_constants.min_normalized_value = -1.\n", + " run_command/set_action_normalization_constants.max_normalized_value = 1.\n", + " run_command/set_action_normalization_constants.min_native_value = 0.0\n", + " run_command/set_action_normalization_constants.max_native_value = 1.0\n", + "\n", + " action_normalizer_map = {{\n", + " 'supply_water_setpoint': @supply_water_bounded_action_normalizer/set_action_normalization_constants(),\n", + " 'differential_pressure': @differential_pressure_setpoint/set_action_normalization_constants(),\n", + " 'ahu_1_supply_air_temperature_setpoint': @supply_air_temperature_setpoint/set_action_normalization_constants(),\n", + " 'ahu_1_static_pressure_setpoint': @static_pressure_setpoint/set_action_normalization_constants(),\n", + " 'ahu_2_supply_air_temperature_setpoint': @supply_air_temperature_setpoint/set_action_normalization_constants(),\n", + " 'ahu_2_static_pressure_setpoint': @static_pressure_setpoint/set_action_normalization_constants(),\n", + " 'supervisor_run_command': @run_command/set_action_normalization_constants(),\n", + " 'ahu_1_supervisor_run_command': @run_command/set_action_normalization_constants(),\n", + " 'ahu_2_supervisor_run_command': @run_command/set_action_normalization_constants(),\n", + " }}\n", + " ActionConfig:\n", + " action_normalizers = %action_normalizer_map\n", + "\n", + " default_actions = {{\n", + " 'supply_water_setpoint': 340.0,\n", + " 'differential_pressure': 20.0,\n", + " 'ahu_1_supply_air_temperature_setpoint': 293.0,\n", + " 'ahu_1_static_pressure_setpoint': 20000.0,\n", + " 'ahu_2_supply_air_temperature_setpoint': 293.0,\n", + " 'ahu_2_static_pressure_setpoint': 20000.0,\n", + " 'supervisor_run_command': 1.0,\n", + " 'ahu_1_supervisor_run_command': 1.0,\n", + " 'ahu_2_supervisor_run_command': 1.0,\n", + "\n", + " }}\n", + "\n", + "\n", + " ##########################\n", + " ### OBSERVATIONS\n", + " ##########################\n", + "\n", + " temperature_observation_normalizer/set_observation_normalization_constants.field_id = 'temperature'\n", + " temperature_observation_normalizer/set_observation_normalization_constants.sample_mean = 310.0\n", + " temperature_observation_normalizer/set_observation_normalization_constants.sample_variance = 2500.0\n", + "\n", + " supply_water_setpoint_observation_normalizer/set_observation_normalization_constants.field_id = 'supply_water_setpoint'\n", + " supply_water_setpoint_observation_normalizer/set_observation_normalization_constants.sample_mean = 310.0\n", + " supply_water_setpoint_observation_normalizer/set_observation_normalization_constants.sample_variance = 2500.0\n", + "\n", + " air_flowrate_observation_normalizer/set_observation_normalization_constants.field_id = 'air_flowrate'\n", + " air_flowrate_observation_normalizer/set_observation_normalization_constants.sample_mean = 0.5\n", + " air_flowrate_observation_normalizer/set_observation_normalization_constants.sample_variance = 4.0\n", + "\n", + " differential_pressure_observation_normalizer/set_observation_normalization_constants.field_id = 'differential_pressure'\n", + " differential_pressure_observation_normalizer/set_observation_normalization_constants.sample_mean = 10000.0\n", + " differential_pressure_observation_normalizer/set_observation_normalization_constants.sample_variance = 100000.0\n", + "\n", + " percentage_observation_normalizer/set_observation_normalization_constants.field_id = 'percentage'\n", + " percentage_observation_normalizer/set_observation_normalization_constants.sample_mean = 0.50\n", + " percentage_observation_normalizer/set_observation_normalization_constants.sample_variance = 1.0\n", + "\n", + " request_count_observation_normalizer/set_observation_normalization_constants.field_id = 'request_count'\n", + " request_count_observation_normalizer/set_observation_normalization_constants.sample_mean = 100.0\n", + " request_count_observation_normalizer/set_observation_normalization_constants.sample_variance = 25.0\n", + "\n", + " # observation_normalizer_map = {{\n", + " # 'temperature' : @temperature_observation_normalizer/set_observation_normalization_constants(),\n", + " # 'supply_water_setpoint' : @supply_water_setpoint_observation_normalizer/set_observation_normalization_constants(),\n", + " # 'air_flowrate': @air_flowrate_observation_normalizer/set_observation_normalization_constants(),\n", + " # 'differential_pressure': @differential_pressure_observation_normalizer/set_observation_normalization_constants(),\n", + " # 'percentage': @percentage_observation_normalizer/set_observation_normalization_constants(),\n", + " # 'request_count': @request_count_observation_normalizer/set_observation_normalization_constants(),\n", + " # }}\n", + " # measurement 0 building_air_static_pressure_sensor\n", + " building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.field_id = 'building_air_static_pressure_sensor'\n", + " building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_mean = 3.779228\n", + " building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_variance = 14.599437\n", + "\n", + " # measurement 1 building_air_static_pressure_setpoint\n", + " building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'building_air_static_pressure_setpoint'\n", + " building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 7.472401\n", + " building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 0.000000\n", + "\n", + " # measurement 2 cooling_percentage_command\n", + " cooling_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'cooling_percentage_command'\n", + " cooling_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 9.658281\n", + " cooling_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 295.833612\n", + "\n", + " # measurement 3 differential_pressure_sensor\n", + " differential_pressure_sensor_normalizer/set_observation_normalization_constants.field_id = 'differential_pressure_sensor'\n", + " differential_pressure_sensor_normalizer/set_observation_normalization_constants.sample_mean = 31611.814379\n", + " differential_pressure_sensor_normalizer/set_observation_normalization_constants.sample_variance = 1844378631.487996\n", + "\n", + " # measurement 4 differential_pressure_setpoint\n", + " differential_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'differential_pressure_setpoint'\n", + " differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 83810.269540\n", + " differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 14889040.603647\n", + "\n", + " # measurement 5 discharge_air_temperature_sensor\n", + " discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'discharge_air_temperature_sensor'\n", + " discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 69.889025\n", + " discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 541.455462\n", + "\n", + " # measurement 6 discharge_air_temperature_setpoint\n", + " discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'discharge_air_temperature_setpoint'\n", + " discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 57.665244\n", + " discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 97.254479\n", + "\n", + " # measurement 7 exhaust_air_damper_percentage_command\n", + " exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'exhaust_air_damper_percentage_command'\n", + " exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 25.000000\n", + " exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 0.000000\n", + "\n", + " # measurement 8 exhaust_air_damper_percentage_sensor\n", + " exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants.field_id = 'exhaust_air_damper_percentage_sensor'\n", + " exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants.sample_mean = 10.680755\n", + " exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants.sample_variance = 539.207818\n", + "\n", + " # measurement 9 exhaust_fan_speed_frequency_sensor\n", + " exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.field_id = 'exhaust_fan_speed_frequency_sensor'\n", + " exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_mean = 4.273057\n", + " exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_variance = 138.559759\n", + "\n", + " # measurement 10 exhaust_fan_speed_percentage_command\n", + " exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'exhaust_fan_speed_percentage_command'\n", + " exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 7.121761\n", + " exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 384.888218\n", + "\n", + " # measurement 11 heating_water_valve_percentage_command\n", + " heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'heating_water_valve_percentage_command'\n", + " heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 3.105189\n", + " heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 202.006249\n", + "\n", + " # measurement 12 mixed_air_temperature_sensor\n", + " mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'mixed_air_temperature_sensor'\n", + " mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 293.718710\n", + " mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 12.517696\n", + "\n", + " # measurement 13 mixed_air_temperature_setpoint\n", + " mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'mixed_air_temperature_setpoint'\n", + " mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 288.218302\n", + " mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 3.186768\n", + "\n", + " # measurement 14 outside_air_damper_percentage_command\n", + " outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'outside_air_damper_percentage_command'\n", + " outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 34.504101\n", + " outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 2053.149002\n", + "\n", + " # measurement 15 outside_air_dewpoint_temperature_sensor\n", + " outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_dewpoint_temperature_sensor'\n", + " outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 285.774428\n", + " outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 2.504610\n", + "\n", + " # measurement 16 outside_air_flowrate_sensor\n", + " outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_flowrate_sensor'\n", + " outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_mean = 3.701930\n", + " outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_variance = 20.300565\n", + "\n", + " # measurement 17 outside_air_flowrate_setpoint\n", + " outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.field_id = 'outside_air_flowrate_setpoint'\n", + " outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 8.730134\n", + " outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 0.240364\n", + "\n", + " # measurement 18 outside_air_relative_humidity_sensor\n", + " outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_relative_humidity_sensor'\n", + " outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants.sample_mean = 71.799372\n", + " outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants.sample_variance = 172.388773\n", + "\n", + " # measurement 19 outside_air_specificenthalpy_sensor\n", + " outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_specificenthalpy_sensor'\n", + " outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants.sample_mean = 60711.656343\n", + " outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants.sample_variance = 25491060.173822\n", + "\n", + " # measurement 20 outside_air_temperature_sensor\n", + " outside_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_temperature_sensor'\n", + " outside_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 291.244931\n", + " outside_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 12.904175\n", + "\n", + " # measurement 21 outside_air_wetbulb_temperature_sensor\n", + " outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'outside_air_wetbulb_temperature_sensor'\n", + " outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 287.709943\n", + " outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 3.594260\n", + "\n", + " # measurement 22 program_differential_pressure_setpoint\n", + " program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_differential_pressure_setpoint'\n", + " program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 83808.578375\n", + " program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 14897544.664858\n", + "\n", + " # measurement 23 program_supply_air_static_pressure_setpoint\n", + " program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_supply_air_static_pressure_setpoint'\n", + " program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 163.396282\n", + " program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 1092.073231\n", + "\n", + " # measurement 24 program_supply_air_temperature_setpoint\n", + " program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_supply_air_temperature_setpoint'\n", + " program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 289.490004\n", + " program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 2.854515\n", + "\n", + " # measurement 25 program_supply_water_temperature_setpoint\n", + " program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'program_supply_water_temperature_setpoint'\n", + " program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 341.467705\n", + " program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 74.961483\n", + "\n", + " # measurement 26 return_air_temperature_sensor\n", + " return_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'return_air_temperature_sensor'\n", + " return_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 295.602164\n", + " return_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 11.309930\n", + "\n", + " # measurement 27 return_water_temperature_sensor\n", + " return_water_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'return_water_temperature_sensor'\n", + " return_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 326.219913\n", + " return_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 497.847788\n", + "\n", + " # measurement 28 run_status\n", + " run_status_normalizer/set_observation_normalization_constants.field_id = 'run_status'\n", + " run_status_normalizer/set_observation_normalization_constants.sample_mean = -0.638340\n", + " run_status_normalizer/set_observation_normalization_constants.sample_variance = 0.592523\n", + "\n", + " # measurement 29 speed_frequency_sensor\n", + " speed_frequency_sensor_normalizer/set_observation_normalization_constants.field_id = 'speed_frequency_sensor'\n", + " speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_mean = 7.003487\n", + " speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_variance = 227.751249\n", + "\n", + " # measurement 30 speed_percentage_command\n", + " speed_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'speed_percentage_command'\n", + " speed_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 11.330966\n", + " speed_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 602.718159\n", + "\n", + " # measurement 31 supervisor_supply_air_static_pressure_setpoint\n", + " supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supervisor_supply_air_static_pressure_setpoint'\n", + " supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 179.409052\n", + " supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 352.049768\n", + "\n", + " # measurement 32 supervisor_supply_air_temperature_setpoint\n", + " supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supervisor_supply_air_temperature_setpoint'\n", + " supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 290.2\n", + " supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 9.66245\n", + "\n", + " # measurement 33 supervisor_supply_water_temperature_setpoint\n", + " supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supervisor_supply_water_temperature_setpoint'\n", + " supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 332.164444\n", + " supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 1.534112\n", + "\n", + " # measurement 34 supply_air_damper_percentage_command\n", + " supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'supply_air_damper_percentage_command'\n", + " supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 51.173986\n", + " supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 1059.265742\n", + "\n", + " # measurement 35 supply_air_flowrate_sensor\n", + " supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_air_flowrate_sensor'\n", + " supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_mean = 177.520026\n", + " supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants.sample_variance = 50499.153481\n", + "\n", + " # measurement 36 supply_air_flowrate_setpoint\n", + " supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_air_flowrate_setpoint'\n", + " supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 209.557558\n", + " supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 47308.757207\n", + "\n", + " # measurement 37 supply_air_static_pressure_sensor\n", + " supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_air_static_pressure_sensor'\n", + " supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_mean = 128.527912\n", + " supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants.sample_variance = 6679.599175\n", + "\n", + " # measurement 38 supply_air_static_pressure_setpoint\n", + " supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_air_static_pressure_setpoint'\n", + " supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 181.307432\n", + " supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 361.757966\n", + "\n", + " # measurement 39 supply_air_temperature_sensor\n", + " supply_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_air_temperature_sensor'\n", + " supply_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 289.737939\n", + " supply_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 6.265837\n", + "\n", + " # measurement 40 supply_air_temperature_setpoint\n", + " supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_air_temperature_setpoint'\n", + " supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 289.329414\n", + " supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 3.186769\n", + "\n", + " # measurement 41 supply_fan_run_status\n", + " supply_fan_run_status_normalizer/set_observation_normalization_constants.field_id = 'supply_fan_run_status'\n", + " supply_fan_run_status_normalizer/set_observation_normalization_constants.sample_mean = 0.439849\n", + " supply_fan_run_status_normalizer/set_observation_normalization_constants.sample_variance = 0.806533\n", + "\n", + " # measurement 42 supply_fan_speed_frequency_sensor\n", + " supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_fan_speed_frequency_sensor'\n", + " supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_mean = 15.926249\n", + " supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants.sample_variance = 207.034194\n", + "\n", + " # measurement 43 supply_fan_speed_percentage_command\n", + " supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.field_id = 'supply_fan_speed_percentage_command'\n", + " supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_mean = 26.543748\n", + " supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants.sample_variance = 575.094979\n", + "\n", + " # measurement 44 supply_water_temperature_sensor\n", + " supply_water_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'supply_water_temperature_sensor'\n", + " supply_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 321.520315\n", + " supply_water_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 658.413066\n", + "\n", + " # measurement 45 supply_water_temperature_setpoint\n", + " supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'supply_water_temperature_setpoint'\n", + " supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 320.261985\n", + " supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 240.195517\n", + "\n", + " # measurement 46 zone_air_co2_concentration_sensor\n", + " zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants.field_id = 'zone_air_co2_concentration_sensor'\n", + " zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants.sample_mean = 432.092062\n", + " zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants.sample_variance = 962.903840\n", + "\n", + " # measurement 47 zone_air_co2_concentration_setpoint\n", + " zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants.field_id = 'zone_air_co2_concentration_setpoint'\n", + " zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 739.337708\n", + " zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 3618.117781\n", + "\n", + " # measurement 48 zone_air_cooling_temperature_setpoint\n", + " zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'zone_air_cooling_temperature_setpoint'\n", + " zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 82.084227\n", + " zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 402.158853\n", + "\n", + " # measurement 49 zone_air_heating_temperature_setpoint\n", + " zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants.field_id = 'zone_air_heating_temperature_setpoint'\n", + " zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_mean = 64.231868\n", + " zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants.sample_variance = 24.461668\n", + "\n", + " # measurement 50 zone_air_temperature_sensor\n", + " zone_air_temperature_sensor_normalizer/set_observation_normalization_constants.field_id = 'zone_air_temperature_sensor'\n", + " zone_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_mean = 190\n", + " zone_air_temperature_sensor_normalizer/set_observation_normalization_constants.sample_variance = 408.113303\n", + "\n", + " supervisor_run_command_normalizer/set_observation_normalization_constants.field_id = 'supervisor_run_command'\n", + " supervisor_run_command_normalizer/set_observation_normalization_constants.sample_mean = 0\n", + " supervisor_run_command_normalizer/set_observation_normalization_constants.sample_variance = 1.0\n", + "\n", + " observation_normalizer_map = {{\n", + " 'building_air_static_pressure_sensor' : @building_air_static_pressure_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'building_air_static_pressure_setpoint' : @building_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'cooling_percentage_command' : @cooling_percentage_command_normalizer/set_observation_normalization_constants(),\n", + " 'differential_pressure_sensor' : @differential_pressure_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'differential_pressure_setpoint' : @differential_pressure_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'discharge_air_temperature_sensor' : @discharge_air_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'discharge_air_temperature_setpoint' : @discharge_air_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'exhaust_air_damper_percentage_command' : @exhaust_air_damper_percentage_command_normalizer/set_observation_normalization_constants(),\n", + " 'exhaust_air_damper_percentage_sensor' : @exhaust_air_damper_percentage_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'exhaust_fan_speed_frequency_sensor' : @exhaust_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'exhaust_fan_speed_percentage_command' : @exhaust_fan_speed_percentage_command_normalizer/set_observation_normalization_constants(),\n", + " 'heating_water_valve_percentage_command' : @heating_water_valve_percentage_command_normalizer/set_observation_normalization_constants(),\n", + " 'mixed_air_temperature_sensor' : @mixed_air_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'mixed_air_temperature_setpoint' : @mixed_air_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'outside_air_damper_percentage_command' : @outside_air_damper_percentage_command_normalizer/set_observation_normalization_constants(),\n", + " 'outside_air_dewpoint_temperature_sensor' : @outside_air_dewpoint_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'outside_air_flowrate_sensor' : @outside_air_flowrate_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'outside_air_flowrate_setpoint' : @outside_air_flowrate_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'outside_air_relative_humidity_sensor' : @outside_air_relative_humidity_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'outside_air_specificenthalpy_sensor' : @outside_air_specificenthalpy_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'outside_air_temperature_sensor' : @outside_air_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'outside_air_wetbulb_temperature_sensor' : @outside_air_wetbulb_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'program_differential_pressure_setpoint' : @program_differential_pressure_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'program_supply_air_static_pressure_setpoint' : @program_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'program_supply_air_temperature_setpoint' : @program_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'program_supply_water_temperature_setpoint' : @program_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'return_air_temperature_sensor' : @return_air_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'return_water_temperature_sensor' : @return_water_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'run_status' : @run_status_normalizer/set_observation_normalization_constants(),\n", + " 'speed_frequency_sensor' : @speed_frequency_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'speed_percentage_command' : @speed_percentage_command_normalizer/set_observation_normalization_constants(),\n", + " 'supervisor_supply_air_static_pressure_setpoint' : @supervisor_supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'supervisor_supply_air_temperature_setpoint' : @supervisor_supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'supervisor_supply_water_temperature_setpoint' : @supervisor_supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'supply_air_damper_percentage_command' : @supply_air_damper_percentage_command_normalizer/set_observation_normalization_constants(),\n", + " 'supply_air_flowrate_sensor' : @supply_air_flowrate_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'supply_air_flowrate_setpoint' : @supply_air_flowrate_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'supply_air_static_pressure_sensor' : @supply_air_static_pressure_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'supply_air_static_pressure_setpoint' : @supply_air_static_pressure_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'supply_air_temperature_sensor' : @supply_air_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'supply_air_temperature_setpoint' : @supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'supply_air_cooling_temperature_setpoint' : @supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'supply_air_heating_temperature_setpoint' : @supply_air_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + "\n", + " 'supply_fan_run_status' : @supply_fan_run_status_normalizer/set_observation_normalization_constants(),\n", + " 'supply_fan_speed_frequency_sensor' : @supply_fan_speed_frequency_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'supply_fan_speed_percentage_command' : @supply_fan_speed_percentage_command_normalizer/set_observation_normalization_constants(),\n", + " 'supply_water_temperature_sensor' : @supply_water_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'supply_water_setpoint' : @supply_water_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'zone_air_co2_concentration_sensor' : @zone_air_co2_concentration_sensor_normalizer/set_observation_normalization_constants(),\n", + " 'zone_air_co2_concentration_setpoint' : @zone_air_co2_concentration_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'zone_air_cooling_temperature_setpoint' : @zone_air_cooling_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'zone_air_heating_temperature_setpoint' : @zone_air_heating_temperature_setpoint_normalizer/set_observation_normalization_constants(),\n", + " 'zone_air_temperature_sensor' : @zone_air_temperature_sensor_normalizer/set_observation_normalization_constants(),\n", + "\n", + " 'cooling_request_count': @request_count_observation_normalizer/set_observation_normalization_constants(),\n", + " }}\n", + "\n", + "\n", + "\n", + " StandardScoreObservationNormalizer:\n", + " normalization_constants = %observation_normalizer_map\n", + "\n", + "\n", + "\n", + " ##########################\n", + " ### ENVIRONMENT\n", + " ##########################\n", + "\n", + "\n", + " # metrics_path = '/cns/oz-d/home/smart-buildings-control-team/smart-buildings/geometric_simulation_collects'\n", + " discount_factor = 0.9\n", + "\n", + " num_days_in_episode=21\n", + " metrics_reporting_interval=10\n", + " label='2_cv_flr_1_outlined_floorplan_based_simulation_no_HVAC'\n", + " num_hod_features = 12\n", + " num_dow_features = 12\n", + "\n", + " Environment.building = @SimulatorBuilding()\n", + " Environment.reward_function = @SetpointEnergyCarbonRegretFunction()\n", + " Environment.observation_normalizer = @StandardScoreObservationNormalizer()\n", + " Environment.action_config = @ActionConfig()\n", + " Environment.metrics_reporting_interval = %metrics_reporting_interval\n", + "\n", + " Environment.discount_factor = %discount_factor\n", + " Environment.label = %label\n", + " Environment.num_days_in_episode= %num_days_in_episode\n", + " Environment.default_actions = %default_actions\n", + " Environment.num_hod_features = %num_hod_features\n", + " Environment.num_dow_features = %num_dow_features\n", + "\n", + "\n", + " HybridActionEnvironment.building = @SimulatorBuilding()\n", + " HybridActionEnvironment.reward_function = @SetpointEnergyCarbonRegretFunction()\n", + " HybridActionEnvironment.observation_normalizer = @StandardScoreObservationNormalizer()\n", + " HybridActionEnvironment.action_config = @ActionConfig()\n", + " HybridActionEnvironment.metrics_reporting_interval = %metrics_reporting_interval\n", + "\n", + " HybridActionEnvironment.discount_factor = %discount_factor\n", + " HybridActionEnvironment.label = %label\n", + " HybridActionEnvironment.num_days_in_episode= %num_days_in_episode\n", + " HybridActionEnvironment.default_actions = %default_actions\n", + " HybridActionEnvironment.num_hod_features = %num_hod_features\n", + " HybridActionEnvironment.num_dow_features = %num_dow_features\n", + " HybridActionEnvironment.device_action_tuples = [\n", + " # --- AHU SYSTEM ACTIONS ---\n", + " ('ahu', 'ahu_1_supervisor_run_command'),\n", + " ('ahu', 'ahu_2_supervisor_run_command'),\n", + " ('ahu', 'ahu_1_supply_air_temperature_setpoint'),\n", + " ('ahu', 'ahu_1_static_pressure_setpoint'),\n", + " ('ahu', 'ahu_2_supply_air_temperature_setpoint'),\n", + " ('ahu', 'ahu_2_static_pressure_setpoint'),\n", + "\n", + " # --- HOT WATER SYSTEM ACTIONS ---\n", + " ('hws', 'supervisor_run_command'),\n", + " ('hws', 'supply_water_setpoint'),\n", + " ('hws', 'differential_pressure'),\n", + " ]\n", + " \"\"\"\n", + " return gin_config_contents" + ], + "metadata": { + "cellView": "form", + "id": "T9OEBogedunl" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# @title Simulation Settings\n", + "\n", + "# @markdown ### Viewing Ranges\n", + "vmin = 292 # @param {type:\"integer\"}\n", + "vmax = 296 # @param {type:\"integer\"}\n", + "\n", + "# @markdown ---\n", + "# @markdown ### Outside Air Temperature\n", + "high_temp = 305 # @param {type:\"number\"}\n", + "low_temp = 305 # @param {type:\"number\"}\n", + "\n", + "# @markdown ---\n", + "# @markdown ### HVAC State (Normalized Actions)\n", + "\n", + "# @markdown **AHU 1**\n", + "ahu_1_run_command = 0 # @param [0, 1] {type:\"raw\"}\n", + "ahu_1_supply_air_temperature_setpoint = -1 # @param {type:\"slider\", min:-1, max:1, step:0.1}\n", + "ahu_1_static_pressure_setpoint = -1 # @param {type:\"slider\", min:-1, max:1, step:0.1}\n", + "\n", + "# @markdown **AHU 2**\n", + "ahu_2_run_command = 1 # @param [0, 1] {type:\"raw\"}\n", + "ahu_2_supply_air_temperature_setpoint = -1 # @param {type:\"slider\", min:-1, max:1, step:0.1}\n", + "ahu_2_static_pressure_setpoint = 1 # @param {type:\"slider\", min:-1, max:1, step:0.1}\n", + "\n", + "# @markdown **Hot Water System**\n", + "hws_run_command = 0 # @param [0, 1] {type:\"raw\"}\n", + "supply_water_setpoint = 1.0 # @param {type:\"slider\", min:-1, max:1, step:0.1}\n", + "differential_pressure = -1 # @param {type:\"slider\", min:-1, max:1, step:0.1}\n", + "\n", + "GIN_CONFIG_PATH = \"demo_config.gin\"\n", + "with open(GIN_CONFIG_PATH, \"w\") as text_file:\n", + " text_file.write(get_config(high_temp,low_temp))\n", + "gin.parse_config_file(GIN_CONFIG_PATH)\n", + "\n", + "env = hybrid_action_environment.HybridActionEnvironment()\n", + "env.reset()\n", + "building_layout = env.building.simulator.building.floor_plan\n", + "renderer = building_renderer.BuildingRenderer(building_layout, 1)\n", + "def render_env(env):\n", + " temps = env.building.simulator.building.temp\n", + " image = renderer.render(temps, cmap='bwr',vmin=vmin,vmax=vmax).convert('RGB')\n", + " return image\n", + "\n", + "info_to_log = []\n", + "for i in range(200):\n", + "\n", + " action = {\n", + " 'discrete_action' : [ahu_1_run_command,ahu_2_run_command,hws_run_command], # ah1, ah2, hws\n", + " 'continuous_action' : [ahu_1_supply_air_temperature_setpoint,ahu_1_static_pressure_setpoint,ahu_2_supply_air_temperature_setpoint,\n", + " ahu_2_static_pressure_setpoint,supply_water_setpoint,differential_pressure],\n", + " }\n", + " reward = env.step(action) # take random action to step env\n", + " timestamp = env.building.current_timestamp\n", + " display(render_env(env))\n", + "\n", + " outside_air = env.building.simulator._hvac.air_handler._ahus[0].outside_air_temperature_sensor\n", + " print(f'outside_air: {outside_air}')\n", + "\n", + " vavs = env.building.simulator._hvac._vavs.items()\n", + " temps=[]\n", + " dampers = []\n", + " flow_rates=[]\n", + " for v in vavs:\n", + " temps.append(v[1].zone_air_temperature)\n", + " dampers.append(v[1].damper_setting)\n", + " flow_rates.append(v[1].flow_rate_demand)\n", + " temp_window = v[1].thermostat.get_setpoint_schedule().get_temperature_window(timestamp)\n", + " print(\"average temps:\",sum(temps)/len(temps))\n", + " print(\"average damper setting:\",sum(dampers)/len(dampers))\n", + " print(\"average vav flowrate:\",sum(flow_rates)/len(flow_rates))\n", + " info_to_log.append((temps[:13] + temps[13+1:],temp_window,outside_air,timestamp))\n", + " plot_hvac_data_with_timestamps(info_to_log)\n" + ], + "metadata": { + "cellView": "form", + "id": "mKSvjtRCe5A7" + }, + "execution_count": null, + "outputs": [] + } + ], + "metadata": { + "colab": { + "provenance": [ + { + "file_id": "/v2/notebooks/welcome.ipynb", + "timestamp": 1764316549631 + } + ], + "last_runtime": { + "build_target": "//corp/ml/smart_buildings/smart_control/notebook:smart_buildings_control_colab_kernel", + "kind": "private" + } + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/smart_control/notebooks/TD3_Demo.ipynb b/smart_control/notebooks/TD3_Demo.ipynb index c13053d2..5bbb22ee 100644 --- a/smart_control/notebooks/TD3_Demo.ipynb +++ b/smart_control/notebooks/TD3_Demo.ipynb @@ -83,28 +83,28 @@ "import reverb\n", "import mediapy as media\n", "from IPython.display import clear_output\n", - "from smart_control.environment import environment\n", - "from smart_control.proto import smart_control_building_pb2\n", - "from smart_control.proto import smart_control_normalization_pb2\n", - "from smart_control.reward import electricity_energy_cost\n", - "from smart_control.reward import natural_gas_energy_cost\n", - "from smart_control.reward import setpoint_energy_carbon_regret\n", - "from smart_control.reward import setpoint_energy_carbon_reward\n", - "from smart_control.simulator import randomized_arrival_departure_occupancy\n", - "from smart_control.simulator import rejection_simulator_building\n", - "from smart_control.simulator import simulator_building\n", - "from smart_control.simulator import step_function_occupancy\n", - "from smart_control.simulator import stochastic_convection_simulator\n", - "from smart_control.utils import bounded_action_normalizer\n", - "from smart_control.utils import building_renderer\n", - "from smart_control.utils import controller_reader\n", - "from smart_control.utils import controller_writer\n", - "from smart_control.utils import conversion_utils\n", - "from smart_control.utils import observation_normalizer\n", - "from smart_control.utils import reader_lib\n", - "from smart_control.utils import writer_lib\n", - "from smart_control.utils import histogram_reducer\n", - "from smart_control.utils import environment_utils\n", + "from smart_buildings.smart_control.environment import environment\n", + "from smart_buildings.smart_control.proto import smart_control_building_pb2\n", + "from smart_buildings.smart_control.proto import smart_control_normalization_pb2\n", + "from smart_buildings.smart_control.reward import electricity_energy_cost\n", + "from smart_buildings.smart_control.reward import natural_gas_energy_cost\n", + "from smart_buildings.smart_control.reward import setpoint_energy_carbon_regret\n", + "from smart_buildings.smart_control.reward import setpoint_energy_carbon_reward\n", + "from smart_buildings.smart_control.simulator import randomized_arrival_departure_occupancy\n", + "from smart_buildings.smart_control.simulator import rejection_simulator_building\n", + "from smart_buildings.smart_control.simulator import simulator_building\n", + "from smart_buildings.smart_control.simulator import step_function_occupancy\n", + "from smart_buildings.smart_control.simulator import stochastic_convection_simulator\n", + "from smart_buildings.smart_control.utils import bounded_action_normalizer\n", + "from smart_buildings.smart_control.utils import building_renderer\n", + "from smart_buildings.smart_control.utils import controller_reader\n", + "from smart_buildings.smart_control.utils import controller_writer\n", + "from smart_buildings.smart_control.utils import conversion_utils\n", + "from smart_buildings.smart_control.utils import observation_normalizer\n", + "from smart_buildings.smart_control.utils import reader_lib\n", + "from smart_buildings.smart_control.utils import writer_lib\n", + "from smart_buildings.smart_control.utils import histogram_reducer\n", + "from smart_buildings.smart_control.utils import environment_utils\n", "import tensorflow as tf\n", "from tf_agents.agents.td3 import td3_agent # TD3 import\n", "from tf_agents.agents.ddpg import critic_network\n", diff --git a/smart_control/proto/BUILD b/smart_control/proto/BUILD deleted file mode 100644 index c30a05c5..00000000 --- a/smart_control/proto/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Top-level BUILD for Smart Buildings Smart Control - -load("//third_party/bazel_rules/rules_python/python:proto.bzl", "py_proto_library") -load("//third_party/protobuf/bazel:proto_library.bzl", "proto_library") - -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -licenses(["notice"]) - -proto_library( - name = "smart_control_reward_proto", - srcs = ["smart_control_reward.proto"], - deps = ["//google/protobuf:timestamp"], -) - -py_proto_library( - name = "smart_control_reward_py_pb2", - visibility = [ - "//corp/ml/smart_buildings/smart_control:packages", - "//third_party/py/smart_buildings/smart_control/environment:__pkg__", - "//third_party/py/smart_buildings/smart_control/models:__pkg__", - "//third_party/py/smart_buildings/smart_control/reward:__pkg__", - "//third_party/py/smart_buildings/smart_control/simulator:__pkg__", - "//third_party/py/smart_buildings/smart_control/utils:__pkg__", - ], - deps = [":smart_control_reward_proto"], -) - -proto_library( - name = "smart_control_building_proto", - srcs = ["smart_control_building.proto"], - deps = ["//google/protobuf:timestamp"], -) - -py_proto_library( - name = "smart_control_building_py_pb2", - visibility = [ - "//corp/ml/smart_buildings/smart_control:packages", - "//third_party/py/smart_buildings/smart_control/environment:__pkg__", - "//third_party/py/smart_buildings/smart_control/models:__pkg__", - "//third_party/py/smart_buildings/smart_control/simulator:__pkg__", - "//third_party/py/smart_buildings/smart_control/utils:__pkg__", - ], - deps = [":smart_control_building_proto"], -) - -proto_library( - name = "smart_control_normalization_proto", - srcs = ["smart_control_normalization.proto"], - deps = ["//google/protobuf:timestamp"], -) - -py_proto_library( - name = "smart_control_normalization_py_pb2", - deps = [":smart_control_normalization_proto"], -) diff --git a/smart_control/proto/__init__.py b/smart_control/proto/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/proto/smart_control_building.proto b/smart_control/proto/smart_control_building.proto index 0f160891..7b7aa2a6 100644 --- a/smart_control/proto/smart_control_building.proto +++ b/smart_control/proto/smart_control_building.proto @@ -79,6 +79,7 @@ message DeviceInfo { GAS = 21; AC = 22; OTHER = 23; + ASHP = 24; } enum ValueType { diff --git a/smart_control/proto/smart_control_building_pb2.py b/smart_control/proto/smart_control_building_pb2.py deleted file mode 100644 index 10a1b84f..00000000 --- a/smart_control/proto/smart_control_building_pb2.py +++ /dev/null @@ -1,1114 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: smart_control_building.proto - -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='smart_control_building.proto', - package='smart_buildings.smart_control.proto', - syntax='proto3', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x1csmart_control_building.proto\x12#smart_buildings.smart_control.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xfe\x01\n\x08ZoneInfo\x12\x0f\n\x07zone_id\x18\x01 \x01(\t\x12\x13\n\x0b\x62uilding_id\x18\x02 \x01(\t\x12\x18\n\x10zone_description\x18\x03 \x01(\t\x12\x0c\n\x04\x61rea\x18\x04 \x01(\x02\x12\x0f\n\x07\x64\x65vices\x18\x05 \x03(\t\x12I\n\tzone_type\x18\x06 \x01(\x0e\x32\x36.smart_buildings.smart_control.proto.ZoneInfo.ZoneType\x12\r\n\x05\x66loor\x18\x07 \x01(\x05\"9\n\x08ZoneType\x12\r\n\tUNDEFINED\x10\x00\x12\x08\n\x04ROOM\x10\x01\x12\t\n\x05\x46LOOR\x10\x02\x12\t\n\x05OTHER\x10\n\"\xa5\x07\n\nDeviceInfo\x12\x11\n\tdevice_id\x18\x01 \x01(\t\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x0c\n\x04\x63ode\x18\x03 \x01(\t\x12\x0f\n\x07zone_id\x18\x04 \x01(\t\x12O\n\x0b\x64\x65vice_type\x18\x05 \x01(\x0e\x32:.smart_buildings.smart_control.proto.DeviceInfo.DeviceType\x12`\n\x11observable_fields\x18\x06 \x03(\x0b\x32\x45.smart_buildings.smart_control.proto.DeviceInfo.ObservableFieldsEntry\x12X\n\raction_fields\x18\x07 \x03(\x0b\x32\x41.smart_buildings.smart_control.proto.DeviceInfo.ActionFieldsEntry\x1ar\n\x15ObservableFieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0e\x32\x39.smart_buildings.smart_control.proto.DeviceInfo.ValueType:\x02\x38\x01\x1an\n\x11\x41\x63tionFieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0e\x32\x39.smart_buildings.smart_control.proto.DeviceInfo.ValueType:\x02\x38\x01\"\xe7\x01\n\nDeviceType\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03\x46\x41N\x10\x01\x12\x07\n\x03PMP\x10\x02\x12\x07\n\x03\x46\x43U\x10\x03\x12\x07\n\x03VAV\x10\x04\x12\x06\n\x02\x44H\x10\x05\x12\x07\n\x03\x41HU\x10\x06\x12\x07\n\x03\x42LR\x10\x07\x12\x08\n\x04\x43\x44WS\x10\x08\x12\x06\n\x02\x43H\x10\t\x12\x08\n\x04\x43HWS\x10\n\x12\x06\n\x02\x43T\x10\x0b\x12\x06\n\x02\x44\x43\x10\x0c\x12\x07\n\x03\x44\x46R\x10\r\x12\x07\n\x03\x44MP\x10\x0e\x12\x07\n\x03HWS\x10\x0f\x12\x06\n\x02HX\x10\x10\x12\x07\n\x03MAU\x10\x11\x12\x07\n\x03SDC\x10\x12\x12\x06\n\x02UH\x10\x13\x12\x07\n\x03PWR\x10\x14\x12\x07\n\x03GAS\x10\x15\x12\x06\n\x02\x41\x43\x10\x16\x12\t\n\x05OTHER\x10\x17\"w\n\tValueType\x12\x18\n\x14VALUE_TYPE_UNDEFINED\x10\x00\x12\x14\n\x10VALUE_CONTINUOUS\x10\x01\x12\x11\n\rVALUE_INTEGER\x10\x02\x12\x15\n\x11VALUE_CATEGORICAL\x10\x03\x12\x10\n\x0cVALUE_BINARY\x10\x04\"G\n\x18SingleObservationRequest\x12\x11\n\tdevice_id\x18\x01 \x01(\t\x12\x18\n\x10measurement_name\x18\x02 \x01(\t\"\xdf\x02\n\x19SingleObservationResponse\x12-\n\ttimestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x61\n\x1asingle_observation_request\x18\x02 \x01(\x0b\x32=.smart_buildings.smart_control.proto.SingleObservationRequest\x12\x19\n\x11observation_valid\x18\x03 \x01(\x08\x12\x1a\n\x10\x63ontinuous_value\x18\x04 \x01(\x02H\x00\x12\x17\n\rinteger_value\x18\x05 \x01(\x05H\x00\x12\x1b\n\x11\x63\x61tegorical_value\x18\x06 \x01(\tH\x00\x12\x16\n\x0c\x62inary_value\x18\x07 \x01(\x08H\x00\x12\x16\n\x0cstring_value\x18\x08 \x01(\tH\x00\x42\x13\n\x11observation_value\"\xa7\x01\n\x12ObservationRequest\x12-\n\ttimestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x62\n\x1bsingle_observation_requests\x18\x02 \x03(\x0b\x32=.smart_buildings.smart_control.proto.SingleObservationRequest\"\xf4\x01\n\x13ObservationResponse\x12-\n\ttimestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12H\n\x07request\x18\x02 \x01(\x0b\x32\x37.smart_buildings.smart_control.proto.ObservationRequest\x12\x64\n\x1csingle_observation_responses\x18\x03 \x03(\x0b\x32>.smart_buildings.smart_control.proto.SingleObservationResponse\"\xd3\x01\n\x13SingleActionRequest\x12\x11\n\tdevice_id\x18\x01 \x01(\t\x12\x15\n\rsetpoint_name\x18\x02 \x01(\t\x12\x1a\n\x10\x63ontinuous_value\x18\x03 \x01(\x02H\x00\x12\x17\n\rinteger_value\x18\x04 \x01(\x05H\x00\x12\x1b\n\x11\x63\x61tegorical_value\x18\x05 \x01(\tH\x00\x12\x16\n\x0c\x62inary_value\x18\x06 \x01(\x08H\x00\x12\x16\n\x0cstring_value\x18\x07 \x01(\tH\x00\x42\x10\n\x0esetpoint_value\"\xdd\x03\n\x14SingleActionResponse\x12I\n\x07request\x18\x01 \x01(\x0b\x32\x38.smart_buildings.smart_control.proto.SingleActionRequest\x12\x63\n\rresponse_type\x18\x02 \x01(\x0e\x32L.smart_buildings.smart_control.proto.SingleActionResponse.ActionResponseType\x12\x17\n\x0f\x61\x64\x64itional_info\x18\x03 \x01(\t\"\xfb\x01\n\x12\x41\x63tionResponseType\x12\r\n\tUNDEFINED\x10\x00\x12\x0c\n\x08\x41\x43\x43\x45PTED\x10\x01\x12\x0b\n\x07PENDING\x10\x02\x12\r\n\tTIMED_OUT\x10\x03\x12\x1c\n\x18REJECTED_INVALID_SETTING\x10\x04\x12%\n!REJECTED_NOT_ENABLED_OR_AVAILABLE\x10\x05\x12\x15\n\x11REJECTED_OVERRIDE\x10\x06\x12\x1b\n\x17REJECTED_INVALID_DEVICE\x10\x07\x12\x1b\n\x17REJECTED_DEVICE_OFFLINE\x10\x08\x12\x0b\n\x07UNKNOWN\x10\t\x12\t\n\x05OTHER\x10\n\"\x98\x01\n\rActionRequest\x12-\n\ttimestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12X\n\x16single_action_requests\x18\x02 \x03(\x0b\x32\x38.smart_buildings.smart_control.proto.SingleActionRequest\"\xe0\x01\n\x0e\x41\x63tionResponse\x12-\n\ttimestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x43\n\x07request\x18\x02 \x01(\x0b\x32\x32.smart_buildings.smart_control.proto.ActionRequest\x12Z\n\x17single_action_responses\x18\x03 \x03(\x0b\x32\x39.smart_buildings.smart_control.proto.SingleActionResponseb\x06proto3' - , - dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) - - - -_ZONEINFO_ZONETYPE = _descriptor.EnumDescriptor( - name='ZoneType', - full_name='smart_buildings.smart_control.proto.ZoneInfo.ZoneType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='UNDEFINED', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='ROOM', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='FLOOR', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='OTHER', index=3, number=10, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=300, - serialized_end=357, -) -_sym_db.RegisterEnumDescriptor(_ZONEINFO_ZONETYPE) - -_DEVICEINFO_DEVICETYPE = _descriptor.EnumDescriptor( - name='DeviceType', - full_name='smart_buildings.smart_control.proto.DeviceInfo.DeviceType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='UNDEFINED', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='FAN', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='PMP', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='FCU', index=3, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='VAV', index=4, number=4, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='DH', index=5, number=5, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='AHU', index=6, number=6, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='BLR', index=7, number=7, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='CDWS', index=8, number=8, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='CH', index=9, number=9, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='CHWS', index=10, number=10, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='CT', index=11, number=11, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='DC', index=12, number=12, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='DFR', index=13, number=13, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='DMP', index=14, number=14, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='HWS', index=15, number=15, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='HX', index=16, number=16, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='MAU', index=17, number=17, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='SDC', index=18, number=18, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='UH', index=19, number=19, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='PWR', index=20, number=20, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='GAS', index=21, number=21, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='AC', index=22, number=22, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='OTHER', index=23, number=23, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=941, - serialized_end=1172, -) -_sym_db.RegisterEnumDescriptor(_DEVICEINFO_DEVICETYPE) - -_DEVICEINFO_VALUETYPE = _descriptor.EnumDescriptor( - name='ValueType', - full_name='smart_buildings.smart_control.proto.DeviceInfo.ValueType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='VALUE_TYPE_UNDEFINED', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='VALUE_CONTINUOUS', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='VALUE_INTEGER', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='VALUE_CATEGORICAL', index=3, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='VALUE_BINARY', index=4, number=4, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=1174, - serialized_end=1293, -) -_sym_db.RegisterEnumDescriptor(_DEVICEINFO_VALUETYPE) - -_SINGLEACTIONRESPONSE_ACTIONRESPONSETYPE = _descriptor.EnumDescriptor( - name='ActionResponseType', - full_name='smart_buildings.smart_control.proto.SingleActionResponse.ActionResponseType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='UNDEFINED', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='ACCEPTED', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='PENDING', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TIMED_OUT', index=3, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='REJECTED_INVALID_SETTING', index=4, number=4, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='REJECTED_NOT_ENABLED_OR_AVAILABLE', index=5, number=5, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='REJECTED_OVERRIDE', index=6, number=6, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='REJECTED_INVALID_DEVICE', index=7, number=7, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='REJECTED_DEVICE_OFFLINE', index=8, number=8, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='UNKNOWN', index=9, number=9, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='OTHER', index=10, number=10, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=2580, - serialized_end=2831, -) -_sym_db.RegisterEnumDescriptor(_SINGLEACTIONRESPONSE_ACTIONRESPONSETYPE) - - -_ZONEINFO = _descriptor.Descriptor( - name='ZoneInfo', - full_name='smart_buildings.smart_control.proto.ZoneInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='zone_id', full_name='smart_buildings.smart_control.proto.ZoneInfo.zone_id', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='building_id', full_name='smart_buildings.smart_control.proto.ZoneInfo.building_id', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='zone_description', full_name='smart_buildings.smart_control.proto.ZoneInfo.zone_description', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='area', full_name='smart_buildings.smart_control.proto.ZoneInfo.area', index=3, - number=4, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='devices', full_name='smart_buildings.smart_control.proto.ZoneInfo.devices', index=4, - number=5, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='zone_type', full_name='smart_buildings.smart_control.proto.ZoneInfo.zone_type', index=5, - number=6, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='floor', full_name='smart_buildings.smart_control.proto.ZoneInfo.floor', index=6, - number=7, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _ZONEINFO_ZONETYPE, - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=103, - serialized_end=357, -) - - -_DEVICEINFO_OBSERVABLEFIELDSENTRY = _descriptor.Descriptor( - name='ObservableFieldsEntry', - full_name='smart_buildings.smart_control.proto.DeviceInfo.ObservableFieldsEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='smart_buildings.smart_control.proto.DeviceInfo.ObservableFieldsEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='smart_buildings.smart_control.proto.DeviceInfo.ObservableFieldsEntry.value', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=712, - serialized_end=826, -) - -_DEVICEINFO_ACTIONFIELDSENTRY = _descriptor.Descriptor( - name='ActionFieldsEntry', - full_name='smart_buildings.smart_control.proto.DeviceInfo.ActionFieldsEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='smart_buildings.smart_control.proto.DeviceInfo.ActionFieldsEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='smart_buildings.smart_control.proto.DeviceInfo.ActionFieldsEntry.value', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=828, - serialized_end=938, -) - -_DEVICEINFO = _descriptor.Descriptor( - name='DeviceInfo', - full_name='smart_buildings.smart_control.proto.DeviceInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='device_id', full_name='smart_buildings.smart_control.proto.DeviceInfo.device_id', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='namespace', full_name='smart_buildings.smart_control.proto.DeviceInfo.namespace', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='code', full_name='smart_buildings.smart_control.proto.DeviceInfo.code', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='zone_id', full_name='smart_buildings.smart_control.proto.DeviceInfo.zone_id', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='device_type', full_name='smart_buildings.smart_control.proto.DeviceInfo.device_type', index=4, - number=5, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='observable_fields', full_name='smart_buildings.smart_control.proto.DeviceInfo.observable_fields', index=5, - number=6, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='action_fields', full_name='smart_buildings.smart_control.proto.DeviceInfo.action_fields', index=6, - number=7, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_DEVICEINFO_OBSERVABLEFIELDSENTRY, _DEVICEINFO_ACTIONFIELDSENTRY, ], - enum_types=[ - _DEVICEINFO_DEVICETYPE, - _DEVICEINFO_VALUETYPE, - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=360, - serialized_end=1293, -) - - -_SINGLEOBSERVATIONREQUEST = _descriptor.Descriptor( - name='SingleObservationRequest', - full_name='smart_buildings.smart_control.proto.SingleObservationRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='device_id', full_name='smart_buildings.smart_control.proto.SingleObservationRequest.device_id', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='measurement_name', full_name='smart_buildings.smart_control.proto.SingleObservationRequest.measurement_name', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1295, - serialized_end=1366, -) - - -_SINGLEOBSERVATIONRESPONSE = _descriptor.Descriptor( - name='SingleObservationResponse', - full_name='smart_buildings.smart_control.proto.SingleObservationResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='timestamp', full_name='smart_buildings.smart_control.proto.SingleObservationResponse.timestamp', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='single_observation_request', full_name='smart_buildings.smart_control.proto.SingleObservationResponse.single_observation_request', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='observation_valid', full_name='smart_buildings.smart_control.proto.SingleObservationResponse.observation_valid', index=2, - number=3, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='continuous_value', full_name='smart_buildings.smart_control.proto.SingleObservationResponse.continuous_value', index=3, - number=4, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='integer_value', full_name='smart_buildings.smart_control.proto.SingleObservationResponse.integer_value', index=4, - number=5, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='categorical_value', full_name='smart_buildings.smart_control.proto.SingleObservationResponse.categorical_value', index=5, - number=6, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='binary_value', full_name='smart_buildings.smart_control.proto.SingleObservationResponse.binary_value', index=6, - number=7, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='string_value', full_name='smart_buildings.smart_control.proto.SingleObservationResponse.string_value', index=7, - number=8, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='observation_value', full_name='smart_buildings.smart_control.proto.SingleObservationResponse.observation_value', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=1369, - serialized_end=1720, -) - - -_OBSERVATIONREQUEST = _descriptor.Descriptor( - name='ObservationRequest', - full_name='smart_buildings.smart_control.proto.ObservationRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='timestamp', full_name='smart_buildings.smart_control.proto.ObservationRequest.timestamp', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='single_observation_requests', full_name='smart_buildings.smart_control.proto.ObservationRequest.single_observation_requests', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1723, - serialized_end=1890, -) - - -_OBSERVATIONRESPONSE = _descriptor.Descriptor( - name='ObservationResponse', - full_name='smart_buildings.smart_control.proto.ObservationResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='timestamp', full_name='smart_buildings.smart_control.proto.ObservationResponse.timestamp', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='request', full_name='smart_buildings.smart_control.proto.ObservationResponse.request', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='single_observation_responses', full_name='smart_buildings.smart_control.proto.ObservationResponse.single_observation_responses', index=2, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1893, - serialized_end=2137, -) - - -_SINGLEACTIONREQUEST = _descriptor.Descriptor( - name='SingleActionRequest', - full_name='smart_buildings.smart_control.proto.SingleActionRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='device_id', full_name='smart_buildings.smart_control.proto.SingleActionRequest.device_id', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='setpoint_name', full_name='smart_buildings.smart_control.proto.SingleActionRequest.setpoint_name', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='continuous_value', full_name='smart_buildings.smart_control.proto.SingleActionRequest.continuous_value', index=2, - number=3, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='integer_value', full_name='smart_buildings.smart_control.proto.SingleActionRequest.integer_value', index=3, - number=4, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='categorical_value', full_name='smart_buildings.smart_control.proto.SingleActionRequest.categorical_value', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='binary_value', full_name='smart_buildings.smart_control.proto.SingleActionRequest.binary_value', index=5, - number=6, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='string_value', full_name='smart_buildings.smart_control.proto.SingleActionRequest.string_value', index=6, - number=7, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='setpoint_value', full_name='smart_buildings.smart_control.proto.SingleActionRequest.setpoint_value', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=2140, - serialized_end=2351, -) - - -_SINGLEACTIONRESPONSE = _descriptor.Descriptor( - name='SingleActionResponse', - full_name='smart_buildings.smart_control.proto.SingleActionResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='request', full_name='smart_buildings.smart_control.proto.SingleActionResponse.request', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='response_type', full_name='smart_buildings.smart_control.proto.SingleActionResponse.response_type', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='additional_info', full_name='smart_buildings.smart_control.proto.SingleActionResponse.additional_info', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _SINGLEACTIONRESPONSE_ACTIONRESPONSETYPE, - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2354, - serialized_end=2831, -) - - -_ACTIONREQUEST = _descriptor.Descriptor( - name='ActionRequest', - full_name='smart_buildings.smart_control.proto.ActionRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='timestamp', full_name='smart_buildings.smart_control.proto.ActionRequest.timestamp', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='single_action_requests', full_name='smart_buildings.smart_control.proto.ActionRequest.single_action_requests', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2834, - serialized_end=2986, -) - - -_ACTIONRESPONSE = _descriptor.Descriptor( - name='ActionResponse', - full_name='smart_buildings.smart_control.proto.ActionResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='timestamp', full_name='smart_buildings.smart_control.proto.ActionResponse.timestamp', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='request', full_name='smart_buildings.smart_control.proto.ActionResponse.request', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='single_action_responses', full_name='smart_buildings.smart_control.proto.ActionResponse.single_action_responses', index=2, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2989, - serialized_end=3213, -) - -_ZONEINFO.fields_by_name['zone_type'].enum_type = _ZONEINFO_ZONETYPE -_ZONEINFO_ZONETYPE.containing_type = _ZONEINFO -_DEVICEINFO_OBSERVABLEFIELDSENTRY.fields_by_name['value'].enum_type = _DEVICEINFO_VALUETYPE -_DEVICEINFO_OBSERVABLEFIELDSENTRY.containing_type = _DEVICEINFO -_DEVICEINFO_ACTIONFIELDSENTRY.fields_by_name['value'].enum_type = _DEVICEINFO_VALUETYPE -_DEVICEINFO_ACTIONFIELDSENTRY.containing_type = _DEVICEINFO -_DEVICEINFO.fields_by_name['device_type'].enum_type = _DEVICEINFO_DEVICETYPE -_DEVICEINFO.fields_by_name['observable_fields'].message_type = _DEVICEINFO_OBSERVABLEFIELDSENTRY -_DEVICEINFO.fields_by_name['action_fields'].message_type = _DEVICEINFO_ACTIONFIELDSENTRY -_DEVICEINFO_DEVICETYPE.containing_type = _DEVICEINFO -_DEVICEINFO_VALUETYPE.containing_type = _DEVICEINFO -_SINGLEOBSERVATIONRESPONSE.fields_by_name['timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -_SINGLEOBSERVATIONRESPONSE.fields_by_name['single_observation_request'].message_type = _SINGLEOBSERVATIONREQUEST -_SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'].fields.append( - _SINGLEOBSERVATIONRESPONSE.fields_by_name['continuous_value']) -_SINGLEOBSERVATIONRESPONSE.fields_by_name['continuous_value'].containing_oneof = _SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'] -_SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'].fields.append( - _SINGLEOBSERVATIONRESPONSE.fields_by_name['integer_value']) -_SINGLEOBSERVATIONRESPONSE.fields_by_name['integer_value'].containing_oneof = _SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'] -_SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'].fields.append( - _SINGLEOBSERVATIONRESPONSE.fields_by_name['categorical_value']) -_SINGLEOBSERVATIONRESPONSE.fields_by_name['categorical_value'].containing_oneof = _SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'] -_SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'].fields.append( - _SINGLEOBSERVATIONRESPONSE.fields_by_name['binary_value']) -_SINGLEOBSERVATIONRESPONSE.fields_by_name['binary_value'].containing_oneof = _SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'] -_SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'].fields.append( - _SINGLEOBSERVATIONRESPONSE.fields_by_name['string_value']) -_SINGLEOBSERVATIONRESPONSE.fields_by_name['string_value'].containing_oneof = _SINGLEOBSERVATIONRESPONSE.oneofs_by_name['observation_value'] -_OBSERVATIONREQUEST.fields_by_name['timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -_OBSERVATIONREQUEST.fields_by_name['single_observation_requests'].message_type = _SINGLEOBSERVATIONREQUEST -_OBSERVATIONRESPONSE.fields_by_name['timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -_OBSERVATIONRESPONSE.fields_by_name['request'].message_type = _OBSERVATIONREQUEST -_OBSERVATIONRESPONSE.fields_by_name['single_observation_responses'].message_type = _SINGLEOBSERVATIONRESPONSE -_SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'].fields.append( - _SINGLEACTIONREQUEST.fields_by_name['continuous_value']) -_SINGLEACTIONREQUEST.fields_by_name['continuous_value'].containing_oneof = _SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'] -_SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'].fields.append( - _SINGLEACTIONREQUEST.fields_by_name['integer_value']) -_SINGLEACTIONREQUEST.fields_by_name['integer_value'].containing_oneof = _SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'] -_SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'].fields.append( - _SINGLEACTIONREQUEST.fields_by_name['categorical_value']) -_SINGLEACTIONREQUEST.fields_by_name['categorical_value'].containing_oneof = _SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'] -_SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'].fields.append( - _SINGLEACTIONREQUEST.fields_by_name['binary_value']) -_SINGLEACTIONREQUEST.fields_by_name['binary_value'].containing_oneof = _SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'] -_SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'].fields.append( - _SINGLEACTIONREQUEST.fields_by_name['string_value']) -_SINGLEACTIONREQUEST.fields_by_name['string_value'].containing_oneof = _SINGLEACTIONREQUEST.oneofs_by_name['setpoint_value'] -_SINGLEACTIONRESPONSE.fields_by_name['request'].message_type = _SINGLEACTIONREQUEST -_SINGLEACTIONRESPONSE.fields_by_name['response_type'].enum_type = _SINGLEACTIONRESPONSE_ACTIONRESPONSETYPE -_SINGLEACTIONRESPONSE_ACTIONRESPONSETYPE.containing_type = _SINGLEACTIONRESPONSE -_ACTIONREQUEST.fields_by_name['timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -_ACTIONREQUEST.fields_by_name['single_action_requests'].message_type = _SINGLEACTIONREQUEST -_ACTIONRESPONSE.fields_by_name['timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -_ACTIONRESPONSE.fields_by_name['request'].message_type = _ACTIONREQUEST -_ACTIONRESPONSE.fields_by_name['single_action_responses'].message_type = _SINGLEACTIONRESPONSE -DESCRIPTOR.message_types_by_name['ZoneInfo'] = _ZONEINFO -DESCRIPTOR.message_types_by_name['DeviceInfo'] = _DEVICEINFO -DESCRIPTOR.message_types_by_name['SingleObservationRequest'] = _SINGLEOBSERVATIONREQUEST -DESCRIPTOR.message_types_by_name['SingleObservationResponse'] = _SINGLEOBSERVATIONRESPONSE -DESCRIPTOR.message_types_by_name['ObservationRequest'] = _OBSERVATIONREQUEST -DESCRIPTOR.message_types_by_name['ObservationResponse'] = _OBSERVATIONRESPONSE -DESCRIPTOR.message_types_by_name['SingleActionRequest'] = _SINGLEACTIONREQUEST -DESCRIPTOR.message_types_by_name['SingleActionResponse'] = _SINGLEACTIONRESPONSE -DESCRIPTOR.message_types_by_name['ActionRequest'] = _ACTIONREQUEST -DESCRIPTOR.message_types_by_name['ActionResponse'] = _ACTIONRESPONSE -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -ZoneInfo = _reflection.GeneratedProtocolMessageType('ZoneInfo', (_message.Message,), { - 'DESCRIPTOR' : _ZONEINFO, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.ZoneInfo) - }) -_sym_db.RegisterMessage(ZoneInfo) - -DeviceInfo = _reflection.GeneratedProtocolMessageType('DeviceInfo', (_message.Message,), { - - 'ObservableFieldsEntry' : _reflection.GeneratedProtocolMessageType('ObservableFieldsEntry', (_message.Message,), { - 'DESCRIPTOR' : _DEVICEINFO_OBSERVABLEFIELDSENTRY, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.DeviceInfo.ObservableFieldsEntry) - }) - , - - 'ActionFieldsEntry' : _reflection.GeneratedProtocolMessageType('ActionFieldsEntry', (_message.Message,), { - 'DESCRIPTOR' : _DEVICEINFO_ACTIONFIELDSENTRY, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.DeviceInfo.ActionFieldsEntry) - }) - , - 'DESCRIPTOR' : _DEVICEINFO, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.DeviceInfo) - }) -_sym_db.RegisterMessage(DeviceInfo) -_sym_db.RegisterMessage(DeviceInfo.ObservableFieldsEntry) -_sym_db.RegisterMessage(DeviceInfo.ActionFieldsEntry) - -SingleObservationRequest = _reflection.GeneratedProtocolMessageType('SingleObservationRequest', (_message.Message,), { - 'DESCRIPTOR' : _SINGLEOBSERVATIONREQUEST, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.SingleObservationRequest) - }) -_sym_db.RegisterMessage(SingleObservationRequest) - -SingleObservationResponse = _reflection.GeneratedProtocolMessageType('SingleObservationResponse', (_message.Message,), { - 'DESCRIPTOR' : _SINGLEOBSERVATIONRESPONSE, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.SingleObservationResponse) - }) -_sym_db.RegisterMessage(SingleObservationResponse) - -ObservationRequest = _reflection.GeneratedProtocolMessageType('ObservationRequest', (_message.Message,), { - 'DESCRIPTOR' : _OBSERVATIONREQUEST, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.ObservationRequest) - }) -_sym_db.RegisterMessage(ObservationRequest) - -ObservationResponse = _reflection.GeneratedProtocolMessageType('ObservationResponse', (_message.Message,), { - 'DESCRIPTOR' : _OBSERVATIONRESPONSE, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.ObservationResponse) - }) -_sym_db.RegisterMessage(ObservationResponse) - -SingleActionRequest = _reflection.GeneratedProtocolMessageType('SingleActionRequest', (_message.Message,), { - 'DESCRIPTOR' : _SINGLEACTIONREQUEST, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.SingleActionRequest) - }) -_sym_db.RegisterMessage(SingleActionRequest) - -SingleActionResponse = _reflection.GeneratedProtocolMessageType('SingleActionResponse', (_message.Message,), { - 'DESCRIPTOR' : _SINGLEACTIONRESPONSE, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.SingleActionResponse) - }) -_sym_db.RegisterMessage(SingleActionResponse) - -ActionRequest = _reflection.GeneratedProtocolMessageType('ActionRequest', (_message.Message,), { - 'DESCRIPTOR' : _ACTIONREQUEST, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.ActionRequest) - }) -_sym_db.RegisterMessage(ActionRequest) - -ActionResponse = _reflection.GeneratedProtocolMessageType('ActionResponse', (_message.Message,), { - 'DESCRIPTOR' : _ACTIONRESPONSE, - '__module__' : 'smart_control_building_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.ActionResponse) - }) -_sym_db.RegisterMessage(ActionResponse) - - -_DEVICEINFO_OBSERVABLEFIELDSENTRY._options = None -_DEVICEINFO_ACTIONFIELDSENTRY._options = None -# @@protoc_insertion_point(module_scope) diff --git a/smart_control/proto/smart_control_normalization_pb2.py b/smart_control/proto/smart_control_normalization_pb2.py deleted file mode 100644 index 36b64c0d..00000000 --- a/smart_control/proto/smart_control_normalization_pb2.py +++ /dev/null @@ -1,130 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: smart_control_normalization.proto - -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='smart_control_normalization.proto', - package='smart_buildings.smart_control.proto', - syntax='proto3', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n!smart_control_normalization.proto\x12#smart_buildings.smart_control.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x90\x02\n\x16\x43ontinuousVariableInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x30\n\x0csample_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nsample_end\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0bsample_size\x18\x04 \x01(\x05\x12\x17\n\x0fsample_variance\x18\x05 \x01(\x02\x12\x13\n\x0bsample_mean\x18\x06 \x01(\x02\x12\x15\n\rsample_median\x18\x07 \x01(\x02\x12\x16\n\x0esample_maximum\x18\x08 \x01(\x02\x12\x16\n\x0esample_minimum\x18\t \x01(\x02\x62\x06proto3' - , - dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) - - - - -_CONTINUOUSVARIABLEINFO = _descriptor.Descriptor( - name='ContinuousVariableInfo', - full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo.id', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='sample_start', full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo.sample_start', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='sample_end', full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo.sample_end', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='sample_size', full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo.sample_size', index=3, - number=4, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='sample_variance', full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo.sample_variance', index=4, - number=5, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='sample_mean', full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo.sample_mean', index=5, - number=6, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='sample_median', full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo.sample_median', index=6, - number=7, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='sample_maximum', full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo.sample_maximum', index=7, - number=8, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='sample_minimum', full_name='smart_buildings.smart_control.proto.ContinuousVariableInfo.sample_minimum', index=8, - number=9, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=108, - serialized_end=380, -) - -_CONTINUOUSVARIABLEINFO.fields_by_name['sample_start'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -_CONTINUOUSVARIABLEINFO.fields_by_name['sample_end'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -DESCRIPTOR.message_types_by_name['ContinuousVariableInfo'] = _CONTINUOUSVARIABLEINFO -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -ContinuousVariableInfo = _reflection.GeneratedProtocolMessageType('ContinuousVariableInfo', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUOUSVARIABLEINFO, - '__module__' : 'smart_control_normalization_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.ContinuousVariableInfo) - }) -_sym_db.RegisterMessage(ContinuousVariableInfo) - - -# @@protoc_insertion_point(module_scope) diff --git a/smart_control/proto/smart_control_reward.proto b/smart_control/proto/smart_control_reward.proto index 95f6b697..3fe4646c 100644 --- a/smart_control/proto/smart_control_reward.proto +++ b/smart_control/proto/smart_control_reward.proto @@ -15,9 +15,9 @@ // Defines messages for computing the RL reward for each timestep. // // This message structure assumes a building with: -// (a) multiple zones that have ventiation and air temperature setpoints, +// (a) multiple zones that have ventilation and air temperature setpoints, // (b) one or more air handlers with fans and air conditioners, and -// (c) one or more natural gas boilers with heating water recirculaion. +// (c) one or more natural gas boilers with heating water recirculation. // // All units are in fundamental metric units: Kelvin, Watts (Joules/sec), // and meters. @@ -30,7 +30,7 @@ // r = s(setpoint) - u x f(energy_cost) - w x g(carbon_emission) // where: // r: the total reward for the timestep, -// s(setpoint): reward function for maintiaining setpoint, +// s(setpoint): reward function for maintaining setpoint, // f(energy_cost): total cost in energy for the period, // g(carbon_emission): total cost associated with carbon emissions, and // u, w are importance weights defined by the energy policy. @@ -74,10 +74,10 @@ message RewardInfo { // Cumulative electrical power in W applied to blowers. float blower_electrical_energy_rate = 1; - // Cumulative electrical energy rate applied in W for air condioning. This + // Cumulative electrical energy rate applied in W for air conditioning. This // represents the total power applied for running a refrigeration or // heat pump cycles (includes running a compressor and pumps to - // recirculate refrgerant.). + // recirculate refrigerant.). float air_conditioning_electrical_energy_rate = 2; } @@ -85,7 +85,15 @@ message RewardInfo { message BoilerRewardInfo { // Energy rate consumed in W by natural gas for heating water. float natural_gas_heating_energy_rate = 1; - // Cumularive electrical power in W for water recirculation pumps. + // Cumulative electrical power in W for water recirculation pumps. + float pump_electrical_energy_rate = 2; + } + + // Information about a heat pump that provides heated water for VAVs. + message HeatPumpRewardInfo { + // Energy rate consumed in W by electricity for heating water. + float electricity_heating_energy_rate = 1; + // Cumulative electrical power in W for water recirculation pumps. float pump_electrical_energy_rate = 2; } @@ -115,6 +123,10 @@ message RewardInfo { // Information about the boilers' energy consumption required to compute the // reward. map boiler_reward_infos = 7; + + // Information about the heat pumps' energy consumption required to compute + // the reward. + map heat_pump_reward_infos = 8; } // The return reward signal from the reward function. While the principal diff --git a/smart_control/proto/smart_control_reward_pb2.py b/smart_control/proto/smart_control_reward_pb2.py deleted file mode 100644 index 9e67d36e..00000000 --- a/smart_control/proto/smart_control_reward_pb2.py +++ /dev/null @@ -1,603 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: smart_control_reward.proto - -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='smart_control_reward.proto', - package='smart_buildings.smart_control.proto', - syntax='proto3', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x1asmart_control_reward.proto\x12#smart_buildings.smart_control.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xe9\t\n\nRewardInfo\x12\x33\n\x0fstart_timestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x31\n\rend_timestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08\x61gent_id\x18\x03 \x01(\t\x12\x13\n\x0bscenario_id\x18\x04 \x01(\t\x12_\n\x11zone_reward_infos\x18\x05 \x03(\x0b\x32\x44.smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfosEntry\x12l\n\x18\x61ir_handler_reward_infos\x18\x06 \x03(\x0b\x32J.smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfosEntry\x12\x63\n\x13\x62oiler_reward_infos\x18\x07 \x03(\x0b\x32\x46.smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfosEntry\x1a\xcc\x01\n\x0eZoneRewardInfo\x12$\n\x1cheating_setpoint_temperature\x18\x01 \x01(\x02\x12$\n\x1c\x63ooling_setpoint_temperature\x18\x02 \x01(\x02\x12\x1c\n\x14zone_air_temperature\x18\x03 \x01(\x02\x12\x1e\n\x16\x61ir_flow_rate_setpoint\x18\x04 \x01(\x02\x12\x15\n\rair_flow_rate\x18\x05 \x01(\x02\x12\x19\n\x11\x61verage_occupancy\x18\x06 \x01(\x02\x1an\n\x14\x41irHandlerRewardInfo\x12%\n\x1d\x62lower_electrical_energy_rate\x18\x01 \x01(\x02\x12/\n\'air_conditioning_electrical_energy_rate\x18\x02 \x01(\x02\x1a`\n\x10\x42oilerRewardInfo\x12\'\n\x1fnatural_gas_heating_energy_rate\x18\x01 \x01(\x02\x12#\n\x1bpump_electrical_energy_rate\x18\x02 \x01(\x02\x1av\n\x14ZoneRewardInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfo:\x02\x38\x01\x1a\x82\x01\n\x1a\x41irHandlerRewardInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12S\n\x05value\x18\x02 \x01(\x0b\x32\x44.smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfo:\x02\x38\x01\x1az\n\x16\x42oilerRewardInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12O\n\x05value\x18\x02 \x01(\x0b\x32@.smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfo:\x02\x38\x01\"\xe4\x04\n\x0eRewardResponse\x12\x1a\n\x12\x61gent_reward_value\x18\x01 \x01(\x02\x12\x1b\n\x13productivity_reward\x18\x02 \x01(\x02\x12\x1f\n\x17\x65lectricity_energy_cost\x18\x03 \x01(\x02\x12\x1f\n\x17natural_gas_energy_cost\x18\x04 \x01(\x02\x12\x16\n\x0e\x63\x61rbon_emitted\x18\x05 \x01(\x02\x12\x13\n\x0b\x63\x61rbon_cost\x18\x06 \x01(\x02\x12\x1b\n\x13productivity_weight\x18\x07 \x01(\x02\x12\x1a\n\x12\x65nergy_cost_weight\x18\x08 \x01(\x02\x12\x1e\n\x16\x63\x61rbon_emission_weight\x18\t \x01(\x02\x12\x1b\n\x13person_productivity\x18\n \x01(\x02\x12\x17\n\x0ftotal_occupancy\x18\x0b \x01(\x02\x12\x14\n\x0creward_scale\x18\x0c \x01(\x02\x12\x14\n\x0creward_shift\x18\r \x01(\x02\x12\x1b\n\x13productivity_regret\x18\x0e \x01(\x02\x12&\n\x1enormalized_productivity_regret\x18\x0f \x01(\x02\x12\x1e\n\x16normalized_energy_cost\x18\x10 \x01(\x02\x12\"\n\x1anormalized_carbon_emission\x18\x11 \x01(\x02\x12\x33\n\x0fstart_timestamp\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x31\n\rend_timestamp\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestampb\x06proto3' - , - dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) - - - - -_REWARDINFO_ZONEREWARDINFO = _descriptor.Descriptor( - name='ZoneRewardInfo', - full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='heating_setpoint_temperature', full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfo.heating_setpoint_temperature', index=0, - number=1, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='cooling_setpoint_temperature', full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfo.cooling_setpoint_temperature', index=1, - number=2, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='zone_air_temperature', full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfo.zone_air_temperature', index=2, - number=3, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='air_flow_rate_setpoint', full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfo.air_flow_rate_setpoint', index=3, - number=4, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='air_flow_rate', full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfo.air_flow_rate', index=4, - number=5, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='average_occupancy', full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfo.average_occupancy', index=5, - number=6, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=567, - serialized_end=771, -) - -_REWARDINFO_AIRHANDLERREWARDINFO = _descriptor.Descriptor( - name='AirHandlerRewardInfo', - full_name='smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='blower_electrical_energy_rate', full_name='smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfo.blower_electrical_energy_rate', index=0, - number=1, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='air_conditioning_electrical_energy_rate', full_name='smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfo.air_conditioning_electrical_energy_rate', index=1, - number=2, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=773, - serialized_end=883, -) - -_REWARDINFO_BOILERREWARDINFO = _descriptor.Descriptor( - name='BoilerRewardInfo', - full_name='smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='natural_gas_heating_energy_rate', full_name='smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfo.natural_gas_heating_energy_rate', index=0, - number=1, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='pump_electrical_energy_rate', full_name='smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfo.pump_electrical_energy_rate', index=1, - number=2, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=885, - serialized_end=981, -) - -_REWARDINFO_ZONEREWARDINFOSENTRY = _descriptor.Descriptor( - name='ZoneRewardInfosEntry', - full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfosEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfosEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfosEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=983, - serialized_end=1101, -) - -_REWARDINFO_AIRHANDLERREWARDINFOSENTRY = _descriptor.Descriptor( - name='AirHandlerRewardInfosEntry', - full_name='smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfosEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfosEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfosEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1104, - serialized_end=1234, -) - -_REWARDINFO_BOILERREWARDINFOSENTRY = _descriptor.Descriptor( - name='BoilerRewardInfosEntry', - full_name='smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfosEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfosEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfosEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1236, - serialized_end=1358, -) - -_REWARDINFO = _descriptor.Descriptor( - name='RewardInfo', - full_name='smart_buildings.smart_control.proto.RewardInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='start_timestamp', full_name='smart_buildings.smart_control.proto.RewardInfo.start_timestamp', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end_timestamp', full_name='smart_buildings.smart_control.proto.RewardInfo.end_timestamp', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='agent_id', full_name='smart_buildings.smart_control.proto.RewardInfo.agent_id', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='scenario_id', full_name='smart_buildings.smart_control.proto.RewardInfo.scenario_id', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='zone_reward_infos', full_name='smart_buildings.smart_control.proto.RewardInfo.zone_reward_infos', index=4, - number=5, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='air_handler_reward_infos', full_name='smart_buildings.smart_control.proto.RewardInfo.air_handler_reward_infos', index=5, - number=6, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='boiler_reward_infos', full_name='smart_buildings.smart_control.proto.RewardInfo.boiler_reward_infos', index=6, - number=7, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_REWARDINFO_ZONEREWARDINFO, _REWARDINFO_AIRHANDLERREWARDINFO, _REWARDINFO_BOILERREWARDINFO, _REWARDINFO_ZONEREWARDINFOSENTRY, _REWARDINFO_AIRHANDLERREWARDINFOSENTRY, _REWARDINFO_BOILERREWARDINFOSENTRY, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=101, - serialized_end=1358, -) - - -_REWARDRESPONSE = _descriptor.Descriptor( - name='RewardResponse', - full_name='smart_buildings.smart_control.proto.RewardResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='agent_reward_value', full_name='smart_buildings.smart_control.proto.RewardResponse.agent_reward_value', index=0, - number=1, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='productivity_reward', full_name='smart_buildings.smart_control.proto.RewardResponse.productivity_reward', index=1, - number=2, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='electricity_energy_cost', full_name='smart_buildings.smart_control.proto.RewardResponse.electricity_energy_cost', index=2, - number=3, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='natural_gas_energy_cost', full_name='smart_buildings.smart_control.proto.RewardResponse.natural_gas_energy_cost', index=3, - number=4, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='carbon_emitted', full_name='smart_buildings.smart_control.proto.RewardResponse.carbon_emitted', index=4, - number=5, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='carbon_cost', full_name='smart_buildings.smart_control.proto.RewardResponse.carbon_cost', index=5, - number=6, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='productivity_weight', full_name='smart_buildings.smart_control.proto.RewardResponse.productivity_weight', index=6, - number=7, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='energy_cost_weight', full_name='smart_buildings.smart_control.proto.RewardResponse.energy_cost_weight', index=7, - number=8, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='carbon_emission_weight', full_name='smart_buildings.smart_control.proto.RewardResponse.carbon_emission_weight', index=8, - number=9, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='person_productivity', full_name='smart_buildings.smart_control.proto.RewardResponse.person_productivity', index=9, - number=10, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='total_occupancy', full_name='smart_buildings.smart_control.proto.RewardResponse.total_occupancy', index=10, - number=11, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='reward_scale', full_name='smart_buildings.smart_control.proto.RewardResponse.reward_scale', index=11, - number=12, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='reward_shift', full_name='smart_buildings.smart_control.proto.RewardResponse.reward_shift', index=12, - number=13, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='productivity_regret', full_name='smart_buildings.smart_control.proto.RewardResponse.productivity_regret', index=13, - number=14, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='normalized_productivity_regret', full_name='smart_buildings.smart_control.proto.RewardResponse.normalized_productivity_regret', index=14, - number=15, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='normalized_energy_cost', full_name='smart_buildings.smart_control.proto.RewardResponse.normalized_energy_cost', index=15, - number=16, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='normalized_carbon_emission', full_name='smart_buildings.smart_control.proto.RewardResponse.normalized_carbon_emission', index=16, - number=17, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='start_timestamp', full_name='smart_buildings.smart_control.proto.RewardResponse.start_timestamp', index=17, - number=18, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end_timestamp', full_name='smart_buildings.smart_control.proto.RewardResponse.end_timestamp', index=18, - number=19, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1361, - serialized_end=1973, -) - -_REWARDINFO_ZONEREWARDINFO.containing_type = _REWARDINFO -_REWARDINFO_AIRHANDLERREWARDINFO.containing_type = _REWARDINFO -_REWARDINFO_BOILERREWARDINFO.containing_type = _REWARDINFO -_REWARDINFO_ZONEREWARDINFOSENTRY.fields_by_name['value'].message_type = _REWARDINFO_ZONEREWARDINFO -_REWARDINFO_ZONEREWARDINFOSENTRY.containing_type = _REWARDINFO -_REWARDINFO_AIRHANDLERREWARDINFOSENTRY.fields_by_name['value'].message_type = _REWARDINFO_AIRHANDLERREWARDINFO -_REWARDINFO_AIRHANDLERREWARDINFOSENTRY.containing_type = _REWARDINFO -_REWARDINFO_BOILERREWARDINFOSENTRY.fields_by_name['value'].message_type = _REWARDINFO_BOILERREWARDINFO -_REWARDINFO_BOILERREWARDINFOSENTRY.containing_type = _REWARDINFO -_REWARDINFO.fields_by_name['start_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -_REWARDINFO.fields_by_name['end_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -_REWARDINFO.fields_by_name['zone_reward_infos'].message_type = _REWARDINFO_ZONEREWARDINFOSENTRY -_REWARDINFO.fields_by_name['air_handler_reward_infos'].message_type = _REWARDINFO_AIRHANDLERREWARDINFOSENTRY -_REWARDINFO.fields_by_name['boiler_reward_infos'].message_type = _REWARDINFO_BOILERREWARDINFOSENTRY -_REWARDRESPONSE.fields_by_name['start_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -_REWARDRESPONSE.fields_by_name['end_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP -DESCRIPTOR.message_types_by_name['RewardInfo'] = _REWARDINFO -DESCRIPTOR.message_types_by_name['RewardResponse'] = _REWARDRESPONSE -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -RewardInfo = _reflection.GeneratedProtocolMessageType('RewardInfo', (_message.Message,), { - - 'ZoneRewardInfo' : _reflection.GeneratedProtocolMessageType('ZoneRewardInfo', (_message.Message,), { - 'DESCRIPTOR' : _REWARDINFO_ZONEREWARDINFO, - '__module__' : 'smart_control_reward_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfo) - }) - , - - 'AirHandlerRewardInfo' : _reflection.GeneratedProtocolMessageType('AirHandlerRewardInfo', (_message.Message,), { - 'DESCRIPTOR' : _REWARDINFO_AIRHANDLERREWARDINFO, - '__module__' : 'smart_control_reward_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfo) - }) - , - - 'BoilerRewardInfo' : _reflection.GeneratedProtocolMessageType('BoilerRewardInfo', (_message.Message,), { - 'DESCRIPTOR' : _REWARDINFO_BOILERREWARDINFO, - '__module__' : 'smart_control_reward_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfo) - }) - , - - 'ZoneRewardInfosEntry' : _reflection.GeneratedProtocolMessageType('ZoneRewardInfosEntry', (_message.Message,), { - 'DESCRIPTOR' : _REWARDINFO_ZONEREWARDINFOSENTRY, - '__module__' : 'smart_control_reward_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.RewardInfo.ZoneRewardInfosEntry) - }) - , - - 'AirHandlerRewardInfosEntry' : _reflection.GeneratedProtocolMessageType('AirHandlerRewardInfosEntry', (_message.Message,), { - 'DESCRIPTOR' : _REWARDINFO_AIRHANDLERREWARDINFOSENTRY, - '__module__' : 'smart_control_reward_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.RewardInfo.AirHandlerRewardInfosEntry) - }) - , - - 'BoilerRewardInfosEntry' : _reflection.GeneratedProtocolMessageType('BoilerRewardInfosEntry', (_message.Message,), { - 'DESCRIPTOR' : _REWARDINFO_BOILERREWARDINFOSENTRY, - '__module__' : 'smart_control_reward_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.RewardInfo.BoilerRewardInfosEntry) - }) - , - 'DESCRIPTOR' : _REWARDINFO, - '__module__' : 'smart_control_reward_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.RewardInfo) - }) -_sym_db.RegisterMessage(RewardInfo) -_sym_db.RegisterMessage(RewardInfo.ZoneRewardInfo) -_sym_db.RegisterMessage(RewardInfo.AirHandlerRewardInfo) -_sym_db.RegisterMessage(RewardInfo.BoilerRewardInfo) -_sym_db.RegisterMessage(RewardInfo.ZoneRewardInfosEntry) -_sym_db.RegisterMessage(RewardInfo.AirHandlerRewardInfosEntry) -_sym_db.RegisterMessage(RewardInfo.BoilerRewardInfosEntry) - -RewardResponse = _reflection.GeneratedProtocolMessageType('RewardResponse', (_message.Message,), { - 'DESCRIPTOR' : _REWARDRESPONSE, - '__module__' : 'smart_control_reward_pb2' - # @@protoc_insertion_point(class_scope:smart_buildings.smart_control.proto.RewardResponse) - }) -_sym_db.RegisterMessage(RewardResponse) - - -_REWARDINFO_ZONEREWARDINFOSENTRY._options = None -_REWARDINFO_AIRHANDLERREWARDINFOSENTRY._options = None -_REWARDINFO_BOILERREWARDINFOSENTRY._options = None -# @@protoc_insertion_point(module_scope) diff --git a/smart_control/reinforcement_learning/__init__.py b/smart_control/reinforcement_learning/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/reinforcement_learning/agents/__init__.py b/smart_control/reinforcement_learning/agents/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/reinforcement_learning/agents/networks/__init__.py b/smart_control/reinforcement_learning/agents/networks/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/reinforcement_learning/agents/networks/sac_networks.py b/smart_control/reinforcement_learning/agents/networks/sac_networks.py index a701bc3b..d6646ab6 100644 --- a/smart_control/reinforcement_learning/agents/networks/sac_networks.py +++ b/smart_control/reinforcement_learning/agents/networks/sac_networks.py @@ -109,14 +109,14 @@ class _TanhNormalProjectionNetworkWrapper( """Wrapper to pass predefined `outer_rank` to underlying projection net.""" def __init__(self, sample_spec, predefined_outer_rank=1): - super().__init__(sample_spec) + super(_TanhNormalProjectionNetworkWrapper, self).__init__(sample_spec) self.predefined_outer_rank = predefined_outer_rank def call(self, inputs, **kwargs): kwargs['outer_rank'] = self.predefined_outer_rank if 'step_type' in kwargs: del kwargs['step_type'] - return super().call( + return super(_TanhNormalProjectionNetworkWrapper, self).call( inputs, **kwargs ) diff --git a/smart_control/reinforcement_learning/agents/sac_agent.py b/smart_control/reinforcement_learning/agents/sac_agent.py index b4100663..ff8ff9b7 100644 --- a/smart_control/reinforcement_learning/agents/sac_agent.py +++ b/smart_control/reinforcement_learning/agents/sac_agent.py @@ -8,8 +8,8 @@ from tf_agents.networks import network from tf_agents.typing import types -from smart_control.reinforcement_learning.agents.networks.sac_networks import create_sequential_actor_network -from smart_control.reinforcement_learning.agents.networks.sac_networks import create_sequential_critic_network +from smart_buildings.smart_control.reinforcement_learning.agents.networks.sac_networks import create_sequential_actor_network +from smart_buildings.smart_control.reinforcement_learning.agents.networks.sac_networks import create_sequential_critic_network def create_sac_agent( diff --git a/smart_control/reinforcement_learning/observers/__init__.py b/smart_control/reinforcement_learning/observers/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/reinforcement_learning/observers/composite_observer.py b/smart_control/reinforcement_learning/observers/composite_observer.py index 1e8b66cf..61143583 100644 --- a/smart_control/reinforcement_learning/observers/composite_observer.py +++ b/smart_control/reinforcement_learning/observers/composite_observer.py @@ -4,7 +4,7 @@ from tf_agents.trajectories import trajectory as trajectory_lib -from smart_control.reinforcement_learning.observers.base_observer import Observer +from smart_buildings.smart_control.reinforcement_learning.observers.base_observer import Observer class CompositeObserver(Observer): diff --git a/smart_control/reinforcement_learning/observers/print_status_observer.py b/smart_control/reinforcement_learning/observers/print_status_observer.py index f3b8ffcd..77570d57 100644 --- a/smart_control/reinforcement_learning/observers/print_status_observer.py +++ b/smart_control/reinforcement_learning/observers/print_status_observer.py @@ -5,8 +5,8 @@ import pandas as pd from tf_agents.trajectories import trajectory as trajectory_lib -from smart_control.reinforcement_learning.observers.base_observer import Observer -from smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE +from smart_buildings.smart_control.reinforcement_learning.observers.base_observer import Observer +from smart_buildings.smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE logger = logging.getLogger(__name__) diff --git a/smart_control/reinforcement_learning/observers/rendering_observer.py b/smart_control/reinforcement_learning/observers/rendering_observer.py index 34a20e96..47c13343 100644 --- a/smart_control/reinforcement_learning/observers/rendering_observer.py +++ b/smart_control/reinforcement_learning/observers/rendering_observer.py @@ -15,18 +15,18 @@ import pytz from tf_agents.trajectories import trajectory as trajectory_lib -from smart_control.environment import environment -from smart_control.reinforcement_learning.observers.base_observer import Observer -from smart_control.reinforcement_learning.utils.config import RENDERS_PATH -from smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE -from smart_control.reinforcement_learning.utils.constants import KELVIN_TO_CELSIUS as _KELVIN_TO_CELSIUS -from smart_control.reinforcement_learning.utils.data_processing import get_action_timeseries -from smart_control.reinforcement_learning.utils.data_processing import get_energy_timeseries -from smart_control.reinforcement_learning.utils.data_processing import get_latest_episode_reader -from smart_control.reinforcement_learning.utils.data_processing import get_outside_air_temperature_timeseries -from smart_control.reinforcement_learning.utils.data_processing import get_reward_timeseries -from smart_control.reinforcement_learning.utils.data_processing import get_zone_timeseries -from smart_control.utils import building_renderer +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.reinforcement_learning.observers.base_observer import Observer +from smart_buildings.smart_control.reinforcement_learning.utils.config import RENDERS_PATH +from smart_buildings.smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE +from smart_buildings.smart_control.reinforcement_learning.utils.constants import KELVIN_TO_CELSIUS as _KELVIN_TO_CELSIUS +from smart_buildings.smart_control.reinforcement_learning.utils.data_processing import get_action_timeseries +from smart_buildings.smart_control.reinforcement_learning.utils.data_processing import get_energy_timeseries +from smart_buildings.smart_control.reinforcement_learning.utils.data_processing import get_latest_episode_reader +from smart_buildings.smart_control.reinforcement_learning.utils.data_processing import get_outside_air_temperature_timeseries +from smart_buildings.smart_control.reinforcement_learning.utils.data_processing import get_reward_timeseries +from smart_buildings.smart_control.reinforcement_learning.utils.data_processing import get_zone_timeseries +from smart_buildings.smart_control.utils import building_renderer logger = logging.getLogger(__name__) diff --git a/smart_control/reinforcement_learning/policies/__init__.py b/smart_control/reinforcement_learning/policies/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/reinforcement_learning/policies/schedule_policy.py b/smart_control/reinforcement_learning/policies/schedule_policy.py index 375185b4..dbecea6c 100644 --- a/smart_control/reinforcement_learning/policies/schedule_policy.py +++ b/smart_control/reinforcement_learning/policies/schedule_policy.py @@ -14,9 +14,9 @@ from tf_agents.trajectories import policy_step from tf_agents.typing import types -from smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE -from smart_control.reinforcement_learning.utils.time_utils import to_dow -from smart_control.reinforcement_learning.utils.time_utils import to_hod +from smart_buildings.smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE +from smart_buildings.smart_control.reinforcement_learning.utils.time_utils import to_dow +from smart_buildings.smart_control.reinforcement_learning.utils.time_utils import to_hod logger = logging.getLogger(__name__) diff --git a/smart_control/reinforcement_learning/replay_buffer/__init__.py b/smart_control/reinforcement_learning/replay_buffer/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/reinforcement_learning/replay_buffer/replay_buffer_test.py b/smart_control/reinforcement_learning/replay_buffer/replay_buffer_test.py deleted file mode 100644 index da8ef09a..00000000 --- a/smart_control/reinforcement_learning/replay_buffer/replay_buffer_test.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Replay Buffer Test""" - -import sys -import unittest - -# we are skipping these tests on Mac for now, until we can resolve the dm-reverb -# package installation on Mac. See: https://github.com/google/sbsim/issues/102 -RUNNING_ON_MAC = sys.platform.startswith("darwin") -SKIP_REASON = "Issues installing dm-reverb on Mac." - - -class ReverbInstallationTest(unittest.TestCase): - """Testing if we can install the dm-reverb package. Skipping on Mac for now. - We can remove the skip logic and push to GitHub Actions to test / prove our - ability to install across all platforms. Then we can remove this test class. - """ - - @unittest.skipIf(RUNNING_ON_MAC, SKIP_REASON) - def test_reverb_installation(self): - import reverb # pylint:disable=import-outside-toplevel - - print("Reverb imported successfully.") - print(dir(reverb)) - assert True - - -# TODO: add more replay buffer related tests here (using the skip logic) - -if __name__ == "__main__": - unittest.main() diff --git a/smart_control/reinforcement_learning/scripts/__init__.py b/smart_control/reinforcement_learning/scripts/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/reinforcement_learning/scripts/populate_starter_buffer.py b/smart_control/reinforcement_learning/scripts/populate_starter_buffer.py index 16e2303f..ca3f8222 100644 --- a/smart_control/reinforcement_learning/scripts/populate_starter_buffer.py +++ b/smart_control/reinforcement_learning/scripts/populate_starter_buffer.py @@ -15,13 +15,13 @@ from tf_agents.train.utils import spec_utils from tf_agents.trajectories import trajectory -from smart_control.reinforcement_learning.observers.composite_observer import CompositeObserver -from smart_control.reinforcement_learning.observers.print_status_observer import PrintStatusObserver -from smart_control.reinforcement_learning.policies.schedule_policy import create_baseline_schedule_policy -from smart_control.reinforcement_learning.replay_buffer.replay_buffer import ReplayBufferManager -from smart_control.reinforcement_learning.utils.config import CONFIG_PATH -from smart_control.reinforcement_learning.utils.config import OUTPUT_DATA_PATH -from smart_control.reinforcement_learning.utils.environment import create_and_setup_environment +from smart_buildings.smart_control.reinforcement_learning.observers.composite_observer import CompositeObserver +from smart_buildings.smart_control.reinforcement_learning.observers.print_status_observer import PrintStatusObserver +from smart_buildings.smart_control.reinforcement_learning.policies.schedule_policy import create_baseline_schedule_policy +from smart_buildings.smart_control.reinforcement_learning.replay_buffer.replay_buffer import ReplayBufferManager +from smart_buildings.smart_control.reinforcement_learning.utils.config import CONFIG_PATH +from smart_buildings.smart_control.reinforcement_learning.utils.config import OUTPUT_DATA_PATH +from smart_buildings.smart_control.reinforcement_learning.utils.environment import create_and_setup_environment # Configure logging logging.basicConfig( diff --git a/smart_control/reinforcement_learning/scripts/train.py b/smart_control/reinforcement_learning/scripts/train.py index 21d7b8ba..c40979b1 100644 --- a/smart_control/reinforcement_learning/scripts/train.py +++ b/smart_control/reinforcement_learning/scripts/train.py @@ -25,13 +25,13 @@ from tf_agents.train import triggers from tf_agents.train.utils import spec_utils -from smart_control.reinforcement_learning.agents.sac_agent import create_sac_agent -from smart_control.reinforcement_learning.observers.composite_observer import CompositeObserver -from smart_control.reinforcement_learning.observers.print_status_observer import PrintStatusObserver -from smart_control.reinforcement_learning.replay_buffer.replay_buffer import ReplayBufferManager -from smart_control.reinforcement_learning.utils.config import CONFIG_PATH -from smart_control.reinforcement_learning.utils.config import EXPERIMENT_RESULTS_PATH -from smart_control.reinforcement_learning.utils.environment import create_and_setup_environment +from smart_buildings.smart_control.reinforcement_learning.agents.sac_agent import create_sac_agent +from smart_buildings.smart_control.reinforcement_learning.observers.composite_observer import CompositeObserver +from smart_buildings.smart_control.reinforcement_learning.observers.print_status_observer import PrintStatusObserver +from smart_buildings.smart_control.reinforcement_learning.replay_buffer.replay_buffer import ReplayBufferManager +from smart_buildings.smart_control.reinforcement_learning.utils.config import CONFIG_PATH +from smart_buildings.smart_control.reinforcement_learning.utils.config import EXPERIMENT_RESULTS_PATH +from smart_buildings.smart_control.reinforcement_learning.utils.environment import create_and_setup_environment # pylint: enable=g-import-not-at-top, wrong-import-position diff --git a/smart_control/reinforcement_learning/utils/__init__.py b/smart_control/reinforcement_learning/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/reinforcement_learning/utils/config.py b/smart_control/reinforcement_learning/utils/config.py index 070aa697..0558936a 100644 --- a/smart_control/reinforcement_learning/utils/config.py +++ b/smart_control/reinforcement_learning/utils/config.py @@ -9,28 +9,28 @@ # pylint: disable=unused-import # these imports are necessary for proper gin setup, even if not referenced # do not remove -from smart_control.reward.electricity_energy_cost import ElectricityEnergyCost -from smart_control.reward.natural_gas_energy_cost import NaturalGasEnergyCost -from smart_control.reward.setpoint_energy_carbon_regret import SetpointEnergyCarbonRegretFunction -from smart_control.simulator.air_handler import AirHandler -from smart_control.simulator.boiler import Boiler -from smart_control.simulator.building import MaterialProperties -from smart_control.simulator.hvac_floorplan_based import FloorPlanBasedHvac -from smart_control.simulator.randomized_arrival_departure_occupancy import RandomizedArrivalDepartureOccupancy -from smart_control.simulator.simulator_building import SimulatorBuilding -from smart_control.simulator.stochastic_convection_simulator import StochasticConvectionSimulator -from smart_control.simulator.tf_simulator import TFSimulator -from smart_control.simulator.weather_controller import ReplayWeatherController -from smart_control.utils import controller_reader -from smart_control.utils import histogram_reducer -from smart_control.utils.constants import ROOT_DIR -from smart_control.utils.controller_writer import ProtoWriterFactory -from smart_control.utils.environment_utils import to_timestamp -from smart_control.utils.observation_normalizer import StandardScoreObservationNormalizer +from smart_buildings.smart_control.reward.electricity_energy_cost import ElectricityEnergyCost +from smart_buildings.smart_control.reward.natural_gas_energy_cost import NaturalGasEnergyCost +from smart_buildings.smart_control.reward.setpoint_energy_carbon_regret import SetpointEnergyCarbonRegretFunction +from smart_buildings.smart_control.simulator.air_handler import AirHandler +from smart_buildings.smart_control.simulator.boiler import Boiler +from smart_buildings.smart_control.simulator.building import MaterialProperties +from smart_buildings.smart_control.simulator.hvac_floorplan_based import FloorPlanBasedHvac +from smart_buildings.smart_control.simulator.randomized_arrival_departure_occupancy import RandomizedArrivalDepartureOccupancy +from smart_buildings.smart_control.simulator.simulator_building import SimulatorBuilding +from smart_buildings.smart_control.simulator.stochastic_convection_simulator import StochasticConvectionSimulator +from smart_buildings.smart_control.simulator.tf_simulator import TFSimulator +from smart_buildings.smart_control.simulator.weather_controller import ReplayWeatherController +from smart_buildings.smart_control.utils import controller_reader +from smart_buildings.smart_control.utils import histogram_reducer +from smart_buildings.smart_control.utils.controller_writer import ProtoWriterFactory +from smart_buildings.smart_control.utils.environment_utils import to_timestamp +from smart_buildings.smart_control.utils.observation_normalizer import StandardScoreObservationNormalizer # pylint: enable=unused-import -# Relative filepaths. Consider moving to reinforcement_learning/constants.py +# Path to the root directory of the project: +ROOT_DIR = os.path.join(os.path.dirname(__file__), "..", "..", "..") # fmt: off # pylint: disable=line-too-long DATA_PATH = os.path.join(ROOT_DIR, "smart_control", "configs", "resources", "sb1") diff --git a/smart_control/reinforcement_learning/utils/config_test.py b/smart_control/reinforcement_learning/utils/config_test.py index 2bfb08bb..d4e343ad 100644 --- a/smart_control/reinforcement_learning/utils/config_test.py +++ b/smart_control/reinforcement_learning/utils/config_test.py @@ -1,10 +1,8 @@ -"""Tests for reinforcement learning utils config.""" - import os from absl.testing import absltest -from smart_control.utils.constants import ROOT_DIR +from smart_buildings.smart_control.reinforcement_learning.utils.config import ROOT_DIR class TestConfigPaths(absltest.TestCase): diff --git a/smart_control/reinforcement_learning/utils/data_processing.py b/smart_control/reinforcement_learning/utils/data_processing.py index fbd976ce..1d8e3189 100644 --- a/smart_control/reinforcement_learning/utils/data_processing.py +++ b/smart_control/reinforcement_learning/utils/data_processing.py @@ -7,10 +7,10 @@ import numpy as np import pandas as pd -from smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE -from smart_control.reinforcement_learning.utils.constants import KELVIN_TO_CELSIUS -from smart_control.utils import controller_reader -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE +from smart_buildings.smart_control.reinforcement_learning.utils.constants import KELVIN_TO_CELSIUS +from smart_buildings.smart_control.utils import controller_reader +from smart_buildings.smart_control.utils import conversion_utils logger = logging.getLogger(__name__) diff --git a/smart_control/reinforcement_learning/utils/data_processing_test.py b/smart_control/reinforcement_learning/utils/data_processing_test.py index a0952c38..4e708776 100644 --- a/smart_control/reinforcement_learning/utils/data_processing_test.py +++ b/smart_control/reinforcement_learning/utils/data_processing_test.py @@ -1,9 +1,7 @@ -"""Tests for reinforcement learning data processing utils.""" - from absl.testing import absltest -from smart_control.reinforcement_learning.utils.data_processing import convert_celsius_to_kelvin -from smart_control.reinforcement_learning.utils.data_processing import convert_kelvin_to_celsius +from smart_buildings.smart_control.reinforcement_learning.utils.data_processing import convert_celsius_to_kelvin +from smart_buildings.smart_control.reinforcement_learning.utils.data_processing import convert_kelvin_to_celsius class TestTempConversions(absltest.TestCase): diff --git a/smart_control/reinforcement_learning/utils/environment.py b/smart_control/reinforcement_learning/utils/environment.py index 1808b1f6..d8228381 100644 --- a/smart_control/reinforcement_learning/utils/environment.py +++ b/smart_control/reinforcement_learning/utils/environment.py @@ -2,8 +2,8 @@ import gin -from smart_control.environment.environment import Environment -from smart_control.reinforcement_learning.utils.constants import DEFAULT_OCCUPANCY_NORMALIZATION_CONSTANT +from smart_buildings.smart_control.environment.environment import Environment +from smart_buildings.smart_control.reinforcement_learning.utils.constants import DEFAULT_OCCUPANCY_NORMALIZATION_CONSTANT def load_environment(gin_config_file: str): diff --git a/smart_control/reinforcement_learning/utils/metrics.py b/smart_control/reinforcement_learning/utils/metrics.py index 6283f567..62e2cfd7 100644 --- a/smart_control/reinforcement_learning/utils/metrics.py +++ b/smart_control/reinforcement_learning/utils/metrics.py @@ -10,7 +10,7 @@ from tf_agents.trajectories import time_step as ts from tf_agents.trajectories import trajectory -from smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE +from smart_buildings.smart_control.reinforcement_learning.utils.constants import DEFAULT_TIME_ZONE logger = logging.getLogger(__name__) diff --git a/smart_control/reward/BUILD b/smart_control/reward/BUILD deleted file mode 100644 index d087115b..00000000 --- a/smart_control/reward/BUILD +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Defines implementations of rewards for Smart Buildings. - -load("//devtools/python/blaze:pytype.bzl", "pytype_strict_library") -load("//devtools/python/blaze:strict.bzl", "py_strict_test") - -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -pytype_strict_library( - name = "setpoint_energy_carbon_regret", - srcs = ["setpoint_energy_carbon_regret.py"], - deps = [ - ":base_setpoint_energy_carbon_reward", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_energy_cost", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "setpoint_energy_carbon_regret_test", - srcs = ["setpoint_energy_carbon_regret_test.py"], - deps = [ - ":setpoint_energy_carbon_regret", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_energy_cost", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "base_setpoint_energy_carbon_reward", - srcs = ["base_setpoint_energy_carbon_reward.py"], - deps = [ - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_energy_cost", - "//third_party/py/smart_buildings/smart_control/models:base_reward_function", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "base_setpoint_energy_carbon_reward_test", - srcs = ["base_setpoint_energy_carbon_reward_test.py"], - deps = [ - ":base_setpoint_energy_carbon_reward", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_energy_cost", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "setpoint_energy_carbon_reward", - srcs = ["setpoint_energy_carbon_reward.py"], - deps = [ - ":base_setpoint_energy_carbon_reward", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_energy_cost", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "setpoint_energy_carbon_reward_test", - srcs = ["setpoint_energy_carbon_reward_test.py"], - deps = [ - ":setpoint_energy_carbon_reward", - "//third_party/py/absl/logging", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_energy_cost", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "natural_gas_energy_cost", - srcs = ["natural_gas_energy_cost.py"], - deps = [ - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_energy_cost", - "//third_party/py/smart_buildings/smart_control/utils:constants", - ], -) - -py_strict_test( - name = "natural_gas_energy_cost_test", - srcs = ["natural_gas_energy_cost_test.py"], - deps = [ - ":natural_gas_energy_cost", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/utils:constants", - ], -) - -pytype_strict_library( - name = "electricity_energy_cost", - srcs = ["electricity_energy_cost.py"], - deps = [ - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/pint", - "//third_party/py/smart_buildings/smart_control/models:base_energy_cost", - "//third_party/py/smart_buildings/smart_control/utils:constants", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "electricity_energy_cost_test", - srcs = ["electricity_energy_cost_test.py"], - deps = [ - ":electricity_energy_cost", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - ], -) diff --git a/smart_control/reward/__init__.py b/smart_control/reward/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/reward/base_setpoint_energy_carbon_reward.py b/smart_control/reward/base_setpoint_energy_carbon_reward.py index d725c5e1..a1be9231 100644 --- a/smart_control/reward/base_setpoint_energy_carbon_reward.py +++ b/smart_control/reward/base_setpoint_energy_carbon_reward.py @@ -5,9 +5,9 @@ import gin import numpy as np -from smart_control.models.base_reward_function import BaseRewardFunction -from smart_control.proto import smart_control_reward_pb2 -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_reward_function import BaseRewardFunction +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import conversion_utils @gin.configurable() @@ -150,6 +150,18 @@ def _sum_electricity_energy_rate( electrical_energy_rate += energy_reward_info.boiler_reward_infos[ bid ].pump_electrical_energy_rate + + # Sum up the power in Watts for the total power. Take the abs of the heat + # pump to ensure both heating (positive), and cooling (negative) are + # assessed as energy consumed. + for heat_pump_info in energy_reward_info.heat_pump_reward_infos.values(): + electrical_energy_rate += np.abs( + heat_pump_info.pump_electrical_energy_rate + ) + electrical_energy_rate += np.abs( + heat_pump_info.electricity_heating_energy_rate + ) + return electrical_energy_rate def _sum_natural_gas_energy_rate( diff --git a/smart_control/reward/base_setpoint_energy_carbon_reward_test.py b/smart_control/reward/base_setpoint_energy_carbon_reward_test.py index 03d35170..936b9702 100644 --- a/smart_control/reward/base_setpoint_energy_carbon_reward_test.py +++ b/smart_control/reward/base_setpoint_energy_carbon_reward_test.py @@ -1,13 +1,11 @@ -"""Tests for setpoint_energy_carbon_reward.""" - from absl.testing import absltest from absl.testing import parameterized import pandas as pd -from smart_control.models.base_energy_cost import BaseEnergyCost -from smart_control.proto import smart_control_reward_pb2 -from smart_control.reward import base_setpoint_energy_carbon_reward -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_energy_cost import BaseEnergyCost +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.reward import base_setpoint_energy_carbon_reward +from smart_buildings.smart_control.utils import conversion_utils class BaseSetpointEnergyCarbonRewardTest(parameterized.TestCase): @@ -45,12 +43,36 @@ def test_sum_zone_productivities(self): self.assertEqual(10.0, occupancy) self.assertAlmostEqual(5000.0 / 12.0, productivity_reward, delta=0.001) - def test_sum_electricity_energy_rate(self): - info = self._get_test_reward_info() + @parameterized.named_parameters([ + ('boiler', 5000.0, 250.0, 0.0, 0.0), + ('heat_pump', 0.0, 0.0, 5000.0, 250.0), + ]) + def test_sum_electricity_energy_rate( + self, + natural_gas_heating_energy_rate, + boiler_pump_electrical_energy_rate, + heat_pump_electricity_heating_energy_rate, + heat_pump_pump_electrical_energy_rate, + ): + info = self._get_test_reward_info( + natural_gas_heating_energy_rate=natural_gas_heating_energy_rate, + boiler_pump_electrical_energy_rate=boiler_pump_electrical_energy_rate, + heat_pump_electricity_heating_energy_rate=heat_pump_electricity_heating_energy_rate, + heat_pump_pump_electrical_energy_rate=heat_pump_pump_electrical_energy_rate, + ) reward_fn = self._get_test_reward_function() energy_rate = reward_fn._sum_electricity_energy_rate(info) # Expected = 1 units x (pump + a/c + blower) - self.assertAlmostEqual((250.0 + 4500.0 + 800.0), energy_rate, delta=0.001) + sum_heating_electricity_energy_rate = ( + + boiler_pump_electrical_energy_rate + + heat_pump_electricity_heating_energy_rate + + heat_pump_pump_electrical_energy_rate + ) + self.assertAlmostEqual( + (sum_heating_electricity_energy_rate + 4500.0 + 800.0), + energy_rate, + delta=0.001, + ) def test_sum_natural_gas_energy_rate(self): info = self._get_test_reward_info() @@ -84,7 +106,9 @@ def _get_test_reward_info( blower_electrical_energy_rate=800.0, air_conditioning_electrical_energy_rate=4500.0, natural_gas_heating_energy_rate=5000.0, - pump_electrical_energy_rate=250.0, + boiler_pump_electrical_energy_rate=250.0, + heat_pump_electricity_heating_energy_rate=0, + heat_pump_pump_electrical_energy_rate=0.0, ): heating_setpoint_temperature = 293.0 cooling_setpoint_temperature = 297.0 @@ -128,8 +152,17 @@ def _get_test_reward_info( boiler_info.natural_gas_heating_energy_rate = ( natural_gas_heating_energy_rate ) - boiler_info.pump_electrical_energy_rate = pump_electrical_energy_rate + boiler_info.pump_electrical_energy_rate = boiler_pump_electrical_energy_rate info.boiler_reward_infos['boiler_0'].CopyFrom(boiler_info) + + heat_pump_info = smart_control_reward_pb2.RewardInfo.HeatPumpRewardInfo() + heat_pump_info.electricity_heating_energy_rate = ( + heat_pump_electricity_heating_energy_rate + ) + heat_pump_info.pump_electrical_energy_rate = ( + heat_pump_pump_electrical_energy_rate + ) + info.heat_pump_reward_infos['heat_pump_0'].CopyFrom(heat_pump_info) return info diff --git a/smart_control/reward/electricity_energy_cost.py b/smart_control/reward/electricity_energy_cost.py index 42001d5b..6ba717ae 100644 --- a/smart_control/reward/electricity_energy_cost.py +++ b/smart_control/reward/electricity_energy_cost.py @@ -8,8 +8,8 @@ import pandas as pd import pint -from smart_control.models.base_energy_cost import BaseEnergyCost -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_energy_cost import BaseEnergyCost +from smart_buildings.smart_control.utils import conversion_utils UNIT = pint.UnitRegistry() UNIT.define("cents_per_kWh = cents / kWh") diff --git a/smart_control/reward/electricity_energy_cost_test.py b/smart_control/reward/electricity_energy_cost_test.py index 6e033d62..fb2ce672 100644 --- a/smart_control/reward/electricity_energy_cost_test.py +++ b/smart_control/reward/electricity_energy_cost_test.py @@ -1,10 +1,8 @@ -"""Tests for electricity_energy_cost.""" - from absl.testing import absltest from absl.testing import parameterized import pandas as pd -from smart_control.reward import electricity_energy_cost +from smart_buildings.smart_control.reward import electricity_energy_cost class ElectricityEnergyCostTest(parameterized.TestCase): diff --git a/smart_control/reward/natural_gas_energy_cost.py b/smart_control/reward/natural_gas_energy_cost.py index e87a2b43..a939aedd 100644 --- a/smart_control/reward/natural_gas_energy_cost.py +++ b/smart_control/reward/natural_gas_energy_cost.py @@ -7,8 +7,8 @@ import numpy as np import pandas as pd -from smart_control.models.base_energy_cost import BaseEnergyCost -from smart_control.utils import constants +from smart_buildings.smart_control.models.base_energy_cost import BaseEnergyCost +from smart_buildings.smart_control.utils import constants # Source: https://www.eia.gov/dnav/ng/hist/n3035ca3m.htm # For 2020, units: Dollars per Thousand Cubic Feet @@ -39,9 +39,9 @@ class NaturalGasEnergyCost(BaseEnergyCost): def __init__( self, gas_price_by_month: Sequence[float] = GAS_PRICE_BY_MONTH_SOURCE ): - if len(gas_price_by_month) != 12: - raise ValueError('Gas price per month must have exactly 12 values.') - + assert ( + len(gas_price_by_month) == 12 + ), 'Gas price per month must have exactly 12 values.' # Convert the month-by-month gas price from $/1000 cubic feet to $/Joule. self._month_gas_price = ( np.array(gas_price_by_month) diff --git a/smart_control/reward/natural_gas_energy_cost_test.py b/smart_control/reward/natural_gas_energy_cost_test.py index 1aa563e2..ef76c687 100644 --- a/smart_control/reward/natural_gas_energy_cost_test.py +++ b/smart_control/reward/natural_gas_energy_cost_test.py @@ -1,11 +1,9 @@ -"""Tests for natural_gas_energy_cost.""" - from absl.testing import absltest from absl.testing import parameterized import pandas as pd -from smart_control.reward import natural_gas_energy_cost -from smart_control.utils import constants +from smart_buildings.smart_control.reward import natural_gas_energy_cost +from smart_buildings.smart_control.utils import constants class NaturalGasEnergyCostTest(parameterized.TestCase): @@ -69,15 +67,6 @@ def test_invalid_carbon_cost(self): energy_rate = -1.0 self.assertEqual(0.0, cost.cost(start_time, end_time, energy_rate)) - def test_invalid_gas_price_by_month_length(self): - """ValueError if gas_price_by_month does not have exactly 12 values.""" - with self.assertRaisesRegex( - ValueError, 'Gas price per month must have exactly 12 values' - ): - natural_gas_energy_cost.NaturalGasEnergyCost( - gas_price_by_month=[1.0, 2.0, 3.0] # Only 3 values instead of 12 - ) - if __name__ == '__main__': absltest.main() diff --git a/smart_control/reward/setpoint_energy_carbon_regret.py b/smart_control/reward/setpoint_energy_carbon_regret.py index 0349bd4d..7f9d15be 100644 --- a/smart_control/reward/setpoint_energy_carbon_regret.py +++ b/smart_control/reward/setpoint_energy_carbon_regret.py @@ -1,6 +1,5 @@ """Reward (Regret) Function for Smart Buildings. - The reward function provides a feedback signal to the reinforcement learning agent that indicates the benefit of the action taken. During training, the agent learns an action policy to maximize the cumulative, or long-term reward. @@ -67,19 +66,20 @@ deadband. Productivity decays smoothly on a logistic curve outside the deadband. """ -import gin +from typing import Any -from smart_control.models.base_energy_cost import BaseEnergyCost -from smart_control.proto import smart_control_reward_pb2 -from smart_control.reward.base_setpoint_energy_carbon_reward import BaseSetpointEnergyCarbonRewardFunction -from smart_control.utils import conversion_utils +import gin +from smart_buildings.smart_control.models import base_energy_cost +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.reward import base_setpoint_energy_carbon_reward +from smart_buildings.smart_control.utils import conversion_utils _HOUR_SEC = 3600.0 @gin.configurable() class SetpointEnergyCarbonRegretFunction( - BaseSetpointEnergyCarbonRewardFunction + base_setpoint_energy_carbon_reward.BaseSetpointEnergyCarbonRewardFunction ): """Reward function based on productivity, energy cost and carbon emission. @@ -104,8 +104,8 @@ def __init__( max_natural_gas_rate: float, productivity_midpoint_delta: float, productivity_decay_stiffness: float, - electricity_energy_cost: BaseEnergyCost, - natural_gas_energy_cost: BaseEnergyCost, + electricity_energy_cost: base_energy_cost.BaseEnergyCost, + natural_gas_energy_cost: base_energy_cost.BaseEnergyCost, productivity_weight: float, energy_cost_weight: float, carbon_emission_weight: float, @@ -124,14 +124,49 @@ def __init__( self._energy_cost_weight = energy_cost_weight self._carbon_emission_weight = carbon_emission_weight - if ( + assert ( self._max_productivity_personhour_usd - <= self._min_productivity_personhour_usd - ): - raise ValueError( - 'Maximum productivity per person-hour must be greater ' - 'than minimum productivity.' - ) + > self._min_productivity_personhour_usd + ) + + @property + def energy_cost_weight(self) -> float: + """Returns the energy cost weight of the reward function.""" + return self._energy_cost_weight + + @property + def carbon_emission_weight(self) -> float: + """Returns the carbon emission weight of the reward function.""" + return self._carbon_emission_weight + + @property + def productivity_weight(self) -> float: + """Returns the productivity weight of the reward function.""" + return self._productivity_weight + + @property + def weights(self) -> dict[str, float]: + """Returns the weights of the reward function.""" + return { + "energy_cost_weight": self._energy_cost_weight, + "carbon_emission_weight": self._carbon_emission_weight, + "productivity_weight": self._productivity_weight, + } + + @property + def json_metadata(self) -> dict[str, Any]: + """Info to write into a JSON file. Needs to be serializable.""" + return { + "max_productivity_personhour_usd": self._max_productivity_personhour_usd, # pylint: disable=line-too-long + "min_productivity_personhour_usd": self._min_productivity_personhour_usd, # pylint: disable=line-too-long + "max_electricity_rate": self._max_electricity_rate, + "max_natural_gas_rate": self._max_natural_gas_rate, + "productivity_midpoint_delta": self._productivity_midpoint_delta, + "productivity_decay_stiffness": self._productivity_decay_stiffness, + "productivity_weight": self._productivity_weight, + "energy_cost_weight": self._energy_cost_weight, + "carbon_emission_weight": self._carbon_emission_weight, + } def compute_reward( self, reward_info: smart_control_reward_pb2.RewardInfo @@ -239,17 +274,23 @@ def compute_reward( combined_energy_cost = ( actual_electricity_energy_cost + actual_natural_gas_energy_cost ) - normalized_energy_cost = combined_energy_cost / ( - max_electricity_energy_cost + max_natural_gas_energy_cost - ) + if max_electricity_energy_cost + max_natural_gas_energy_cost > 0.0: + normalized_energy_cost = combined_energy_cost / ( + max_electricity_energy_cost + max_natural_gas_energy_cost + ) + else: + normalized_energy_cost = 0.0 combined_carbon_emission = ( actual_electricity_carbon_emission + actual_natural_gas_carbon_emission ) - normalized_carbon_emission = combined_carbon_emission / ( - max_electricity_carbon_emission + max_natural_gas_carbon_emission - ) + if max_electricity_carbon_emission + max_natural_gas_carbon_emission > 0.0: + normalized_carbon_emission = combined_carbon_emission / ( + max_electricity_carbon_emission + max_natural_gas_carbon_emission + ) + else: + normalized_carbon_emission = 0.0 response.carbon_emitted = combined_carbon_emission diff --git a/smart_control/reward/setpoint_energy_carbon_regret_test.py b/smart_control/reward/setpoint_energy_carbon_regret_test.py index 9edbd1a4..4227f21b 100644 --- a/smart_control/reward/setpoint_energy_carbon_regret_test.py +++ b/smart_control/reward/setpoint_energy_carbon_regret_test.py @@ -1,153 +1,186 @@ -"""Tests for setpoint_energy_carbon_reward.""" - from absl.testing import absltest from absl.testing import parameterized import pandas as pd -from smart_control.models.base_energy_cost import BaseEnergyCost -from smart_control.proto import smart_control_reward_pb2 -from smart_control.reward import setpoint_energy_carbon_regret -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_energy_cost import BaseEnergyCost +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.reward import setpoint_energy_carbon_regret +from smart_buildings.smart_control.utils import conversion_utils class SetpointEnergyCarbonRegretTest(parameterized.TestCase): @parameterized.named_parameters([ - ( - 'occupied_in_setpoint_no_energy', - 293.0, - 10.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 1.0, - 1.0, - 0.0, - 5000.0 / 6, - 0.0, - 0.0, - 0.0, + dict( + testcase_name='occupied_in_setpoint_no_energy', + zone_air_temperature=293.0, + average_occupancy=10.0, + blower_electrical_energy_rate=0.0, + air_conditioning_electrical_energy_rate=0.0, + natural_gas_heating_energy_rate=0.0, + pump_electrical_energy_rate=0.0, + productivity_weight=1.0, + energy_cost_weight=1.0, + carbon_emission_weight=1.0, + expected_reward=0.0, + expected_productivity=5000.0 / 6, + expected_electrical_energy_cost=0.0, + expected_natural_gas_cost=0.0, + expected_carbon_emitted=0.0, + max_electricity_rate=10000.0, + max_natural_gas_rate=10000.0, ), - ( - 'occupied_above_setpoint_no_energy', - 298.5, - 10.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 1.0, - 1.0, - -0.2381, - 2500.0 / 6, - 0.0, - 0.0, - 0.0, + dict( + testcase_name='occupied_above_setpoint_no_energy', + zone_air_temperature=298.5, + average_occupancy=10.0, + blower_electrical_energy_rate=0.0, + air_conditioning_electrical_energy_rate=0.0, + natural_gas_heating_energy_rate=0.0, + pump_electrical_energy_rate=0.0, + productivity_weight=1.0, + energy_cost_weight=1.0, + carbon_emission_weight=1.0, + expected_reward=-0.2381, + expected_productivity=2500.0 / 6, + expected_electrical_energy_cost=0.0, + expected_natural_gas_cost=0.0, + expected_carbon_emitted=0.0, + max_electricity_rate=10000.0, + max_natural_gas_rate=10000.0, + ), + dict( + testcase_name='occupied_below_setpoint_no_energy', + zone_air_temperature=291.5, + average_occupancy=10.0, + blower_electrical_energy_rate=0.0, + air_conditioning_electrical_energy_rate=0.0, + natural_gas_heating_energy_rate=0.0, + pump_electrical_energy_rate=0.0, + productivity_weight=1.0, + energy_cost_weight=1.0, + carbon_emission_weight=1.0, + expected_reward=-0.2381, + expected_productivity=2500.0 / 6, + expected_electrical_energy_cost=0.0, + expected_natural_gas_cost=0.0, + expected_carbon_emitted=0.0, + max_electricity_rate=10000.0, + max_natural_gas_rate=10000.0, ), - ( - 'occupied_below_setpoint_no_energy', - 291.5, - 10.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 1.0, - 1.0, - -0.2381, - 2500.0 / 6, - 0.0, - 0.0, - 0.0, + dict( + testcase_name='occupied_in_setpoint_gas_only_no_carbon_weight', + zone_air_temperature=293.0, + average_occupancy=10.0, + blower_electrical_energy_rate=0.0, + air_conditioning_electrical_energy_rate=0.0, + natural_gas_heating_energy_rate=5000.0, + pump_electrical_energy_rate=0.0, + productivity_weight=1.0, + energy_cost_weight=1.0, + carbon_emission_weight=0.0, + expected_reward=-0.125, + expected_productivity=5000.0 / 6, + expected_electrical_energy_cost=0.0, + expected_natural_gas_cost=0.0208, + expected_carbon_emitted=0.004166, + max_electricity_rate=10000.0, + max_natural_gas_rate=10000.0, ), - ( - 'occupied_in_setpoint_gas_only_no_carbon_weight', - 293.0, - 10.0, - 0.0, - 0.0, - 5000.0, - 0.0, - 1.0, - 1.0, - 0.0, - -0.125, - 5000.0 / 6, - 0.0, - 0.0208, - 0.004166, + dict( + testcase_name='occupied_in_setpoint_electricity_no_carbon_weight', + zone_air_temperature=293.0, + average_occupancy=10.0, + blower_electrical_energy_rate=2000.0, + air_conditioning_electrical_energy_rate=2000.0, + natural_gas_heating_energy_rate=0.0, + pump_electrical_energy_rate=2000.0, + productivity_weight=1.0, + energy_cost_weight=1.0, + carbon_emission_weight=0.0, + expected_reward=-0.15, + expected_productivity=5000.0 / 6, + expected_electrical_energy_cost=0.025, + expected_natural_gas_cost=0.0, + expected_carbon_emitted=0.005, + max_electricity_rate=10000.0, + max_natural_gas_rate=10000.0, ), - ( - 'occupied_in_setpoint_electricity_only_no_carbon_weight', - 293.0, - 10.0, - 2000.0, - 2000.0, - 0.0, - 2000.0, - 1.0, - 1.0, - 0.0, - -0.15, - 5000.0 / 6, - 0.025, - 0.0, - 0.005, + dict( + testcase_name='occupied_in_setpoint_no_carbon_weight', + zone_air_temperature=293.0, + average_occupancy=10.0, + blower_electrical_energy_rate=2000.0, + air_conditioning_electrical_energy_rate=2000.0, + natural_gas_heating_energy_rate=5000.0, + pump_electrical_energy_rate=2000.0, + productivity_weight=1.0, + energy_cost_weight=1.0, + carbon_emission_weight=0.0, + expected_reward=-0.125 - 0.15, + expected_productivity=5000.0 / 6, + expected_electrical_energy_cost=0.025, + expected_natural_gas_cost=0.0208, + expected_carbon_emitted=0.005 + 0.004166, + max_electricity_rate=10000.0, + max_natural_gas_rate=10000.0, ), - ( - 'occupied_in_setpoint_no_carbon_weight', - 293.0, - 10.0, - 2000.0, - 2000.0, - 5000.0, - 2000.0, - 1.0, - 1.0, - 0.0, - -0.125 - 0.15, - 5000.0 / 6, - 0.025, - 0.0208, - 0.005 + 0.004166, + dict( + testcase_name='occupied_in_setpoint', + zone_air_temperature=293.0, + average_occupancy=10.0, + blower_electrical_energy_rate=2000.0, + air_conditioning_electrical_energy_rate=2000.0, + natural_gas_heating_energy_rate=5000.0, + pump_electrical_energy_rate=2000.0, + productivity_weight=1.0, + energy_cost_weight=1.0, + carbon_emission_weight=1.0, + expected_reward=-0.125 - 0.15 - 0.09166, + expected_productivity=5000.0 / 6, + expected_electrical_energy_cost=0.025, + expected_natural_gas_cost=0.0208, + expected_carbon_emitted=0.005 + 0.004166, + max_electricity_rate=10000.0, + max_natural_gas_rate=10000.0, ), - ( - 'occupied_in_setpoint', - 293.0, - 10.0, - 2000.0, - 2000.0, - 5000.0, - 2000.0, - 1.0, - 1.0, - 1.0, - -0.125 - 0.15 - 0.09166, - 5000.0 / 6, - 0.025, - 0.0208, - 0.005 + 0.004166, + dict( + testcase_name='max_regret', + zone_air_temperature=280.0, + average_occupancy=10.0, + blower_electrical_energy_rate=3000.0, + air_conditioning_electrical_energy_rate=3000.0, + natural_gas_heating_energy_rate=10000.0, + pump_electrical_energy_rate=6000.0, + productivity_weight=1.0, + energy_cost_weight=1.0, + carbon_emission_weight=1.0, + expected_reward=-1.0, + expected_productivity=1500.0 / 6, + expected_electrical_energy_cost=0.041666, + expected_natural_gas_cost=0.04166, + expected_carbon_emitted=0.01666, + max_electricity_rate=10000.0, + max_natural_gas_rate=10000.0, ), - ( - 'max_regret', - 280.0, - 10.0, - 3000.0, - 3000.0, - 10000.0, - 6000.0, - 1.0, - 1.0, - 1.0, - -1.0, - 1500.0 / 6, - 0.041666, - 0.04166, - 0.01666, + dict( + testcase_name='zero_natural_gas', + zone_air_temperature=280.0, + average_occupancy=10.0, + blower_electrical_energy_rate=3000.0, + air_conditioning_electrical_energy_rate=3000.0, + natural_gas_heating_energy_rate=10000.0, + pump_electrical_energy_rate=6000.0, + productivity_weight=1.0, + energy_cost_weight=1.0, + carbon_emission_weight=1.0, + expected_reward=-1.0, + expected_productivity=1500.0 / 6, + expected_electrical_energy_cost=0.041666, + expected_natural_gas_cost=0.0, + expected_carbon_emitted=0.00833, + max_electricity_rate=10000.0, + max_natural_gas_rate=0.0, ), ]) def test_compute_reward( @@ -166,6 +199,8 @@ def test_compute_reward( expected_electrical_energy_cost, expected_natural_gas_cost, expected_carbon_emitted, + max_electricity_rate, + max_natural_gas_rate, ): info = self._get_test_reward_info( zone_air_temperature, @@ -177,7 +212,11 @@ def test_compute_reward( ) reward_fn = self._get_test_reward_function( - productivity_weight, energy_cost_weight, carbon_emission_weight + productivity_weight, + energy_cost_weight, + carbon_emission_weight, + max_electricity_rate, + max_natural_gas_rate, ) response = reward_fn.compute_reward(info) @@ -196,9 +235,11 @@ def test_compute_reward( def _get_test_reward_function( self, - productivity_weight=1.0, - energy_cost_weight=1.0, - carbon_emission_weight=1.0, + productivity_weight: float = 1.0, + energy_cost_weight: float = 1.0, + carbon_emission_weight: float = 1.0, + max_electricity_rate: float = 10000.0, + max_natural_gas_rate: float = 10000.0, ): max_productivity_personhour_usd = 500.0 min_productivity_personhour_usd = 150.0 @@ -206,8 +247,6 @@ def _get_test_reward_function( productivity_decay_stiffness = 4.3 productivity_midpoint_delta = 1.5 - max_electricity_rate = 10000.0 - max_natural_gas_rate = 10000.0 electricity_energy_cost = TestEnergyCost(0.05, 0.01) natural_gas_energy_cost = TestEnergyCost(0.05, 0.01) @@ -280,28 +319,20 @@ def _get_test_reward_info( return info - def test_invalid_productivity_bounds(self): - """ValueError if max_productivity <= min_productivity.""" - electricity_cost = TestEnergyCost(usd_per_kwh=0.05, kg_per_kwh=0.01) - natural_gas_cost = TestEnergyCost(usd_per_kwh=0.05, kg_per_kwh=0.01) - - with self.assertRaisesRegex( - ValueError, - 'Maximum productivity per person-hour must be greater than minimum', - ): - setpoint_energy_carbon_regret.SetpointEnergyCarbonRegretFunction( - max_productivity_personhour_usd=100.0, - min_productivity_personhour_usd=200.0, # min > max: invalid - max_electricity_rate=10000.0, - max_natural_gas_rate=10000.0, - productivity_midpoint_delta=1.5, - productivity_decay_stiffness=4.3, - electricity_energy_cost=electricity_cost, - natural_gas_energy_cost=natural_gas_cost, - productivity_weight=1.0, - energy_cost_weight=1.0, - carbon_emission_weight=1.0, - ) + def test_weights(self): + reward_fn = self._get_test_reward_function( + productivity_weight=0.5, + energy_cost_weight=0.3, + carbon_emission_weight=0.2, + ) + self.assertEqual( + reward_fn.weights, + { + 'energy_cost_weight': 0.3, + 'carbon_emission_weight': 0.2, + 'productivity_weight': 0.5, + }, + ) class TestEnergyCost(BaseEnergyCost): diff --git a/smart_control/reward/setpoint_energy_carbon_reward.py b/smart_control/reward/setpoint_energy_carbon_reward.py index 3454a134..482d8d00 100644 --- a/smart_control/reward/setpoint_energy_carbon_reward.py +++ b/smart_control/reward/setpoint_energy_carbon_reward.py @@ -21,10 +21,10 @@ r = s(setpoint) - u x f(cost) - w x g(carbon) where: r is the incremental reward at this step - s(setpoint) is the reward for maintaining setpoint + s(setpoint) is the reward for maintining setpoint f(cost) is the cost of consuming electrical and natural gas energy g(carbon) is the cost of emitting carbon, - and u, w are weighing factors for cost and carbon depending on the policy. + and u, w are weighing factors for cost and carbon dependingon the policy. The fundamental metric unit of energy is the Joule (J), and the unit of energy applied over a fixed time interval (energy rate) is power measured in J/sec or @@ -61,10 +61,10 @@ import gin -from smart_control.models.base_energy_cost import BaseEnergyCost -from smart_control.proto import smart_control_reward_pb2 -from smart_control.reward.base_setpoint_energy_carbon_reward import BaseSetpointEnergyCarbonRewardFunction -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_energy_cost import BaseEnergyCost +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.reward.base_setpoint_energy_carbon_reward import BaseSetpointEnergyCarbonRewardFunction +from smart_buildings.smart_control.utils import conversion_utils @gin.configurable() diff --git a/smart_control/reward/setpoint_energy_carbon_reward_test.py b/smart_control/reward/setpoint_energy_carbon_reward_test.py index 912b8d25..cfe659a6 100644 --- a/smart_control/reward/setpoint_energy_carbon_reward_test.py +++ b/smart_control/reward/setpoint_energy_carbon_reward_test.py @@ -1,14 +1,12 @@ -"""Tests for setpoint_energy_carbon_reward.""" - from absl import logging from absl.testing import absltest from absl.testing import parameterized import pandas as pd -from smart_control.models.base_energy_cost import BaseEnergyCost -from smart_control.proto import smart_control_reward_pb2 -from smart_control.reward import setpoint_energy_carbon_reward -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_energy_cost import BaseEnergyCost +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.reward import setpoint_energy_carbon_reward +from smart_buildings.smart_control.utils import conversion_utils class SetpointEnergyCarbonRewardTest(parameterized.TestCase): diff --git a/smart_control/services/weather/base_forecast.py b/smart_control/services/weather/base_forecast.py new file mode 100644 index 00000000..948a8bc4 --- /dev/null +++ b/smart_control/services/weather/base_forecast.py @@ -0,0 +1,275 @@ +"""Base weather forecast. + +A weather **forecast** is a collection of sequential forecast periods. + +A forecast is generally represented "on the hour" using times like 10:00, 11:00, +12:00, etc. However, it is capable of creating a copy of itself that is +normalized to a given start time (e.g. 10:05, 11:05, 12:05, etc.), and in this +case uses linearly interpolated temperature values for each normalized period. +""" + +from collections.abc import Sequence +import dataclasses +import datetime +import functools +from typing import Self + +import numpy as np +import pandas as pd +from smart_buildings.smart_control.services.weather import base_forecast_period +from smart_buildings.smart_control.utils import temperature_conversion + + +@dataclasses.dataclass(frozen=True) +class BaseForecast: + """A collection of forecast periods. + + The forecast can represent any sequence of forecast periods, depending on the + source of the forecast data. For example: + + - a seven-day forecast, with one or two periods per day + - a single-day forecast, with one period per hour + - etc. + + Attributes: + periods: A sequence of forecast periods. + interpolation_interval: The time delta between period start times to use + when constructing an interpolated / normalized version of the forecast. + """ + + periods: Sequence[base_forecast_period.BaseForecastPeriod] + interpolation_interval: pd.Timedelta = pd.Timedelta(minutes=1) + + def __post_init__(self): + self._validate_periods() + + def _validate_periods(self): + """Validates periods are sorted by start_timestamp in ascending order.""" + if not self.periods: + raise ValueError("Periods cannot be empty.") + + sorted_periods = sorted(self.periods, key=lambda p: p.start_timestamp) + if list(self.periods) != sorted_periods: + raise ValueError( + "Periods must be sorted by start_timestamp in ascending order." + ) + + @property + def first_period(self) -> base_forecast_period.BaseForecastPeriod: + """The forecast period with the earliest start time.""" + return self.periods[0] + + @property + def last_period(self) -> base_forecast_period.BaseForecastPeriod: + """The forecast period with the latest start time.""" + return self.periods[-1] + + @property + def temp_unit(self) -> temperature_conversion.TempUnit: + """The temperature unit for all temperatures in the forecast.""" + return self.first_period.temp_unit + + @property + def tzinfo(self) -> datetime.tzinfo: + """The time zone information for all forecast periods.""" + return self.first_period.start_timestamp.tzinfo + + @property + def time_zone(self) -> str: + """The time zone name for all forecast periods.""" + return str(self.tzinfo) + + @property + def df(self) -> pd.DataFrame: + """The forecast periods, as a pandas DataFrame.""" + return pd.DataFrame((p.as_dict for p in self.periods)) + + def filter_periods( + self, + ends_after_timestamp: pd.Timestamp | None = None, + max_periods: int | None = 24, + ) -> Self: + """Returns a copy of the forecast, with periods filtered as applicable. + + Args: + ends_after_timestamp: Filter periods to include only those that end after + this timestamp (generally used to exclude periods ending in the past). + If None, no filtering will be done based on the timestamp. + max_periods: The maximum number of periods to include in the forecast. + Must be greater than zero because a forecast without any periods would + be invalid. This filtering step is performed after the timestamp + filtering step, as applicable. If None, no filtering will be done based + on the number of periods. + + Returns: + A copy of the forecast with periods filtered to the given range. + """ + if ends_after_timestamp is not None: + ends_after_timestamp = self._parse_timestamp(ends_after_timestamp) + + new_periods = [] + for p in self.periods: + if ends_after_timestamp and p.end_timestamp <= ends_after_timestamp: + continue # Keep only the periods that end after the filter timestamp. + new_periods.append(p) + + if max_periods is not None: + new_periods = new_periods[:max_periods] + + return type(self)(periods=new_periods) + + # INTERPOLATION + + @functools.cached_property + def seconds(self) -> Sequence[float]: + """A sequence of period start times, as seconds since the epoch (UTC).""" + return tuple(p.start_seconds for p in self.periods) + + @functools.cached_property + def temps(self) -> Sequence[float]: + """A sequence of period temperatures, in ascending order of start time.""" + return tuple(p.temp for p in self.periods) + + def _parse_timestamp(self, timestamp: pd.Timestamp) -> pd.Timestamp: + """Ensures the timestamp is timezone-aware, and in the forecasts's timezone. + + Args: + timestamp: A timezone-aware timestamp. + + Returns: + A timestamp in forecast's timezone. + + Raises: + ValueError: if timestamp is timezone-naive. + """ + if timestamp.tzinfo is None: + raise ValueError(f"Timestamp {timestamp} must be timezone-aware.") + + if timestamp.tzinfo == self.tzinfo: + return timestamp + + return timestamp.tz_convert(self.tzinfo) + + def _validate_timestamp_is_in_range(self, timestamp: pd.Timestamp): + """Ensures the timestamp is within the forecast range.""" + if ( + timestamp < self.first_period.start_timestamp + or timestamp > self.last_period.end_timestamp + ): + raise ValueError( + f"Timestamp {timestamp} is outside the forecast range: " + f"({self.first_period.start_timestamp}, " + f"{self.last_period.end_timestamp})." + ) + + def resample( + self, + start_timestamp: pd.Timestamp, + interval: pd.Timedelta = pd.Timedelta(hours=1), + ) -> Self: + """Returns a copy of the forecast, normalized to the given start time. + + The new periods will start at the given start_timestamp and the duration of + each period will be set to the given interval. The temperature values for + each period are adjusted using linear interpolation. Periods are generated + from the requested start_timestamp, up to the end of the forecast range. + + This is the primary method used by the weather service to obtain normalized + forecast periods with interpolated temperature values. + + Args: + start_timestamp: The start timestamp to anchor the new forecast periods. + interval: The time delta between periods / duration of each period. + + Returns: + A new BaseForecast with resampled periods. + + Raises: + ValueError: If the `start_timestamp` is timezone-naive, or if the + `interval` is not a positive duration. + """ + start_timestamp = self._parse_timestamp(start_timestamp) + + if interval <= pd.Timedelta(0): + raise ValueError("Interval must be a positive duration.") + + new_periods = [] + i = 0 + while True: + timestamp = start_timestamp + interval * i + # Ensure the entire new period is within the bounds of the forecast. + if timestamp + interval > self.last_period.end_timestamp: + break + try: + self._validate_timestamp_is_in_range(timestamp) + new_periods.append( + base_forecast_period.BaseForecastPeriod( + start_timestamp=timestamp, + end_timestamp=timestamp + interval, + temp=np.interp(timestamp.timestamp(), self.seconds, self.temps), + temp_unit=self.temp_unit, + ) + ) + except ValueError: + break # There are no more periods available in the forecast time range. + i += 1 + return type(self)(periods=new_periods) + + def interpolate_period( + self, timestamp: pd.Timestamp + ) -> base_forecast_period.BaseForecastPeriod: + """Returns a single forecast period, interpolated to the given timestamp. + + This is an extra, optional convenience method, not used by the weather + service. + + Args: + timestamp: The timestamp to interpolate to. + + Returns: + A forecast period with the given timestamp and interpolated values. + + Raises: + ValueError: If the timestamp is timezone-naive, or if the timestamp is + outside the forecast's time range. + """ + timestamp = self._parse_timestamp(timestamp) + self._validate_timestamp_is_in_range(timestamp) + + return base_forecast_period.BaseForecastPeriod( + start_timestamp=timestamp, + end_timestamp=timestamp + self.interpolation_interval, + temp=np.interp(timestamp.timestamp(), self.seconds, self.temps), + temp_unit=self.temp_unit, + ) + + @functools.cached_property + def interpolated_forecast(self) -> Self: + """A forecast with minute-level periods and interpolated temperature values. + + This expanded, more granular version of the original forecast covers the + entire time range of the original forecast. + + This is an extra, optional convenience method, not used by the weather + service. + """ + periods = [] + + for p in self.periods: + start_timestamp = p.start_timestamp + periods.append(self.interpolate_period(start_timestamp)) + + while start_timestamp < p.end_timestamp - self.interpolation_interval: + start_timestamp = start_timestamp + self.interpolation_interval + periods.append(self.interpolate_period(start_timestamp)) + + return BaseForecast(periods=tuple(periods)) + + @property + def interp_df(self) -> pd.DataFrame: + """A pandas DataFrame of interpolated forecast periods. + + This is an extra, optional convenience method, not used by the weather + service. It is useful for charting and display purposes. + """ + return pd.DataFrame((p.as_dict for p in self.interpolated_forecast.periods)) diff --git a/smart_control/services/weather/base_forecast_period.py b/smart_control/services/weather/base_forecast_period.py new file mode 100644 index 00000000..cd5b3d35 --- /dev/null +++ b/smart_control/services/weather/base_forecast_period.py @@ -0,0 +1,104 @@ +"""Base weather forecast period. + +A weather **forecast period** is a range of time for which a given weather +forecast is applicable. +""" + +import dataclasses +from typing import Any + +import pandas as pd +from smart_buildings.smart_control.utils import temperature_conversion + + +@dataclasses.dataclass(frozen=True) +class BaseForecastPeriod: + """A single forecast period. + + A forecast period is a range of time for which a given weather forecast is + applicable. This can be an hourly forecast period covering a single hour (the + most common use case), or a longer forecast period covering multiple hours + (depending on the source of the forecast data). + + The period is bounded by a start and end timestamp, which are validated to be + timezone-aware, and sharing the same timezone. At a minimum, the forecast + period provides information about the given temperature (and corresponding + temperature unit). + + Attributes: + start_timestamp: The period start time, as a timezone-aware pandas + Timestamp. + end_timestamp: The period end time, as a timezone-aware pandas Timestamp. + temp: The temperature value (e.g. 70.0). + temp_unit: The temperature unit (e.g. 'Kelvin', 'Celsius', or 'Fahrenheit'). + """ + + start_timestamp: pd.Timestamp + end_timestamp: pd.Timestamp + temp: float + temp_unit: temperature_conversion.TempUnit + + def __post_init__(self): + """Validates the timestamps and their timezones after initialization.""" + self._validate_time_zones() + self._validate_timestamps() + + def _validate_time_zones(self): + """Ensures start and end timestamp time zones are present and matching.""" + if self.start_timestamp.tzinfo is None or self.end_timestamp.tzinfo is None: + raise ValueError( + f"start_timestamp ({self.start_timestamp}) and end_timestamp" + f" ({self.end_timestamp}) must have a time zone." + ) + + if self.start_timestamp.tzinfo != self.end_timestamp.tzinfo: + raise ValueError( + f"start_timestamp ({self.start_timestamp}) must be in the same time" + f" zone as end_timestamp ({self.end_timestamp})." + ) + + def _validate_timestamps(self): + """Ensures start_timestamp is before end_timestamp.""" + if self.start_timestamp >= self.end_timestamp: + raise ValueError( + f"start_timestamp ({self.start_timestamp}) must be before " + f"end_timestamp ({self.end_timestamp})." + ) + + @property + def duration(self) -> pd.Timedelta: + """The period's duration, as a pandas Timedelta.""" + return self.end_timestamp - self.start_timestamp + + @property + def start_date(self) -> str: + """The period's start date, as a string.""" + return str(self.start_timestamp.date()) + + @property + def end_date(self) -> str: + """The period's end date, as a string.""" + return str(self.end_timestamp.date()) + + @property + def start_seconds(self) -> float: + """The period's start time, as seconds since the epoch (UTC).""" + return self.start_timestamp.timestamp() + + @property + def end_seconds(self) -> float: + """The period's end time, as seconds since the epoch (UTC).""" + return self.end_timestamp.timestamp() + + @property + def as_dict(self) -> dict[str, Any]: + """A dictionary of period attributes.""" + data = dataclasses.asdict(self) + data["temp_unit"] = data["temp_unit"].value # use the value, not the enum + return data | dict( + duration=self.duration, + start_date=self.start_date, + end_date=self.end_date, + start_seconds=self.start_seconds, + end_seconds=self.end_seconds, + ) diff --git a/smart_control/services/weather/base_forecast_period_test.py b/smart_control/services/weather/base_forecast_period_test.py new file mode 100644 index 00000000..813fee6f --- /dev/null +++ b/smart_control/services/weather/base_forecast_period_test.py @@ -0,0 +1,128 @@ +import datetime +import re + +from absl.testing import absltest +from absl.testing import parameterized +import pandas as pd +from smart_buildings.smart_control.services.weather import base_forecast_period +from smart_buildings.smart_control.services.weather import conftest + +EXPECTED_TZINFO = datetime.timezone.utc + + +class BaseForecastPeriodTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.period = conftest.create_period() + + def test_initialization(self): + self.assertIsInstance(self.period, base_forecast_period.BaseForecastPeriod) + + def test_attributes(self): + with self.subTest(name='timestamps'): + self.assertEqual(self.period.start_timestamp, conftest.START_TIMESTAMP) + self.assertEqual(self.period.end_timestamp, conftest.END_TIMESTAMP) + + with self.subTest(name='time_zones'): + self.assertEqual(self.period.start_timestamp.tzinfo, EXPECTED_TZINFO) + self.assertEqual(self.period.end_timestamp.tzinfo, EXPECTED_TZINFO) + + with self.subTest(name='temperature'): + self.assertEqual(self.period.temp, conftest.TEMP) + self.assertEqual(self.period.temp_unit, conftest.TEMP_UNIT) + + def test_properties(self): + with self.subTest(name='duration'): + self.assertEqual(self.period.duration, pd.Timedelta(minutes=1)) + + with self.subTest(name='dates'): + self.assertEqual(self.period.start_date, '2026-01-01') + self.assertEqual(self.period.end_date, '2026-01-01') + + with self.subTest(name='seconds_since_epoch'): + self.assertEqual(self.period.start_seconds, 1767226020.0) + self.assertEqual(self.period.end_seconds, 1767226080.0) + + def _assert_timestamps_regex_raises(self, end_timestamp: pd.Timestamp): + with self.assertRaisesRegex( + ValueError, + re.escape(( + f'start_timestamp ({conftest.START_TIMESTAMP}) must be before ' + f'end_timestamp ({end_timestamp}).' + )), + ): + conftest.create_period(end_timestamp=end_timestamp) + + def test_validates_misordered_timestamps_raises(self): + end_timestamp = conftest.START_TIMESTAMP - pd.Timedelta(minutes=1) + self._assert_timestamps_regex_raises(end_timestamp) + + def test_validates_same_timestamps_raises(self): + end_timestamp = conftest.START_TIMESTAMP # end == start + self._assert_timestamps_regex_raises(end_timestamp) + + @parameterized.named_parameters( + dict( + testcase_name='utc', + time_zone='UTC', + ), + dict(testcase_name='est', time_zone='America/New_York'), + dict(testcase_name='pst', time_zone='America/Los_Angeles'), + ) + def test_validates_time_zones(self, time_zone): + start_timestamp = pd.Timestamp('2026-01-01 00:00:00', tz=time_zone) + end_timestamp = pd.Timestamp('2026-01-01 01:00:00', tz=time_zone) + conftest.create_period( + start_timestamp=start_timestamp, end_timestamp=end_timestamp + ) + + def test_validates_missing_time_zones_raises(self): + start_timestamp = pd.Timestamp('2026-01-01 00:00:00') + end_timestamp = pd.Timestamp('2026-01-01 01:00:00') + with self.assertRaisesRegex( + ValueError, + re.escape(( + f'start_timestamp ({start_timestamp}) and end_timestamp' + f' ({end_timestamp}) must have a time zone.' + )), + ): + conftest.create_period( + start_timestamp=start_timestamp, + end_timestamp=end_timestamp, + ) + + def test_validates_mismatched_time_zones_raises(self): + start_timestamp = pd.Timestamp('2026-01-01 00:00:00', tz='UTC') + end_timestamp = pd.Timestamp('2026-01-01 01:00:00', tz='America/New_York') + with self.assertRaisesRegex( + ValueError, + re.escape(( + f'start_timestamp ({start_timestamp}) must be in the same time' + f' zone as end_timestamp ({end_timestamp}).' + )), + ): + conftest.create_period( + start_timestamp=start_timestamp, + end_timestamp=end_timestamp, + ) + + def test_as_dict(self): + self.assertEqual( + self.period.as_dict, + { + 'start_timestamp': conftest.START_TIMESTAMP, + 'end_timestamp': conftest.END_TIMESTAMP, + 'temp': conftest.TEMP, + 'temp_unit': conftest.TEMP_UNIT.value, + 'duration': self.period.duration, + 'start_date': self.period.start_date, + 'end_date': self.period.end_date, + 'start_seconds': self.period.start_seconds, + 'end_seconds': self.period.end_seconds, + }, + ) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/services/weather/base_forecast_test.py b/smart_control/services/weather/base_forecast_test.py new file mode 100644 index 00000000..9b9b8e8b --- /dev/null +++ b/smart_control/services/weather/base_forecast_test.py @@ -0,0 +1,617 @@ +from absl.testing import absltest +from absl.testing import parameterized +import pandas as pd +from smart_buildings.smart_control.services.weather import base_forecast +from smart_buildings.smart_control.services.weather import conftest + + +class BaseForecastTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.periods = conftest.create_hourly_periods() + self.forecast = base_forecast.BaseForecast(periods=self.periods) + + def test_initialization(self): + self.assertIsInstance(self.forecast, base_forecast.BaseForecast) + + def test_attributes(self): + self.assertEqual(self.forecast.periods, self.periods) + self.assertEqual( + self.forecast.interpolation_interval, + pd.Timedelta(minutes=1), + ) + + def test_validates_misordered_periods_raises(self): + periods = list(self.periods).copy() + # Manually misorder the periods by swapping the first two. + periods[0], periods[1] = periods[1], periods[0] + with self.assertRaisesRegex( + ValueError, + 'Periods must be sorted by start_timestamp in ascending order.', + ): + base_forecast.BaseForecast(periods=periods) + + def test_validates_empty_periods_raises(self): + with self.assertRaisesRegex(ValueError, 'Periods cannot be empty.'): + base_forecast.BaseForecast(periods=[]) + + def test_temp_unit(self): + self.assertEqual(self.forecast.temp_unit, conftest.TEMP_UNIT) + self.assertEqual(self.forecast.temp_unit.value, 'Fahrenheit') + + def test_df(self): + df = self.forecast.df + self.assertIsInstance(df, pd.DataFrame) + self.assertLen(df, 24) + self.assertEqual( + df.columns.tolist(), + [ + 'start_timestamp', + 'end_timestamp', + 'temp', + 'temp_unit', + 'duration', + 'start_date', + 'end_date', + 'start_seconds', + 'end_seconds', + ], + ) + + +class BaseForecastInterpolationTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.start_timestamp = pd.Timestamp('2026-01-01 00:00:00', tz='UTC') + self.periods = [ + conftest.create_period( + start_timestamp=self.start_timestamp, + end_timestamp=self.start_timestamp + pd.Timedelta(hours=1), + temp=10.0, + ), + conftest.create_period( + start_timestamp=self.start_timestamp + pd.Timedelta(hours=1), + end_timestamp=self.start_timestamp + pd.Timedelta(hours=2), + temp=20.0, + ), + conftest.create_period( + start_timestamp=self.start_timestamp + pd.Timedelta(hours=2), + end_timestamp=self.start_timestamp + pd.Timedelta(hours=3), + temp=30.0, + ), + ] + self.forecast = base_forecast.BaseForecast(periods=self.periods) + + def test_first_period(self): + self.assertEqual(self.forecast.first_period, self.periods[0]) + + def test_last_period(self): + self.assertEqual(self.forecast.last_period, self.periods[-1]) + + def test_seconds(self): + self.assertEqual( + list(self.forecast.seconds), + [p.start_seconds for p in self.periods], + ) + + def test_temps(self): + self.assertEqual(list(self.forecast.temps), [10.0, 20.0, 30.0]) + + def test_interpolation_interval(self): + self.assertEqual( + self.forecast.interpolation_interval, + pd.Timedelta(minutes=1), + ) + + @parameterized.named_parameters( + dict( + testcase_name='start_of_forecast', + timestamp=pd.Timestamp('2026-01-01 00:00:00', tz='UTC'), + expected_temp=10.0, + ), + dict( + testcase_name='middle_of_first_hour', + timestamp=pd.Timestamp('2026-01-01 00:30:00', tz='UTC'), + expected_temp=15.0, + ), + dict( + testcase_name='start_of_second_hour', + timestamp=pd.Timestamp('2026-01-01 01:00:00', tz='UTC'), + expected_temp=20.0, + ), + dict( + testcase_name='middle_of_second_hour', + timestamp=pd.Timestamp('2026-01-01 01:30:00', tz='UTC'), + expected_temp=25.0, + ), + dict( + testcase_name='start_of_third_hour', + timestamp=pd.Timestamp('2026-01-01 02:00:00', tz='UTC'), + expected_temp=30.0, + ), + dict( + testcase_name='middle_of_third_hour', + timestamp=pd.Timestamp('2026-01-01 02:30:00', tz='UTC'), + expected_temp=30.0, + ), + dict( + testcase_name='end_of_forecast_range', + timestamp=pd.Timestamp('2026-01-01 03:00:00', tz='UTC'), + expected_temp=30.0, + ), + ) + def test_interpolate_period(self, timestamp, expected_temp): + interpolated_period = self.forecast.interpolate_period(timestamp) + + with self.subTest('temp'): + self.assertAlmostEqual(interpolated_period.temp, expected_temp) + self.assertEqual(interpolated_period.temp_unit, self.forecast.temp_unit) + + with self.subTest('timestamps'): + self.assertEqual(interpolated_period.start_timestamp, timestamp) + self.assertEqual( + interpolated_period.end_timestamp, + timestamp + self.forecast.interpolation_interval, + ) + + with self.subTest('time_zone'): + self.assertEqual( + interpolated_period.start_timestamp.tzinfo, + self.forecast.tzinfo, + ) + + def test_interpolate_period_different_tz_converts(self): + timestamp_est = pd.Timestamp('2025-12-31 19:30:00', tz='America/New_York') + # This is 2026-01-01 00:30:00 UTC, which is in the middle of the first hour. + interpolated_period = self.forecast.interpolate_period(timestamp_est) + + self.assertAlmostEqual(interpolated_period.temp, 15.0) + self.assertEqual( + interpolated_period.start_timestamp, + pd.Timestamp('2026-01-01 00:30:00', tz='UTC'), + ) + self.assertEqual( + interpolated_period.start_timestamp.tzinfo, self.forecast.tzinfo + ) + + def test_interpolate_period_naive_tz_raises(self): + timestamp = pd.Timestamp('2026-01-01 00:30:00') + with self.assertRaisesRegex(ValueError, 'must be timezone-aware'): + self.forecast.interpolate_period(timestamp) + + @parameterized.named_parameters( + dict( + testcase_name='before_forecast', + timestamp=pd.Timestamp('2025-12-31 23:59:59', tz='UTC'), + ), + dict( + testcase_name='after_forecast', + timestamp=pd.Timestamp('2026-01-01 03:00:01', tz='UTC'), + ), + ) + def test_interpolate_period_outside_range_raises(self, timestamp): + with self.assertRaisesRegex(ValueError, 'is outside the forecast range'): + self.forecast.interpolate_period(timestamp) + + def test_interpolated_forecast(self): + interpolated_forecast = self.forecast.interpolated_forecast + self.assertIsInstance(interpolated_forecast, base_forecast.BaseForecast) + self.assertLen(interpolated_forecast.periods, 180) + + with self.subTest('first_period'): + first_period = interpolated_forecast.first_period + self.assertEqual(first_period.start_timestamp, self.start_timestamp) + self.assertAlmostEqual(first_period.temp, 10.0) + + with self.subTest('last_period'): + last_period = interpolated_forecast.last_period + self.assertEqual( + last_period.start_timestamp, + self.start_timestamp + + pd.Timedelta(hours=3) + - pd.Timedelta(minutes=1), + ) + self.assertAlmostEqual(last_period.temp, 30.0) + + def test_interp_df(self): + interp_df = self.forecast.interp_df + self.assertIsInstance(interp_df, pd.DataFrame) + self.assertLen(interp_df, 180) + + with self.subTest('columns'): + self.assertEqual( + interp_df.columns.tolist(), + [ + 'start_timestamp', + 'end_timestamp', + 'temp', + 'temp_unit', + 'duration', + 'start_date', + 'end_date', + 'start_seconds', + 'end_seconds', + ], + ) + + with self.subTest('first_row'): + first_row = interp_df.iloc[0] + self.assertEqual( + first_row.start_timestamp, + self.start_timestamp, + ) + self.assertAlmostEqual(first_row.temp, 10.0) + + with self.subTest('last_row'): + last_row = interp_df.iloc[-1] + self.assertEqual( + last_row.start_timestamp, + self.start_timestamp + + pd.Timedelta(hours=3) + - pd.Timedelta(minutes=1), + ) + self.assertAlmostEqual(last_row.temp, 30.0) + + +class BaseForecastResampleTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.start_timestamp = pd.Timestamp('2026-01-01 00:00:00', tz='UTC') + self.periods = [ + conftest.create_period( + start_timestamp=self.start_timestamp, + end_timestamp=self.start_timestamp + pd.Timedelta(hours=1), + temp=10.0, + ), + conftest.create_period( + start_timestamp=self.start_timestamp + pd.Timedelta(hours=1), + end_timestamp=self.start_timestamp + pd.Timedelta(hours=2), + temp=20.0, + ), + conftest.create_period( + start_timestamp=self.start_timestamp + pd.Timedelta(hours=2), + end_timestamp=self.start_timestamp + pd.Timedelta(hours=3), + temp=30.0, + ), + ] + self.forecast = base_forecast.BaseForecast(periods=self.periods) + + def test_resample_interval_hourly_same_start(self): + resampled = self.forecast.resample(start_timestamp=self.start_timestamp) + self.assertLen(resampled.periods, 3) + expected_values = [ + ( + pd.Timestamp('2026-01-01 00:00:00', tz='UTC'), + pd.Timestamp('2026-01-01 01:00:00', tz='UTC'), + 10.0, + ), + ( + pd.Timestamp('2026-01-01 01:00:00', tz='UTC'), + pd.Timestamp('2026-01-01 02:00:00', tz='UTC'), + 20.0, + ), + ( + pd.Timestamp('2026-01-01 02:00:00', tz='UTC'), + pd.Timestamp('2026-01-01 03:00:00', tz='UTC'), + 30.0, + ), + ] + self.assertEqual( + [ + (p.start_timestamp, p.end_timestamp, p.temp) + for p in resampled.periods + ], + expected_values + ) + + def test_resample_interval_hourly_offset_start(self): + new_start_timestamp = self.start_timestamp + pd.Timedelta(minutes=30) + resampled = self.forecast.resample(start_timestamp=new_start_timestamp) + self.assertLen(resampled.periods, 2) + expected_values = [ + ( + pd.Timestamp('2026-01-01 00:30:00', tz='UTC'), + pd.Timestamp('2026-01-01 01:30:00', tz='UTC'), + 15.0, + ), + ( + pd.Timestamp('2026-01-01 01:30:00', tz='UTC'), + pd.Timestamp('2026-01-01 02:30:00', tz='UTC'), + 25.0, + ), + ] + self.assertEqual( + [ + (p.start_timestamp, p.end_timestamp, p.temp) + for p in resampled.periods + ], + expected_values + ) + + def test_resample_interval_30m_same_start(self): + resampled = self.forecast.resample( + start_timestamp=self.start_timestamp, interval=pd.Timedelta(minutes=30) + ) + self.assertLen(resampled.periods, 6) + expected_values = [ + ( + pd.Timestamp('2026-01-01 00:00:00', tz='UTC'), + pd.Timestamp('2026-01-01 00:30:00', tz='UTC'), + 10.0, + ), + ( + pd.Timestamp('2026-01-01 00:30:00', tz='UTC'), + pd.Timestamp('2026-01-01 01:00:00', tz='UTC'), + 15.0, + ), + ( + pd.Timestamp('2026-01-01 01:00:00', tz='UTC'), + pd.Timestamp('2026-01-01 01:30:00', tz='UTC'), + 20.0, + ), + ( + pd.Timestamp('2026-01-01 01:30:00', tz='UTC'), + pd.Timestamp('2026-01-01 02:00:00', tz='UTC'), + 25.0, + ), + ( + pd.Timestamp('2026-01-01 02:00:00', tz='UTC'), + pd.Timestamp('2026-01-01 02:30:00', tz='UTC'), + 30.0, + ), + ( + pd.Timestamp('2026-01-01 02:30:00', tz='UTC'), + pd.Timestamp('2026-01-01 03:00:00', tz='UTC'), + 30.0, + ), + ] + self.assertEqual( + [ + (p.start_timestamp, p.end_timestamp, p.temp) + for p in resampled.periods + ], + expected_values + ) + + def test_resample_different_tz_converts(self): + new_start_timestamp = pd.Timestamp( + '2025-12-31 19:30:00', tz='America/New_York' + ) # '2026-01-01 00:30:00' in UTC. + resampled = self.forecast.resample(start_timestamp=new_start_timestamp) + self.assertLen(resampled.periods, 2) + expected_values = [ + ( + pd.Timestamp('2026-01-01 00:30:00', tz='UTC'), + pd.Timestamp('2026-01-01 01:30:00', tz='UTC'), + 15.0, + ), + ( + pd.Timestamp('2026-01-01 01:30:00', tz='UTC'), + pd.Timestamp('2026-01-01 02:30:00', tz='UTC'), + 25.0, + ), + ] + self.assertEqual( + [ + (p.start_timestamp, p.end_timestamp, p.temp) + for p in resampled.periods + ], + expected_values + ) + + def test_resample_naive_tz_raises(self): + start_ts = pd.Timestamp('2026-01-01 00:00:00') + with self.assertRaisesRegex(ValueError, 'must be timezone-aware'): + self.forecast.resample(start_ts) + + def test_resample_invalid_interval_raises(self): + with self.assertRaisesRegex( + ValueError, 'Interval must be a positive duration.' + ): + self.forecast.resample( + self.start_timestamp, interval=pd.Timedelta(minutes=0) + ) + + +class BaseForecastCustomTimezoneInterpolationTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.tz = 'America/Los_Angeles' + self.start_timestamp = pd.Timestamp('2026-01-01 00:00:00', tz=self.tz) + self.periods = [ + conftest.create_period( + start_timestamp=self.start_timestamp, + end_timestamp=self.start_timestamp + pd.Timedelta(hours=1), + temp=10.0, + ), + conftest.create_period( + start_timestamp=self.start_timestamp + pd.Timedelta(hours=1), + end_timestamp=self.start_timestamp + pd.Timedelta(hours=2), + temp=20.0, + ), + ] + self.forecast = base_forecast.BaseForecast(periods=self.periods) + + def test_interpolation_uses_utc_seconds(self): + # Verify that the seconds used for interpolation are in UTC (epoch seconds). + # '2026-01-01 00:00:00' in America/Los_Angeles is + # '2026-01-01 08:00:00' in UTC. + + first_period = self.periods[0] + self.assertEqual( + str(first_period.start_timestamp), + '2026-01-01 00:00:00-08:00', + ) + + expected_utc_start = pd.Timestamp('2026-01-01 08:00:00', tz='UTC') + self.assertEqual(first_period.start_seconds, expected_utc_start.timestamp()) + + # Interpolate at the middle of the first hour (30 minutes in). + # 10.0 at t=0, 20.0 at t=3600. At t=1800, should be 15.0. + timestamp = self.start_timestamp + pd.Timedelta(minutes=30) + interpolated_period = self.forecast.interpolate_period(timestamp) + + self.assertAlmostEqual(interpolated_period.temp, 15.0) + self.assertEqual(interpolated_period.start_timestamp, timestamp) + self.assertEqual( + interpolated_period.start_timestamp.tzinfo, + first_period.start_timestamp.tzinfo, + ) + + +class BaseForecastFilterPeriodsTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.start_timestamp = pd.Timestamp('2026-01-01 00:00:00', tz='UTC') + self.periods = [ + conftest.create_period( + start_timestamp=self.start_timestamp, + end_timestamp=self.start_timestamp + pd.Timedelta(hours=1), + temp=10.0, + ), + conftest.create_period( + start_timestamp=self.start_timestamp + pd.Timedelta(hours=1), + end_timestamp=self.start_timestamp + pd.Timedelta(hours=2), + temp=20.0, + ), + conftest.create_period( + start_timestamp=self.start_timestamp + pd.Timedelta(hours=2), + end_timestamp=self.start_timestamp + pd.Timedelta(hours=3), + temp=30.0, + ), + ] + self.forecast = base_forecast.BaseForecast(periods=self.periods) + + @parameterized.named_parameters( + # DEFAULT PARAMS + dict( + testcase_name='defaults', + timestamp=None, + max_periods=24, + expected_indices=[0, 1, 2], + ), + # MAX PERIODS FILTERING SCENARIOS + dict( + testcase_name='max_periods_less_than_count', + timestamp=None, + max_periods=2, + expected_indices=[0, 1], + ), + dict( + testcase_name='max_periods_greater_than_count', + timestamp=None, + max_periods=5, + expected_indices=[0, 1, 2], + ), + dict( + testcase_name='max_periods_is_none', + timestamp=None, + max_periods=None, + expected_indices=[0, 1, 2], + ), + # TIMESTAMP FILTERING SCENARIOS > UTC + dict( + testcase_name='utc_ts_during_first_period', + timestamp=pd.Timestamp('2026-01-01 00:30:00', tz='UTC'), + max_periods=None, + expected_indices=[0, 1, 2], + ), + dict( + testcase_name='utc_ts_at_first_period_end', + timestamp=pd.Timestamp('2026-01-01 01:00:00', tz='UTC'), + max_periods=None, + expected_indices=[1, 2], + ), + dict( + testcase_name='utc_ts_at_first_period_end_with_max_periods', + timestamp=pd.Timestamp('2026-01-01 01:00:00', tz='UTC'), + max_periods=1, + expected_indices=[1], + ), + dict( + testcase_name='utc_ts_during_second_period', + timestamp=pd.Timestamp('2026-01-01 01:30:00', tz='UTC'), + max_periods=None, + expected_indices=[1, 2], + ), + dict( + testcase_name='utc_ts_at_second_period_end', + timestamp=pd.Timestamp('2026-01-01 02:00:00', tz='UTC'), + max_periods=None, + expected_indices=[2], + ), + dict( + testcase_name='utc_ts_during_third_period', + timestamp=pd.Timestamp('2026-01-01 02:30:00', tz='UTC'), + max_periods=None, + expected_indices=[2], + ), + # TIMESTAMP FILTERING SCENARIOS > OTHER TIMEZONE + dict( + testcase_name='est_ts_during_first_period', # 00:30 UTC + timestamp=pd.Timestamp('2025-12-31 19:30:00', tz='America/New_York'), + max_periods=None, + expected_indices=[0, 1, 2], + ), + dict( + testcase_name='est_ts_at_first_period_end', # 01:00 UTC + timestamp=pd.Timestamp('2025-12-31 20:00:00', tz='America/New_York'), + max_periods=None, + expected_indices=[1, 2], + ), + dict( + testcase_name='est_ts_at_first_period_end_with_max_periods', + timestamp=pd.Timestamp('2025-12-31 20:00:00', tz='America/New_York'), + max_periods=1, + expected_indices=[1], + ), + dict( + testcase_name='est_ts_during_second_period', # 01:30 UTC + timestamp=pd.Timestamp('2025-12-31 20:30:00', tz='America/New_York'), + max_periods=None, + expected_indices=[1, 2], + ), + dict( + testcase_name='est_ts_at_second_period_end', # 02:00 UTC + timestamp=pd.Timestamp('2025-12-31 21:00:00', tz='America/New_York'), + max_periods=None, + expected_indices=[2], + ), + dict( + testcase_name='est_ts_during_third_period', # 02:30 UTC + timestamp=pd.Timestamp('2025-12-31 21:30:00', tz='America/New_York'), + max_periods=None, + expected_indices=[2], + ), + ) + def test_filter_periods( + self, timestamp, max_periods, expected_indices + ): + new_forecast = self.forecast.filter_periods( + ends_after_timestamp=timestamp, max_periods=max_periods + ) + expected_periods = [self.periods[i] for i in expected_indices] + self.assertEqual(list(new_forecast.periods), expected_periods) + + def test_filter_periods_naive_timezone_raises(self): + ends_after_timestamp = pd.Timestamp('2026-01-01 01:00:00') + with self.assertRaisesRegex(ValueError, 'must be timezone-aware'): + self.forecast.filter_periods(ends_after_timestamp=ends_after_timestamp) + + def test_filter_periods_all_filtered_raises(self): + ends_after_timestamp = pd.Timestamp('2026-01-01 03:01:00', tz='UTC') + with self.assertRaisesRegex(ValueError, 'Periods cannot be empty.'): + self.forecast.filter_periods(ends_after_timestamp=ends_after_timestamp) + + def test_filter_periods_max_periods_is_zero_raises(self): + with self.assertRaisesRegex(ValueError, 'Periods cannot be empty.'): + self.forecast.filter_periods(max_periods=0) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/services/weather/base_weather_service.py b/smart_control/services/weather/base_weather_service.py new file mode 100644 index 00000000..02cbc5a2 --- /dev/null +++ b/smart_control/services/weather/base_weather_service.py @@ -0,0 +1,43 @@ +"""Base classes for a weather service that fetches forecast data.""" + +import abc + +import pandas as pd +from smart_buildings.smart_control.services.weather import base_forecast + + +class BaseWeatherService(abc.ABC): + """A weather service for fetching forecast data.""" + + @abc.abstractmethod + def get_hourly_forecast( + self, + *, + start_timestamp: pd.Timestamp | None = None, + n_hours: int = 24, + normalize_to_start: bool = False, + ) -> base_forecast.BaseForecast: + """Fetches upcoming hourly forecast data for a specific location. + + The resulting forecast should be sorted by start_timestamp in ascending + order, and only include periods that end after the specified + start_timestamp (excludes periods ending in the past). + + Args: + start_timestamp: The timestamp to start fetching forecast data from. + Optional, because some services may default to fetching current + conditions. + n_hours: The maximum number of hours to fetch forecast data for. It is + possible this method can return fewer than n_hours periods, for example, + depending on the availability of forecast data, or depending on the + requested normalization conditions (the last normalized period may be + excluded if its adjusted end time would exceed the forecast range). + normalize_to_start: If False (default), returns forecasts on the hour + (e.g. 10:00, 11:00, etc.), or whatever was returned by the service. If + True and start_timestamp is provided, returns forecasts normalized to + start_timestamp (e.g. 10:05, 11:05, etc.). Uses linear interpolation to + calculate forecast values at the normalized times. + + Returns: + A forecast object containing a list of hourly forecast periods. + """ diff --git a/smart_control/services/weather/conftest.py b/smart_control/services/weather/conftest.py new file mode 100644 index 00000000..6155137a --- /dev/null +++ b/smart_control/services/weather/conftest.py @@ -0,0 +1,48 @@ +"""Test fixtures for base weather service and data classes.""" + +from typing import Sequence + +import pandas as pd +from smart_buildings.smart_control.services.weather import base_forecast_period +from smart_buildings.smart_control.utils import temperature_conversion + + +TIME_ZONE = "UTC" +START_TIMESTAMP = pd.Timestamp("2026-01-01 00:07:00", tz=TIME_ZONE) +END_TIMESTAMP = START_TIMESTAMP + pd.Timedelta(minutes=1) +TEMP = 70.0 +TEMP_UNIT = temperature_conversion.TempUnit.FAHRENHEIT + + +def create_period( + start_timestamp: pd.Timestamp = START_TIMESTAMP, + end_timestamp: pd.Timestamp = END_TIMESTAMP, + temp: float = TEMP, + temp_unit: temperature_conversion.TempUnit = TEMP_UNIT, +) -> base_forecast_period.BaseForecastPeriod: + """Creates a forecast period for test purposes.""" + return base_forecast_period.BaseForecastPeriod( + start_timestamp=start_timestamp, + end_timestamp=end_timestamp, + temp=temp, + temp_unit=temp_unit, + ) + + +def create_hourly_periods( + start_timestamp: pd.Timestamp = START_TIMESTAMP, + n_hours: int = 24, + temp: float = TEMP, + temp_unit: temperature_conversion.TempUnit = TEMP_UNIT, +) -> Sequence[base_forecast_period.BaseForecastPeriod]: + """Creates a list of hourly forecast periods for test purposes.""" + periods = [ + create_period( + start_timestamp=start_timestamp + pd.Timedelta(hours=i), + end_timestamp=start_timestamp + pd.Timedelta(hours=i + 1), + temp=temp, + temp_unit=temp_unit, + ) + for i in range(n_hours) + ] + return periods diff --git a/smart_control/services/weather_gov/conftest.py b/smart_control/services/weather_gov/conftest.py new file mode 100644 index 00000000..87bb5c44 --- /dev/null +++ b/smart_control/services/weather_gov/conftest.py @@ -0,0 +1,237 @@ +"""Test fixtures and helpers for the Weather.gov API service.""" + +import json +import os +from unittest import mock + +import pandas as pd +import requests +from smart_buildings.smart_control.services.weather_gov import models +from smart_buildings.smart_control.services.weather_gov import weather_service +from smart_buildings.smart_control.utils import constants +from smart_buildings.smart_control.utils import temperature_conversion + +TempUnit = temperature_conversion.TempUnit + +TEST_DATA_DIR = os.path.join( + constants.REPO_DIRPATH, "services", "weather_gov", "test_data" +) + +GRIDPOINT_URL = "https://api.weather.gov/points/37.4263,-122.0349" +FORECAST_URL = "https://api.weather.gov/gridpoints/MTR/95,87/forecast" +HOURLY_FORECAST_URL = f"{FORECAST_URL}/hourly" + + +# RESPONSE DATA + + +def _read_json_file(filename: str) -> models.ResponseData: + filepath = os.path.join(TEST_DATA_DIR, filename) + with open(filepath, encoding="utf-8") as f: + return json.load(f) + + +def read_gridpoint_data() -> models.ResponseData: + return _read_json_file("gridpoint.json") + + +def read_forecast_data() -> models.ResponseData: + return _read_json_file("forecast.json") + + +def read_hourly_forecast_data() -> models.ResponseData: + return _read_json_file("forecast_hourly.json") + + +# FACTORIES + + +def create_gridpoint() -> models.Gridpoint: + """Returns a test Gridpoint object for test purposes.""" + return models.Gridpoint(read_gridpoint_data()) + + +def create_forecast() -> models.Forecast: + """Returns a test seven-day Forecast for test purposes.""" + return models.Forecast.from_response_data(read_forecast_data()) + + +def create_hourly_forecast() -> models.HourlyForecast: + """Returns a non-comprehensive HourlyForecast for test purposes. + + To keep the test data file size small, this data only includes the first three + and the last three hourly periods. But in practice there are many more records + returned by the API. + + Returns: + A test HourlyForecast object. + """ + return models.HourlyForecast.from_response_data( + data=read_hourly_forecast_data() + ) + + +# EXAMPLE FORECAST RECORDS + +FIRST_PERIOD = models.ForecastPeriod( + number=1, + name="Today", + start_timestamp=pd.Timestamp("2026-02-06T09:00:00-08:00"), + end_timestamp=pd.Timestamp("2026-02-06T18:00:00-08:00"), + is_daytime=True, + temp=67, + temp_unit=TempUnit.FAHRENHEIT, + temp_trend=None, + chance_of_precip=6, + wind_speed="2 to 7 mph", + wind_direction="NNW", + icon="https://api.weather.gov/icons/land/day/few?size=medium", + short_forecast="Sunny", + detailed_forecast=( + "Sunny. High near 67, with temperatures falling to around 64 in the" + " afternoon. North northwest wind 2 to 7 mph." + ), +) + +LAST_PERIOD = models.ForecastPeriod( + number=14, + name="Thursday Night", + start_timestamp=pd.Timestamp("2026-02-12T18:00:00-08:00"), + end_timestamp=pd.Timestamp("2026-02-13T06:00:00-08:00"), + is_daytime=False, + temp=44, + temp_unit=TempUnit.FAHRENHEIT, + temp_trend=None, + chance_of_precip=11, + wind_speed="2 to 9 mph", + wind_direction="W", + icon="https://api.weather.gov/icons/land/night/sct/fog?size=medium", + short_forecast="Partly Cloudy then Patchy Fog", + detailed_forecast=( + "Patchy fog after 5am. Partly cloudy, with a low around 44." + ), +) + +# EXAMPLE HOURLY FORECAST RECORDS + +FIRST_HOURLY_PERIOD = models.HourlyForecastPeriod( + number=1, + name="", + start_timestamp=pd.Timestamp("2026-02-06T09:00:00-08:00"), + end_timestamp=pd.Timestamp("2026-02-06T10:00:00-08:00"), + is_daytime=True, + temp=57, + temp_unit=TempUnit.FAHRENHEIT, + temp_trend=None, + chance_of_precip=6, + dewpoint=9.444444444444445, + dewpoint_unit="wmoUnit:degC", + relative_humidity=81, + relative_humidity_unit="wmoUnit:percent", + wind_speed="2 mph", + wind_direction="W", + icon="https://api.weather.gov/icons/land/day/sct?size=small", + short_forecast="Mostly Sunny", + detailed_forecast="", +) + +LAST_HOURLY_PERIOD = models.HourlyForecastPeriod( + number=156, + name="", + start_timestamp=pd.Timestamp("2026-02-12T20:00:00-08:00"), + end_timestamp=pd.Timestamp("2026-02-12T21:00:00-08:00"), + is_daytime=False, + temp=52, + temp_unit=TempUnit.FAHRENHEIT, + temp_trend=None, + chance_of_precip=9, + dewpoint=8.88888888888889, + dewpoint_unit="wmoUnit:degC", + relative_humidity=83, + relative_humidity_unit="wmoUnit:percent", + wind_speed="7 mph", + wind_direction="WNW", + icon="https://api.weather.gov/icons/land/night/sct?size=small", + short_forecast="Partly Cloudy", + detailed_forecast="", +) + + +# MOCKING SETUP FOR WEATHER SERVICE + + +class MockResponse: + """Mimics a requests.Response object.""" + + def __init__(self, json_data: models.ResponseData, status_code: int): + self.json_data = json_data + self.status_code = status_code + self.ok = status_code < 400 + + def json(self): + return self.json_data + + def raise_for_status(self): + if not self.ok: + raise requests.exceptions.RequestException( + f"Request failed with status code {self.status_code}" + ) + + +def mock_requests_get(url: str, **kwargs) -> MockResponse: + """Mimics requests.get() function, can be used to prevent network requests. + + For the default location, we have test data to return. + + For other locations, we swallow the request and return a custom error message. + + Args: + url: The URL to make the GET request to. + **kwargs: Keyword arguments to pass along with the request. + + Returns: + A MockResponse object. + """ + del kwargs # needed for the timeout arg, but unused in the MockResponse + if url == GRIDPOINT_URL: + return MockResponse(read_gridpoint_data(), 200) + elif url == FORECAST_URL: + return MockResponse(read_forecast_data(), 200) + elif url == HOURLY_FORECAST_URL: + return MockResponse(read_hourly_forecast_data(), 200) + return MockResponse( + {"message": "Sorry, we don't have test data for the specified URL."}, 200 + ) + + +def setup_mock_session(test_case: mock.Mock) -> mock.MagicMock: + """Handles the standard mocking and patching of WeatherService.session. + + To be used within a setUp() method of a unittest / absltest test class. + + Args: + test_case: The test case instance to register the patch with. + + Example: + + def setUp(self): + super().setUp() + self.mock_session = conftest.setup_mock_session(self) + self.service = weather_service.WeatherService() + + Returns: + The mock session object. + """ + mock_session = mock.MagicMock(spec=requests.Session) + mock_session.headers = mock.MagicMock() + mock_session.get.side_effect = mock_requests_get + mock_session.__enter__.return_value = mock_session + test_case.enter_context( + mock.patch.object( + weather_service.WeatherService, + "session", + new_callable=mock.PropertyMock, + return_value=mock_session, + ) + ) + return mock_session diff --git a/smart_control/services/weather_gov/models.py b/smart_control/services/weather_gov/models.py new file mode 100644 index 00000000..12252e03 --- /dev/null +++ b/smart_control/services/weather_gov/models.py @@ -0,0 +1,278 @@ +"""Data structures for response data returned by the Weather.gov API.""" + +from collections.abc import Mapping, Sequence +import dataclasses +from typing import Any, Self + +import pandas as pd +from smart_buildings.smart_control.services.weather import base_forecast +from smart_buildings.smart_control.services.weather import base_forecast_period +from smart_buildings.smart_control.utils import temperature_conversion + +assign_temp_unit = temperature_conversion.assign_temp_unit + +ResponseData = Mapping[str, Any] + + +@dataclasses.dataclass(frozen=True) +class ForecastPeriod(base_forecast_period.BaseForecastPeriod): + """Schema for a single forecast period. + + The Weather.gov API's 'forecasts' endpoint provides a list of 14 periods, + spanning seven calendar dates (starting today), with two periods (one day-time + and one night-time period) for each calendar date. + + One important note is that the timestamps for all day-time periods, or for all + night-time periods, may not be consistant across different days. For example, + the day-time period for today may be at 6am, but the day-time period for + Saturday it may be at 9am. So this endpoint should essentially be used if you + need a high-level seven day forecast. + + For more information, see the + [API docs](https://www.weather.gov/documentation/services-web-api), as well as + copies of real response data stored in the "weather_gov/test_data" directory. + + Attributes: + number: Forecast period number. + name: Forecast period name. + start_time: Forecast period start time. + end_time: Forecast period end time. + is_daytime: Whether the forecast period is daytime. + temp: Forecast temperature. + temp_unit: Forecast temperature unit. + temp_trend: Forecast temperature trend. May be null. + chance_of_precip: Forecast chance of precipitation. Represented as a + percentage value from 0 to 100. + wind_speed: Forecast wind speed. + wind_direction: Forecast wind direction. + icon: Forecast icon URL. + short_forecast: Short description of the forecast. + detailed_forecast: Detailed description of the forecast. + """ + number: int + name: str + start_timestamp: pd.Timestamp + end_timestamp: pd.Timestamp + is_daytime: bool + temp: int + temp_unit: temperature_conversion.TempUnit + temp_trend: str | None + chance_of_precip: int + wind_speed: str + wind_direction: str + icon: str + short_forecast: str + detailed_forecast: str + + +@dataclasses.dataclass(frozen=True) +class HourlyForecastPeriod(ForecastPeriod): + """Schema for a single hourly forecast period. + + The hourly forecast period is exactly one hour. + + The Weather.gov API's 'forecasts/hourly' endpoint provides a list of periods, + spanning around seven days (starting now), with one record for each hour. + + For more information, see the + [API docs](https://www.weather.gov/documentation/services-web-api), as well as + copies of real response data stored in the "weather_gov/test_data" directory. + + Attributes: + number: Forecast period number. + name: Forecast period name. May be blank. + start_timestamp: Forecast period start time. + end_timestamp: Forecast period end time. + is_daytime: Whether the forecast period is during the day-time. + temp: Forecast temperature. + temp_unit: Forecast temperature unit. + temp_trend: Forecast temperature trend. May be null. + chance_of_precip: Forecast chance of precipitation. Represented as a + percentage value from 0 to 100. + dewpoint: Forecast dewpoint, in Celsius. + dewpoint_unit: Forecast dewpoint unit. + relative_humidity: Forecast relative humidity. Represented as a percentage + value from 0 to 100. + relative_humidity_unit: Forecast relative humidity unit. + wind_speed: Forecast wind speed. + wind_direction: Forecast wind direction. + icon: Forecast icon URL. + short_forecast: Short description of the forecast. + detailed_forecast: Detailed description of the forecast. May be blank. + """ + dewpoint: float | None + dewpoint_unit: str | None + relative_humidity: int | None + relative_humidity_unit: str | None + + +@dataclasses.dataclass(frozen=True) +class Gridpoint: + """Gridpoint data from the Weather.gov API. + + A gridpoint is a location associated with a given set of latitude and + longitude coordinates. + + Attributes: + data: The JSON data returned by a request to the Gridpoints API endpoint + (e.g. https://api.weather.gov/points/37.4263,-122.0349). + """ + + data: ResponseData + + @property + def time_zone(self) -> str: + """The time zone of the location.""" + return self.data["properties"]["timeZone"] + + @property + def grid_id(self) -> str: + """The unique identifier for the grid.""" + return self.data["properties"]["gridId"] + + @property + def grid_x(self) -> int: + """The X coordinate of the grid.""" + return self.data["properties"]["gridX"] + + @property + def grid_y(self) -> int: + """The Y coordinate of the grid.""" + return self.data["properties"]["gridY"] + + # LOCATION + + @property + def location(self) -> Mapping[str, Any]: + """Location data.""" + return self.data["properties"]["relativeLocation"] + + @property + def city(self) -> str: + """The city name.""" + return self.location["properties"]["city"] + + @property + def state(self) -> str: + """The state name.""" + return self.location["properties"]["state"] + + # URLS + + @property + def forecast_url(self) -> str: + """The URL for fetching forecast data.""" + return self.data["properties"]["forecast"] + + @property + def hourly_forecast_url(self) -> str: + """The URL for fetching hourly forecast data.""" + return self.data["properties"]["forecastHourly"] + + @property + def stations_url(self) -> str: + """The URL for fetching observation station data.""" + return self.data["properties"]["observationStations"] + + +@dataclasses.dataclass(frozen=True) +class Forecast(base_forecast.BaseForecast): + """Forecast data from the Weather.gov API. + + Represents a seven-day forecast, with two forecast periods for each calendar + date (one for daytime and one for night-time), starting today. + + Attributes: + periods: Seven-day forecast periods (day and night for each calendar date). + """ + + periods: Sequence[ForecastPeriod] + + @classmethod + def from_response_data(cls, data: ResponseData) -> Self: + """Constructs a Forecast object from API response data. + + Args: + data: The JSON data returned by a request to the Forecast API endpoint + (e.g. https://api.weather.gov/gridpoints/MTR/95,87/forecast). + + Returns: + A Forecast object. + """ + periods = data.get("properties", {}).get("periods", []) + forecast_periods = [ + ForecastPeriod( + number=p.get("number"), + name=p.get("name", ""), + start_timestamp=pd.Timestamp(p.get("startTime")), + end_timestamp=pd.Timestamp(p.get("endTime")), + is_daytime=p.get("isDaytime"), + temp=p.get("temperature"), + temp_unit=assign_temp_unit(p.get("temperatureUnit")), + temp_trend=p.get("temperatureTrend"), + chance_of_precip=p.get("probabilityOfPrecipitation", {}).get("value"), # pylint: disable=line-too-long + wind_speed=p.get("windSpeed"), + wind_direction=p.get("windDirection"), + icon=p.get("icon"), + short_forecast=p.get("shortForecast"), + detailed_forecast=p.get("detailedForecast"), + ) + for p in periods + ] + forecast_periods = sorted(forecast_periods, key=lambda p: p.start_timestamp) + return cls(periods=forecast_periods) + + +@dataclasses.dataclass(frozen=True) +class HourlyForecast(Forecast): + """Hourly forecast data from the Weather.gov API. + + Represents a forecast for each hour, spanning approximately seven days, + starting from the current time. + + Attributes: + periods: Hourly forecast periods. + """ + + periods: Sequence[HourlyForecastPeriod] + + @classmethod + def from_response_data( + cls, + data: ResponseData, + ) -> Self: + """Constructs an HourlyForecast object from API response data. + + Args: + data: The JSON data returned by a request to the Hourly Forecast API + endpoint (e.g. + https://api.weather.gov/gridpoints/MTR/95,87/forecast/hourly). + + Returns: + An HourlyForecast object. + """ + periods = data.get("properties", {}).get("periods", []) + forecast_periods = [ + HourlyForecastPeriod( + number=p.get("number"), + name=p.get("name", ""), + start_timestamp=pd.Timestamp(p.get("startTime")), + end_timestamp=pd.Timestamp(p.get("endTime")), + is_daytime=p.get("isDaytime"), + temp=p.get("temperature"), + temp_unit=assign_temp_unit(p.get("temperatureUnit")), + temp_trend=p.get("temperatureTrend"), + chance_of_precip=p.get("probabilityOfPrecipitation", {}).get("value"), # pylint: disable=line-too-long + dewpoint=p.get("dewpoint", {}).get("value"), + dewpoint_unit=p.get("dewpoint", {}).get("unitCode"), + relative_humidity=p.get("relativeHumidity", {}).get("value"), + relative_humidity_unit=p.get("relativeHumidity", {}).get("unitCode"), # pylint: disable=line-too-long + wind_speed=p.get("windSpeed"), + wind_direction=p.get("windDirection"), + icon=p.get("icon"), + short_forecast=p.get("shortForecast"), + detailed_forecast=p.get("detailedForecast"), + ) for p in periods + ] + forecast_periods = sorted(forecast_periods, key=lambda p: p.start_timestamp) + return cls(periods=forecast_periods) diff --git a/smart_control/services/weather_gov/models_test.py b/smart_control/services/weather_gov/models_test.py new file mode 100644 index 00000000..fb3c6606 --- /dev/null +++ b/smart_control/services/weather_gov/models_test.py @@ -0,0 +1,239 @@ +import dataclasses + +from absl.testing import absltest +import pandas as pd + +from smart_buildings.smart_control.services.weather_gov import conftest +from smart_buildings.smart_control.services.weather_gov import models + + +GRIDPOINT_URL = conftest.GRIDPOINT_URL +FORECAST_URL = conftest.FORECAST_URL +HOURLY_FORECAST_URL = conftest.HOURLY_FORECAST_URL + + +class ForecastPeriodTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.period = conftest.FIRST_PERIOD + + def test_properties(self): + with self.subTest(name="timestamps"): + self.assertEqual( + self.period.start_timestamp, pd.Timestamp("2026-02-06 09:00:00-08:00") + ) + self.assertEqual( + self.period.end_timestamp, pd.Timestamp("2026-02-06 18:00:00-08:00") + ) + + with self.subTest(name="duration"): + self.assertEqual(self.period.duration, pd.Timedelta(hours=9)) + + with self.subTest(name="dates"): + self.assertEqual(self.period.start_date, "2026-02-06") + self.assertEqual(self.period.end_date, "2026-02-06") + + +class HourlyForecastPeriodTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.period = conftest.FIRST_HOURLY_PERIOD + + def test_properties(self): + with self.subTest(name="timstamps"): + self.assertEqual( + self.period.start_timestamp, pd.Timestamp("2026-02-06 09:00:00-08:00") + ) + self.assertEqual( + self.period.end_timestamp, pd.Timestamp("2026-02-06 10:00:00-08:00") + ) + + with self.subTest(name="duration"): + self.assertEqual(self.period.duration, pd.Timedelta(hours=1)) + + with self.subTest(name="dates"): + self.assertEqual(self.period.start_date, "2026-02-06") + self.assertEqual(self.period.end_date, "2026-02-06") + + +class GridpointTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.gridpoint = conftest.create_gridpoint() + + def test_initialization(self): + self.assertIsInstance(self.gridpoint, models.Gridpoint) + + def test_properties(self): + self.assertEqual(self.gridpoint.time_zone, "America/Los_Angeles") + + with self.subTest(name="grid"): + self.assertEqual(self.gridpoint.grid_id, "MTR") + self.assertEqual(self.gridpoint.grid_x, 95) + self.assertEqual(self.gridpoint.grid_y, 87) + + with self.subTest(name="location"): + self.assertEqual(self.gridpoint.city, "Sunnyvale") + self.assertEqual(self.gridpoint.state, "CA") + + with self.subTest(name="urls"): + self.assertEqual(self.gridpoint.forecast_url, FORECAST_URL) + self.assertEqual(self.gridpoint.hourly_forecast_url, HOURLY_FORECAST_URL) + self.assertEqual( + self.gridpoint.stations_url, + "https://api.weather.gov/gridpoints/MTR/95,87/stations", + ) + + +class ForecastTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.forecast = conftest.create_forecast() + + def test_initialization(self): + self.assertIsInstance(self.forecast, models.Forecast) + + def test_periods(self): + periods = self.forecast.periods + self.assertLen(periods, 14) + + with self.subTest(name="example_periods"): + self.assertEqual(periods[0], conftest.FIRST_PERIOD) + self.assertEqual(periods[-1], conftest.LAST_PERIOD) + + with self.subTest(name="spans_seven_days"): + self.assertLen({r.start_date for r in periods}, 7) + + with self.subTest(name="two_periods_per_day"): + self.assertEqual( + pd.Series([r.is_daytime for r in periods]).value_counts().to_dict(), + {True: 7, False: 7} + ) + + with self.subTest(name="sorted_by_start_time_ascending"): + sorted_periods = sorted(periods, key=lambda p: p.start_timestamp) + self.assertEqual(list(periods), sorted_periods) + + def test_df(self): + forecast_df = self.forecast.df + self.assertIsInstance(forecast_df, pd.DataFrame) + self.assertLen(forecast_df, 14) + + with self.subTest(name="example_periods"): + comparison_df = forecast_df.drop( + columns=[ + "duration", + "start_date", + "end_date", + "start_seconds", + "end_seconds", + ] + ) + self.assertEqual( + comparison_df.iloc[0].to_dict(), + dataclasses.asdict(conftest.FIRST_PERIOD), + ) + self.assertEqual( + comparison_df.iloc[-1].to_dict(), + dataclasses.asdict(conftest.LAST_PERIOD), + ) + + with self.subTest(name="spans_seven_days"): + self.assertLen(forecast_df["start_date"].unique(), 7) + + with self.subTest(name="two_periods_per_day"): + self.assertEqual( + forecast_df["is_daytime"].value_counts().to_dict(), + {True: 7, False: 7} + ) + + +class HourlyForecastTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.hourly_forecast = conftest.create_hourly_forecast() + + def test_initialization(self): + self.assertIsInstance(self.hourly_forecast, models.HourlyForecast) + + def test_periods(self): + periods = self.hourly_forecast.periods + self.assertIsInstance(periods, list) + + with self.subTest(name="example_periods"): + self.assertEqual(periods[0], conftest.FIRST_HOURLY_PERIOD) + self.assertEqual(periods[-1], conftest.LAST_HOURLY_PERIOD) + + with self.subTest(name="spans_seven_days"): + timedelta = periods[-1].end_timestamp - periods[0].start_timestamp + self.assertEqual( + timedelta, + pd.Timedelta(days=6, hours=12), + ) + + with self.subTest(name="hourly_duration"): + durations = {r.duration for r in periods} + self.assertEqual(durations, {pd.Timedelta(hours=1)}) + + with self.subTest(name="one_period_per_hour"): + self.assertEqual( + [r.start_timestamp for r in periods[0:3]], + [ + pd.Timestamp("2026-02-06 09:00:00-08:00"), + pd.Timestamp("2026-02-06 10:00:00-08:00"), + pd.Timestamp("2026-02-06 11:00:00-08:00"), + ], + ) + + def test_df(self): + df = self.hourly_forecast.df + self.assertIsInstance(df, pd.DataFrame) + + with self.subTest(name="example_periods"): + comparison_df = df.drop( + columns=[ + "duration", + "start_date", + "end_date", + "start_seconds", + "end_seconds", + ] + ) + self.assertEqual( + comparison_df.iloc[0].to_dict(), + dataclasses.asdict(conftest.FIRST_HOURLY_PERIOD), + ) + self.assertEqual( + comparison_df.iloc[-1].to_dict(), + dataclasses.asdict(conftest.LAST_HOURLY_PERIOD), + ) + + with self.subTest(name="spans_seven_days"): + timedelta = df["end_timestamp"].iloc[-1] - df["start_timestamp"].iloc[0] + self.assertEqual( + timedelta, + pd.Timedelta(days=6, hours=12), + ) + + with self.subTest(name="hourly_duration"): + durations = df["duration"].unique() + self.assertEqual(durations, pd.Timedelta(hours=1)) + + with self.subTest(name="one_period_per_hour"): + self.assertEqual( + df["start_timestamp"].iloc[0:3].to_list(), + [ + pd.to_datetime("2026-02-06 09:00:00-08:00"), + pd.to_datetime("2026-02-06 10:00:00-08:00"), + pd.to_datetime("2026-02-06 11:00:00-08:00"), + ], + ) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/services/weather_gov/test_data/forecast.json b/smart_control/services/weather_gov/test_data/forecast.json new file mode 100644 index 00000000..4054e7a8 --- /dev/null +++ b/smart_control/services/weather_gov/test_data/forecast.json @@ -0,0 +1,319 @@ +{ + "@context": [ + "https://geojson.org/geojson-ld/geojson-context.jsonld", + { + "@version": "1.1", + "wx": "https://api.weather.gov/ontology#", + "geo": "http://www.opengis.net/ont/geosparql#", + "unit": "http://codes.wmo.int/common/unit/", + "@vocab": "https://api.weather.gov/ontology#" + } + ], + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -122.0169, + 37.4155 + ], + [ + -122.0224, + 37.4373 + ], + [ + -122.0499, + 37.4329 + ], + [ + -122.0444, + 37.4111 + ], + [ + -122.0169, + 37.4155 + ] + ] + ] + }, + "properties": { + "units": "us", + "forecastGenerator": "BaselineForecastGenerator", + "generatedAt": "2026-02-06T17:36:07+00:00", + "updateTime": "2026-02-06T16:14:10+00:00", + "validTimes": "2026-02-06T10:00:00+00:00/P7DT15H", + "elevation": { + "unitCode": "wmoUnit:m", + "value": 3.048 + }, + "periods": [ + { + "number": 1, + "name": "Today", + "startTime": "2026-02-06T09:00:00-08:00", + "endTime": "2026-02-06T18:00:00-08:00", + "isDaytime": true, + "temperature": 67, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 6 + }, + "windSpeed": "2 to 7 mph", + "windDirection": "NNW", + "icon": "https://api.weather.gov/icons/land/day/few?size=medium", + "shortForecast": "Sunny", + "detailedForecast": "Sunny. High near 67, with temperatures falling to around 64 in the afternoon. North northwest wind 2 to 7 mph." + }, + { + "number": 2, + "name": "Tonight", + "startTime": "2026-02-06T18:00:00-08:00", + "endTime": "2026-02-07T06:00:00-08:00", + "isDaytime": false, + "temperature": 46, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "windSpeed": "1 to 6 mph", + "windDirection": "NW", + "icon": "https://api.weather.gov/icons/land/night/sct/fog?size=medium", + "shortForecast": "Partly Cloudy then Areas Of Fog", + "detailedForecast": "Areas of fog after 1am. Partly cloudy. Low around 46, with temperatures rising to around 48 overnight. Northwest wind 1 to 6 mph." + }, + { + "number": 3, + "name": "Saturday", + "startTime": "2026-02-07T06:00:00-08:00", + "endTime": "2026-02-07T18:00:00-08:00", + "isDaytime": true, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "windSpeed": "2 to 8 mph", + "windDirection": "WNW", + "icon": "https://api.weather.gov/icons/land/day/fog/sct?size=medium", + "shortForecast": "Areas Of Fog then Mostly Sunny", + "detailedForecast": "Areas of fog before 9am. Mostly sunny. High near 63, with temperatures falling to around 61 in the afternoon. West northwest wind 2 to 8 mph." + }, + { + "number": 4, + "name": "Saturday Night", + "startTime": "2026-02-07T18:00:00-08:00", + "endTime": "2026-02-08T06:00:00-08:00", + "isDaytime": false, + "temperature": 46, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "windSpeed": "0 to 7 mph", + "windDirection": "W", + "icon": "https://api.weather.gov/icons/land/night/fog?size=medium", + "shortForecast": "Patchy Fog", + "detailedForecast": "Patchy fog after 10pm. Partly cloudy, with a low around 46. West wind 0 to 7 mph." + }, + { + "number": 5, + "name": "Sunday", + "startTime": "2026-02-08T06:00:00-08:00", + "endTime": "2026-02-08T18:00:00-08:00", + "isDaytime": true, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 10 + }, + "windSpeed": "2 to 8 mph", + "windDirection": "WSW", + "icon": "https://api.weather.gov/icons/land/day/fog/bkn?size=medium", + "shortForecast": "Areas Of Fog then Partly Sunny", + "detailedForecast": "Areas of fog before 9am. Partly sunny, with a high near 63. West southwest wind 2 to 8 mph." + }, + { + "number": 6, + "name": "Sunday Night", + "startTime": "2026-02-08T18:00:00-08:00", + "endTime": "2026-02-09T06:00:00-08:00", + "isDaytime": false, + "temperature": 48, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 10 + }, + "windSpeed": "3 to 8 mph", + "windDirection": "WNW", + "icon": "https://api.weather.gov/icons/land/night/fog?size=medium", + "shortForecast": "Areas Of Fog", + "detailedForecast": "Areas of fog after 9pm. Mostly cloudy, with a low around 48." + }, + { + "number": 7, + "name": "Monday", + "startTime": "2026-02-09T06:00:00-08:00", + "endTime": "2026-02-09T18:00:00-08:00", + "isDaytime": true, + "temperature": 61, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 7 + }, + "windSpeed": "3 to 9 mph", + "windDirection": "NW", + "icon": "https://api.weather.gov/icons/land/day/fog/bkn?size=medium", + "shortForecast": "Areas Of Fog then Mostly Cloudy", + "detailedForecast": "Areas of fog before 11am. Mostly cloudy, with a high near 61." + }, + { + "number": 8, + "name": "Monday Night", + "startTime": "2026-02-09T18:00:00-08:00", + "endTime": "2026-02-10T06:00:00-08:00", + "isDaytime": false, + "temperature": 46, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "windSpeed": "5 to 9 mph", + "windDirection": "WNW", + "icon": "https://api.weather.gov/icons/land/night/rain,20?size=medium", + "shortForecast": "Slight Chance Light Rain", + "detailedForecast": "A slight chance of rain between 10pm and 1am, then patchy fog and a slight chance of rain. Mostly cloudy, with a low around 46." + }, + { + "number": 9, + "name": "Tuesday", + "startTime": "2026-02-10T06:00:00-08:00", + "endTime": "2026-02-10T18:00:00-08:00", + "isDaytime": true, + "temperature": 57, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 35 + }, + "windSpeed": "5 to 10 mph", + "windDirection": "WSW", + "icon": "https://api.weather.gov/icons/land/day/rain,30/rain,40?size=medium", + "shortForecast": "Chance Light Rain", + "detailedForecast": "A chance of rain and patchy fog. Mostly cloudy, with a high near 57." + }, + { + "number": 10, + "name": "Tuesday Night", + "startTime": "2026-02-10T18:00:00-08:00", + "endTime": "2026-02-11T06:00:00-08:00", + "isDaytime": false, + "temperature": 43, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 36 + }, + "windSpeed": "5 to 10 mph", + "windDirection": "SSW", + "icon": "https://api.weather.gov/icons/land/night/rain,40?size=medium", + "shortForecast": "Chance Light Rain then Areas Of Fog", + "detailedForecast": "A chance of rain before 10pm, then a chance of rain and patchy fog between 10pm and midnight, then areas of fog and a chance of rain. Mostly cloudy, with a low around 43." + }, + { + "number": 11, + "name": "Wednesday", + "startTime": "2026-02-11T06:00:00-08:00", + "endTime": "2026-02-11T18:00:00-08:00", + "isDaytime": true, + "temperature": 58, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 31 + }, + "windSpeed": "3 to 9 mph", + "windDirection": "ENE", + "icon": "https://api.weather.gov/icons/land/day/rain,30?size=medium", + "shortForecast": "Areas Of Fog then Chance Light Rain", + "detailedForecast": "Areas of fog and a chance of rain before 9am, then a chance of rain and patchy fog. Mostly sunny, with a high near 58." + }, + { + "number": 12, + "name": "Wednesday Night", + "startTime": "2026-02-11T18:00:00-08:00", + "endTime": "2026-02-12T06:00:00-08:00", + "isDaytime": false, + "temperature": 42, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 22 + }, + "windSpeed": "2 to 9 mph", + "windDirection": "NNW", + "icon": "https://api.weather.gov/icons/land/night/rain,20?size=medium", + "shortForecast": "Slight Chance Light Rain then Areas Of Fog", + "detailedForecast": "A slight chance of rain before 10pm, then areas of fog and a slight chance of rain. Partly cloudy, with a low around 42." + }, + { + "number": 13, + "name": "Thursday", + "startTime": "2026-02-12T06:00:00-08:00", + "endTime": "2026-02-12T18:00:00-08:00", + "isDaytime": true, + "temperature": 60, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 12 + }, + "windSpeed": "2 to 9 mph", + "windDirection": "NNW", + "icon": "https://api.weather.gov/icons/land/day/fog/few?size=medium", + "shortForecast": "Areas Of Fog then Sunny", + "detailedForecast": "Areas of fog before 8am. Sunny, with a high near 60." + }, + { + "number": 14, + "name": "Thursday Night", + "startTime": "2026-02-12T18:00:00-08:00", + "endTime": "2026-02-13T06:00:00-08:00", + "isDaytime": false, + "temperature": 44, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 11 + }, + "windSpeed": "2 to 9 mph", + "windDirection": "W", + "icon": "https://api.weather.gov/icons/land/night/sct/fog?size=medium", + "shortForecast": "Partly Cloudy then Patchy Fog", + "detailedForecast": "Patchy fog after 5am. Partly cloudy, with a low around 44." + } + ] + } +} \ No newline at end of file diff --git a/smart_control/services/weather_gov/test_data/forecast_hourly.json b/smart_control/services/weather_gov/test_data/forecast_hourly.json new file mode 100644 index 00000000..5cc8a711 --- /dev/null +++ b/smart_control/services/weather_gov/test_data/forecast_hourly.json @@ -0,0 +1,215 @@ +{ + "@context": [ + "https://geojson.org/geojson-ld/geojson-context.jsonld", + { + "@version": "1.1", + "wx": "https://api.weather.gov/ontology#", + "geo": "http://www.opengis.net/ont/geosparql#", + "unit": "http://codes.wmo.int/common/unit/", + "@vocab": "https://api.weather.gov/ontology#" + } + ], + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -122.0169, + 37.4155 + ], + [ + -122.0224, + 37.4373 + ], + [ + -122.0499, + 37.4329 + ], + [ + -122.0444, + 37.4111 + ], + [ + -122.0169, + 37.4155 + ] + ] + ] + }, + "properties": { + "units": "us", + "forecastGenerator": "HourlyForecastGenerator", + "generatedAt": "2026-02-06T17:36:10+00:00", + "updateTime": "2026-02-06T16:14:10+00:00", + "validTimes": "2026-02-06T10:00:00+00:00/P7DT15H", + "elevation": { + "unitCode": "wmoUnit:m", + "value": 3.048 + }, + "periods": [ + { + "number": 1, + "name": "", + "startTime": "2026-02-06T09:00:00-08:00", + "endTime": "2026-02-06T10:00:00-08:00", + "isDaytime": true, + "temperature": 57, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 6 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 9.444444444444445 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 81 + }, + "windSpeed": "2 mph", + "windDirection": "W", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 2, + "name": "", + "startTime": "2026-02-06T10:00:00-08:00", + "endTime": "2026-02-06T11:00:00-08:00", + "isDaytime": true, + "temperature": 61, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 3 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 10 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 76 + }, + "windSpeed": "2 mph", + "windDirection": "NW", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 3, + "name": "", + "startTime": "2026-02-06T11:00:00-08:00", + "endTime": "2026-02-06T12:00:00-08:00", + "isDaytime": true, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 3 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 10.555555555555555 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 70 + }, + "windSpeed": "5 mph", + "windDirection": "NNW", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 154, + "name": "", + "startTime": "2026-02-12T18:00:00-08:00", + "endTime": "2026-02-12T19:00:00-08:00", + "isDaytime": false, + "temperature": 56, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 9 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 8.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 73 + }, + "windSpeed": "9 mph", + "windDirection": "NW", + "icon": "https://api.weather.gov/icons/land/night/few?size=small", + "shortForecast": "Mostly Clear", + "detailedForecast": "" + }, + { + "number": 155, + "name": "", + "startTime": "2026-02-12T19:00:00-08:00", + "endTime": "2026-02-12T20:00:00-08:00", + "isDaytime": false, + "temperature": 54, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 9 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 8.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 79 + }, + "windSpeed": "7 mph", + "windDirection": "WNW", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 156, + "name": "", + "startTime": "2026-02-12T20:00:00-08:00", + "endTime": "2026-02-12T21:00:00-08:00", + "isDaytime": false, + "temperature": 52, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 9 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 8.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 83 + }, + "windSpeed": "7 mph", + "windDirection": "WNW", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + } + ] + } +} \ No newline at end of file diff --git a/smart_control/services/weather_gov/test_data/gridpoint.json b/smart_control/services/weather_gov/test_data/gridpoint.json new file mode 100644 index 00000000..c877b17d --- /dev/null +++ b/smart_control/services/weather_gov/test_data/gridpoint.json @@ -0,0 +1,95 @@ +{ + "@context": [ + "https://geojson.org/geojson-ld/geojson-context.jsonld", + { + "@version": "1.1", + "wx": "https://api.weather.gov/ontology#", + "s": "https://schema.org/", + "geo": "http://www.opengis.net/ont/geosparql#", + "unit": "http://codes.wmo.int/common/unit/", + "@vocab": "https://api.weather.gov/ontology#", + "geometry": { + "@id": "s:GeoCoordinates", + "@type": "geo:wktLiteral" + }, + "city": "s:addressLocality", + "state": "s:addressRegion", + "distance": { + "@id": "s:Distance", + "@type": "s:QuantitativeValue" + }, + "bearing": { + "@type": "s:QuantitativeValue" + }, + "value": { + "@id": "s:value" + }, + "unitCode": { + "@id": "s:unitCode", + "@type": "@id" + }, + "forecastOffice": { + "@type": "@id" + }, + "forecastGridData": { + "@type": "@id" + }, + "publicZone": { + "@type": "@id" + }, + "county": { + "@type": "@id" + } + } + ], + "id": "https://api.weather.gov/points/37.4263,-122.0349", + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -122.0349, + 37.4263 + ] + }, + "properties": { + "@id": "https://api.weather.gov/points/37.4263,-122.0349", + "@type": "wx:Point", + "cwa": "MTR", + "type": "land", + "forecastOffice": "https://api.weather.gov/offices/MTR", + "gridId": "MTR", + "gridX": 95, + "gridY": 87, + "forecast": "https://api.weather.gov/gridpoints/MTR/95,87/forecast", + "forecastHourly": "https://api.weather.gov/gridpoints/MTR/95,87/forecast/hourly", + "forecastGridData": "https://api.weather.gov/gridpoints/MTR/95,87", + "observationStations": "https://api.weather.gov/gridpoints/MTR/95,87/stations", + "relativeLocation": { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -122.026316, + 37.385797 + ] + }, + "properties": { + "city": "Sunnyvale", + "state": "CA", + "distance": { + "unitCode": "wmoUnit:m", + "value": 4567.1108116324 + }, + "bearing": { + "unitCode": "wmoUnit:degree_(angle)", + "value": 350 + } + } + }, + "forecastZone": "https://api.weather.gov/zones/forecast/CAZ508", + "county": "https://api.weather.gov/zones/county/CAC085", + "fireWeatherZone": "https://api.weather.gov/zones/fire/CAZ508", + "timeZone": "America/Los_Angeles", + "radarStation": "KMUX" + } +} \ No newline at end of file diff --git a/smart_control/services/weather_gov/weather_script.py b/smart_control/services/weather_gov/weather_script.py new file mode 100644 index 00000000..5196ef19 --- /dev/null +++ b/smart_control/services/weather_gov/weather_script.py @@ -0,0 +1,49 @@ +"""An executable script for integration testing the weather service. + +Example execution: +blaze run //third_party/py/smart_buildings/smart_control/services/weather_gov:weather_script +""" # pylint: disable=line-too-long + +from collections.abc import Sequence + +from absl import app +from absl import flags + +from smart_buildings.smart_control.services.weather_gov import weather_service + +_LAT = flags.DEFINE_float( + name="lat", + default=weather_service.SB1_COORDS["lat"], + help=( + "Latitude (in fractional degrees / decimal degrees) of the location to" + " fetch weather data for." + ), +) + +_LON = flags.DEFINE_float( + name="lon", + default=weather_service.SB1_COORDS["lon"], + help=( + "Longitude (in fractional degrees / decimal degrees) of the location to" + " fetch weather data for." + ), +) + + +def main(argv: Sequence[str]) -> None: + if len(argv) > 1: + raise app.UsageError("Too many command-line arguments.") + + lat = float(input("Provide a latitude (or press enter): ") or _LAT.value) + lon = float(input("Provide a longitude (or press enter): ") or _LON.value) + service = weather_service.WeatherService(lat=lat, lon=lon) + + print(f"Fetching forecast for coordinates: ({lat}, {lon})") + forecast = service.get_forecast() + + print("Current Forecast:") + print(forecast.df.head()) + + +if __name__ == "__main__": + app.run(main) diff --git a/smart_control/services/weather_gov/weather_service.py b/smart_control/services/weather_gov/weather_service.py new file mode 100644 index 00000000..81e32eda --- /dev/null +++ b/smart_control/services/weather_gov/weather_service.py @@ -0,0 +1,240 @@ +"""Service class for interfacing with the Weather.gov API. + +This API only provides weather data for locations within the United States. + +API Docs: https://www.weather.gov/documentation/services-web-api + +The API recommends the following authenticiation strategy: + +> A User Agent is required to identify your application. This string can be +> anything, and the more unique to your application the less likely it will be +> affected by a security event. If you include contact information (website or +> email), we can contact you if your string is associated to a security event. +> This will be replaced with an API key in the future. +> +> User-Agent: (myweatherapp.com, contact@myweatherapp.com) +""" + +import functools +import os +from typing import Any + +import backoff +import immutabledict +import pandas as pd +import requests + +from smart_buildings.smart_control.services.weather import base_weather_service +from smart_buildings.smart_control.services.weather import base_forecast +from smart_buildings.smart_control.services.weather_gov import models + +MAX_TRIES = int(os.environ.get("WEATHER_GOV_MAX_TRIES", "3")) + +SB1_COORDS = immutabledict.immutabledict({"lat": 37.4263, "lon": -122.0349}) + +USER_AGENT = os.environ.get( + "WEATHER_GOV_USER_AGENT", + "(oss-smart-buildings-control, https://github.com/google/sbsim)", +) + + +class WeatherService(base_weather_service.BaseWeatherService): + """Service for fetching data from the Weather.gov API for a given US location. + + This service is initialized for a specific latitude and longitude, and the + gridpoint data is cached. To fetch weather data for a different location, a + new instance of WeatherService should be created. + + The intended use case is to make infrequent requests, for example, one request + per hour. Based on this use case, we wouldn't get the benefits of keeping a + persistent session, so we are choosing to use a new session for each request. + + The service supports an optional cache_max_age, which represents the + duration of time for which fetched data should be considered valid. If the + cache_max_age is specified, cached data will be used until the age of the + cached data exceeds the cache_max_age. If cache_max_age is None, then new + data will be fetched on every request. This helps avoid unnecessary API calls, + since recently fetched forecast data will still be generally accurate, even a + few hours later. + + Attributes: + lat: Latitude of the location to fetch weather data for. + lon: Longitude of the location to fetch weather data for. + user_agent: User agent to use for the request. + cache_max_age: The duration of time to wait before fetching a new forecast. + If specified, cached data is used until the age of the cached data + exceeds the cache_max_age. If None, new data is fetched on every request. + """ + + def __init__( + self, + *, + lat: float = SB1_COORDS["lat"], + lon: float = SB1_COORDS["lon"], + user_agent: str = USER_AGENT, + cache_max_age: pd.Timedelta | None = None, + ): + """Initializes the instance. + + Args: + lat: Latitude (in fractional degrees / decimal degrees) of the location + to fetch weather data for. + lon: Longitude (in fractional degrees / decimal degrees) of the location + to fetch weather data for. + user_agent: User agent to use for the request. + cache_max_age: The duration of time to wait before fetching a new + forecast. If specified, cached data is used until the interval expires. + If None, new data is fetched on every request. + """ + self.lat = lat + self.lon = lon + self.user_agent = user_agent + self.cache_max_age = cache_max_age + + self._cached_hourly_forecast_data: models.ResponseData | None = None + self._cache_updated_timestamp: pd.Timestamp | None = None + + @property + def session(self) -> requests.Session: + """Provides a requests.Session instance. + + By default, this returns a new Session on each access, suitable for + infrequent calls. Subclasses can override this property to provide + a customized session. + + Returns: + A requests.Session instance. + """ + return requests.Session() + + @backoff.on_exception( + backoff.expo, requests.exceptions.RequestException, max_tries=MAX_TRIES + ) + def _get_data( + self, request_url: str, timeout: int = 60 + ) -> models.ResponseData: + """Makes a GET request for JSON data from the Weather.gov API. + + Because the use case is to make infrequent requests, like once every hour, + we are choosing to initialize a new session for each request. + + We are also ensuring the session gets closed by using a context manager + approach. + + Args: + request_url: The URL to make the GET request to. + timeout: Optional timeout in seconds for the request. + + Returns: + The JSON data returned by the request. + """ + with self.session as session: + session.headers.update({"User-Agent": self.user_agent}) + response = session.get(request_url, timeout=timeout) + response.raise_for_status() + return response.json() + + @property + def gridpoint_url(self) -> str: + """The URL for fetching gridpoint data.""" + return f"https://api.weather.gov/points/{self.lat},{self.lon}" + + @functools.cached_property + def gridpoint(self) -> models.Gridpoint: + """A Gridpoint object for the given location.""" + return models.Gridpoint(self._get_data(self.gridpoint_url)) + + @property + def cached_data_is_valid(self) -> bool: + """Whether or not cached data is available and recent enough to be reused. + + If we didn't specify a validity interval, or if cached data is not + available, then we will always consider the cached data as invalid and + fetch new data on every request. + + If the cache_max_age has been specified and cached data is available, + then we determine if the cache age has exceeded the max age. + + Returns: + True if the cache_max_age is specified, and the cached data is + available and valid, False otherwise. + """ + if ( + self.cache_max_age is None + or self._cached_hourly_forecast_data is None + or self._cache_updated_timestamp is None + ): + return False + + cache_age = pd.Timestamp.now(tz="UTC") - self._cache_updated_timestamp + return cache_age < self.cache_max_age + + def get_forecast(self) -> models.Forecast: + """Fetches forecast data for the given location.""" + data = self._get_data(self.gridpoint.forecast_url) + return models.Forecast.from_response_data(data=data) + + def get_hourly_forecast( + self, + *, + start_timestamp: pd.Timestamp | None = None, + n_hours: int = 24, + normalize_to_start: bool = False, + **kwargs: Any, + ) -> base_forecast.BaseForecast: + """Fetches hourly forecast data for the given location. + + Args: + start_timestamp: The timezone-aware start timestamp of the forecast. + n_hours: The number of hours to fetch. + normalize_to_start: Whether to normalize the forecast to the start + timestamp. + **kwargs: Additional keyword arguments for child classes. + + Returns: + A BaseForecast object. + + Raises: + requests.exceptions.RequestException: If the request fails, and no cached + data is available. + ValueError: If start_timestamp is provided and is not timezone-aware. + """ + del kwargs # Unused by this implementation. + + if start_timestamp and start_timestamp.tzinfo is None: + raise ValueError("start_timestamp must be timezone-aware.") + + if self.cached_data_is_valid: + # Use cached data if available and valid. + forecast = models.HourlyForecast.from_response_data( + data=self._cached_hourly_forecast_data, + ) + else: + try: + # Fetch new data from the API, and cache it. + data = self._get_data(self.gridpoint.hourly_forecast_url) + forecast = models.HourlyForecast.from_response_data(data=data) + self._cached_hourly_forecast_data = data + self._cache_updated_timestamp = pd.Timestamp.now(tz="UTC") + except requests.exceptions.RequestException as err: + # Fallback to use cached data, if available. + if self._cached_hourly_forecast_data: + forecast = models.HourlyForecast.from_response_data( + data=self._cached_hourly_forecast_data, + ) + else: + raise requests.exceptions.RequestException( + "Failed to fetch forecast data. No cached data is available." + ) from err + + if normalize_to_start and start_timestamp: + forecast = forecast.resample( + start_timestamp=start_timestamp, + interval=pd.Timedelta(hours=1), + ) + + forecast = forecast.filter_periods( + ends_after_timestamp=start_timestamp, + max_periods=n_hours, + ) + return forecast diff --git a/smart_control/services/weather_gov/weather_service_test.py b/smart_control/services/weather_gov/weather_service_test.py new file mode 100644 index 00000000..6461d036 --- /dev/null +++ b/smart_control/services/weather_gov/weather_service_test.py @@ -0,0 +1,371 @@ +from unittest import mock + +from absl.testing import absltest +import pandas as pd +import requests + +from smart_buildings.smart_control.services.weather import base_forecast +from smart_buildings.smart_control.services.weather_gov import conftest +from smart_buildings.smart_control.services.weather_gov import models +from smart_buildings.smart_control.services.weather_gov import weather_service + +GRIDPOINT_URL = conftest.GRIDPOINT_URL +FORECAST_URL = conftest.FORECAST_URL +HOURLY_FORECAST_URL = conftest.HOURLY_FORECAST_URL + + +class MockResponse: + + def __init__( + self, json_data: models.ResponseData, status_code: int + ): + self.json_data = json_data + self.status_code = status_code + self.ok = status_code < 400 + + def json(self): + return self.json_data + + def raise_for_status(self): + if not self.ok: + raise requests.exceptions.RequestException( + f"Request failed with status code {self.status_code}" + ) + + +def mock_requests_get(url: str, **kwargs) -> MockResponse: + """Mimics requests.get() function, can be used to prevent network requests. + + For the default location, we have test data to return. + + For other locations, we swallow the request and return a custom error message. + + Args: + url: The URL to make the GET request to. + **kwargs: Keyword arguments to pass along with the request. + + Returns: + A MockResponse object. + """ + del kwargs # needed for the timeout arg, but unused in the MockResponse + if url == GRIDPOINT_URL: + return MockResponse(conftest.read_gridpoint_data(), 200) + elif url == FORECAST_URL: + return MockResponse(conftest.read_forecast_data(), 200) + elif url == HOURLY_FORECAST_URL: + return MockResponse(conftest.read_hourly_forecast_data(), 200) + return MockResponse( + {"message": "Sorry, we don't have test data for the specified URL."}, 200 + ) + + +def mock_requests_get_error(url: str, **kwargs) -> MockResponse: + """Similar to mock_requests_get but raises for the given URL.""" + del url, kwargs # Unused by this implementation. + raise requests.exceptions.RequestException("Failed") + + +class WeatherServiceTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.mock_session = mock.MagicMock(spec=requests.Session) + self.mock_session.headers = mock.MagicMock() + self.mock_session.get.side_effect = mock_requests_get + self.mock_session.__enter__.return_value = self.mock_session + self.service = weather_service.WeatherService() + self.enter_context( + mock.patch.object( + weather_service.WeatherService, + "session", + new_callable=mock.PropertyMock, + return_value=self.mock_session, + ) + ) + + def test_attributes(self): + self.assertEqual(self.service.lat, 37.4263) + self.assertEqual(self.service.lon, -122.0349) + + def test_properties(self): + self.assertEqual(self.service.gridpoint_url, GRIDPOINT_URL) + + def test_get_gridpoint(self): + gridpoint = self.service.gridpoint + self.assertIsInstance(gridpoint, models.Gridpoint) + + self.mock_session.headers.update.assert_called_once_with( + {"User-Agent": self.service.user_agent} + ) + self.mock_session.get.assert_called_once_with(GRIDPOINT_URL, timeout=60) + + def test_get_forecast(self): + forecast = self.service.get_forecast() + self.assertIsInstance(forecast, models.Forecast) + + # Makes two calls to get the gridpoint data and then the forecast data. + self.assertEqual(2, self.mock_session.headers.update.call_count) + self.mock_session.headers.update.assert_called_with( + {"User-Agent": self.service.user_agent} + ) + calls = [ + mock.call(GRIDPOINT_URL, timeout=60), + mock.call(FORECAST_URL, timeout=60), + ] + self.mock_session.get.assert_has_calls(calls) + self.mock_session.get.reset_mock() + self.mock_session.headers.update.reset_mock() + + _ = self.service.get_forecast() + with self.subTest(name="subsequent_calls_use_cached_gridpoint"): + self.mock_session.headers.update.assert_called_once_with( + {"User-Agent": self.service.user_agent} + ) + self.mock_session.get.assert_called_once_with(FORECAST_URL, timeout=60) + + def test_get_hourly_forecast(self): + hourly_forecast = self.service.get_hourly_forecast() + self.assertIsInstance(hourly_forecast, models.HourlyForecast) + self.assertLen(hourly_forecast.periods, 6) + + with self.subTest(name="first_call_fetches_gridpoint_then_hourly_forecast"): + self.assertEqual(2, self.mock_session.headers.update.call_count) + self.mock_session.headers.update.assert_called_with( + {"User-Agent": self.service.user_agent} + ) + calls = [ + mock.call(GRIDPOINT_URL, timeout=60), + mock.call(HOURLY_FORECAST_URL, timeout=60), + ] + self.mock_session.get.assert_has_calls(calls) + self.mock_session.get.reset_mock() + self.mock_session.headers.update.reset_mock() + + _ = self.service.get_hourly_forecast() + with self.subTest(name="subsequent_calls_use_cached_gridpoint"): + self.mock_session.headers.update.assert_called_once_with( + {"User-Agent": self.service.user_agent} + ) + self.mock_session.get.assert_called_once_with( + HOURLY_FORECAST_URL, timeout=60 + ) + + def test_get_hourly_forecast_with_normalize_to_start(self): + start_time = pd.Timestamp("2026-02-06 09:30:00-08:00") + hourly_forecast = self.service.get_hourly_forecast( + start_timestamp=start_time, n_hours=2, normalize_to_start=True + ) + self.assertIsInstance(hourly_forecast, base_forecast.BaseForecast) + self.assertLen(hourly_forecast.periods, 2) + self.assertEqual( + hourly_forecast.first_period.start_timestamp.minute, + start_time.minute, + ) + # Expect interpolated value between 57F (at 9:00) and 61F (at 10:00). + self.assertEqual(hourly_forecast.first_period.temp, 59) + # Expect interpolated value between 61F (at 10:00) and 63F (at 11:00). + self.assertEqual(hourly_forecast.periods[1].temp, 62) + + def test_get_hourly_forecast_naive_start_timestamp_raises(self): + with self.assertRaisesRegex( + ValueError, "start_timestamp must be timezone-aware." + ): + self.service.get_hourly_forecast( + start_timestamp=pd.Timestamp("2026-02-06 09:30:00") + ) + + def test_get_gridpoint_raises_for_status(self): + self.mock_session.get.side_effect = lambda url, **kwargs: MockResponse( + {}, 404 + ) + with self.assertRaises(requests.exceptions.RequestException): + _ = self.service.gridpoint + + @mock.patch("time.sleep") + def test_get_gridpoint_uses_backoff_on_request_exception(self, mock_sleep): + del mock_sleep # Unused by this test. + self.mock_session.get.side_effect = [ + requests.exceptions.RequestException("Failed 1"), + requests.exceptions.RequestException("Failed 2"), + mock_requests_get(GRIDPOINT_URL, timeout=60), + ] + + gridpoint = self.service.gridpoint + + self.assertIsInstance(gridpoint, models.Gridpoint) + self.assertEqual(3, self.mock_session.get.call_count) + + @mock.patch("time.sleep") + def test_get_forecast_uses_backoff_on_request_exception(self, mock_sleep): + del mock_sleep # Unused by this test. + self.mock_session.get.side_effect = [ + mock_requests_get(GRIDPOINT_URL, timeout=60), + requests.exceptions.RequestException("Failed 1"), + requests.exceptions.RequestException("Failed 2"), + mock_requests_get(FORECAST_URL, timeout=60), + ] + + forecast = self.service.get_forecast() + + self.assertIsInstance(forecast, models.Forecast) + self.assertEqual(4, self.mock_session.get.call_count) + + +class WeatherServiceCustomLocationTest(absltest.TestCase): + """Tests the WeatherService for a custom location. + + Since the weather service gets the forecast URL and hourly forecast URL from + the gridpoint response data, we don't know what those URLs will be beforehand. + """ + + def setUp(self): + super().setUp() + self.lat = 40.7128 + self.lon = -74.0060 + self.mock_session = mock.MagicMock(spec=requests.Session) + self.mock_session.headers = mock.MagicMock() + self.mock_session.get.side_effect = mock_requests_get + self.mock_session.__enter__.return_value = self.mock_session + self.service = weather_service.WeatherService(lat=self.lat, lon=self.lon) + self.enter_context( + mock.patch.object( + weather_service.WeatherService, + "session", + new_callable=mock.PropertyMock, + return_value=self.mock_session, + ) + ) + + def test_get_gridpoint(self): + _ = self.service.gridpoint + self.mock_session.headers.update.assert_called_once_with( + {"User-Agent": self.service.user_agent} + ) + self.mock_session.get.assert_called_once_with( + f"https://api.weather.gov/points/{self.lat},{self.lon}", timeout=60 + ) + + +class WeatherServiceCachedDataTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.mock_session = mock.MagicMock(spec=requests.Session) + self.mock_session.headers = mock.MagicMock() + self.mock_session.__enter__.return_value = self.mock_session + self.service = weather_service.WeatherService() + self.enter_context( + mock.patch.object( + weather_service.WeatherService, + "session", + new_callable=mock.PropertyMock, + return_value=self.mock_session, + ) + ) + + def test_get_hourly_forecast_uses_cache_on_failure(self): + # First call succeeds and caches data. + self.mock_session.get.side_effect = mock_requests_get + initial_forecast = self.service.get_hourly_forecast() + self.assertIsNotNone(self.service._cached_hourly_forecast_data) + self.assertLen(initial_forecast.periods, 6) + + # Second call fails, and returns cached data. + self.mock_session.get.side_effect = mock_requests_get_error + cached_forecast = self.service.get_hourly_forecast() + self.assertIsInstance(cached_forecast, models.HourlyForecast) + self.assertLen(cached_forecast.periods, len(initial_forecast.periods)) + self.assertEqual( + initial_forecast.periods[0].start_timestamp, + cached_forecast.periods[0].start_timestamp, + ) + + def test_get_hourly_forecast_raises_exception_on_failure_with_no_cache(self): + self.assertIsNone(self.service._cached_hourly_forecast_data) + + self.mock_session.get.side_effect = mock_requests_get_error + + with self.assertRaisesRegex( + requests.exceptions.RequestException, + "Failed to fetch forecast data.", + ): + self.service.get_hourly_forecast() + + def test_get_hourly_forecast_with_forecast_start_filters_cache(self): + # First call succeeds and caches data. + self.mock_session.get.side_effect = mock_requests_get + initial_forecast = self.service.get_hourly_forecast() + self.assertIsNotNone(self.service._cached_hourly_forecast_data) + + # Second call fails, and returns cached data, filtered by start_timestamp. + self.mock_session.get.side_effect = mock_requests_get_error + start_timestamp = ( + initial_forecast.first_period.start_timestamp + pd.Timedelta(hours=1) + ) + cached_forecast = self.service.get_hourly_forecast( + start_timestamp=start_timestamp + ) + self.assertIsInstance(cached_forecast, models.HourlyForecast) + self.assertLen(cached_forecast.periods, 5) + self.assertEqual( + cached_forecast.first_period.start_timestamp, + start_timestamp, + ) + + +class WeatherServiceValidityIntervalTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.mock_session = mock.MagicMock(spec=requests.Session) + self.mock_session.headers = mock.MagicMock() + self.mock_session.__enter__.return_value = self.mock_session + self.service = weather_service.WeatherService() + self.enter_context( + mock.patch.object( + weather_service.WeatherService, + "session", + new_callable=mock.PropertyMock, + return_value=self.mock_session, + ) + ) + + def test_get_hourly_forecast_uses_validity_interval(self): + # Setup service with cache_max_age + self.service.cache_max_age = pd.Timedelta(hours=1) + self.mock_session.get.side_effect = mock_requests_get + + t1 = pd.Timestamp("2023-01-01 12:00:00", tz="UTC") + t2 = t1 + pd.Timedelta(minutes=30) # Within cache_max_age + t3 = t1 + pd.Timedelta(minutes=61) # After cache_max_age expires + + with mock.patch("pandas.Timestamp.now") as mock_now: + # Initial call, fetches data (no cached data is available). + mock_now.return_value = t1 + self.service.get_hourly_forecast() + # ... makes two calls (one for gridpoint, one for hourly forecast): + self.assertEqual(2, self.mock_session.get.call_count) + # ... updates the cache_updated_timestamp to the time of the call: + self.assertEqual(t1, self.service._cache_updated_timestamp) + self.mock_session.get.reset_mock() + + # Second call, within cache_max_age, uses cached data. + mock_now.return_value = t2 + self.service.get_hourly_forecast() + # ... makes no calls: + self.assertEqual(0, self.mock_session.get.call_count) + # ... does not update the cache_updated_timestamp: + self.assertEqual(t1, self.service._cache_updated_timestamp) + self.mock_session.get.reset_mock() + + # Third call, after cache_max_age expires, fetches new data. + mock_now.return_value = t3 + self.service.get_hourly_forecast() + # ... makes one call, for forecast (gridpoint has already been cached) + self.assertEqual(1, self.mock_session.get.call_count) + # ... updates the cache_updated_timestamp to the time of the call: + self.assertEqual(t3, self.service._cache_updated_timestamp) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/simulator/BUILD b/smart_control/simulator/BUILD deleted file mode 100644 index afae6a13..00000000 --- a/smart_control/simulator/BUILD +++ /dev/null @@ -1,592 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# BUILD file for simulator package. -load("//devtools/python/blaze:pytype.bzl", "pytype_strict_library") -load("//devtools/python/blaze:strict.bzl", "py_strict_test") - -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -py_strict_test( - name = "air_handler_test", - srcs = ["air_handler_test.py"], - deps = [ - ":air_handler", - ":weather_controller", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/utils:constants", - ], -) - -py_strict_test( - name = "boiler_test", - srcs = ["boiler_test.py"], - deps = [ - ":boiler", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:constants", - ], -) - -py_strict_test( - name = "building_test", - srcs = ["building_test.py"], - deps = [ - ":building", - ":building_utils", - ":constants", - ":stochastic_convection_simulator", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - ], -) - -py_strict_test( - name = "building_utils_test", - srcs = ["building_utils_test.py"], - deps = [ - ":building_utils", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - ], -) - -py_strict_test( - name = "hvac_floorplan_based_test", - srcs = ["hvac_floorplan_based_test.py"], - deps = [ - ":air_handler", - ":boiler", - ":hvac_floorplan_based", - ":setpoint_schedule", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "hvac_test", - srcs = ["hvac_test.py"], - deps = [ - ":air_handler", - ":boiler", - ":hvac", - ":setpoint_schedule", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "randomized_arrival_departure_occupancy_test", - srcs = ["randomized_arrival_departure_occupancy_test.py"], - deps = [ - ":randomized_arrival_departure_occupancy", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - "//third_party/py/pandas", - ], -) - -py_strict_test( - name = "rejection_simulator_building_test", - srcs = ["rejection_simulator_building_test.py"], - deps = [ - ":rejection_simulator_building", - ":simulator_building", - ":simulator_building_test_lib", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - ], -) - -py_strict_test( - name = "setpoint_schedule_test", - srcs = ["setpoint_schedule_test.py"], - deps = [ - ":setpoint_schedule", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/pytz", - ], -) - -py_strict_test( - name = "simulator_building_test", - srcs = ["simulator_building_test.py"], - deps = [ - ":simulator_building", - ":simulator_building_test_lib", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - ], -) - -py_strict_test( - name = "simulator_flexible_floor_plan_test", - srcs = ["simulator_flexible_floor_plan_test.py"], - deps = [ - ":air_handler", - ":boiler", - ":building", - ":hvac_floorplan_based", - ":setpoint_schedule", - ":simulator_flexible_floor_plan", - ":step_function_occupancy", - ":weather_controller", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "simulator_test", - srcs = ["simulator_test.py"], - deps = [ - ":air_handler", - ":boiler", - ":building", - ":hvac", - ":setpoint_schedule", - ":simulator", - ":step_function_occupancy", - ":weather_controller", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "smart_device_test", - srcs = ["smart_device_test.py"], - deps = [ - ":smart_device", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - ], -) - -py_strict_test( - name = "step_function_occupancy_test", - srcs = ["step_function_occupancy_test.py"], - deps = [ - ":step_function_occupancy", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - ], -) - -py_strict_test( - name = "thermal_diffuser_utils_test", - srcs = ["thermal_diffuser_utils_test.py"], - deps = [ - ":thermal_diffuser_utils", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - ], -) - -py_strict_test( - name = "thermostat_test", - srcs = ["thermostat_test.py"], - deps = [ - ":setpoint_schedule", - ":thermostat", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - ], -) - -pytype_strict_library( - name = "air_handler", - srcs = ["air_handler.py"], - deps = [ - ":smart_device", - ":weather_controller", - "//third_party/py/gin", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:constants", - ], -) - -pytype_strict_library( - name = "boiler", - srcs = ["boiler.py"], - deps = [ - ":smart_device", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:constants", - ], -) - -pytype_strict_library( - name = "building", - srcs = ["building.py"], - deps = [ - ":base_convection_simulator", - ":building_utils", - ":constants", - ":thermal_diffuser_utils", - "//third_party/py/gin", - "//third_party/py/numpy", - ], -) - -pytype_strict_library( - name = "building_utils", - srcs = ["building_utils.py"], - deps = [ - ":constants", - "//third_party/py/cv2", - "//third_party/py/matplotlib", - "//third_party/py/numpy", - "//third_party/py/scipy", - ], -) - -pytype_strict_library( - name = "constants", - srcs = ["constants.py"], -) - -pytype_strict_library( - name = "hvac", - srcs = ["hvac.py"], - deps = [ - ":air_handler", - ":boiler", - ":setpoint_schedule", - ":thermostat", - ":vav", - "//third_party/py/gin", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "hvac_floorplan_based", - srcs = ["hvac_floorplan_based.py"], - deps = [ - ":air_handler", - ":boiler", - ":constants", - ":setpoint_schedule", - ":thermostat", - ":vav", - "//third_party/py/gin", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "randomized_arrival_departure_occupancy", - srcs = ["randomized_arrival_departure_occupancy.py"], - deps = [ - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_occupancy", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "rejection_simulator_building", - srcs = ["rejection_simulator_building.py"], - deps = [ - "//third_party/py/gin", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_building", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -pytype_strict_library( - name = "setpoint_schedule", - srcs = ["setpoint_schedule.py"], - deps = [ - "//third_party/py/gin", - "//third_party/py/pandas", - "//third_party/py/pytz", - ], -) - -pytype_strict_library( - name = "simulator", - srcs = ["simulator.py"], - deps = [ - ":building", - ":hvac", - ":weather_controller", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_occupancy", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "tf_simulator", - srcs = ["tf_simulator.py"], - deps = [ - ":building", - ":hvac_floorplan_based", - ":simulator_flexible_floor_plan", - ":weather_controller", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/tensorflow", - ], -) - -py_strict_test( - name = "tf_simulator_test", - srcs = ["tf_simulator_test.py"], - deps = [ - "tf_simulator", - ":air_handler", - ":boiler", - ":building", - ":hvac_floorplan_based", - ":setpoint_schedule", - ":weather_controller", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/tensorflow:tensorflow_no_contrib", - ], -) - -pytype_strict_library( - name = "simulator_building", - srcs = ["simulator_building.py"], - deps = [ - ":simulator", - ":simulator_flexible_floor_plan", - ":smart_device", - ":tf_simulator", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_building", - "//third_party/py/smart_buildings/smart_control/models:base_occupancy", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "simulator_building_test_lib", - srcs = ["simulator_building_test_lib.py"], - deps = [ - ":air_handler", - ":boiler", - ":building", - ":hvac", - ":setpoint_schedule", - ":simulator", - ":simulator_building", - ":step_function_occupancy", - ":weather_controller", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - ], -) - -pytype_strict_library( - name = "simulator_flexible_floor_plan", - srcs = ["simulator_flexible_floor_plan.py"], - deps = [ - ":building", - ":constants", - ":hvac_floorplan_based", - ":simulator", - ":weather_controller", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_occupancy", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:building_renderer", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - "//third_party/py/smart_buildings/smart_control/utils:visual_logger", - ], -) - -pytype_strict_library( - name = "smart_device", - srcs = ["smart_device.py"], - deps = [ - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - ], -) - -pytype_strict_library( - name = "step_function_occupancy", - srcs = ["step_function_occupancy.py"], - deps = [ - "//third_party/py/gin", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_occupancy", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "thermal_diffuser_utils", - srcs = ["thermal_diffuser_utils.py"], - deps = [ - ":building_utils", - "//third_party/py/absl/logging", - "//third_party/py/cv2", - "//third_party/py/numpy", - ], -) - -pytype_strict_library( - name = "thermostat", - srcs = ["thermostat.py"], - deps = [ - ":setpoint_schedule", - "//third_party/py/pandas", - ], -) - -pytype_strict_library( - name = "vav", - srcs = ["vav.py"], - deps = [ - ":boiler", - ":smart_device", - ":thermostat", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:constants", - ], -) - -pytype_strict_library( - name = "weather_controller", - srcs = ["weather_controller.py"], - deps = [ - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -pytype_strict_library( - name = "stochastic_convection_simulator", - srcs = ["stochastic_convection_simulator.py"], - deps = [ - ":base_convection_simulator", - "//third_party/py/gin", - "//third_party/py/numpy", - ], -) - -pytype_strict_library( - name = "base_convection_simulator", - srcs = ["base_convection_simulator.py"], - deps = ["//third_party/py/numpy"], -) - -py_strict_test( - name = "vav_test", - srcs = ["vav_test.py"], - deps = [ - ":boiler", - ":setpoint_schedule", - ":thermostat", - ":vav", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/utils:constants", - ], -) - -py_strict_test( - name = "weather_controller_test", - srcs = ["weather_controller_test.py"], - data = ["local_weather_test_data.csv"], - deps = [ - ":weather_controller", - "//third_party/py/absl/logging", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/pandas", - ], -) diff --git a/smart_control/simulator/__init__.py b/smart_control/simulator/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/simulator/air_handler.py b/smart_control/simulator/air_handler.py index 1f3ef99b..cfcbd767 100644 --- a/smart_control/simulator/air_handler.py +++ b/smart_control/simulator/air_handler.py @@ -1,66 +1,76 @@ -"""Models an air handler in an HVAC system.""" +"""A model of an air handler in an HVAC system.""" -from typing import Optional +from typing import Mapping, Optional import uuid import gin - -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import smart_device -from smart_control.simulator import weather_controller -from smart_control.utils import constants +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.simulator import weather_controller +from smart_buildings.smart_control.simulator import constants @gin.configurable class AirHandler(smart_device.SmartDevice): - """Models an air hander with heating/cooling, input/exhaust and recirculation. + """An air handler with heating/cooling, input/exhaust, recirculation. Attributes: recirculation: Proportion of air recirculated. air_flow_rate: Flow rate produced by fan in m^3/s. - heating_air_temp_setpoint: Minimum temperature in K until air will need to - be heated. - cooling_air_temp_setpoint: Maximum temperature in K until air will be - cooled. - fan_differential_pressure: Amount of pressure in Pa needed to push air + supply_air_temperature_setpoint: Average temperature in K of air output from + the air handler. This is reduced to the heating or cooling setpoint. + Either this, or those two, can be used. For backwards compatibility, the + heating and cooling setpoints are here, but in the real building, only the + supply_air_temperature_setpoint exists. + fan_static_pressure: Amount of pressure in Pa needed to push air effectively. fan_efficiency: Electrical efficiency of fan (0 - 1). cooling_request_count: count of VAVs that have requested cooling in this cycle. - max_air_flow_rate: max air flow rate in kg/s + max_air_flow_rate: max air flow rate in m^3/s """ def __init__( self, recirculation: float, - heating_air_temp_setpoint: int, - cooling_air_temp_setpoint: int, - fan_differential_pressure: float, + supply_air_temperature_setpoint: int, + fan_static_pressure: float, fan_efficiency: float, max_air_flow_rate: float = 8.67, device_id: Optional[str] = None, sim_weather_controller: Optional[ weather_controller.WeatherController ] = None, + run_command=smart_device.RunStatus.ON, ): - if cooling_air_temp_setpoint <= heating_air_temp_setpoint: - raise ValueError( - 'cooling_air_temp_setpoint must greater than' - ' heating_air_temp_setpoint' - ) observable_fields = { - 'differential_pressure_setpoint': smart_device.AttributeInfo( - 'fan_differential_pressure', float + 'cooling_request_count': smart_device.AttributeInfo( + 'cooling_request_count', float + ), + 'supply_air_static_pressure_setpoint': smart_device.AttributeInfo( + 'supply_air_static_pressure_setpoint', float + ), + 'supply_air_static_pressure_sensor': smart_device.AttributeInfo( + 'supply_air_static_pressure_sensor', float + ), + 'supply_air_flowrate_setpoint': smart_device.AttributeInfo( + 'air_flow_rate', float ), 'supply_air_flowrate_sensor': smart_device.AttributeInfo( 'air_flow_rate', float ), - 'supply_air_heating_temperature_setpoint': smart_device.AttributeInfo( - 'heating_air_temp_setpoint', float + 'supply_air_temperature_sensor': smart_device.AttributeInfo( + 'supply_air_temperature_sensor', float + ), + 'supply_air_temperature_setpoint': smart_device.AttributeInfo( + 'supply_air_temperature_setpoint', float ), - 'supply_air_cooling_temperature_setpoint': smart_device.AttributeInfo( - 'cooling_air_temp_setpoint', float + 'supply_fan_run_command': smart_device.AttributeInfo( + 'run_command', int + ), + 'exhaust_fan_run_command': smart_device.AttributeInfo( + 'run_command', int ), 'supply_fan_speed_percentage_command': smart_device.AttributeInfo( 'supply_fan_speed_percentage', float @@ -71,8 +81,8 @@ def __init__( 'outside_air_flowrate_sensor': smart_device.AttributeInfo( 'ambient_flow_rate', float ), - 'cooling_request_count': smart_device.AttributeInfo( - 'cooling_request_count', float + 'supervisor_run_command': smart_device.AttributeInfo( + 'run_command', int ), } if sim_weather_controller: @@ -81,11 +91,14 @@ def __init__( ) action_fields = { - 'supply_air_heating_temperature_setpoint': smart_device.AttributeInfo( - 'heating_air_temp_setpoint', float + 'supervisor_run_command': smart_device.AttributeInfo( + 'run_command', int + ), + 'supply_air_static_pressure_setpoint': smart_device.AttributeInfo( + 'supply_air_static_pressure_setpoint', float ), - 'supply_air_cooling_temperature_setpoint': smart_device.AttributeInfo( - 'cooling_air_temp_setpoint', float + 'supply_air_temperature_setpoint': smart_device.AttributeInfo( + 'supply_air_temperature_setpoint', float ), } @@ -101,24 +114,28 @@ def __init__( self._init_recirculation = recirculation self._init_air_flow_rate = 0.0 - self._init_heating_air_temp_setpoint = heating_air_temp_setpoint - self._init_cooling_air_temp_setpoint = cooling_air_temp_setpoint - self._init_fan_differential_pressure = fan_differential_pressure + + self._init_cooling_air_temp_setpoint = supply_air_temperature_setpoint + self._init_fan_static_pressure = fan_static_pressure self._init_fan_efficiency = fan_efficiency self._init_cooling_request_count = 0 self._init_max_air_flow_rate = max_air_flow_rate self._sim_weather_controller = sim_weather_controller + self._init_run_command = run_command self.reset() def reset(self): self._recirculation = self._init_recirculation self._air_flow_rate = self._init_air_flow_rate - self._heating_air_temp_setpoint = self._init_heating_air_temp_setpoint - self._cooling_air_temp_setpoint = self._init_cooling_air_temp_setpoint - self._fan_differential_pressure = self._init_fan_differential_pressure + self._supply_air_temperature_setpoint = self._init_cooling_air_temp_setpoint + self._fan_static_pressure = self._init_fan_static_pressure self._fan_efficiency = self._init_fan_efficiency self._cooling_request_count = self._init_cooling_request_count self._max_air_flow_rate = self._init_max_air_flow_rate + self._run_command = self._init_run_command + + def get_vav_air_handler(self, _): + return self @property def outside_air_temperature_sensor(self) -> float: @@ -135,12 +152,22 @@ def outside_air_temperature_sensor(self) -> float: def recirculation(self) -> float: return self._recirculation + @property + def run_command(self) -> smart_device.RunStatus: + return self._run_command + + @run_command.setter + def run_command(self, value: smart_device.RunStatus): + self._run_command = value + @recirculation.setter def recirculation(self, value: float): self._recirculation = value @property def air_flow_rate(self) -> float: + if self._run_command == smart_device.RunStatus.OFF: + return 0.0 return self._air_flow_rate @air_flow_rate.setter @@ -148,33 +175,35 @@ def air_flow_rate(self, value: float): self._air_flow_rate = value @property - def cooling_air_temp_setpoint(self) -> int: - return self._cooling_air_temp_setpoint # pytype: disable=bad-return-type # trace-all-classes + def supply_air_temperature_setpoint(self) -> float: + return self._supply_air_temperature_setpoint - @cooling_air_temp_setpoint.setter - def cooling_air_temp_setpoint(self, value: float): - self._cooling_air_temp_setpoint = value + @supply_air_temperature_setpoint.setter + def supply_air_temperature_setpoint(self, value: float): + self._supply_air_temperature_setpoint = value @property - def heating_air_temp_setpoint(self) -> int: - return self._heating_air_temp_setpoint # pytype: disable=bad-return-type # trace-all-classes - - @heating_air_temp_setpoint.setter - def heating_air_temp_setpoint(self, value: float): - self._heating_air_temp_setpoint = value + def supply_air_temperature_sensor(self) -> float: + return self._supply_air_temperature_setpoint @property - def fan_differential_pressure(self) -> float: - return self._fan_differential_pressure + def supply_air_static_pressure_setpoint(self) -> float: + if self._run_command == smart_device.RunStatus.OFF: + return 0.0 + return self._fan_static_pressure - @fan_differential_pressure.setter - def fan_differential_pressure(self, value: float): - self._fan_differential_pressure = value + @supply_air_static_pressure_setpoint.setter + def supply_air_static_pressure_setpoint(self, value: float): + self._fan_static_pressure = value @property def fan_efficiency(self) -> float: return self._fan_efficiency + @property + def supply_air_static_pressure_sensor(self) -> float: + return self.supply_air_static_pressure_setpoint + @fan_efficiency.setter def fan_efficiency(self, value: float): self._fan_efficiency = value @@ -213,10 +242,11 @@ def get_supply_air_temp( ambient_temp: Temperature in K of ambient/outside air. """ mixed_air_temp = self.get_mixed_air_temp(recirculation_temp, ambient_temp) - if mixed_air_temp > self._cooling_air_temp_setpoint: - return self._cooling_air_temp_setpoint - elif mixed_air_temp < self._heating_air_temp_setpoint: - return self._heating_air_temp_setpoint + if ( + mixed_air_temp > self.supply_air_temperature_setpoint + and self._run_command == smart_device.RunStatus.ON + ): + return self.supply_air_temperature_setpoint else: return mixed_air_temp @@ -268,6 +298,7 @@ def compute_thermal_energy_rate( supply_air_temp = self.get_supply_air_temp(recirculation_temp, ambient_temp) return ( self._air_flow_rate + * constants.AIR_DENSITY * constants.AIR_HEAT_CAPACITY * (supply_air_temp - mixed_air_temp) ) @@ -275,7 +306,7 @@ def compute_thermal_energy_rate( def compute_fan_power( self, flow_rate: float, - fan_differential_pressure: float, + fan_static_pressure: float, fan_efficiency: float, ) -> float: """Returns power in W consumed by fan. @@ -285,24 +316,186 @@ def compute_fan_power( Args: flow_rate: Rate of air flow in m^3/s. - fan_differential_pressure: Pressure difference in Pa between fan intake - and fan output. + fan_static_pressure: Pressure difference in Pa between fan intake and fan + output. fan_efficiency: Electrical efficiency of fan (0-1). """ - return flow_rate * fan_differential_pressure / fan_efficiency + return flow_rate * fan_static_pressure / fan_efficiency def compute_intake_fan_energy_rate(self) -> float: """Returns power in W consumed by the intake fan.""" return self.compute_fan_power( - self._air_flow_rate, - self._fan_differential_pressure, + self.air_flow_rate, + self.supply_air_static_pressure_setpoint, self._fan_efficiency, ) def compute_exhaust_fan_energy_rate(self) -> float: """Returns power in W consumed by the exhaust fan.""" return self.compute_fan_power( - self._air_flow_rate * (1.0 - self._recirculation), - self._fan_differential_pressure, + self.air_flow_rate * (1.0 - self._recirculation), + self.supply_air_static_pressure_setpoint, self._fan_efficiency, ) + + def set_action(self, action_field_name, value, action_timestamp): + if 'supervisor_run_command' in action_field_name: + if value == 1: + value = smart_device.RunStatus.ON + else: + value = smart_device.RunStatus.OFF + super().set_action(action_field_name, value, action_timestamp) + + +@gin.configurable +class AirHandlerSystem(smart_device.SmartDevice): + """A system controller that manages multiple AirHandler units.""" + + def __init__( + self, + ahus, + device_id: Optional[str] = None, + ): + if not ahus: + raise ValueError('AirHandlerSystem requires at least one AirHandler.') + + self._ahus = list(ahus.keys()) + self._map = ahus + + if device_id is None: + device_id = f'ahu_system_{uuid.uuid4()}' + + system_actions = {} + system_observables = {} + for i, ahu in enumerate(self._ahus): + prefix = f'ahu_{i+1}_' + + for key, info in ahu._action_fields.items(): + system_actions[prefix + key] = smart_device.AttributeInfo( + prefix + key, info.clazz + ) + setattr(self, prefix + key, None) + for key, info in ahu._observable_fields.items(): + system_observables[prefix + key] = smart_device.AttributeInfo( + prefix + key, info.clazz + ) + setattr(self, prefix + key, None) + + super().__init__( + observable_fields=system_observables, + action_fields=system_actions, + device_type=smart_control_building_pb2.DeviceInfo.DeviceType.AHU, + device_id=device_id or f'ahu_system_{uuid.uuid4()}', + ) + + def _get_target(self, name): + """Parses 'ahu_1_run_command' -> returns (ahu_object, 'run_command').""" + parts = name.split('_', 2) # Splits into ['ahu', '1', 'run_command'] + + if len(parts) >= 3 and parts[0] == 'ahu': + index = int(parts[1]) - 1 # Convert '1' to 0 (list index) + field_name = parts[2] # 'run_command' + return self._ahus[index], field_name + + raise ValueError(f'Could not find child for field: {name}') + + @property + def ahus(self) -> list[AirHandler]: + return self._ahus + + @property + def ahu_zones_map(self) -> Mapping[AirHandler, list[str]]: + """The mapping of AirHandler units to the zones they serve.""" + return self._map + + def set_action(self, action_field_name, value, action_timestamp): + """Send an action to the target AHU. + + Args: + action_field_name: The name of the action field to set (e.g., + 'ahu_1_supervisor_run_command'). + value: The value to set for the action field. + action_timestamp: The timestamp of when the action is being set. + """ + if 'supervisor_run_command' in action_field_name: + if value == 1: + value = smart_device.RunStatus.ON + else: + value = smart_device.RunStatus.OFF + target_ahu, target_field = self._get_target(action_field_name) + target_ahu.set_action(target_field, value, action_timestamp) + + def get_observation(self, observable_field_name, observation_timestamp): + """Gets an observation from a specific AirHandler unit. + + Args: + observable_field_name: The name of the observable field (e.g., + 'ahu_1_supply_air_flowrate_sensor'). + observation_timestamp: The timestamp of when the observation is requested. + + Returns: + The value of the requested observable field from the target AHU. + """ + target_ahu, target_field = self._get_target(observable_field_name) + return target_ahu.get_observation(target_field, observation_timestamp) + + def reset(self): + for ahu in self._ahus: + ahu.reset() + + def reset_demand(self): + for ahu in self._ahus: + ahu.reset_demand() + + @property + def air_flow_rate(self) -> float: + return sum(ahu.air_flow_rate for ahu in self._ahus) + + @property + def cooling_request_count(self) -> int: + return sum(ahu.cooling_request_count for ahu in self._ahus) + + def compute_thermal_energy_rate( + self, recirculation_temps: Mapping[str, float], ambient_temp: float + ) -> float: + return sum( + ahu.compute_thermal_energy_rate( + recirculation_temps[ahu.device_id()], ambient_temp + ) + for ahu in self._ahus + if ahu.device_id() in recirculation_temps + ) + + def compute_intake_fan_energy_rate(self) -> float: + return sum(ahu.compute_intake_fan_energy_rate() for ahu in self._ahus) + + def compute_exhaust_fan_energy_rate(self) -> float: + return sum(ahu.compute_exhaust_fan_energy_rate() for ahu in self._ahus) + + def get_supply_air_temp( + self, recirculation_temps, ambient_temperature + ) -> dict[str, float]: + temps = {} + for ahu in self._ahus: + ahu_id = ahu.device_id() + temps[ahu_id] = ahu.get_supply_air_temp( + recirculation_temps[ahu_id], ambient_temperature + ) + return temps + + def get_vav_air_handler(self, zone_id): + """Gets the AirHandler associated with a given zone. + + Args: + zone_id: The ID of the zone. + + Returns: + The AirHandler instance responsible for the given zone. + + Raises: + ValueError: If no AirHandler is found for the specified zone. + """ + for ahu, zones in self._map.items(): + if zone_id in zones: + return ahu + raise ValueError(f'No VAV found for zone {zone_id}') diff --git a/smart_control/simulator/air_handler_test.py b/smart_control/simulator/air_handler_test.py index 7961574e..8aa2806c 100644 --- a/smart_control/simulator/air_handler_test.py +++ b/smart_control/simulator/air_handler_test.py @@ -1,42 +1,38 @@ -"""Tests for air_handler.""" - from absl.testing import absltest from absl.testing import parameterized import pandas as pd -from smart_control.simulator import air_handler -from smart_control.simulator import weather_controller -from smart_control.utils import constants +from smart_buildings.smart_control.simulator import air_handler +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.simulator import weather_controller +from smart_buildings.smart_control.simulator import constants class AirHandlerTest(parameterized.TestCase): recirculation = 0.3 - heating_air_temp_setpoint = 270 - cooling_air_temp_setpoint = 288 - fan_differential_pressure = 20000.0 + supply_air_temperature_setpoint = 288 + fan_static_pressure = 20000.0 fan_efficiency = 0.8 max_air_flow_rate = 10 def test_init(self): handler = air_handler.AirHandler( - self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, - self.fan_efficiency, - self.max_air_flow_rate, - 'device_id', + recirculation=self.recirculation, + supply_air_temperature_setpoint=self.supply_air_temperature_setpoint, + fan_static_pressure=self.fan_static_pressure, + fan_efficiency=self.fan_efficiency, + max_air_flow_rate=self.max_air_flow_rate, + device_id='device_id', ) self.assertEqual(handler.recirculation, self.recirculation) + self.assertEqual( - handler.heating_air_temp_setpoint, self.heating_air_temp_setpoint - ) - self.assertEqual( - handler.cooling_air_temp_setpoint, self.cooling_air_temp_setpoint + handler.supply_air_temperature_setpoint, + self.supply_air_temperature_setpoint, ) self.assertEqual( - handler.fan_differential_pressure, self.fan_differential_pressure + handler.supply_air_static_pressure_setpoint, self.fan_static_pressure ) self.assertEqual(handler.fan_efficiency, self.fan_efficiency) self.assertEqual(handler.air_flow_rate, 0) @@ -46,49 +42,41 @@ def test_init(self): def test_init_default(self): handler = air_handler.AirHandler( - self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, - self.fan_efficiency, + recirculation=self.recirculation, + supply_air_temperature_setpoint=self.supply_air_temperature_setpoint, + fan_static_pressure=self.fan_static_pressure, + fan_efficiency=self.fan_efficiency, ) self.assertEqual(handler.max_air_flow_rate, 8.67) self.assertIsNotNone(handler._device_id) - def test_init_invalid_setpoints(self): - with self.assertRaises(ValueError): - air_handler.AirHandler( - self.recirculation, - self.cooling_air_temp_setpoint, - self.heating_air_temp_setpoint, - self.fan_differential_pressure, - self.fan_efficiency, - ) - def test_setters(self): handler = air_handler.AirHandler( - self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, - self.fan_efficiency, + recirculation=self.recirculation, + supply_air_temperature_setpoint=self.supply_air_temperature_setpoint, + fan_static_pressure=self.fan_static_pressure, + fan_efficiency=self.fan_efficiency, ) handler.recirculation = self.recirculation + 0.2 - handler.heating_air_temp_setpoint = self.heating_air_temp_setpoint + 10 - handler.cooling_air_temp_setpoint = self.cooling_air_temp_setpoint + 10 - handler.fan_differential_pressure = self.fan_differential_pressure + 1000 + + handler.supply_air_temperature_setpoint = ( + self.supply_air_temperature_setpoint + 10 + ) + handler.supply_air_static_pressure_setpoint = ( + self.fan_static_pressure + 1000 + ) handler.fan_efficiency = self.fan_efficiency + 0.1 handler.air_flow_rate = 30 self.assertEqual(handler.recirculation, self.recirculation + 0.2) + self.assertEqual( - handler.heating_air_temp_setpoint, self.heating_air_temp_setpoint + 10 - ) - self.assertEqual( - handler.cooling_air_temp_setpoint, self.cooling_air_temp_setpoint + 10 + handler.supply_air_temperature_setpoint, + self.supply_air_temperature_setpoint + 10, ) self.assertEqual( - handler.fan_differential_pressure, self.fan_differential_pressure + 1000 + handler.supply_air_static_pressure_setpoint, + self.fan_static_pressure + 1000, ) self.assertEqual(handler.fan_efficiency, self.fan_efficiency + 0.1) self.assertEqual(handler.air_flow_rate, 30) @@ -117,23 +105,20 @@ def test_get_mixed_air_temp( expected: the expected value """ handler = air_handler.AirHandler( - recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, - self.fan_efficiency, + recirculation=recirculation, + supply_air_temperature_setpoint=self.supply_air_temperature_setpoint, + fan_static_pressure=self.fan_static_pressure, + fan_efficiency=self.fan_efficiency, ) self.assertEqual( handler.get_mixed_air_temp(recirculation_temp, ambient_temp), expected ) @parameterized.named_parameters( - ('below setpoint window case 1', 0.3, 280, 240, 270), - ('below setpount window case 2', 0.6, 244, 270, 270), + ('below setpoint window case 1', 0.3, 280, 240, 252), + ('below setpount window case 2', 0.6, 244, 270, 254.4), ('above setpoint window case 1', 0.1, 210, 316, 288), ('above setpoint window case 2', 0.4, 250, 316, 288), - ('in setpoint window case 1', 0.4, 286, 266, 0.4 * 286 + 0.6 * 266), - ('in setpoint window case 2', 0.12, 198, 290, 0.12 * 198 + 0.88 * 290), ) def test_get_supply_air_temp( self, recirculation, recirculation_temp, ambient_temp, expected @@ -151,9 +136,8 @@ def test_get_supply_air_temp( """ handler = air_handler.AirHandler( recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) self.assertEqual( @@ -170,9 +154,8 @@ def test_get_supply_air_temp( def test_ambient_flow_rate(self, recirculation, air_flow_rate): handler = air_handler.AirHandler( recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) handler.air_flow_rate = air_flow_rate @@ -191,9 +174,8 @@ def test_ambient_flow_rate(self, recirculation, air_flow_rate): def test_recirculation_flow_rate(self, recirculation, air_flow_rate): handler = air_handler.AirHandler( recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) handler.air_flow_rate = air_flow_rate @@ -205,9 +187,8 @@ def test_recirculation_flow_rate(self, recirculation, air_flow_rate): def test_reset_demand(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) handler.add_demand(5) @@ -219,9 +200,8 @@ def test_reset_demand(self): def test_add_demand(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, 10, ) @@ -233,9 +213,8 @@ def test_add_demand(self): def test_add_demand_above_max(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) self.assertEqual(handler.air_flow_rate, 0) @@ -246,9 +225,8 @@ def test_add_demand_above_max(self): def test_add_demand_raises_value_error(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) @@ -258,28 +236,25 @@ def test_add_demand_raises_value_error(self): def test_reset(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) handler.recirculation += 1.0 - handler.heating_air_temp_setpoint += 1.0 - handler.cooling_air_temp_setpoint += 1.0 - handler.fan_differential_pressure += 0.1 + handler.supply_air_temperature_setpoint += 1.0 + handler.supply_air_static_pressure_setpoint += 0.1 handler.fan_efficiency = 0.1 handler.reset() self.assertEqual(handler.recirculation, self.recirculation) + self.assertEqual( - handler.heating_air_temp_setpoint, self.heating_air_temp_setpoint - ) - self.assertEqual( - handler.cooling_air_temp_setpoint, self.cooling_air_temp_setpoint + handler.supply_air_temperature_setpoint, + self.supply_air_temperature_setpoint, ) self.assertEqual( - handler.fan_differential_pressure, self.fan_differential_pressure + handler.supply_air_static_pressure_setpoint, self.fan_static_pressure ) self.assertEqual(handler.fan_efficiency, self.fan_efficiency) @@ -295,9 +270,8 @@ def test_compute_thermal_energy_rate( ): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) handler.air_flow_rate = air_flow_rate @@ -313,6 +287,7 @@ def test_compute_thermal_energy_rate( ) expected = ( handler.air_flow_rate + * constants.AIR_DENSITY * constants.AIR_HEAT_CAPACITY * (supply_air_temp - mixed_air_temp) ) @@ -327,28 +302,26 @@ def test_compute_thermal_energy_rate( (1, 4000.0, 0.4), ) def test_compute_fan_power( - self, flow_rate, fan_differential_pressure, fan_efficiency + self, flow_rate, fan_static_pressure, fan_efficiency ): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) self.assertEqual( handler.compute_fan_power( - flow_rate, fan_differential_pressure, fan_efficiency + flow_rate, fan_static_pressure, fan_efficiency ), - flow_rate * fan_differential_pressure / fan_efficiency, + flow_rate * fan_static_pressure / fan_efficiency, ) def test_invalid_outside_air_temperature_sensor(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) with self.assertRaises(RuntimeError): @@ -364,9 +337,8 @@ def test_valid_outside_air_handler_temperature_sensor( ): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, sim_weather_controller=weather_controller.WeatherController(0.0, 10.0), ) @@ -378,9 +350,8 @@ def test_valid_outside_air_handler_temperature_sensor( def test_compute_intake_fan_energy_rate(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) handler.air_flow_rate = 5 @@ -392,7 +363,7 @@ def test_compute_intake_fan_energy_rate(self): handler.compute_intake_fan_energy_rate(), handler.compute_fan_power( handler.air_flow_rate, - handler.fan_differential_pressure, + handler.supply_air_static_pressure_setpoint, handler.fan_efficiency, ), ) @@ -400,9 +371,8 @@ def test_compute_intake_fan_energy_rate(self): def test_compute_exhaust_fan_energy_rate(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) handler.air_flow_rate = 5 @@ -416,7 +386,7 @@ def test_compute_exhaust_fan_energy_rate(self): handler.compute_exhaust_fan_energy_rate(), handler.compute_fan_power( handler.air_flow_rate * (1 - self.recirculation), - handler.fan_differential_pressure, + handler.supply_air_static_pressure_setpoint, handler.fan_efficiency, ), ) @@ -424,9 +394,8 @@ def test_compute_exhaust_fan_energy_rate(self): def test_supply_fan_speed_percentage(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, 10, ) @@ -437,41 +406,43 @@ def test_supply_fan_speed_percentage(self): def test_observable_field_names(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) self.assertSameElements( handler.observable_field_names(), [ - 'differential_pressure_setpoint', + 'supply_air_static_pressure_setpoint', + 'supply_air_static_pressure_sensor', 'supply_air_flowrate_sensor', - 'supply_air_heating_temperature_setpoint', - 'supply_air_cooling_temperature_setpoint', - 'supply_fan_speed_percentage_command', + 'supply_air_flowrate_setpoint', + 'supply_air_temperature_setpoint', + 'supply_air_temperature_sensor', + 'supply_fan_run_command', + 'exhaust_fan_run_command', 'discharge_fan_speed_percentage_command', + 'supply_fan_speed_percentage_command', 'outside_air_flowrate_sensor', 'cooling_request_count', + 'supervisor_run_command', ], ) @parameterized.parameters( - ('differential_pressure_setpoint', 'fan_differential_pressure'), - ('supply_air_heating_temperature_setpoint', 'heating_air_temp_setpoint'), - ('supply_air_cooling_temperature_setpoint', 'cooling_air_temp_setpoint'), - ('supply_fan_speed_percentage_command', 'supply_fan_speed_percentage'), - ('discharge_fan_speed_percentage_command', 'supply_fan_speed_percentage'), - ('outside_air_flowrate_sensor', 'ambient_flow_rate'), - ('supply_air_flowrate_sensor', 'air_flow_rate'), + ( + 'supply_air_static_pressure_setpoint', + 'supply_air_static_pressure_setpoint', + ), + ('supply_air_temperature_setpoint', 'supply_air_temperature_setpoint'), + ('supervisor_run_command', 'run_command'), ) def test_observations(self, observation_name, attribute_name): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) observed_value = handler.get_observation( @@ -482,9 +453,8 @@ def test_observations(self, observation_name, attribute_name): def test_observe_cooling_request_count(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) @@ -501,37 +471,41 @@ def test_observe_cooling_request_count(self): def test_action_field_names(self): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) self.assertSameElements( handler.action_field_names(), [ - 'supply_air_heating_temperature_setpoint', - 'supply_air_cooling_temperature_setpoint', + 'supply_air_temperature_setpoint', + 'supervisor_run_command', + 'supply_air_static_pressure_setpoint', ], ) @parameterized.parameters( ( - 280.0, - 'supply_air_heating_temperature_setpoint', - 'heating_air_temp_setpoint', + 290.0, + 'supply_air_temperature_setpoint', + 'supply_air_temperature_setpoint', ), ( - 280.0, - 'supply_air_cooling_temperature_setpoint', - 'cooling_air_temp_setpoint', + 120.0, + 'supply_air_static_pressure_setpoint', + 'supply_air_static_pressure_setpoint', + ), + ( + smart_device.RunStatus.OFF, + 'supervisor_run_command', + 'run_command', ), ) def test_actions(self, new_value, action_name, attribute_name): handler = air_handler.AirHandler( self.recirculation, - self.heating_air_temp_setpoint, - self.cooling_air_temp_setpoint, - self.fan_differential_pressure, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, self.fan_efficiency, ) @@ -540,6 +514,215 @@ def test_actions(self, new_value, action_name, attribute_name): ) self.assertEqual(getattr(handler, attribute_name), new_value) + @parameterized.parameters( + (smart_device.RunStatus.OFF), + (smart_device.RunStatus.ON), + ) + def test_run_command(self, run_command): + handler = air_handler.AirHandler( + self.recirculation, + self.supply_air_temperature_setpoint, + self.fan_static_pressure, + self.fan_efficiency, + run_command=run_command, + ) + handler.add_demand(5) + self.assertEqual(handler.run_command, run_command) + if run_command == smart_device.RunStatus.OFF: + self.assertEqual(handler.air_flow_rate, 0.0) + self.assertEqual(handler.supply_air_static_pressure_setpoint, 0.0) + else: + self.assertEqual(handler.air_flow_rate, 5.0) + self.assertEqual( + handler.supply_air_static_pressure_setpoint, self.fan_static_pressure + ) + + handler.set_action( + 'supervisor_run_command', + smart_device.RunStatus.OFF, + pd.Timestamp('2021-09-01 10:10:00'), + ) + self.assertEqual(handler.run_command, smart_device.RunStatus.OFF) + self.assertEqual(handler.air_flow_rate, 0.0) + self.assertEqual(handler.supply_air_static_pressure_setpoint, 0.0) + + handler.set_action( + 'supervisor_run_command', + smart_device.RunStatus.ON, + pd.Timestamp('2021-09-01 10:10:00'), + ) + self.assertEqual(handler.run_command, smart_device.RunStatus.ON) + self.assertEqual(handler.air_flow_rate, 5.0) + self.assertEqual( + handler.supply_air_static_pressure_setpoint, self.fan_static_pressure + ) + + handler.reset() + self.assertEqual(handler.run_command, run_command) + + def test_air_flow_units(self): + # A flow of 1.0 m^3/s through 1.0 Pascal of pressure at 100% efficiency + # should equal exactly 1.0 Watt of power. + # This verifies that air_flow_rate is in m^3/s and pressure is in Pascals. + handler = air_handler.AirHandler( + recirculation=0.5, + supply_air_temperature_setpoint=300, + fan_static_pressure=1.0, # 1 Pascal + fan_efficiency=1.0, # 100% efficiency + ) + power = handler.compute_fan_power( + flow_rate=1.0, + fan_static_pressure=1.0, + fan_efficiency=1.0, + ) + self.assertAlmostEqual(power, 1.0) + + +class AirHandlerSystemTest(parameterized.TestCase): + """System-level tests for AirHandlerSystem and multiple AirHandlers.""" + + def setUp(self): + super().setUp() + self.ahu1 = self._create_air_handler('ahu1') + self.ahu2 = self._create_air_handler('ahu2') + self.ahu_map = {self.ahu1: ['zone1'], self.ahu2: ['zone2']} + self.system = air_handler.AirHandlerSystem(self.ahu_map) + + def _create_air_handler( + self, + device_id: str, + recirculation: float = 0.3, + supply_air_temperature_setpoint: float = 279, + fan_static_pressure: float = 20000.0, + fan_efficiency: float = 0.8, + max_air_flow_rate: float = 10, + ) -> air_handler.AirHandler: + """Helper to create an AirHandler with standard test parameters.""" + return air_handler.AirHandler( + recirculation=recirculation, + supply_air_temperature_setpoint=supply_air_temperature_setpoint, + fan_static_pressure=fan_static_pressure, + fan_efficiency=fan_efficiency, + max_air_flow_rate=max_air_flow_rate, + device_id=device_id, + ) + + def test_ahu_zones_map(self): + """Tests that ahu_zones_map returns the correct mapping.""" + self.assertEqual(self.system.ahu_zones_map, self.ahu_map) + + @parameterized.named_parameters( + dict( + testcase_name='both_below_setpoint', + recirculation_temps={'ahu1': 280, 'ahu2': 244}, + ambient_temp=240, + # In this case, mixed air temp is below the supply setpoint (279K). + # ahu1: 0.3 * 280 + 0.7 * 240 = 252.0. Since 252 < 279, + # supply is 252. + # ahu2: 0.3 * 244 + 0.7 * 240 = 241.2. Since 241.2 < 279, + # supply is 241.2. + expected_temps={'ahu1': 252.0, 'ahu2': 241.2}, + ), + dict( + testcase_name='both_above_setpoint', + recirculation_temps={'ahu1': 300, 'ahu2': 310}, + ambient_temp=320, + # Mixed air temp is above the supply setpoint (279K), so it cools + # to 279. + # ahu1: 0.3 * 300 + 0.7 * 320 = 314.0. Since 314 > 279, supply is 279. + # ahu2: 0.3 * 310 + 0.7 * 320 = 317.0. Since 317 > 279, supply is 279. + expected_temps={'ahu1': 279.0, 'ahu2': 279.0}, + ), + dict( + testcase_name='one_above_one_below', + recirculation_temps={'ahu1': 380, 'ahu2': 244}, + ambient_temp=240, + # ahu1: 0.3 * 380 + 0.7 * 240 = 114 + 168 = 282. Since 282 > 279, + # supply is 279. + # ahu2: 0.3 * 244 + 0.7 * 240 = 241.2. Since 241.2 < 279, + # supply is 241.2. + expected_temps={'ahu1': 279.0, 'ahu2': 241.2}, + ), + dict( + testcase_name='at_setpoint_threshold', + recirculation_temps={'ahu1': 279, 'ahu2': 300}, + ambient_temp=279, + # ahu1: 0.3 * 279 + 0.7 * 279 = 279.0. Supply is 279. + # ahu2: 0.3 * 300 + 0.7 * 279 = 90 + 195.3 = 285.3. Supply is 279. + expected_temps={'ahu1': 279.0, 'ahu2': 279.0}, + ), + ) + def test_get_supply_air_temp( + self, recirculation_temps, ambient_temp, expected_temps + ): + """Verifies supply air temperature calculation for a system of AHUs. + + The expected supply temperature is derived from: + 1. Mixed Air Temp = (recirculation * recirculation_temp) + + ((1 - recirculation) * ambient_temp) + 2. Supply Air Setpoint + 3. If Mixed Air Temp > Setpoint: Supply Temp = Setpoint + Else: Supply Temp = Mixed Air Temp + + Args: + recirculation_temps: Mapping of AHU device IDs to recirculation temps. + ambient_temp: The ambient air temperature. + expected_temps: Mapping of AHU device IDs to expected supply temps. + """ + temps = self.system.get_supply_air_temp(recirculation_temps, ambient_temp) + self.assertLen(temps, 2) + self.assertAlmostEqual(temps['ahu1'], expected_temps['ahu1'], places=4) + self.assertAlmostEqual(temps['ahu2'], expected_temps['ahu2'], places=4) + + def test_compute_thermal_energy_rate(self): + """Verifies combined thermal energy rate for a system of AHUs. + + Energy Rate (W) = air_flow_rate (m^3/s) * density (kg/m^3) * + heat_capacity (J/kg*K) * (T_supply - T_mixed) + """ + # Set air flow rates for each AHU + self.ahu1.air_flow_rate = 1.0 + self.ahu2.air_flow_rate = 2.0 + + recirculation_temps = {'ahu1': 290.0, 'ahu2': 260.0} + ambient_temp = 300.0 + + # Expected energy rate calculations: + # Setpoint = (270 + 288) / 2 = 279 + + # AHU1: + # T_mixed = 0.3 * 290 + 0.7 * 300 = 87 + 210 = 297 + # T_supply = 279 + # Delta_T = 279 - 297 = -18 + # density = 1.2 + # energy_ahu1 = 1.0 * 1.2 * 1005 * -18 = -21708 + expected_energy_ahu1 = ( + 1.0 + * constants.AIR_DENSITY + * constants.AIR_HEAT_CAPACITY + * (279.0 - 297.0) + ) + + # AHU2: + # T_mixed = 0.3 * 260 + 0.7 * 300 = 78 + 210 = 288 + # T_supply = 279 + # Delta_T = 279 - 288 = -9 + # energy_ahu2 = 2.0 * 1.2 * 1005 * -9 = -21708 + expected_energy_ahu2 = ( + 2.0 + * constants.AIR_DENSITY + * constants.AIR_HEAT_CAPACITY + * (279.0 - 288.0) + ) + + expected_total_energy = expected_energy_ahu1 + expected_energy_ahu2 + + actual_total_energy = self.system.compute_thermal_energy_rate( + recirculation_temps, ambient_temp + ) + + self.assertAlmostEqual(actual_total_energy, expected_total_energy, places=4) + if __name__ == '__main__': absltest.main() diff --git a/smart_control/simulator/air_source_heat_pump.py b/smart_control/simulator/air_source_heat_pump.py new file mode 100644 index 00000000..5bead56e --- /dev/null +++ b/smart_control/simulator/air_source_heat_pump.py @@ -0,0 +1,218 @@ +r"""Models commercial Air Source Heat Pump (ASHP), patterned after Aermec 0700. + +Overview: + This class provides a discrete-time thermodynamic simulation of an ASHP acting + as a hot water heat source. Unlike traditional gas or electric resistance + boilers that operate with a relatively constant efficiency, an ASHP operates + by absorbing heat from the ambient outside air and transferring it to a + hydronic water loop using a vapor-compression refrigeration cycle. + Consequently, its heating capacity and electrical efficiency are + highly dependent on environmental conditions. + +Thermodynamic Modeling Approach: + The simulation calculates the electrical power consumption based on the + thermal demand of the building and the real-time + Coefficient of Performance (COP) of the heat pump. + + 1. Thermal Demand: The required thermal power $Q$ to reach the supply setpoint + is calculated using the mass flow rate and specific heat capacity of water: + $$Q = \dot{m} \cdot c_p \cdot \max(0, T_{setpoint} - T_{return})$$ + + 2. Dynamic Efficiency (COP): The COP represents the ratio of heat delivered to + electrical work consumed. This model implements a simplified dynamic COP + that degrades linearly as the ambient outside air temperature $T_{ambient}$ + decreases, reflecting the reduced thermal energy available in colder air and + the increased lift required by the compressor. + + 3. Electrical Power: The final electrical power $P_{elec}$ consumed by the + unit is: + $$P_{elec} = \frac{\min(Q, Q_{max})}{COP(T_{ambient})}$$ + +Strengths of this Implementation: + * Computational Efficiency: By utilizing a simplified linear COP degradation + model and steady-state thermal equations, this simulation is extremely fast, + making it suitable for training Reinforcement Learning (RL) agents or running + multi-year energy simulations. + * Environmental Responsiveness: Accurately reflects the most critical behavior + of an ASHP—that its electrical efficiency drops significantly as outside air + gets colder. + * Interoperability: Adheres to the abstract `HotWaterHeatSource` interface, + allowing it to be seamlessly swapped with `Boiler` models in `gin` + configurations without breaking the broader building simulation. + +Limitations and Simplifications: + * Linear COP Curve: Real-world compressor efficiency curves are non-linear and + rely on bi-variate performance maps (dependent on both ambient air temperature + AND leaving water temperature). This model simplifies that relationship. + * Constant Maximum Capacity: In physical ASHPs, maximum heating capacity + $Q_{max}$ drops alongside COP in cold weather. This model assumes a + constant maximum capacity. + * Defrost Cycles Excluded: At ambient temperatures near freezing (e.g., 30°F - + 40°F) with high humidity, ASHPs must periodically reverse their cycle to melt + frost off the evaporator coils. This causes significant, transient drops in + efficiency and capacity that are not captured in this model. + * Part-Load Ratios (PLR): The model does not explicitly account for compressor + staging, inverter efficiencies, or part-load performance degradation, assuming + linea power scaling regardless of the load fraction. +""" + +from typing import Final +import uuid + +import gin +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import hot_water_heat_source +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.utils import constants +from smart_buildings.smart_control.utils import temperature_conversion + +# approx surface area of ASHP heat exchanger/buffer +_EXTERIOR_SURFACE_AREA_M2: Final[float] = 4.0 +# Fixed convection coefficient for exterior surface of ASHP due to ambient air +# currents or wind. +_EXTERIOR_CONVECTION_COEFF_W_M2_K: Final[float] = 5.6 + + +@gin.configurable +class AirSourceHeatPump(hot_water_heat_source.HotWaterHeatSource): + """Simulation of an Aermec 0700 Air Source Heat Pump.""" + + def __init__( + self, + *, + supply_water_temperature_setpoint: float, + device_id: str | None = None, + # ~600k BTU/hr, typical for large commercial ASHP + max_heating_capacity_w: float = 180000.0, + nominal_cop: float = 3.2, + init_return_water_temperature_sensor: float = 295.0, + ): + observable_fields = { + 'supply_water_temperature_setpoint': smart_device.AttributeInfo( + 'supply_water_temperature_setpoint', float + ), + 'supply_water_temperature_sensor': smart_device.AttributeInfo( + 'supply_water_temperature_sensor', float + ), + } + + action_fields = { + 'supply_water_temperature_setpoint': smart_device.AttributeInfo( + 'supply_water_temperature_setpoint', float + ), + } + + super().__init__( + observable_fields, + action_fields, + device_type=smart_control_building_pb2.DeviceInfo.DeviceType.ASHP, + device_id=device_id or f'ashp_id_{uuid.uuid4()}', + ) + + self._max_capacity_w = max_heating_capacity_w + self._nominal_cop = nominal_cop + self._init_return_water_temp = init_return_water_temperature_sensor + self._return_water_temp = init_return_water_temperature_sensor + self._run_command = smart_device.RunStatus.ON + self._supply_water_temperature_setpoint = supply_water_temperature_setpoint + + def reset(self) -> None: + self._return_water_temp = self._init_return_water_temp + self._run_command = smart_device.RunStatus.ON + + @property + def supply_water_temperature_sensor(self) -> float: + # ASHP does not have a tank, so supply water temperature is the setpoint. + return self._supply_water_temperature_setpoint + + @property + def supply_water_temperature_setpoint(self) -> float: + return self._supply_water_temperature_setpoint + + @supply_water_temperature_setpoint.setter + def supply_water_temperature_setpoint(self, value: float) -> None: + self._supply_water_temperature_setpoint = value + + @property + def return_water_temperature_sensor(self) -> float: + return self._return_water_temp + + @return_water_temperature_sensor.setter + def return_water_temperature_sensor(self, value: float) -> None: + self._return_water_temp = value + + @property + def run_command(self) -> smart_device.RunStatus: + return self._run_command + + @run_command.setter + def run_command(self, value: smart_device.RunStatus) -> None: + self._run_command = value + + def _calculate_dynamic_cop(self, outside_temp_k: float) -> float: + """Calculates COP based on outside air temperature. + + ASHP efficiency drops as outside air gets colder. + + Args: + outside_temp_k: Outside air temperature in Kelvin. + + Returns: + The dynamic COP at the given outside temperature. + """ + outside_temp_c = temperature_conversion.kelvin_to_celsius(outside_temp_k) + + # Simplified linear COP degradation model for Aermec units. + # Assumes nominal COP is rated at 7C (45F) outside air. + cop = self._nominal_cop + (outside_temp_c - 7.0) * 0.05 + + # Clamp COP to realistic physical bounds for an ASHP + return max(1.0, min(cop, 5.0)) + + def compute_thermal_energy_rate( + self, return_water_temp: float, outside_temp: float, flow_rate: float + ) -> float: + """Returns the electrical power (W) consumed by the ASHP to heat water. + + Args: + return_water_temp: The temperature of the water returning to the ASHP (K). + outside_temp: The ambient outside air temperature (K). + flow_rate: The mass flow rate of water through the ASHP (kg/s). + """ + if ( + self._run_command == smart_device.RunStatus.OFF + or flow_rate <= 0 + ): + return 0.0 + + # Calculate required thermal energy to reach setpoint (Q = m * c * dT) + # Using placeholder constants for density and specific heat capacity + specific_heat_water = constants.WATER_HEAT_CAPACITY # J/(kg*K) + target_temp = self.get_observation( + 'supply_water_temperature_setpoint', self._observation_timestamp + ) + self._supply_water_temperature_setpoint = target_temp + + delta_t = max(0.0, target_temp - return_water_temp) + required_thermal_power_w = ( + flow_rate * constants.WATER_DENSITY * specific_heat_water * delta_t + ) + + # Limit by the maximum physical capacity of the Aermec unit + actual_thermal_power_w = min(required_thermal_power_w, self._max_capacity_w) + + # Electrical power = Thermal Power / COP + cop = self._calculate_dynamic_cop(outside_temp) + return actual_thermal_power_w / cop + + def compute_thermal_dissipation_rate( + self, water_temp: float, outside_temp: float + ) -> float: + """Computes thermal loss rate from the ASHP unit to the ambient air.""" + + surface_area = _EXTERIOR_SURFACE_AREA_M2 + return ( + _EXTERIOR_CONVECTION_COEFF_W_M2_K + * surface_area + * max(0.0, water_temp - outside_temp) + ) diff --git a/smart_control/simulator/air_source_heat_pump_test.py b/smart_control/simulator/air_source_heat_pump_test.py new file mode 100644 index 00000000..2643f2a3 --- /dev/null +++ b/smart_control/simulator/air_source_heat_pump_test.py @@ -0,0 +1,158 @@ +from unittest import mock + +from absl.testing import absltest +from absl.testing import parameterized +from smart_buildings.smart_control.simulator import air_source_heat_pump +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.utils import constants + + +class AirSourceHeatPumpTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + + # Ensure constants are defined for consistent testing + self.water_density = 1000.0 # kg/m^3 + self.enter_context( + mock.patch.object(constants, "WATER_DENSITY", new=self.water_density) + ) + self.specific_heat = 4184.0 # J/(kg*K) + + self.reheat_setpoint_k = 313.15 # 40°C + self.max_capacity_w = 180000.0 + self.nominal_cop = 3.2 + + self.ashp = air_source_heat_pump.AirSourceHeatPump( + supply_water_temperature_setpoint=self.reheat_setpoint_k, + device_id="test_ashp_01", + max_heating_capacity_w=self.max_capacity_w, + nominal_cop=self.nominal_cop, + init_return_water_temperature_sensor=295.15, # 22°C + ) + + # Mock the observation state to return our test setpoint + self.ashp.get_observation = mock.MagicMock( + return_value=self.reheat_setpoint_k + ) + + def test_initialization(self): + self.assertEqual(self.ashp.device_id(), "test_ashp_01") + self.assertEqual(self.ashp.run_command, smart_device.RunStatus.ON) + self.assertEqual(self.ashp.return_water_temperature_sensor, 295.15) + self.assertEqual(self.ashp._max_capacity_w, self.max_capacity_w) + + def test_reset(self): + """Verifies reset restores the initial return temperature and run state.""" + self.ashp.return_water_temperature_sensor = 300.0 + self.ashp.run_command = smart_device.RunStatus.OFF + + self.ashp.reset() + + self.assertEqual(self.ashp.return_water_temperature_sensor, 295.15) + self.assertEqual(self.ashp.run_command, smart_device.RunStatus.ON) + + def test_supply_water_temperature_setpoint_setter(self): + """Tests we can change the reheat setpoint.""" + new_setpoint = 310.0 + self.ashp.supply_water_temperature_setpoint = new_setpoint + self.assertEqual(self.ashp.supply_water_temperature_setpoint, new_setpoint) + + @parameterized.parameters( + (280.15, 3.2), # 7°C Outside -> Nominal COP + (273.15, 2.85), # 0°C Outside -> Degraded COP (3.2 - 0.35) + (253.15, 1.85), # -20°C Outside -> Highly Degraded COP (3.2 - 1.35) + (200.00, 1.0), # Extreme Cold -> Clamped to Minimum COP of 1.0 + (330.00, 5.0), # Extreme Heat -> Clamped to Maximum COP of 5.0 + ) + def test_calculate_dynamic_cop(self, outside_temp_k, expected_cop): + """Tests linear degradation and clamping of the COP curve.""" + calculated_cop = self.ashp._calculate_dynamic_cop(outside_temp_k) + self.assertAlmostEqual(calculated_cop, expected_cop, places=2) + + @parameterized.parameters( + # Status, Flow, Return Temp, Outside Temp, Expected Electrical Watts + ( + smart_device.RunStatus.OFF, + 0.05, + 295.15, + 280.15, + 0.0, + ), # Off -> 0W + ( + smart_device.RunStatus.ON, + 0.0, + 295.15, + 280.15, + 0.0, + ), # No flow -> 0W + ( + smart_device.RunStatus.ON, + 0.05, + 315.00, + 280.15, + 0.0, + ), # Return > Setpoint (313.15K) -> 0W + ) + def test_compute_thermal_energy_rate_zero_conditions( + self, run_status, flow_rate, return_temp, outside_temp, expected_w + ): + """Tests conditions where the heat pump should consume zero power.""" + self.ashp.run_command = run_status + power_w = self.ashp.compute_thermal_energy_rate( + return_temp, outside_temp, flow_rate + ) + self.assertEqual(power_w, expected_w) + + def test_compute_thermal_energy_rate_normal_operation(self): + """Tests standard heating calculations well within max capacity bounds.""" + flow_rate = 0.002 # m^3/s (approx 31 GPM) + return_temp = 308.15 # 35°C (delta T of 5°C to the 40°C setpoint) + outside_temp = 280.15 # 7°C (COP = 3.2) + + # Expected Thermal Q = mass_flow * density * Cp * delta_T + # Q = 0.002 * 1000 * 4184 * 5.0 = 41,840 W + # Expected Electrical = Q / COP = 41840 / 3.2 = 13,063 W + expected_electrical_power = 13062.5 + + power_w = self.ashp.compute_thermal_energy_rate( + return_temp, outside_temp, flow_rate + ) + self.assertAlmostEqual(power_w, expected_electrical_power, places=1) + + def test_compute_thermal_energy_rate_capacity_clamped(self): + """Tests that electrical power is bounded when demand above max capacity.""" + flow_rate = 0.05 # Huge flow + return_temp = 280.15 # Very cold return (large delta T) + outside_temp = 280.15 # 7°C (COP = 3.2) + + # Unbounded demand would be massive. Should clamp to max capacity. + # Max capacity = 180,000 W + # Expected Electrical = 180,000 / 3.2 = 56,250 W + expected_electrical_power = 180000.0 / 3.2 + + power_w = self.ashp.compute_thermal_energy_rate( + return_temp, outside_temp, flow_rate + ) + self.assertAlmostEqual(power_w, expected_electrical_power, places=1) + + @parameterized.parameters( + ( + 320.0, + 290.0, + 5.6 * 4.0 * 30.0, + ), # Water warmer than outside -> Heat loss + (290.0, 320.0, 0.0), # Water cooler than outside -> Clamped to 0 + ) + def test_compute_thermal_dissipation_rate( + self, water_temp, outside_temp, expected_loss + ): + """Tests the simplified convection heat loss calculation.""" + loss_w = self.ashp.compute_thermal_dissipation_rate( + water_temp, outside_temp + ) + self.assertAlmostEqual(loss_w, expected_loss, places=1) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/simulator/boiler.py b/smart_control/simulator/boiler.py index 0667d8a8..5d681f95 100644 --- a/smart_control/simulator/boiler.py +++ b/smart_control/simulator/boiler.py @@ -6,25 +6,21 @@ import gin import numpy as np import pandas as pd - -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import smart_device -from smart_control.utils import constants +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import hot_water_heat_source +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.utils import constants @gin.configurable -class Boiler(smart_device.SmartDevice): - """Models a central boiler with water pump. +class Boiler(hot_water_heat_source.HotWaterHeatSource): + """Models a boiler that is part of a hot water system. Attributes: - _total_flow_rate: Flow rate of water in m3/s. - reheat_water_setpoint: Temperature in K that the boiler will maintain. - _water_pump_differential_head: Length in meters of pump head. - _water_pump_efficiency: Electrical efficiency of water pump [0,1]. - device_code: unique name of the device. - heating_request_count: count of VAVs that have requested heat in this cycle. + supply_water_temperature_setpoint: Temperature in K that the boiler will + maintain. + device_id: unique name of the device. supply_water_temperature_sensor: temp [K] of water being supplied to VAVs. - supply_water_setpoint: setpoint [K] of the supply water. return_water_temperature_sensor: temp [K] of return water heating_rate: degrees C / minute a boiler can heat cooling_rate: degrees C / minute the boiler temp will drop @@ -39,9 +35,7 @@ class Boiler(smart_device.SmartDevice): def __init__( self, - reheat_water_setpoint: float, - water_pump_differential_head: float, - water_pump_efficiency: float, + supply_water_temperature_setpoint: float, device_id: Optional[str] = None, heating_rate: Optional[float] = 0, cooling_rate: Optional[float] = 0, @@ -51,23 +45,21 @@ def __init__( water_capacity: Optional[float] = 1.5, insulation_conductivity: Optional[float] = 0.067, insulation_thickness: Optional[float] = 0.06, + init_return_water_temperature_sensor: float = 295.0, ): observable_fields = { - 'supply_water_setpoint': smart_device.AttributeInfo( - 'reheat_water_setpoint', float + 'supply_water_temperature_setpoint': smart_device.AttributeInfo( + 'supply_water_temperature_setpoint', float ), 'supply_water_temperature_sensor': smart_device.AttributeInfo( 'supply_water_temperature_sensor', float ), - 'heating_request_count': smart_device.AttributeInfo( - 'heating_request_count', int - ), } action_fields = { - 'supply_water_setpoint': smart_device.AttributeInfo( - 'reheat_water_setpoint', float - ) + 'supply_water_temperature_setpoint': smart_device.AttributeInfo( + 'supply_water_temperature_setpoint', float + ), } if device_id is None: @@ -80,11 +72,16 @@ def __init__( device_id=device_id, ) - self._init_reheat_water_setpoint = reheat_water_setpoint - self._init_water_pump_differential_head = water_pump_differential_head - self._init_water_pump_efficiency = water_pump_efficiency - self._init_heating_request_count = 0 - self._init_return_water_temperature_sensor = 0.0 + self._init_supply_water_temperature_setpoint = ( + supply_water_temperature_setpoint + ) + self._init_return_water_temperature_sensor = ( + init_return_water_temperature_sensor + ) + + self._has_tank = tank_radius > 0.0 + + # these values are only relevant for a boiler with a tank self._heating_rate = heating_rate self._cooling_rate = cooling_rate self._convection_coefficient = convection_coefficient @@ -93,20 +90,20 @@ def __init__( self._water_capacity = water_capacity self._insulation_conductivity = insulation_conductivity self._insulation_thickness = insulation_thickness + self.reset() def reset(self): - self.reset_demand() - self._reheat_water_setpoint = self._init_reheat_water_setpoint - self._water_pump_differential_head = self._init_water_pump_differential_head - self._water_pump_efficiency = self._init_water_pump_efficiency - self._heating_request_count = self._init_heating_request_count + self._supply_water_temperature_setpoint = ( + self._init_supply_water_temperature_setpoint + ) self._return_water_temperature_sensor = ( self._init_return_water_temperature_sensor ) - self._current_temperature = self._init_reheat_water_setpoint + self._current_temperature = self._init_supply_water_temperature_setpoint self._step_tank_temperature_change = 0.0 self._last_step_duration = pd.Timedelta(0, unit='second') + self._run_command = smart_device.RunStatus.OFF @property def return_water_temperature_sensor(self) -> float: @@ -117,16 +114,12 @@ def return_water_temperature_sensor(self, value: float) -> None: self._return_water_temperature_sensor = value @property - def reheat_water_setpoint(self) -> float: - return self._reheat_water_setpoint - - @reheat_water_setpoint.setter - def reheat_water_setpoint(self, value: float) -> None: - self._reheat_water_setpoint = value + def supply_water_temperature_setpoint(self) -> float: + return self._supply_water_temperature_setpoint - @property - def heating_request_count(self) -> int: - return self._heating_request_count + @supply_water_temperature_setpoint.setter + def supply_water_temperature_setpoint(self, value: float) -> None: + self._supply_water_temperature_setpoint = value @property def supply_water_temperature_sensor(self) -> float: @@ -134,17 +127,17 @@ def supply_water_temperature_sensor(self) -> float: return self._current_temperature @property - def supply_water_setpoint(self) -> float: - return self._reheat_water_setpoint + def run_command(self) -> smart_device.RunStatus: + return self._run_command - def reset_demand(self) -> None: - self._total_flow_rate = 0.0 - self._heating_request_count = 0 + @run_command.setter + def run_command(self, value: smart_device.RunStatus) -> None: + self._run_command = value def _set_current_temperature(self): """Adjusts the temperature based on time elapsed after setpoint change.""" - # Retain instantaneous behavior if rates aren't set. + # Retain instantaneous behavior if rates aren't set, or if there is no tank. # If no action has been applied, setpoint and measured temps are equal. if self._action_timestamp: self._last_step_duration = ( @@ -156,17 +149,20 @@ def _set_current_temperature(self): self._action_timestamp and self._cooling_rate > 0.0 and self._heating_rate > 0.0 + and self._has_tank ): begin_step_temp = self._current_temperature self._current_temperature = self._adjust_temperature( - self._reheat_water_setpoint, begin_step_temp, self._last_step_duration + self._supply_water_temperature_setpoint, + begin_step_temp, + self._last_step_duration, ) self._step_tank_temperature_change = ( self._current_temperature - begin_step_temp ) else: - self._current_temperature = self._reheat_water_setpoint + self._current_temperature = self._supply_water_temperature_setpoint def _adjust_temperature( self, @@ -202,46 +198,35 @@ def _adjust_temperature( else: return setpoint_temperature - def add_demand(self, flow_rate: float): - """Adds to current flow rate demand. - - Args: - flow_rate: Flow rate to add. - - Raises: - ValueError: If flow_rate is not positive. - """ - if flow_rate <= 0: - raise ValueError('Flow rate must be positive') - self._total_flow_rate += flow_rate - self._heating_request_count += 1 - def compute_thermal_energy_rate( - self, return_water_temp: float, outside_temp: float + self, + return_water_temp: float, + outside_temp: float, + total_flow_rate: float, ) -> float: """Returns energy rate in W consumed by boiler to heat water. Args: return_water_temp: Temperature in K that water is received at. outside_temp: Temperature in K that the water tank is in. + total_flow_rate: The total flow rate of water through the HWS in m3/s. """ # If return_water_temp is greater than the setpoint, # the boiler should not be cooling. - if self._reheat_water_setpoint > return_water_temp: - supply_water_temp = self._reheat_water_setpoint + if self._supply_water_temperature_setpoint > return_water_temp: + supply_water_temp = self._supply_water_temperature_setpoint else: supply_water_temp = return_water_temp flow_heating_energy_rate = ( constants.WATER_HEAT_CAPACITY - * self._total_flow_rate + * total_flow_rate * (supply_water_temp - return_water_temp) ) dissipation_energy_rate = self.compute_thermal_dissipation_rate( supply_water_temp, outside_temp ) - if self._last_step_duration.total_seconds() > 0: tank_heating_energy_rate = ( constants.WATER_HEAT_CAPACITY @@ -292,12 +277,11 @@ def compute_thermal_dissipation_rate( Returns: thermal loss rate of the tank in Watts """ - + # If the water temperature is less than the outside temperature, + # there should be no heat transfer. if water_temp < outside_temp: - raise ValueError( - 'Water temperature must be >= outside temperature. ' - f'Got water_temp={water_temp}, outside_temp={outside_temp}.' - ) + return 0.0 + delta_temp = water_temp - outside_temp numerator = self._tank_length * 2.0 * np.pi * delta_temp interior_radius = self._tank_radius @@ -308,16 +292,3 @@ def compute_thermal_dissipation_rate( ) convection_factor = 1.0 / self._convection_coefficient / exterior_radius return numerator / (conduction_factor + convection_factor) - - def compute_pump_power(self) -> float: - """Returns power consumed by pump in W to move water to VAVs. - - derived from: https://www.engineeringtoolbox.com/pumps-power-d_505.html - """ - return ( - self._total_flow_rate - * constants.WATER_DENSITY - * constants.GRAVITY - * self._water_pump_differential_head - / self._water_pump_efficiency - ) diff --git a/smart_control/simulator/boiler_test.py b/smart_control/simulator/boiler_test.py index df5733da..de4dd9e6 100644 --- a/smart_control/simulator/boiler_test.py +++ b/smart_control/simulator/boiler_test.py @@ -1,24 +1,17 @@ -"""Tests for boiler.""" - from absl.testing import absltest from absl.testing import parameterized import pandas as pd - -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import boiler -from smart_control.utils import constants +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import boiler +from smart_buildings.smart_control.simulator import smart_device class BoilerTest(parameterized.TestCase): def get_default_boiler(self): reheat_water_setpoint = 360 - water_pump_differential_head = 3 - water_pump_efficiency = 0.6 return boiler.Boiler( reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, device_id='boiler_id', heating_rate=0.0, cooling_rate=0.0, @@ -32,100 +25,58 @@ def get_default_boiler(self): def test_init(self): reheat_water_setpoint = 260 - water_pump_differential_head = 3 - water_pump_efficiency = 0.6 b = boiler.Boiler( reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, device_id='boiler_id', ) - self.assertEqual(b.reheat_water_setpoint, reheat_water_setpoint) - self.assertEqual( - b._water_pump_differential_head, water_pump_differential_head - ) - self.assertEqual(b._water_pump_efficiency, water_pump_efficiency) - self.assertEqual(b._total_flow_rate, 0) + self.assertEqual(b.supply_water_temperature_setpoint, reheat_water_setpoint) def test_reset(self): reheat_water_setpoint = 260 - water_pump_differential_head = 3 - water_pump_efficiency = 0.6 b = boiler.Boiler( reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, device_id='boiler_id', ) - b._reheat_water_setpoint += 1.0 - b._water_pump_differential_head = 4.0 - b._water_pump_efficiency = 0.1 - b._heating_request_count = 10 + b._supply_water_temperature_setpoint += 1.0 b._return_water_temperature_sensor = 310.0 - b._total_flow_rate = 10.0 + b.run_command = smart_device.RunStatus.ON b.reset() - self.assertEqual(b.reheat_water_setpoint, reheat_water_setpoint) - self.assertEqual( - b._water_pump_differential_head, water_pump_differential_head - ) - self.assertEqual(b._water_pump_efficiency, water_pump_efficiency) - self.assertEqual(b._total_flow_rate, 0) + self.assertEqual(b.supply_water_temperature_setpoint, reheat_water_setpoint) + self.assertEqual(b.run_command, smart_device.RunStatus.OFF) def test_init_default_id(self): reheat_water_setpoint = 260 - water_pump_differential_head = 3 - water_pump_efficiency = 0.6 b = boiler.Boiler( reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, ) self.assertIsNotNone(b._device_id) def test_setters(self): b = self.get_default_boiler() - b.reheat_water_setpoint = 300 - self.assertEqual(b.reheat_water_setpoint, 300) - - def test_reset_demand(self): - b = self.get_default_boiler() - - b.add_demand(5) - b.reset_demand() - - self.assertEqual(b._total_flow_rate, 0) - self.assertEqual(b.heating_request_count, 0) - - def test_add_demand(self): - b = self.get_default_boiler() - - b.add_demand(5) - self.assertEqual(b._total_flow_rate, 5) - self.assertEqual(b.heating_request_count, 1) - - def test_add_demand_raises_value_error(self): - b = self.get_default_boiler() - - with self.assertRaises(ValueError): - b.add_demand(0.0) + b.supply_water_temperature_setpoint = 300 + self.assertEqual(b.supply_water_temperature_setpoint, 300) def test_compute_thermal_energy_rate_heating(self): b = self.get_default_boiler() setpoint_temperature = 370 return_water_temp = 300 outside_temp = 280 - q0 = b.compute_thermal_energy_rate(return_water_temp, outside_temp) - b.reheat_water_setpoint = setpoint_temperature + q0 = b.compute_thermal_energy_rate( + return_water_temp, outside_temp, total_flow_rate=0 + ) + b.supply_water_temperature_setpoint = setpoint_temperature _ = b._adjust_temperature( setpoint_temperature, outside_temp, pd.Timedelta(5, unit='minute') ) b._last_step_duration = pd.Timedelta(5, unit='minute') - q1 = b.compute_thermal_energy_rate(return_water_temp, outside_temp) + q1 = b.compute_thermal_energy_rate( + return_water_temp, outside_temp, total_flow_rate=0 + ) self.assertAlmostEqual(500.066862, q0, places=4) self.assertAlmostEqual(562.57521, q1, places=4) @@ -144,41 +95,38 @@ def test_compute_thermal_energy_rate( total_flow_rate, expected_energy_rate, ): - water_pump_differential_head = 3 - water_pump_efficiency = 0.6 b = boiler.Boiler( water_temp_setpoint, - water_pump_differential_head, - water_pump_efficiency, device_id='boiler_id', ) - b.add_demand(total_flow_rate) - self.assertAlmostEqual( - b.compute_thermal_energy_rate(return_water_temp, outside_temp), + b.compute_thermal_energy_rate( + return_water_temp, outside_temp, total_flow_rate + ), expected_energy_rate, places=3, ) - def test_compute_thermal_energy_rate_raises_value_error(self): + def test_compute_thermal_energy_rate_zero(self): return_water_temp = 200 total_flow_rate = 0.5 reheat_water_setpoint = 100 - water_pump_differential_head = 3 - water_pump_efficiency = 0.6 outside_temp = 293 b = boiler.Boiler( reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, device_id='boiler_id', ) - b.add_demand(total_flow_rate) - - with self.assertRaises(ValueError): - _ = b.compute_thermal_energy_rate(return_water_temp, outside_temp) + # If the outside temp is higher than the return water temp, + # there should be no heat transfer. + self.assertAlmostEqual( + b.compute_thermal_energy_rate( + return_water_temp, outside_temp, total_flow_rate + ), + 0.0, + places=3, + ) @parameterized.parameters( (330.0, 290.0, pd.Timedelta(60, unit='second'), 0.0, 0.0, 290.0), @@ -197,12 +145,8 @@ def test_adjust_temperature( expected_temperature, ): reheat_water_setpoint = 310 - water_pump_differential_head = 3 - water_pump_efficiency = 0.6 b = boiler.Boiler( reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, device_id='boiler_id', heating_rate=heating_rate, cooling_rate=cooling_rate, @@ -215,43 +159,14 @@ def test_adjust_temperature( ), ) - @parameterized.parameters( - (0.5, 3, 0.9), - (0.2, 7, 0.5), - (0.5, 8, 0.23), - (0.5, 9, 0.7), - ) - def test_compute_pump_power( - self, total_flow_rate, water_pump_differential_head, water_pump_efficiency - ): - reheat_water_setpoint = 100 - b = boiler.Boiler( - reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, - device_id='boiler_id', - ) - - b.add_demand(total_flow_rate) - - expected = ( - total_flow_rate - * constants.WATER_DENSITY - * constants.GRAVITY - * water_pump_differential_head - / water_pump_efficiency - ) - self.assertEqual(b.compute_pump_power(), expected) - def test_observable_field_names(self): b = self.get_default_boiler() self.assertSameElements( b.observable_field_names(), [ - 'supply_water_setpoint', + 'supply_water_temperature_setpoint', 'supply_water_temperature_sensor', - 'heating_request_count', ], ) @@ -260,21 +175,17 @@ def test_observe_supply_water_setpoint(self): b = self.get_default_boiler() observed_value = b.get_observation( - 'supply_water_setpoint', pd.Timestamp('2021-09-01 10:00') + 'supply_water_temperature_setpoint', pd.Timestamp('2021-09-01 10:00') ) self.assertEqual(observed_value, reheat_water_setpoint) def test_observe_supply_water_temperature_sensor(self): reheat_water_setpoint = 360 - water_pump_differential_head = 3 - water_pump_efficiency = 0.6 heating_rate = 2.0 cooling_rate = 0.5 b = boiler.Boiler( reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, device_id='boiler_id', heating_rate=heating_rate, cooling_rate=cooling_rate, @@ -288,7 +199,9 @@ def test_observe_supply_water_temperature_sensor(self): # Up the setpoint to 365, one minute later, the temp should go to 362. b.set_action( - 'supply_water_setpoint', 365.0, pd.Timestamp('2021-09-01 10:00:00') + 'supply_water_temperature_setpoint', + 365.0, + pd.Timestamp('2021-09-01 10:00:00'), ) observed_value = b.get_observation( 'supply_water_temperature_sensor', pd.Timestamp('2021-09-01 10:01') @@ -303,7 +216,9 @@ def test_observe_supply_water_temperature_sensor(self): # Drop the setpoint to 350; after 20 min, should drop to 355. b.set_action( - 'supply_water_setpoint', 350.0, pd.Timestamp('2021-09-01 10:10:00') + 'supply_water_temperature_setpoint', + 350.0, + pd.Timestamp('2021-09-01 10:10:00'), ) observed_value = b.get_observation( @@ -317,6 +232,35 @@ def test_observe_supply_water_temperature_sensor(self): ) self.assertAlmostEqual(observed_value, 350.0) + def test_observe_supply_water_temperature_sensor_no_tank(self): + reheat_water_setpoint = 360 + heating_rate = 2.0 + cooling_rate = 0.5 + b = boiler.Boiler( + reheat_water_setpoint, + device_id='boiler_id', + heating_rate=heating_rate, + cooling_rate=cooling_rate, + tank_radius=0.0, + ) + + # Start with a temp & setpoint at 360. + observed_value = b.get_observation( + 'supply_water_temperature_sensor', pd.Timestamp('2021-09-01 10:00') + ) + self.assertEqual(observed_value, reheat_water_setpoint) + + # Up the setpoint to 365, one minute later, the temp should already be 365. + b.set_action( + 'supply_water_temperature_setpoint', + 365.0, + pd.Timestamp('2021-09-01 10:00:00'), + ) + observed_value = b.get_observation( + 'supply_water_temperature_sensor', pd.Timestamp('2021-09-01 10:01') + ) + self.assertAlmostEqual(observed_value, 365.0) + @parameterized.parameters( ( 300.0, @@ -381,39 +325,25 @@ def test_set_current_temperature_default( expected_energy_rate, ): reheat_water_setpoint = current_temp - water_pump_differential_head = 3 - water_pump_efficiency = 0.6 b = boiler.Boiler( reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, device_id='boiler_id', heating_rate=heating_rate, cooling_rate=cooling_rate, ) - b.set_action('supply_water_setpoint', setpoint_temp, action_timestamp) + b.set_action( + 'supply_water_temperature_setpoint', setpoint_temp, action_timestamp + ) observed_temp = b.get_observation( 'supply_water_temperature_sensor', observation_timestamp ) self.assertAlmostEqual(expected_temp, observed_temp) - energy_rate = b.compute_thermal_energy_rate(300, 288) + energy_rate = b.compute_thermal_energy_rate(300, 288, total_flow_rate=0) self.assertAlmostEqual(expected_energy_rate, energy_rate, places=3) - def test_observe_heating_request_count(self): - b = self.get_default_boiler() - - b.add_demand(1.5) - b.add_demand(1.5) - - observed_value = b.get_observation( - 'heating_request_count', pd.Timestamp('2021-09-01 10:00') - ) - - self.assertEqual(observed_value, 2) - def test_compute_thermal_dissipation_rate_valid(self): b = self.get_default_boiler() q = b.compute_thermal_dissipation_rate(340.0, 290.0) @@ -424,25 +354,29 @@ def test_compute_thermal_dissipation_rate_zero(self): q = b.compute_thermal_dissipation_rate(290.0, 290.0) self.assertAlmostEqual(q, 0.0, places=4) - def test_compute_thermal_dissipation_rate_invalid(self): + def test_compute_thermal_dissipation_rate_zero_low_temp(self): b = self.get_default_boiler() - with self.assertRaises(ValueError): - _ = b.compute_thermal_dissipation_rate(240.0, 290.0) + q = b.compute_thermal_dissipation_rate(240.0, 290.0) + self.assertAlmostEqual(q, 0.0, places=4) def test_action_field_names(self): b = self.get_default_boiler() - self.assertSameElements(b.action_field_names(), ['supply_water_setpoint']) + self.assertSameElements( + b.action_field_names(), ['supply_water_temperature_setpoint'] + ) def test_action_supply_water_setpoint(self): b = self.get_default_boiler() new_value = 280.0 b.set_action( - 'supply_water_setpoint', new_value, pd.Timestamp('2021-09-01 10:00') + 'supply_water_temperature_setpoint', + new_value, + pd.Timestamp('2021-09-01 10:00'), ) - self.assertEqual(b.reheat_water_setpoint, new_value) + self.assertEqual(b.supply_water_temperature_setpoint, new_value) def test_device_type(self): b = self.get_default_boiler() @@ -460,6 +394,26 @@ def test_device_id(self): self.assertEqual(device_id, 'boiler_id') + def test_run_command_setter(self): + b = self.get_default_boiler() + # Check initial status + self.assertEqual(b.run_command, smart_device.RunStatus.OFF) + + # Set to On and verify + b.run_command = smart_device.RunStatus.ON + self.assertEqual(b.run_command, smart_device.RunStatus.ON) + + # Set back to Off and verify + b.run_command = smart_device.RunStatus.OFF + self.assertEqual(b.run_command, smart_device.RunStatus.OFF) + + def test_supply_water_setpoint(self): + b = self.get_default_boiler() + self.assertEqual(b.supply_water_temperature_setpoint, 360.0) + + b.supply_water_temperature_setpoint = 305.0 + self.assertEqual(b.supply_water_temperature_setpoint, 305.0) + if __name__ == '__main__': absltest.main() diff --git a/smart_control/simulator/building.py b/smart_control/simulator/building.py index 0f550fea..fd4b5672 100644 --- a/smart_control/simulator/building.py +++ b/smart_control/simulator/building.py @@ -2,16 +2,14 @@ import abc import dataclasses -from typing import Any, Dict, List, Optional, Sequence, Tuple, Union +from typing import Any, Dict, List, Mapping, Optional, Sequence, Tuple, Union import gin import numpy as np - -from smart_control.simulator import base_convection_simulator -from smart_control.simulator import building_radiation_utils -from smart_control.simulator import building_utils -from smart_control.simulator import constants -from smart_control.simulator import thermal_diffuser_utils +from smart_buildings.smart_control.simulator import base_convection_simulator +from smart_buildings.smart_control.simulator import building_utils +from smart_buildings.smart_control.simulator import constants +from smart_buildings.smart_control.simulator import thermal_diffuser_utils Coordinates2D = Tuple[int, int] Shape2D = Tuple[int, int] @@ -29,155 +27,7 @@ class MaterialProperties: density: float -@dataclasses.dataclass -class DefaultInsideAirMaterialProperties(MaterialProperties): - """The default material properties for inside air.""" - - def __init__(self): - super().__init__(conductivity=50.0, heat_capacity=700.0, density=1.2) - - -@dataclasses.dataclass -class DefaultInsideWallMaterialProperties(MaterialProperties): - """The default material properties for inside walls.""" - - def __init__(self): - super().__init__(conductivity=2.0, heat_capacity=1000.0, density=1800.0) - - -@dataclasses.dataclass -class DefaultExteriorWallMaterialProperties(MaterialProperties): - """The default material properties for building exterior.""" - - def __init__(self): - super().__init__(conductivity=0.05, heat_capacity=1000.0, density=3000.0) - - -@gin.configurable -@dataclasses.dataclass -class RadiationProperties: - # pylint: disable=line-too-long - r"""Holds the radiative properties for a material. - - Args: - alpha (float): absorptivity. Absorptivity is the fraction of incident - radiative heat that is absorbed by a surface. When radiation strikes a - surface, a portion of its energy is converted into internal thermal - energy, causing the temperature of the surface to rise. - A value of 1 means the surface is a "black body" and absorbs all incident - radiation, while a value of 0 means it absorbs none. - epsilon (float): emissivity. Emissivity is a measure of a surface's ability - to emit thermal radiation. It is the ratio of the radiation emitted by a - surface to the radiation emitted by a perfect black body at the same - temperature. A black body has an emissivity of 1, as it is a perfect - emitter. A surface with an emissivity of 0 is a theoretical "white body" - that cannot emit radiation. High emissivity surfaces (like matte black - paint) are excellent radiators of heat, while low emissivity surfaces - (like polished metal) are poor radiators. - tau (float): transmittance. Transmittance is the fraction of incident - radiative heat that passes through a medium without being absorbed or - reflected. This property is particularly relevant for modeling radiation - through transparent or semi-transparent materials, such as glass, air, or - other gases. For an opaque surface, the transmittance is always 0 because - no radiation passes through it. For a perfectly transparent medium, the - transmittance is always 1. - rho (float): reflectivity. Reflectivity is the fraction of incident - radiative heat that is reflected away from a surface. When radiation hits - a surface, some of it bounces off. A highly polished, shiny surface will - have a high reflectivity (approaching 1), while a dull, dark surface will - have low reflectivity (approaching 0). - - Relationship between the properties: - - + For any surface, the sum of absorptivity, reflectivity, and transmittance - must equal 1, as all incident radiation is either absorbed, reflected, or - transmitted. - + For an opaque (non-transparent) surface, where transmittance is 0, the sum - of absorptivity and reflectivity must equal 1, as all incident radiation - is either absorbed or reflected. - - Each of the property values should be between 0 and 1 (inclusive). Example - values for various common materials are displayed in the tables below. - - Long-wave and solar emissivity for building surfaces: - - | Material | Long-wave emissivity (epsilon) | Solar absorptivity (alpha) | - |---------------------|--------------------------------|------------------------------| - | Building materials | 0.90 - 0.96 | 0.6 - 0.7 | - | Wood | 0.9 | 0.9 - 0.96 | - | Dark-colored paints | 0.91 - 0.95 | 0.98 | - | Light-colored paints| 0.8 | 0.2 | - | Galvanized metal | 0.28 | 0.8 | - | Aluminum, polished | 0.03 | 0.09 | - | Window glass | 0.9 - 0.95 | 0.02 - 0.04 | - | Water | 0.96 | 0.1 - 1* | - | Ice | 0.95 | 0.3 - 0.4 | - - \* Depends strongly on zenith angle; is close to unity for small angles and - close to zero for large angles. - - Source: - Table 4.5, Mitchell, John W., and James E. Braun. Principles of - heating, ventilation, and air conditioning in buildings. John Wiley & Sons, - 2012. - """ - # pylint: enable=line-too-long - - alpha: float # absorptivity - epsilon: float # emissivity - tau: float # transmittance - rho: float | None = None # reflectivity - - def __post_init__(self): - if self.rho is None: - self.rho = 1 - self.alpha - self.tau - - if self.alpha < 0 or self.alpha > 1: - raise ValueError("The value for alpha should be between 0 and 1.") - - if self.epsilon < 0 or self.epsilon > 1: - raise ValueError("The value for epsilon should be between 0 and 1.") - - if self.tau < 0 or self.tau > 1: - raise ValueError("The value for tau should be between 0 and 1.") - - if self.rho < 0 or self.rho > 1: - raise ValueError("The value for rho should be between 0 and 1.") - - # Check that the sum of certain radiative properties is equal to 1: - total = self.alpha + self.rho + self.tau - if abs(total - 1.0) > 1e-10: - raise ValueError( - f"The sum of alpha ({self.alpha}), rho ({self.rho}), " - f"and tau ({self.tau}) must equal 1, but got {total}." - ) - - -@dataclasses.dataclass -class DefaultInsideAirRadiationProperties(RadiationProperties): - """The default radiation properties for inside air.""" - - def __init__(self): - super().__init__(alpha=0.0, epsilon=0.0, tau=1.0, rho=0.0) - - -@dataclasses.dataclass -class DefaultInsideWallRadiationProperties(RadiationProperties): - """The default radiation properties for light colored paints.""" - - def __init__(self): - super().__init__(alpha=0.2, epsilon=0.8, tau=0.0, rho=0.8) - - -@dataclasses.dataclass -class DefaultExteriorWallRadiationProperties(RadiationProperties): - """The default radiation properties for building materials.""" - - def __init__(self): - super().__init__(alpha=0.65, epsilon=0.93, tau=0.0, rho=0.35) - - -def _check_room_sizes(matrix_shape: Shape2D, room_shape: Shape2D): +def _check_room_sizes(matrix_shape: Shape2D, room_shape: Shape2D) -> None: """Raises a ValueError if room_shape is not compatible with matrix_shape. The matrix for the building includes 2 outer wall layers, then rooms divided @@ -195,7 +45,7 @@ def _check_room_sizes(matrix_shape: Shape2D, room_shape: Shape2D): raise ValueError("Room_shape[1] is not compatible with matrix_shape[1]") -def assign_building_exterior_values(array: np.ndarray, value: float): +def assign_building_exterior_values(array: np.ndarray, value: float) -> None: """Assigns value to the building's exterior locations. The outer 2 layers of the matrix are special CVs which represent the thicker @@ -211,7 +61,7 @@ def assign_building_exterior_values(array: np.ndarray, value: float): def assign_interior_wall_values( array: np.ndarray, value: float, room_shape: Shape2D -): +) -> None: """Assigns value to interior wall locations. These are the walls dividing the rooms. None of these walls are on the @@ -437,6 +287,7 @@ def _assign_thermal_diffusers( interior_walls: building_utils.InteriorWalls, diffuser_spacing: int = 10, buffer_from_walls: int = 5, + min_room_size: int = 350, ) -> np.ndarray: """Places as many thermal diffusers in a zone as "diffuser_spacing" allows. @@ -466,20 +317,21 @@ def _assign_thermal_diffusers( diffuser_spacing: how many diffusers to have per control volume spacing. buffer_from_walls: how many CVs to leave in between each wall and each thermal diffuser + min_room_size: minimum room size to place diffusers Returns: an np.ndarray with the appropriate values set. """ for key, value in room_dict.items(): - if not key.startswith(constants.ROOM_STRING_DESIGNATOR): + if constants.is_non_physical_space(key): continue - inds = thermal_diffuser_utils.diffuser_allocation_switch( room_cv_indices=value, spacing=diffuser_spacing, interior_walls=interior_walls, buffer_from_walls=buffer_from_walls, + min_room_size=min_room_size, ) num_inds = len(inds) for ind in inds: @@ -492,7 +344,7 @@ class BaseSimulatorBuilding(abc.ABC): """Base class for building simulators.""" @abc.abstractmethod - def reset(self): + def reset(self) -> None: """Resets the building to its initial parameters.""" @abc.abstractmethod @@ -548,7 +400,9 @@ class Building(BaseSimulatorBuilding): volume. cv_type: a matrix noting whether each CV is outside air, interior space, or a wall. cv_type will be used in the sweep() function. - + inside_air_properties: MaterialProperties for interior air. + inside_wall_properties: MaterialProperties for interior walls. + building_exterior_properties: MaterialProperties for building's exterior. """ def __init__( @@ -593,6 +447,10 @@ def __init__( self.building_shape = building_shape self._initial_temp = initial_temp + self.inside_air_properties = inside_air_properties + self.inside_wall_properties = inside_wall_properties + self.building_exterior_properties = building_exterior_properties + if not deprecation: # TODO(sipple): delete the class when deprecation is finished. @@ -655,7 +513,7 @@ def conductivity(self) -> np.ndarray: def cv_type(self) -> np.ndarray: raise NotImplementedError() - def reset(self): + def reset(self) -> None: """Resets the building to its initial parameters.""" nrows = (self.room_shape[0] + 1) * self.building_shape[0] + 3 ncols = (self.room_shape[1] + 1) * self.building_shape[1] + 3 @@ -729,7 +587,7 @@ def get_zone_average_temps(self) -> Dict[Tuple[int, int], Any]: def apply_thermal_power_zone( self, zone_coordinates: Coordinates2D, power: float - ): + ) -> None: """Applies thermal power to zones, spread evenly across diffusers. The thermal power [W] is applied to zones `zone_x` and `zone_y`. @@ -760,6 +618,8 @@ class FloorPlanBasedBuilding(BaseSimulatorBuilding): width and length of each room. building_shape: 2-Tuple representing the number of rooms in the width and length of the building. + floor_plan_filepath: path to the floor plan npy file. + zone_map_filepath: path to the zone map npy file. floor_plan: an np.ndarray representing the building's floor plan. temp: The current temp in K of each control volume. conductivity: Thermal conductivity in of each control volume W/m/K. @@ -773,50 +633,70 @@ class FloorPlanBasedBuilding(BaseSimulatorBuilding): neighbors: Matrix containing list of neighbor coordinates for each control volume. len_neighbors: matrix containing the length of neighbors - include_radiative_heat_transfer: bool to note whether to include radiative - heat transfer. - indexed_floor_plan: matrix representing the building's floor plan. Used only - for calculating interior radiative heat transfer. - interior_wall_mask: matrix representing the interior walls of the - building. Used only for calculating interior radiative heat transfer. - interior_wall_index: matrix representing the index of the interior - walls of the building. Used only for calculating interior radiative - heat transfer. - interior_wall_vf: matrix representing the view factors of the - interior walls of the building, which is denoted as F in the equation. - Used only for calculating interior radiative heat transfer. - epsilon: matrix representing the emissivity of the nodes of - the building. Used only for calculating radiative heat transfer. - alpha: matrix representing the absorptivity of the nodes of - the building. Used only for calculating radiative heat transfer. - tau: matrix representing the transmittance of the nodes of - the building. Used only for calculating radiative heat transfer. - ifa_inv: matrix representing the inverse of the IFA matrix of the nodes of - the building. Used only for calculating radiative heat transfer. - include_interior_mass: bool to note whether to include interior mass nodes. - interior_mass_mask: matrix indicating which CVs have interior mass nodes. - interior_mass_temp: matrix representing temperature of interior mass nodes. - - The longwave radiation ($q_{lwx}$) is calculated as: - - $$q_{lwx} = \\sigma(I-F)\\tilde{A}_{inv}T^4$$ - - Where the term $(I-F)\\tilde{A}_{inv}$ can be pre-calculated as: - - $$IFA_{inv} = (I-F)\\tilde{A}_{inv}$$ + inside_air_properties: MaterialProperties for interior air. + inside_wall_properties: MaterialProperties for interior walls. + building_exterior_properties: MaterialProperties for building's exterior. """ + def _check_floor_plan_and_zone_inputs( + self, + floor_plan: np.ndarray | None, + floor_plan_filepath: Optional[str], + zone_map: np.ndarray | None, + zone_map_filepath: Optional[str], + custom_room_dict: Optional[Dict[str, List[Tuple[int, int]]]], + custom_zone_to_vavs: Optional[Dict[str, List[str]]], + ) -> None: + """Checks for valid combinations of floor plan and zone inputs.""" + if floor_plan_filepath is not None and floor_plan is not None: + raise ValueError( + "You have provided both a floor_plan and a floor_plan_filepath. " + "Please provide only one." + ) + if floor_plan is None and floor_plan_filepath is None: + raise ValueError( + "Both floor_plan and floor_plan_filepath cannot be None." + ) + + if ( + zone_map_filepath is None + and zone_map is None + and custom_room_dict is None + ): + raise ValueError( + "Please provide a zone_map_filepath or a zone_map or a" + " custom_room_dict." + ) + + if zone_map_filepath is not None and zone_map is not None: + raise ValueError( + "You have provided both zone_map_filepath and a zone_map." + ) + if custom_room_dict is not None and ( + zone_map is not None or zone_map_filepath is not None + ): + raise ValueError( + "You have provided both custom_room_dict and a zone_map or" + " zone_map_filepath." + ) + + if custom_zone_to_vavs is not None and custom_room_dict is None: + raise ValueError( + "custom_zone_to_vavs cannot be provided without custom_room_dict." + ) + def __init__( self, cv_size_cm: float, floor_height_cm: float, initial_temp: float, - inside_air_properties: MaterialProperties | None = None, - inside_wall_properties: MaterialProperties | None = None, - building_exterior_properties: MaterialProperties | None = None, - interior_mass_properties: MaterialProperties | None = None, + inside_air_properties: MaterialProperties, + inside_wall_properties: MaterialProperties, + building_exterior_properties: MaterialProperties, zone_map: Optional[np.ndarray] = None, zone_map_filepath: Optional[str] = None, + custom_room_dict: dict[str, list[tuple[int, int]]] | None = None, + custom_zone_to_vavs: Optional[Dict[str, List[str]]] = None, floor_plan: Optional[np.ndarray] = None, floor_plan_filepath: Optional[str] = None, buffer_from_walls: int = 3, @@ -824,120 +704,107 @@ def __init__( base_convection_simulator.BaseConvectionSimulator ] = None, reset_temp_values: np.ndarray | None = None, - inside_air_radiative_properties: RadiationProperties | None = None, - inside_wall_radiative_properties: RadiationProperties | None = None, - building_exterior_radiative_properties: RadiationProperties | None = None, - interior_mass_radiative_properties: RadiationProperties | None = None, - include_radiative_heat_transfer: bool = False, - view_factor_method: str = "ScriptF", - include_interior_mass: bool = False, + min_room_size: int = 350, ): """Initializes the New Building. Args: - cv_size_cm: Width, length and height of control volume in cm. + cv_size_cm: Width, length and height of control volume. floor_height_cm: Height in cm floor to ceiling of each room. - initial_temp: Initial temperature for each control volume in K. - inside_air_properties: MaterialProperties for interior air. If None, - defaults to DefaultInsideAirMaterialProperties. - inside_wall_properties: MaterialProperties for interior walls. If None, - defaults to DefaultInsideWallMaterialProperties. + initial_temp: Initial temperature for each control volume. + inside_air_properties: MaterialProperties for interior air. + inside_wall_properties: MaterialProperties for interior walls. building_exterior_properties: MaterialProperties for building's exterior. - If None, defaults to DefaultExteriorWallMaterialProperties. zone_map: an np.ndarray noting where the VAV zones are. zone_map_filepath: a string of where to find the zone_map in CNS. Note that the user requires only to provide one of either zone_map_filepath or zone_map. + custom_room_dict: a dictionary that maps custom zone names to their + corresponding control volumes. Example: {'zone_1': [(2, 3), (2, 4)], + 'zone_2': [(10, 11), (10, 12)]} + custom_zone_to_vavs: a dictionary that maps custom zone names to their + corresponding VAVs. This should only be provided if a custom_room_dict + is provided. Example: + {'zone_1': ['vav_1'], 'zone_2': ['vav_2', 'vav_3']} floor_plan: an np.ndarray to pass into the function if one has this. If this is None, then the user must pass in a filepath. floor_plan_filepath: a string of where to find the floor_plan in CNS. Both - floor_plan and floor_plan_filepath may not be None. + floor_plan and floor_plan_filepath may not be None in the new code. + debugging purposes. buffer_from_walls: int to note the space to put between thermal diffusers - and walls. - convection_simulator: object to simulate air convection. - reset_temp_values: Temp values to use when resetting the building. - inside_air_radiative_properties: RadiationProperties for interior air. - inside_wall_radiative_properties: RadiationProperties for interior walls. - building_exterior_radiative_properties: RadiationProperties for building's - exterior. - include_radiative_heat_transfer: bool to note whether to include radiative - heat transfer. - view_factor_method: str to note the method to use for view factors. - Either "ScriptF" or "CarrollMRT". See - [LW Radiation Exchange Among Zone Surfaces](https://bigladdersoftware.com/epx/docs/9-6/engineering-reference/inside-heat-balance.html#lw-radiation-exchange-among-zone-surfaces) - for more details. - interior_mass_properties: MaterialProperties for interior mass nodes - attached to air CVs. - interior_mass_radiative_properties: RadiationProperties for interior mass - nodes attached to air CVs. - include_interior_mass: bool to note whether to include interior mass nodes - for air CVs. + and walls + convection_simulator: object to simulate air convection + reset_temp_values: Temp values to use when resetting the building + min_room_size: The minimum number of control volumes a room must have to + be considered for diffuser placement. """ - + # consider super call! + self.floor_plan_filepath = floor_plan_filepath + self.zone_map_filepath = zone_map_filepath self.cv_size_cm = cv_size_cm self.floor_height_cm = floor_height_cm + self.inside_air_properties = inside_air_properties + self.inside_wall_properties = inside_wall_properties + self.building_exterior_properties = building_exterior_properties self._initial_temp = initial_temp self._convection_simulator = convection_simulator self._reset_temp_values = reset_temp_values - self.include_radiative_heat_transfer = include_radiative_heat_transfer - self.include_interior_mass = include_interior_mass - - # Apply default material properties if not provided - inside_air_properties = inside_air_properties or ( - DefaultInsideAirMaterialProperties() - ) - inside_wall_properties = inside_wall_properties or ( - DefaultInsideWallMaterialProperties() - ) - building_exterior_properties = building_exterior_properties or ( - DefaultExteriorWallMaterialProperties() + self._min_room_size = min_room_size + + self._check_floor_plan_and_zone_inputs( + floor_plan=floor_plan, + floor_plan_filepath=floor_plan_filepath, + zone_map=zone_map, + zone_map_filepath=zone_map_filepath, + custom_room_dict=custom_room_dict, + custom_zone_to_vavs=custom_zone_to_vavs, ) - # below is new code, to derive necessary artifacts from the floor plan. - # TODO(spangher): neaten code by turning the next twenty lines into a - # private method. - - if floor_plan is None and floor_plan_filepath is None: - raise ValueError( - "Both floor_plan and floor_plan_filepath cannot be None." - ) - - elif floor_plan is None and floor_plan_filepath: - self.floor_plan = building_utils.read_floor_plan_from_filepath( + if floor_plan_filepath is not None: + self.floor_plan, _ = building_utils.read_floor_plan_from_filepath( floor_plan_filepath ) - - elif floor_plan is not None and floor_plan_filepath is None: - self.floor_plan = floor_plan - + elif floor_plan is not None: + self.floor_plan = np.asarray(floor_plan) else: - raise ValueError("floor_plan and floor_plan_filepath ") - - if zone_map_filepath is None and zone_map is None: - raise ValueError("please provide a zone_map_filepath or a zone_map") - - if zone_map_filepath is not None and zone_map is not None: + # This case should be caught by _check_floor_plan_and_zone_inputs, + # but included for type consistency. raise ValueError( - "You have provided both zone_map_filepath and a zone_map" + "Both floor_plan and floor_plan_filepath cannot be None." ) - if zone_map is not None and zone_map_filepath is None: - self._zone_map = zone_map - - if zone_map is None and zone_map_filepath is not None: - zone_map = building_utils.read_floor_plan_from_filepath(zone_map_filepath) - self._zone_map = zone_map - if include_interior_mass and interior_mass_properties is None: - raise ValueError( - "interior_mass_properties must be provided if include_interior_mass" - " is True" + if zone_map is not None: + self._zone_map = np.asarray(zone_map) + zone_map = self._zone_map + elif zone_map_filepath is not None: + zone_map, _ = building_utils.read_floor_plan_from_filepath( + zone_map_filepath ) + self._zone_map = zone_map + else: + self._zone_map = None - (self._room_dict, exterior_walls, interior_walls, self._exterior_space) = ( - building_utils.construct_building_data_types( - floor_plan=self.floor_plan, zone_map=zone_map - ) + effective_zone_map = zone_map if zone_map is not None else self.floor_plan + ( + self._room_dict, + exterior_walls, + interior_walls, + self._exterior_space, + offset, + ) = building_utils.construct_building_data_types( + floor_plan=self.floor_plan, zone_map=effective_zone_map ) + # quick fix is to overwrite, might delete the autodetected roomdict later + # we keep this call for backward compatibility with the old approach + # where zones were automatically detected. + if custom_room_dict is not None: + self._room_dict = { + k: [(r + offset[0], c + offset[1]) for (r, c) in v] + for k, v in custom_room_dict.items() + } + + self._custom_room_dict = custom_room_dict + self._custom_zone_to_vavs = custom_zone_to_vavs self._exterior_walls, self._interior_walls = enlarge_exterior_walls( exterior_walls=exterior_walls, interior_walls=interior_walls @@ -973,6 +840,7 @@ def __init__( room_dict=self._room_dict, interior_walls=interior_walls, buffer_from_walls=buffer_from_walls, + min_room_size=self._min_room_size, ) self._cv_type = _construct_cv_type_array( @@ -982,233 +850,51 @@ def __init__( self.neighbors = self._calculate_neighbors() self.len_neighbors = self._calculate_length_of_neighbors() - self._assign_interior_mass_properties( - interior_mass_properties=interior_mass_properties, - interior_mass_radiative_properties=interior_mass_radiative_properties, - ) - - self._assign_radiative_heat_transfer_properties( - view_factor_method, - exterior_walls, - interior_walls, - inside_wall_radiative_properties, - building_exterior_radiative_properties, - inside_air_radiative_properties, - ) - self.reset() - def _assign_radiative_heat_transfer_properties( - self, - view_factor_method, - exterior_walls, - interior_walls, - inside_wall_radiative_properties, - building_exterior_radiative_properties, - inside_air_radiative_properties, - ): - if self.include_radiative_heat_transfer: - self.view_factor_method = view_factor_method - - self.indexed_floor_plan = self.floor_plan.copy() - # convert values from 2 to -1: - self.indexed_floor_plan[ - self.indexed_floor_plan - == constants.EXTERIOR_SPACE_VALUE_IN_FILE_INPUT - ] = constants.EXTERIOR_SPACE_VALUE_IN_FUNCTION - # convert values from 1 to -3: - self.indexed_floor_plan[ - self.indexed_floor_plan == constants.INTERIOR_WALL_VALUE_IN_FILE_INPUT - ] = constants.INTERIOR_WALL_VALUE_IN_FUNCTION - - self.interior_wall_mask = ( - building_radiation_utils.mark_interior_wall_adjacent_to_air( - self.indexed_floor_plan, - constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, - ) - ) - self.lwx_index = np.full(self.indexed_floor_plan.shape, -1) - # convert mask index => range for view factor matrix order. - if self.include_interior_mass: - interior_wall_mask_all = ( - self.interior_wall_mask | self.interior_mass_mask - ) - else: - interior_wall_mask_all = self.interior_wall_mask - self.lwx_index[interior_wall_mask_all] = np.arange( - np.sum(interior_wall_mask_all) - ) - self.interior_wall_vf = building_radiation_utils.get_vf( - indexed_floor_plan=self.indexed_floor_plan, - interior_wall_mask=self.interior_wall_mask, - view_factor_method=view_factor_method, - interior_mass_mask=self.interior_mass_mask, - ) - - # radiative properties - inside_wall_radiative_properties = ( - inside_wall_radiative_properties - or DefaultInsideWallRadiationProperties() - ) - building_exterior_radiative_properties = ( - building_exterior_radiative_properties - or DefaultExteriorWallRadiationProperties() - ) - inside_air_radiative_properties = ( - inside_air_radiative_properties - or DefaultInsideAirRadiationProperties() - ) - - # emissivity - self._epsilon = _assign_interior_and_exterior_values( - exterior_walls=exterior_walls, - interior_walls=interior_walls, - interior_wall_value=inside_wall_radiative_properties.epsilon, - exterior_wall_value=building_exterior_radiative_properties.epsilon, - interior_and_exterior_space_value=inside_air_radiative_properties.epsilon, # pylint: disable=line-too-long - ) - # absorptivity - self._alpha = _assign_interior_and_exterior_values( - exterior_walls=exterior_walls, - interior_walls=interior_walls, - interior_wall_value=inside_wall_radiative_properties.alpha, - exterior_wall_value=building_exterior_radiative_properties.alpha, - interior_and_exterior_space_value=inside_air_radiative_properties.alpha, # pylint: disable=line-too-long - ) - # transmittance - self._tau = _assign_interior_and_exterior_values( - exterior_walls=exterior_walls, - interior_walls=interior_walls, - interior_wall_value=inside_wall_radiative_properties.tau, - exterior_wall_value=building_exterior_radiative_properties.tau, - interior_and_exterior_space_value=inside_air_radiative_properties.tau, - ) - if self.include_interior_mass: - epsilon_temp = np.zeros_like(self._epsilon) - epsilon_temp[self.interior_mass_mask] = self._epsilon_interior_mass[ - self.interior_mass_mask - ] - epsilon_temp[self.interior_wall_mask] = self._epsilon[ - self.interior_wall_mask - ] - interior_mask_all = self.interior_mass_mask | self.interior_wall_mask - epsilon_vector = epsilon_temp[interior_mask_all] - else: - epsilon_vector = self._epsilon[self.interior_wall_mask] - a_tilde_inv = building_radiation_utils.calculate_a_tilde_inv( - epsilon_vector, self.interior_wall_vf - ) - self.ifa_inv = building_radiation_utils.calculate_ifa_inv( - self.interior_wall_vf, a_tilde_inv - ) - - else: - self.view_factor_method = None - self.indexed_floor_plan = None - self.interior_wall_mask = None - self.interior_wall_index = None - self.interior_wall_vf = None - self._alpha = None - self._epsilon = None - self._tau = None - self.ifa_inv = None - - def _assign_interior_mass_properties( - self, - interior_mass_properties, - interior_mass_radiative_properties, - ): - """Assigns properties for interior mass nodes.""" - if self.include_interior_mass: - # Use provided properties or default to air properties - - # Create mask for air nodes (interior space) - self.interior_mass_mask = ( - self.floor_plan == constants.INTERIOR_SPACE_VALUE_IN_FILE_INPUT - ) - - # Initialize interior mass temperature array - self.interior_mass_temp = np.full( - self._exterior_walls.shape, self._initial_temp - ) - - # Assign material properties for interior mass - self._interior_mass_conductivity = np.where( - self.interior_mass_mask, - interior_mass_properties.conductivity, - 0.0, - ) - self._interior_mass_heat_capacity = np.where( - self.interior_mass_mask, - interior_mass_properties.heat_capacity, - 0.0, - ) - self._interior_mass_density = np.where( - self.interior_mass_mask, - interior_mass_properties.density, - 0.0, - ) - - if self.include_radiative_heat_transfer: - interior_mass_radiative_properties = ( - interior_mass_radiative_properties - or DefaultInsideWallRadiationProperties() - ) - self._epsilon_interior_mass = np.where( - self.interior_mass_mask, - interior_mass_radiative_properties.epsilon, - 0.0, - ) - self._alpha_interior_mass = np.where( - self.interior_mass_mask, - interior_mass_radiative_properties.alpha, - 0.0, - ) - self._tau_interior_mass = np.where( - self.interior_mass_mask, - interior_mass_radiative_properties.tau, - 0.0, - ) - else: - self.interior_mass_mask = None - self.interior_mass_temp = None - self._interior_mass_conductivity = None - self._interior_mass_heat_capacity = None - self._interior_mass_density = None - self._epsilon_interior_mass = None - self._alpha_interior_mass = None - self._tau_interior_mass = None - @property def density(self) -> np.ndarray: + """Returns the density array.""" return self._density @property def heat_capacity(self) -> np.ndarray: + """Returns the heat capacity array.""" return self._heat_capacity @property def conductivity(self) -> np.ndarray: + """Returns the conductivity array.""" return self._conductivity @property def cv_type(self) -> np.ndarray: + """Returns the cv_type array.""" return self._cv_type @property - def interior_mass_conductivity(self) -> np.ndarray: - return self._interior_mass_conductivity + def room_dict(self) -> Mapping[str, List[Tuple[int, int]]]: + """The room dictionary mapping room names to CV coordinates.""" + return self._room_dict @property - def interior_mass_heat_capacity(self) -> np.ndarray: - return self._interior_mass_heat_capacity + def custom_zone_to_vavs(self) -> Optional[Mapping[str, List[str]]]: + """The custom zone to vavs mapping.""" + return self._custom_zone_to_vavs @property - def interior_mass_density(self) -> np.ndarray: - return self._interior_mass_density + def initial_temp(self) -> float: + """Returns the initial temperature for the building.""" + return self._initial_temp - def reset(self): + @property + def convection_simulator( + self, + ) -> base_convection_simulator.BaseConvectionSimulator | None: + """The convection simulator for the building.""" + return self._convection_simulator + + def reset(self) -> None: self.temp = np.full( shape=self._exterior_walls.shape, fill_value=self._initial_temp ) @@ -1218,12 +904,6 @@ def reset(self): self.input_q = np.zeros(self._exterior_walls.shape) - # Reset interior mass temperatures if enabled - if self.include_interior_mass: - self.interior_mass_temp = np.full( - self._exterior_walls.shape, self._initial_temp - ) - def _calculate_neighbors(self) -> List[List[List[Coordinates2D]]]: """Returns matrix of list of neighbor indices for each location in a matrix. @@ -1303,9 +983,10 @@ def get_zone_average_temps(self) -> Dict[str, Any]: avg_temps = {} for zone in self._room_dict.keys(): - if zone.startswith(constants.ROOM_STRING_DESIGNATOR): - _, _, avg_temp = self.get_zone_temp_stats(zone) - avg_temps[zone] = avg_temp + if constants.is_non_physical_space(zone): + continue + _, _, avg_temp = self.get_zone_temp_stats(zone) + avg_temps[zone] = avg_temp return avg_temps def apply_thermal_power_zone(self, zone_name: str, power: float): # pylint: disable=arguments-renamed @@ -1331,30 +1012,3 @@ def apply_thermal_power_zone(self, zone_name: str, power: float): # pylint: dis def apply_convection(self) -> None: if self._convection_simulator is not None: self._convection_simulator.apply_convection(self._room_dict, self.temp) - - def apply_longwave_interior_radiative_heat_transfer( - self, temperature_estimates: np.ndarray - ) -> np.ndarray: - """ - Applies long-wave interior radiative heat transfer. - - This function calculates the net radiative heat flux and radiosity for each - interior wall. - """ - if self.include_interior_mass: - interior_mask_all = self.interior_mass_mask | self.interior_wall_mask - temperature_estimates_temp = np.zeros_like(temperature_estimates) - temperature_estimates_temp[self.interior_mass_mask] = ( - self.interior_mass_temp[self.interior_mass_mask] - ) - temperature_estimates_temp[self.interior_wall_mask] = ( - temperature_estimates[self.interior_wall_mask] - ) - q_lwx = building_radiation_utils.net_radiative_heatflux_function_of_t( - temperature_estimates_temp[interior_mask_all], self.ifa_inv - ) - else: - q_lwx = building_radiation_utils.net_radiative_heatflux_function_of_t( - temperature_estimates[self.interior_wall_mask], self.ifa_inv - ) - return q_lwx diff --git a/smart_control/simulator/building_radiation_properties_test.py b/smart_control/simulator/building_radiation_properties_test.py deleted file mode 100644 index aa58dd4d..00000000 --- a/smart_control/simulator/building_radiation_properties_test.py +++ /dev/null @@ -1,96 +0,0 @@ -"""Tests for building radiation properties.""" - -from absl.testing import absltest - -from smart_control.simulator import building - - -class RadiationPropertiesTest(absltest.TestCase): - - def test_validations(self): - with self.subTest("alpha should be between 0 and 1"): - building.RadiationProperties(alpha=0, epsilon=0, tau=0) - building.RadiationProperties(alpha=0.5, epsilon=0, tau=0) - building.RadiationProperties(alpha=1, epsilon=0, tau=0) - - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=-0.5, epsilon=0.0, tau=0.0) - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=1.5, epsilon=0.0, tau=0.0) - - with self.subTest("epsilon should be between 0 and 1"): - building.RadiationProperties(alpha=0, epsilon=0, tau=0) - building.RadiationProperties(alpha=0, epsilon=0.5, tau=0) - building.RadiationProperties(alpha=0, epsilon=1, tau=0) - - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=0, epsilon=-0.5, tau=0) - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=0, epsilon=1.5, tau=0) - - with self.subTest("tau should be between 0 and 1"): - building.RadiationProperties(alpha=0, epsilon=0, tau=0) - building.RadiationProperties(alpha=0, epsilon=0, tau=0.5) - building.RadiationProperties(alpha=0, epsilon=0, tau=1) - - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=0, epsilon=0, tau=-0.5) - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=0, epsilon=0, tau=1.5) - - with self.subTest("rho should be between 0 and 1"): - building.RadiationProperties(alpha=0, epsilon=0, tau=0, rho=None) - building.RadiationProperties(alpha=0, epsilon=0, tau=1, rho=0) - building.RadiationProperties(alpha=0, epsilon=0, tau=0.5, rho=0.5) - building.RadiationProperties(alpha=0, epsilon=0, tau=0, rho=1) - - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=0, epsilon=0, tau=0, rho=-0.5) - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=0, epsilon=0, tau=0, rho=1.5) - - with self.subTest("rho gets set automatically if omitted"): - props = building.RadiationProperties(alpha=0, epsilon=0, tau=0) - self.assertEqual(props.rho, 1) - - props = building.RadiationProperties(alpha=0, epsilon=0, tau=0.5) - self.assertEqual(props.rho, 0.5) - - props = building.RadiationProperties(alpha=0.5, epsilon=0, tau=0) - self.assertEqual(props.rho, 0.5) - - with self.subTest("sum of alpha, rho, and tau should be 1"): - building.RadiationProperties(alpha=0.5, epsilon=0, tau=0.5, rho=None) - building.RadiationProperties(alpha=0.5, epsilon=0, tau=0.5, rho=0) - building.RadiationProperties(alpha=0, epsilon=0, tau=0.5, rho=0.5) - - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=0.5, epsilon=0.5, tau=0.6, rho=None) - with self.assertRaises(ValueError): - building.RadiationProperties(alpha=0.5, epsilon=0.5, tau=0.5, rho=0.1) - - def test_defaults(self): - with self.subTest("inside air defaults:"): - props = building.DefaultInsideAirRadiationProperties() - self.assertEqual(props.alpha, 0) - self.assertEqual(props.epsilon, 0) - self.assertEqual(props.tau, 1) - self.assertEqual(props.rho, 0) - - with self.subTest("inside wall defaults:"): - props = building.DefaultInsideWallRadiationProperties() - self.assertEqual(props.alpha, 0.2) - self.assertEqual(props.epsilon, 0.8) - self.assertEqual(props.tau, 0) - self.assertEqual(props.rho, 0.8) - - with self.subTest("exterior wall defaults"): - props = building.DefaultExteriorWallRadiationProperties() - self.assertEqual(props.alpha, 0.65) - self.assertEqual(props.epsilon, 0.93) - self.assertEqual(props.tau, 0) - self.assertEqual(props.rho, 0.35) - - -if __name__ == "__main__": - absltest.main() diff --git a/smart_control/simulator/building_radiation_test.py b/smart_control/simulator/building_radiation_test.py deleted file mode 100644 index e379eae0..00000000 --- a/smart_control/simulator/building_radiation_test.py +++ /dev/null @@ -1,111 +0,0 @@ -"""Building radiation tests.""" - -import os - -from absl.testing import absltest -import numpy as np -from numpy.testing import assert_array_almost_equal -import pandas as pd - -from smart_control.simulator import conftest - -TEST_DATA_DIR = os.path.join( - os.path.dirname(__file__), "building_radiation_test_data" -) - -INDEXED_FLOOR_PLAN = np.array([ - [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [-1, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -1], - [-1, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, 0, 0, 0, 0, 0, 0, -3, -3, -1], - [-1, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -1], - [-1, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -1], - [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], -]) - - -def assert_data_file_values_equal( - data: np.array, csv_filename: str, precision: int = 3 -): - data_filepath = os.path.join(TEST_DATA_DIR, csv_filename) - # temporarily uncomment to update the test data file, when applicable: - # df = pd.DataFrame(data) - # df.to_csv(data_filepath, index=False, header=False) - - df = pd.read_csv(data_filepath, header=None) - expected = df.to_numpy() - assert_array_almost_equal( - np.round(data, precision), - np.round(expected, precision), - ) - - -class BuildingRadiationScriptFTest(absltest.TestCase): - - def setUp(self): - self.building = conftest.create_building_with_radiative_properties( - view_factor_method="ScriptF" - ) - self.building_with_interior_mass = ( - conftest.create_building_with_radiative_properties( - view_factor_method="ScriptF", - include_interior_mass=True, - ) - ) - - def test_interior_radiative_heat_transfer(self): - with self.subTest("indexed_floor_plan"): - assert_array_almost_equal( - np.round(self.building.indexed_floor_plan, 3), - np.round(INDEXED_FLOOR_PLAN, 3), - ) - - with self.subTest("view factor"): - props = self.building.interior_wall_vf - assert_data_file_values_equal(props, "expected_interior_wall_vf.csv") - - with self.subTest("alpha"): - props = self.building._alpha - self.assertEqual(props.shape, (23, 12)) - assert_data_file_values_equal(props, "alpha.csv") - - with self.subTest("epsilon"): - props = self.building._epsilon - self.assertEqual(props.shape, (23, 12)) - assert_data_file_values_equal(props, "epsilon.csv") - - with self.subTest("tau"): - props = self.building._tau - self.assertEqual(props.shape, (23, 12)) - assert_data_file_values_equal(props, "tau.csv") - - with self.subTest("ifa_inv"): - results = self.building.ifa_inv - self.assertEqual(results.shape, (50, 50)) - assert_data_file_values_equal(results, "ifa_inv.csv", precision=5) - - with self.subTest("view factor with interior mass"): - props = self.building_with_interior_mass.interior_wall_vf - assert_data_file_values_equal( - props, "expected_interior_wall_vf_interior_mass.csv" - ) - - -if __name__ == "__main__": - absltest.main() diff --git a/smart_control/simulator/building_radiation_test_data/alpha.csv b/smart_control/simulator/building_radiation_test_data/alpha.csv deleted file mode 100644 index 5b4b2bdb..00000000 --- a/smart_control/simulator/building_radiation_test_data/alpha.csv +++ /dev/null @@ -1,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,0.0 -0.0,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.0 -0.0,0.65,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.65,0.0 -0.0,0.65,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.65,0.0 -0.0,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/smart_control/simulator/building_radiation_test_data/epsilon.csv b/smart_control/simulator/building_radiation_test_data/epsilon.csv deleted file mode 100644 index c9558222..00000000 --- a/smart_control/simulator/building_radiation_test_data/epsilon.csv +++ /dev/null @@ -1,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,0.0 -0.0,0.93,0.93,0.93,0.93,0.93,0.93,0.93,0.93,0.93,0.93,0.0 -0.0,0.93,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.0,0.0,0.0,0.0,0.0,0.0,0.8,0.93,0.0 -0.0,0.93,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.93,0.0 -0.0,0.93,0.93,0.93,0.93,0.93,0.93,0.93,0.93,0.93,0.93,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/smart_control/simulator/building_radiation_test_data/expected_interior_wall_vf.csv b/smart_control/simulator/building_radiation_test_data/expected_interior_wall_vf.csv deleted file mode 100644 index 381291e7..00000000 --- a/smart_control/simulator/building_radiation_test_data/expected_interior_wall_vf.csv +++ /dev/null @@ -1,50 +0,0 @@ -0.0,0.0,0.0,0.0,0.0,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378 -0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378 -0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378 -0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378 -0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378 -0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.0316612,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.05527638,0.0,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.02844378,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0510298,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/smart_control/simulator/building_radiation_test_data/expected_interior_wall_vf_interior_mass.csv b/smart_control/simulator/building_radiation_test_data/expected_interior_wall_vf_interior_mass.csv deleted file mode 100644 index 990ff707..00000000 --- a/smart_control/simulator/building_radiation_test_data/expected_interior_wall_vf_interior_mass.csv +++ /dev/null @@ -1,146 +0,0 @@ -0.0,0.0,0.0,0.0,0.0,0.0,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.0,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.009934714731762703,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.026999758124980656,0.0,0.0,0.0,0.0,0.0,0.0,0.026999758124980656,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.009934714731762703,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.026999758124980656,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 -0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406 -0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406 -0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406 -0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406 -0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406 -0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.005844494971300393,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.019937697471567466,0.005844494971300393,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.005844494971300393,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.005844494971300393,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.0,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.009934714731762703,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.01993769747156747,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02699975812498066,0.0,0.0,0.0,0.0,0.0,0.0,0.02699975812498066,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.005844494971300393,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009934714731762703,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.02699975812498066,0.0,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436,0.009740540020914436 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0,0.0,0.0,0.0,0.0,0.0 -0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.0056934811133428406,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.009740540020914436,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.02668464745151962,0.009740540020914436,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/smart_control/simulator/building_radiation_test_data/ifa_inv.csv b/smart_control/simulator/building_radiation_test_data/ifa_inv.csv deleted file mode 100644 index db1ac347..00000000 --- a/smart_control/simulator/building_radiation_test_data/ifa_inv.csv +++ /dev/null @@ -1,50 +0,0 @@ -0.7931598701127922,-0.006840129887208184,-0.006840129887208184,-0.006840129887208184,-0.006840129887208184,-0.006840129887208184,-0.03721840062325172,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325173,-0.03721840062325171,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.0372184006232517,-0.022340502964469072,-0.022340502964469072,-0.022340502964469065,-0.022340502964469076,-0.022340502964469083,-0.022340502964469072,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275629,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275627,-0.000993265859927563,-0.0009247338276185867,-0.0009247338276185868,-0.0009247338276185864,-0.0009247338276185867,-0.0009247338276185865,-0.0009247338276185865 --0.006840129887208184,0.7931598701127922,-0.006840129887208184,-0.006840129887208184,-0.006840129887208184,-0.006840129887208184,-0.03721840062325172,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325173,-0.03721840062325171,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.0372184006232517,-0.022340502964469072,-0.022340502964469072,-0.022340502964469065,-0.022340502964469076,-0.022340502964469083,-0.022340502964469072,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275629,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275627,-0.000993265859927563,-0.0009247338276185867,-0.0009247338276185868,-0.0009247338276185864,-0.0009247338276185867,-0.0009247338276185865,-0.0009247338276185865 --0.006840129887208184,-0.006840129887208184,0.7931598701127922,-0.006840129887208184,-0.006840129887208184,-0.006840129887208184,-0.03721840062325172,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325173,-0.03721840062325171,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.0372184006232517,-0.022340502964469072,-0.022340502964469072,-0.022340502964469065,-0.022340502964469076,-0.022340502964469083,-0.022340502964469072,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275629,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275627,-0.000993265859927563,-0.0009247338276185867,-0.0009247338276185868,-0.0009247338276185864,-0.0009247338276185867,-0.0009247338276185865,-0.0009247338276185865 --0.006840129887208184,-0.006840129887208184,-0.006840129887208184,0.7931598701127922,-0.006840129887208184,-0.006840129887208184,-0.03721840062325172,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325173,-0.03721840062325171,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.0372184006232517,-0.022340502964469072,-0.022340502964469072,-0.022340502964469065,-0.022340502964469076,-0.022340502964469083,-0.022340502964469072,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275629,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275627,-0.000993265859927563,-0.0009247338276185867,-0.0009247338276185868,-0.0009247338276185864,-0.0009247338276185867,-0.0009247338276185865,-0.0009247338276185865 --0.006840129887208184,-0.006840129887208184,-0.006840129887208184,-0.006840129887208184,0.7931598701127922,-0.006840129887208184,-0.03721840062325173,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.0372184006232517,-0.022340502964469076,-0.022340502964469076,-0.022340502964469065,-0.022340502964469076,-0.022340502964469083,-0.022340502964469076,-0.0009932658599275633,-0.000993265859927563,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275629,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009247338276185867,-0.0009247338276185868,-0.0009247338276185864,-0.0009247338276185867,-0.0009247338276185864,-0.0009247338276185864 --0.006840129887208184,-0.006840129887208184,-0.006840129887208184,-0.006840129887208184,-0.006840129887208184,0.7931598701127922,-0.03721840062325173,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.0372184006232517,-0.022340502964469076,-0.022340502964469076,-0.022340502964469065,-0.022340502964469076,-0.022340502964469083,-0.022340502964469076,-0.0009932658599275633,-0.000993265859927563,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275629,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275633,-0.000993265859927563,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009247338276185867,-0.0009247338276185868,-0.0009247338276185864,-0.0009247338276185867,-0.0009247338276185864,-0.0009247338276185864 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.037218400623251685,0.7933461493347661,-0.0391561590678188,-0.006653850665233386,-0.039156159067818795,-0.006653850665233387,-0.03915615906781879,-0.006653850665233386,-0.039156159067818795,-0.006653850665233386,-0.03915615906781879,-0.006653850665233385,-0.039156159067818774,-0.006653850665233384,-0.03915615906781877,-0.006653850665233386,-0.039156159067818774,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693432,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629 --0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03915615906781879,0.7933461493347663,-0.039156159067818795,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.03915615906781879,-0.006653850665233387,-0.03915615906781878,-0.006653850665233386,-0.039156159067818774,-0.006653850665233386,-0.03915615906781877,-0.006653850665233386,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.006653850665233386,-0.0391561590678188,0.7933461493347662,-0.039156159067818795,-0.006653850665233387,-0.039156159067818795,-0.006653850665233386,-0.039156159067818795,-0.006653850665233386,-0.03915615906781879,-0.006653850665233385,-0.039156159067818774,-0.006653850665233385,-0.039156159067818774,-0.006653850665233386,-0.039156159067818774,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.023996157840751233,-0.0010668768017693439,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693432,-0.0010668768017693434,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629 --0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.037218400623251685,-0.03915615906781879,-0.006653850665233388,-0.039156159067818795,0.7933461493347662,-0.039156159067818795,-0.006653850665233386,-0.039156159067818795,-0.006653850665233386,-0.03915615906781879,-0.006653850665233386,-0.03915615906781878,-0.006653850665233387,-0.039156159067818774,-0.006653850665233386,-0.03915615906781876,-0.006653850665233386,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693432,-0.0010668768017693436,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629 --0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.037218400623251685,-0.006653850665233386,-0.0391561590678188,-0.006653850665233386,-0.039156159067818795,0.7933461493347663,-0.039156159067818795,-0.006653850665233386,-0.039156159067818795,-0.006653850665233387,-0.039156159067818795,-0.006653850665233386,-0.039156159067818774,-0.006653850665233385,-0.039156159067818774,-0.006653850665233386,-0.039156159067818774,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.03915615906781879,-0.006653850665233388,-0.0391561590678188,-0.006653850665233386,-0.0391561590678188,0.7933461493347663,-0.039156159067818795,-0.006653850665233387,-0.03915615906781879,-0.006653850665233387,-0.03915615906781879,-0.006653850665233387,-0.039156159067818774,-0.006653850665233386,-0.03915615906781877,-0.006653850665233387,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693432,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629 --0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.03721840062325169,-0.006653850665233386,-0.0391561590678188,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.03915615906781879,0.7933461493347664,-0.039156159067818795,-0.006653850665233386,-0.03915615906781879,-0.006653850665233386,-0.03915615906781878,-0.006653850665233385,-0.039156159067818774,-0.006653850665233386,-0.03915615906781878,-0.023996157840751233,-0.023996157840751233,-0.023996157840751226,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.03915615906781879,-0.006653850665233388,-0.039156159067818795,-0.006653850665233386,-0.039156159067818795,-0.006653850665233387,-0.039156159067818795,0.7933461493347664,-0.03915615906781879,-0.006653850665233386,-0.03915615906781878,-0.006653850665233387,-0.039156159067818774,-0.006653850665233386,-0.03915615906781877,-0.006653850665233387,-0.02399615784075123,-0.02399615784075123,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693432,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.006653850665233386,-0.03915615906781881,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.039156159067818795,0.7933461493347663,-0.039156159067818795,-0.006653850665233386,-0.039156159067818774,-0.006653850665233385,-0.039156159067818774,-0.006653850665233386,-0.039156159067818774,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693432,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.03915615906781879,-0.006653850665233388,-0.039156159067818795,-0.006653850665233386,-0.039156159067818795,-0.006653850665233387,-0.039156159067818795,-0.006653850665233386,-0.03915615906781878,0.7933461493347664,-0.03915615906781878,-0.006653850665233387,-0.039156159067818774,-0.006653850665233386,-0.03915615906781877,-0.006653850665233387,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693432,-0.0010668768017693436,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.006653850665233386,-0.03915615906781881,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.03915615906781879,0.7933461493347663,-0.03915615906781878,-0.006653850665233385,-0.039156159067818774,-0.006653850665233386,-0.03915615906781878,-0.023996157840751233,-0.023996157840751233,-0.023996157840751226,-0.023996157840751237,-0.02399615784075124,-0.023996157840751233,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693439,-0.0010668768017693439,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693439,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.039156159067818795,-0.006653850665233388,-0.0391561590678188,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.03915615906781879,-0.006653850665233387,-0.03915615906781879,0.7933461493347662,-0.039156159067818774,-0.006653850665233386,-0.03915615906781877,-0.006653850665233387,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.006653850665233386,-0.03915615906781881,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.03915615906781879,-0.006653850665233386,-0.03915615906781878,0.7933461493347662,-0.039156159067818774,-0.006653850665233387,-0.03915615906781878,-0.023996157840751233,-0.023996157840751233,-0.023996157840751226,-0.023996157840751237,-0.02399615784075124,-0.023996157840751233,-0.001066876801769344,-0.0010668768017693436,-0.0010668768017693439,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693439,-0.0010668768017693439,-0.0010668768017693439,-0.0010668768017693439,-0.0010668768017693439,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.03915615906781879,-0.006653850665233388,-0.0391561590678188,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.03915615906781879,-0.006653850665233387,-0.03915615906781879,-0.006653850665233387,-0.03915615906781878,0.7933461493347663,-0.03915615906781877,-0.006653850665233387,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693432,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.006653850665233386,-0.0391561590678188,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.039156159067818795,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.03915615906781879,-0.006653850665233386,-0.03915615906781878,-0.006653850665233385,-0.03915615906781878,0.7933461493347662,-0.03915615906781878,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693439,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275629,-0.000993265859927563,-0.0009932658599275629,-0.0009932658599275629 --0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.03915615906781879,-0.0066538506652333886,-0.0391561590678188,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.0391561590678188,-0.006653850665233387,-0.03915615906781879,-0.006653850665233387,-0.03915615906781879,-0.006653850665233387,-0.03915615906781878,-0.006653850665233387,-0.03915615906781877,0.7933461493347664,-0.023996157840751233,-0.023996157840751233,-0.023996157840751223,-0.023996157840751233,-0.023996157840751237,-0.02399615784075123,-0.0010668768017693439,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693436,-0.0010668768017693434,-0.0010668768017693436,-0.0010668768017693432,-0.0010668768017693436,-0.000993265859927563,-0.000993265859927563,-0.0009932658599275627,-0.0009932658599275629,-0.0009932658599275629,-0.0009932658599275629 --0.022340502964469083,-0.022340502964469083,-0.022340502964469086,-0.022340502964469086,-0.02234050296446909,-0.02234050296446909,-0.023996157840751223,-0.023996157840751223,-0.023996157840751216,-0.023996157840751223,-0.02399615784075123,-0.023996157840751216,-0.023996157840751223,-0.023996157840751226,-0.02399615784075122,-0.023996157840751226,-0.023996157840751212,-0.023996157840751212,-0.023996157840751212,-0.02399615784075121,-0.02399615784075121,-0.023996157840751216,0.7936125425510279,-0.006387457448971829,-0.006387457448971829,-0.006387457448971829,-0.00638745744897183,-0.006387457448971829,-0.02399615784075124,-0.023996157840751223,-0.023996157840751247,-0.02399615784075124,-0.02399615784075123,-0.023996157840751237,-0.023996157840751237,-0.02399615784075124,-0.023996157840751233,-0.023996157840751237,-0.023996157840751237,-0.023996157840751233,-0.02399615784075123,-0.023996157840751233,-0.023996157840751226,-0.023996157840751233,-0.022340502964469076,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076 --0.022340502964469083,-0.022340502964469083,-0.022340502964469086,-0.022340502964469086,-0.02234050296446909,-0.02234050296446909,-0.023996157840751223,-0.023996157840751223,-0.023996157840751216,-0.023996157840751223,-0.02399615784075123,-0.023996157840751212,-0.023996157840751223,-0.023996157840751226,-0.02399615784075122,-0.023996157840751226,-0.023996157840751212,-0.023996157840751212,-0.023996157840751212,-0.02399615784075121,-0.02399615784075121,-0.023996157840751216,-0.006387457448971829,0.7936125425510279,-0.006387457448971829,-0.0063874574489718285,-0.00638745744897183,-0.006387457448971829,-0.023996157840751244,-0.023996157840751223,-0.023996157840751247,-0.023996157840751244,-0.02399615784075123,-0.023996157840751237,-0.023996157840751237,-0.023996157840751244,-0.023996157840751237,-0.023996157840751237,-0.023996157840751237,-0.023996157840751237,-0.02399615784075123,-0.023996157840751233,-0.02399615784075123,-0.023996157840751237,-0.022340502964469072,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076 --0.022340502964469083,-0.022340502964469083,-0.022340502964469086,-0.022340502964469086,-0.02234050296446909,-0.02234050296446909,-0.023996157840751223,-0.023996157840751223,-0.023996157840751216,-0.023996157840751223,-0.02399615784075123,-0.023996157840751212,-0.023996157840751223,-0.023996157840751226,-0.02399615784075122,-0.023996157840751226,-0.023996157840751212,-0.02399615784075121,-0.023996157840751212,-0.02399615784075121,-0.02399615784075121,-0.023996157840751216,-0.0063874574489718285,-0.0063874574489718285,0.7936125425510275,-0.006387457448971829,-0.00638745744897183,-0.006387457448971829,-0.02399615784075124,-0.023996157840751223,-0.023996157840751244,-0.02399615784075124,-0.023996157840751226,-0.023996157840751233,-0.023996157840751237,-0.02399615784075124,-0.023996157840751233,-0.023996157840751233,-0.023996157840751237,-0.023996157840751233,-0.023996157840751226,-0.023996157840751233,-0.023996157840751226,-0.023996157840751233,-0.022340502964469076,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076,-0.022340502964469076,-0.022340502964469076 --0.022340502964469083,-0.022340502964469083,-0.022340502964469086,-0.022340502964469086,-0.02234050296446909,-0.02234050296446909,-0.023996157840751226,-0.023996157840751226,-0.023996157840751216,-0.023996157840751223,-0.02399615784075123,-0.023996157840751216,-0.023996157840751223,-0.023996157840751226,-0.02399615784075122,-0.02399615784075123,-0.023996157840751212,-0.023996157840751212,-0.023996157840751212,-0.023996157840751212,-0.02399615784075121,-0.023996157840751216,-0.006387457448971829,-0.006387457448971829,-0.006387457448971829,0.7936125425510279,-0.006387457448971831,-0.00638745744897183,-0.02399615784075124,-0.023996157840751223,-0.023996157840751247,-0.023996157840751244,-0.02399615784075123,-0.023996157840751237,-0.023996157840751237,-0.023996157840751244,-0.023996157840751233,-0.023996157840751237,-0.023996157840751237,-0.023996157840751237,-0.02399615784075123,-0.023996157840751233,-0.02399615784075123,-0.023996157840751237,-0.022340502964469072,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076,-0.022340502964469076,-0.022340502964469076 --0.022340502964469083,-0.022340502964469083,-0.022340502964469086,-0.022340502964469086,-0.02234050296446909,-0.02234050296446909,-0.023996157840751223,-0.023996157840751226,-0.023996157840751216,-0.023996157840751223,-0.02399615784075123,-0.023996157840751216,-0.023996157840751223,-0.023996157840751226,-0.02399615784075122,-0.02399615784075123,-0.023996157840751212,-0.023996157840751212,-0.023996157840751212,-0.023996157840751212,-0.02399615784075121,-0.023996157840751216,-0.0063874574489718285,-0.0063874574489718285,-0.006387457448971829,-0.006387457448971829,0.793612542551028,-0.006387457448971829,-0.02399615784075124,-0.023996157840751223,-0.023996157840751244,-0.02399615784075124,-0.02399615784075123,-0.023996157840751237,-0.023996157840751237,-0.02399615784075124,-0.023996157840751237,-0.023996157840751237,-0.023996157840751237,-0.023996157840751233,-0.02399615784075123,-0.023996157840751233,-0.023996157840751226,-0.023996157840751233,-0.022340502964469076,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076 --0.022340502964469083,-0.022340502964469083,-0.022340502964469086,-0.022340502964469086,-0.02234050296446909,-0.02234050296446909,-0.023996157840751226,-0.023996157840751226,-0.023996157840751216,-0.023996157840751223,-0.02399615784075123,-0.023996157840751216,-0.023996157840751223,-0.023996157840751226,-0.02399615784075122,-0.02399615784075123,-0.023996157840751212,-0.023996157840751212,-0.023996157840751212,-0.023996157840751212,-0.02399615784075121,-0.023996157840751216,-0.006387457448971829,-0.006387457448971829,-0.006387457448971829,-0.006387457448971829,-0.006387457448971831,0.7936125425510278,-0.02399615784075124,-0.023996157840751223,-0.023996157840751247,-0.02399615784075124,-0.02399615784075123,-0.023996157840751237,-0.023996157840751237,-0.02399615784075124,-0.023996157840751233,-0.023996157840751237,-0.023996157840751237,-0.023996157840751233,-0.02399615784075123,-0.023996157840751233,-0.02399615784075123,-0.023996157840751237,-0.022340502964469072,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076,-0.022340502964469072,-0.022340502964469076 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693443,-0.02399615784075123,-0.02399615784075123,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751223,0.7933461493347664,-0.03915615906781882,-0.006653850665233385,-0.03915615906781882,-0.006653850665233384,-0.039156159067818816,-0.006653850665233385,-0.039156159067818816,-0.006653850665233384,-0.03915615906781881,-0.006653850665233385,-0.03915615906781881,-0.006653850665233384,-0.0391561590678188,-0.006653850665233383,-0.039156159067818795,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693436,-0.001066876801769344,-0.0010668768017693436,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693445,-0.02399615784075123,-0.02399615784075123,-0.02399615784075122,-0.02399615784075123,-0.02399615784075123,-0.023996157840751226,-0.03915615906781883,0.7933461493347663,-0.03915615906781883,-0.006653850665233386,-0.03915615906781881,-0.006653850665233385,-0.03915615906781881,-0.006653850665233385,-0.03915615906781881,-0.006653850665233385,-0.03915615906781881,-0.006653850665233385,-0.039156159067818795,-0.006653850665233385,-0.03915615906781879,-0.006653850665233384,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693445,-0.02399615784075123,-0.02399615784075123,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751223,-0.006653850665233385,-0.03915615906781882,0.7933461493347665,-0.03915615906781882,-0.006653850665233385,-0.039156159067818816,-0.006653850665233385,-0.039156159067818816,-0.006653850665233384,-0.03915615906781881,-0.006653850665233385,-0.03915615906781881,-0.006653850665233384,-0.0391561590678188,-0.0066538506652333825,-0.039156159067818795,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693436,-0.001066876801769344,-0.0010668768017693436,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693443,-0.02399615784075123,-0.02399615784075123,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751223,-0.03915615906781882,-0.006653850665233384,-0.03915615906781882,0.7933461493347667,-0.0391561590678188,-0.006653850665233385,-0.03915615906781881,-0.006653850665233385,-0.03915615906781881,-0.006653850665233385,-0.03915615906781881,-0.006653850665233385,-0.039156159067818795,-0.006653850665233385,-0.03915615906781879,-0.006653850665233384,-0.03721840062325171,-0.037218400623251706,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693445,-0.02399615784075123,-0.02399615784075123,-0.02399615784075122,-0.02399615784075123,-0.023996157840751233,-0.023996157840751226,-0.006653850665233386,-0.03915615906781882,-0.006653850665233386,-0.03915615906781883,0.7933461493347663,-0.03915615906781882,-0.006653850665233385,-0.03915615906781882,-0.006653850665233385,-0.039156159067818816,-0.006653850665233386,-0.03915615906781881,-0.006653850665233385,-0.0391561590678188,-0.006653850665233383,-0.039156159067818795,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693443,-0.02399615784075123,-0.023996157840751226,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751223,-0.03915615906781883,-0.006653850665233384,-0.03915615906781883,-0.006653850665233385,-0.03915615906781881,0.7933461493347665,-0.03915615906781881,-0.006653850665233385,-0.039156159067818816,-0.006653850665233385,-0.03915615906781881,-0.006653850665233385,-0.039156159067818795,-0.006653850665233384,-0.03915615906781879,-0.006653850665233384,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693443,-0.02399615784075123,-0.02399615784075123,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751226,-0.006653850665233385,-0.03915615906781882,-0.006653850665233385,-0.03915615906781883,-0.006653850665233385,-0.03915615906781882,0.7933461493347664,-0.03915615906781882,-0.006653850665233385,-0.039156159067818816,-0.006653850665233385,-0.03915615906781881,-0.006653850665233384,-0.0391561590678188,-0.006653850665233383,-0.039156159067818795,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.000993265859927563,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275633,-0.000993265859927563,-0.0009932658599275633,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.001066876801769344,-0.001066876801769344,-0.0010668768017693443,-0.023996157840751226,-0.023996157840751226,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751223,-0.03915615906781883,-0.006653850665233384,-0.03915615906781883,-0.006653850665233385,-0.0391561590678188,-0.006653850665233385,-0.039156159067818816,0.7933461493347667,-0.039156159067818816,-0.006653850665233385,-0.03915615906781881,-0.006653850665233385,-0.039156159067818795,-0.006653850665233385,-0.03915615906781879,-0.006653850665233384,-0.037218400623251706,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275633,-0.0009932658599275633,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.001066876801769344,-0.001066876801769344,-0.0010668768017693443,-0.02399615784075123,-0.023996157840751226,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751223,-0.006653850665233385,-0.03915615906781882,-0.006653850665233385,-0.03915615906781883,-0.006653850665233385,-0.039156159067818816,-0.006653850665233385,-0.039156159067818816,0.7933461493347665,-0.039156159067818816,-0.006653850665233385,-0.03915615906781881,-0.006653850665233384,-0.0391561590678188,-0.006653850665233383,-0.039156159067818795,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693445,-0.02399615784075123,-0.02399615784075123,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751226,-0.03915615906781883,-0.006653850665233384,-0.03915615906781883,-0.006653850665233385,-0.03915615906781881,-0.006653850665233385,-0.039156159067818816,-0.006653850665233386,-0.039156159067818816,0.7933461493347665,-0.03915615906781881,-0.006653850665233386,-0.039156159067818795,-0.006653850665233385,-0.03915615906781879,-0.006653850665233385,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693445,-0.02399615784075123,-0.02399615784075123,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751226,-0.006653850665233386,-0.03915615906781882,-0.006653850665233385,-0.03915615906781883,-0.006653850665233385,-0.039156159067818816,-0.006653850665233385,-0.039156159067818816,-0.006653850665233385,-0.039156159067818816,0.7933461493347665,-0.03915615906781881,-0.006653850665233384,-0.0391561590678188,-0.006653850665233383,-0.039156159067818795,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693445,-0.023996157840751226,-0.023996157840751226,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751223,-0.03915615906781883,-0.006653850665233384,-0.03915615906781883,-0.006653850665233386,-0.0391561590678188,-0.006653850665233385,-0.039156159067818816,-0.006653850665233386,-0.039156159067818816,-0.006653850665233385,-0.039156159067818816,0.7933461493347667,-0.039156159067818795,-0.006653850665233385,-0.03915615906781878,-0.006653850665233384,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693447,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693447,-0.0010668768017693439,-0.001066876801769344,-0.0010668768017693439,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693445,-0.02399615784075123,-0.02399615784075123,-0.02399615784075122,-0.02399615784075123,-0.023996157840751233,-0.023996157840751226,-0.006653850665233386,-0.03915615906781882,-0.006653850665233386,-0.03915615906781883,-0.006653850665233385,-0.03915615906781882,-0.006653850665233385,-0.03915615906781882,-0.006653850665233385,-0.039156159067818816,-0.006653850665233385,-0.039156159067818816,0.7933461493347664,-0.0391561590678188,-0.006653850665233383,-0.039156159067818795,-0.03721840062325172,-0.03721840062325171,-0.037218400623251706,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693447,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693447,-0.001066876801769344,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.02399615784075123,-0.02399615784075123,-0.023996157840751216,-0.02399615784075123,-0.02399615784075123,-0.023996157840751223,-0.03915615906781883,-0.006653850665233385,-0.03915615906781883,-0.006653850665233386,-0.03915615906781881,-0.006653850665233385,-0.039156159067818816,-0.006653850665233386,-0.039156159067818816,-0.006653850665233386,-0.039156159067818816,-0.006653850665233386,-0.039156159067818795,0.7933461493347665,-0.03915615906781879,-0.006653850665233385,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693447,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693447,-0.001066876801769344,-0.0010668768017693443,-0.001066876801769344,-0.0010668768017693443,-0.0010668768017693443,-0.0010668768017693445,-0.02399615784075123,-0.02399615784075123,-0.02399615784075122,-0.02399615784075123,-0.023996157840751233,-0.023996157840751226,-0.006653850665233386,-0.03915615906781883,-0.006653850665233386,-0.03915615906781883,-0.006653850665233386,-0.03915615906781882,-0.006653850665233386,-0.03915615906781882,-0.006653850665233385,-0.039156159067818816,-0.006653850665233386,-0.039156159067818816,-0.006653850665233385,-0.0391561590678188,0.7933461493347663,-0.0391561590678188,-0.03721840062325172,-0.03721840062325171,-0.037218400623251706,-0.037218400623251706,-0.037218400623251706,-0.0372184006232517 --0.0009932658599275633,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275635,-0.0009932658599275633,-0.0009932658599275635,-0.0010668768017693445,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693447,-0.0010668768017693445,-0.0010668768017693445,-0.0010668768017693447,-0.0010668768017693447,-0.0010668768017693447,-0.001066876801769344,-0.0010668768017693445,-0.001066876801769344,-0.0010668768017693443,-0.0010668768017693445,-0.0010668768017693445,-0.02399615784075123,-0.02399615784075123,-0.02399615784075122,-0.02399615784075123,-0.023996157840751233,-0.023996157840751226,-0.03915615906781883,-0.006653850665233386,-0.03915615906781883,-0.006653850665233386,-0.03915615906781881,-0.006653850665233386,-0.039156159067818816,-0.006653850665233386,-0.039156159067818816,-0.006653850665233387,-0.039156159067818816,-0.006653850665233386,-0.039156159067818795,-0.006653850665233385,-0.03915615906781879,0.7933461493347665,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517 --0.0009247338276185873,-0.0009247338276185874,-0.0009247338276185874,-0.0009247338276185874,-0.0009247338276185873,-0.0009247338276185874,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.0009932658599275616,-0.0009932658599275618,-0.0009932658599275616,-0.000993265859927562,-0.0009932658599275618,-0.000993265859927562,-0.022340502964469055,-0.022340502964469055,-0.022340502964469044,-0.022340502964469055,-0.02234050296446906,-0.022340502964469055,-0.037218400623251734,-0.03721840062325173,-0.03721840062325173,-0.03721840062325173,-0.03721840062325171,-0.03721840062325173,-0.03721840062325172,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.03721840062325169,-0.0372184006232517,0.793159870112792,-0.0068401298872081875,-0.006840129887208187,-0.0068401298872081875,-0.006840129887208187,-0.006840129887208187 --0.0009247338276185873,-0.0009247338276185876,-0.0009247338276185876,-0.0009247338276185876,-0.0009247338276185873,-0.0009247338276185876,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.0009932658599275616,-0.0009932658599275616,-0.0009932658599275616,-0.000993265859927562,-0.0009932658599275616,-0.000993265859927562,-0.022340502964469055,-0.022340502964469055,-0.022340502964469044,-0.022340502964469055,-0.02234050296446906,-0.022340502964469055,-0.037218400623251734,-0.03721840062325173,-0.03721840062325173,-0.03721840062325173,-0.03721840062325171,-0.03721840062325173,-0.03721840062325172,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.03721840062325169,-0.0372184006232517,-0.0068401298872081875,0.793159870112792,-0.006840129887208186,-0.0068401298872081875,-0.006840129887208186,-0.006840129887208186 --0.0009247338276185874,-0.0009247338276185876,-0.0009247338276185876,-0.0009247338276185876,-0.0009247338276185874,-0.0009247338276185876,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.0009932658599275616,-0.0009932658599275618,-0.0009932658599275616,-0.000993265859927562,-0.0009932658599275618,-0.000993265859927562,-0.022340502964469055,-0.022340502964469055,-0.022340502964469044,-0.022340502964469055,-0.02234050296446906,-0.022340502964469055,-0.03721840062325173,-0.03721840062325173,-0.03721840062325173,-0.03721840062325173,-0.03721840062325171,-0.03721840062325173,-0.03721840062325172,-0.03721840062325173,-0.03721840062325171,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.0372184006232517,-0.03721840062325169,-0.0372184006232517,-0.0068401298872081875,-0.0068401298872081875,0.7931598701127918,-0.0068401298872081875,-0.006840129887208186,-0.006840129887208186 --0.0009247338276185873,-0.0009247338276185876,-0.0009247338276185876,-0.0009247338276185876,-0.0009247338276185873,-0.0009247338276185876,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.0009932658599275616,-0.0009932658599275618,-0.0009932658599275616,-0.000993265859927562,-0.0009932658599275618,-0.000993265859927562,-0.022340502964469055,-0.022340502964469055,-0.022340502964469044,-0.022340502964469055,-0.02234050296446906,-0.02234050296446906,-0.037218400623251734,-0.03721840062325173,-0.03721840062325173,-0.03721840062325173,-0.03721840062325171,-0.03721840062325173,-0.03721840062325172,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.03721840062325169,-0.0372184006232517,-0.0068401298872081875,-0.0068401298872081875,-0.006840129887208186,0.7931598701127919,-0.006840129887208186,-0.006840129887208186 --0.0009247338276185874,-0.0009247338276185877,-0.0009247338276185877,-0.0009247338276185877,-0.0009247338276185874,-0.0009247338276185877,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.0009932658599275616,-0.0009932658599275618,-0.0009932658599275616,-0.000993265859927562,-0.0009932658599275618,-0.000993265859927562,-0.022340502964469055,-0.02234050296446905,-0.022340502964469044,-0.022340502964469055,-0.02234050296446906,-0.022340502964469055,-0.037218400623251734,-0.03721840062325173,-0.037218400623251734,-0.03721840062325173,-0.03721840062325171,-0.03721840062325173,-0.03721840062325172,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.03721840062325169,-0.0372184006232517,-0.0068401298872081875,-0.006840129887208187,-0.006840129887208186,-0.0068401298872081875,0.7931598701127918,-0.006840129887208186 --0.0009247338276185874,-0.0009247338276185877,-0.0009247338276185877,-0.0009247338276185877,-0.0009247338276185874,-0.0009247338276185877,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.000993265859927562,-0.0009932658599275622,-0.000993265859927562,-0.000993265859927562,-0.0009932658599275622,-0.0009932658599275622,-0.000993265859927562,-0.0009932658599275616,-0.0009932658599275618,-0.0009932658599275616,-0.000993265859927562,-0.0009932658599275618,-0.000993265859927562,-0.022340502964469055,-0.022340502964469055,-0.022340502964469044,-0.022340502964469055,-0.02234050296446906,-0.022340502964469055,-0.037218400623251734,-0.03721840062325173,-0.037218400623251734,-0.037218400623251734,-0.03721840062325171,-0.03721840062325173,-0.03721840062325172,-0.03721840062325173,-0.03721840062325172,-0.03721840062325172,-0.03721840062325171,-0.03721840062325171,-0.0372184006232517,-0.037218400623251706,-0.0372184006232517,-0.0372184006232517,-0.0068401298872081875,-0.0068401298872081875,-0.006840129887208186,-0.0068401298872081875,-0.006840129887208186,0.7931598701127918 diff --git a/smart_control/simulator/building_radiation_test_data/tau.csv b/smart_control/simulator/building_radiation_test_data/tau.csv deleted file mode 100644 index cc32214a..00000000 --- a/smart_control/simulator/building_radiation_test_data/tau.csv +++ /dev/null @@ -1,23 +0,0 @@ -1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0 -1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 -1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0 -1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 -1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 -1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0 diff --git a/smart_control/simulator/building_radiation_utils.py b/smart_control/simulator/building_radiation_utils.py deleted file mode 100644 index b16bd9fb..00000000 --- a/smart_control/simulator/building_radiation_utils.py +++ /dev/null @@ -1,972 +0,0 @@ -"""Building Radiation Utility Functions - -For computing the physical and thermal characteristics of buildings. -""" - -from collections import deque -import math -from typing import Optional, Tuple - -import numpy as np - -from smart_control.simulator import constants -from smart_control.simulator.solar_radiation import calculate_poa_irradiance # re-export # pylint: disable=unused-import -from smart_control.simulator.solar_radiation import IrradianceComponents # re-export # pylint: disable=unused-import - -TEMPORARY_MARKED_VALUE = -33 -TEMPORARY_BLOCKED_VALUE = -34 -AIR_IN_LINE_OF_SIGHT = 9 # Air nodes along line of sight between wall nodes - -# pylint: disable=invalid-name - - -def calculate_a_tilde_inv(epsilon: np.ndarray, F: np.ndarray) -> np.ndarray: - """Calculates the A-tilde matrix used in radiative heat transfer calculations. - - The A-tilde matrix relates the radiosity to the blackbody emissive power in a - radiative heat transfer system. It accounts for both emission and reflection. - - Args: - epsilon: Array of surface emissivity values (between 0 and 1) - F: View factor matrix - - Returns: - The A-tilde matrix relating radiosity to blackbody emissive power - - Raises: - AssertionError: If emissivity vector size doesn't match view factor matrix - or if emissivity values are outside [0,1] - """ - n = epsilon.shape[0] - epsilon[epsilon == 0] = 1e-10 - - A = np.eye(n) - I = np.eye(n) - for i in range(n): - for j in range(n): - A[i, j] = (I[i, j] - (1 - epsilon[i]) * F[i, j]) / epsilon[i] - return np.linalg.inv(A) - - -def calculate_ifa_inv(F: np.ndarray, A_inv: np.ndarray) -> np.ndarray: - r""" - Calculates the $IFA_{inv}$ matrix. - - $$IFA_{inv} = (I - F) \tilde{A}^{-1}$$ - - See [`net_radiative_heatflux_function_of_T`](./#smart_control.simulator.building_radiation_utils.net_radiative_heatflux_function_of_T) for more details. - - Args: - F (np.ndarray): The view factor matrix. - A_inv (np.ndarray): The A inverse matrix. - - Returns: - IFA_inv : The IFA inverse matrix. - """ - - n = F.shape[0] - - I = np.eye(n) - ifa_inv = (I - F) @ A_inv - return ifa_inv - - -def net_radiative_heatflux_function_of_t( - T: np.ndarray, ifa_inv: np.ndarray -) -> np.array: - r""" - Calculates the net radiative heat flux and radiosity for all surfaces given - surface temperatures. - - Equations: - -------------------- - The net radiative heat flux leaving surface $i$ is: - - $$q_i = J_i - G_i$$ - - where: - - $J_i$ is the radiosity (total outgoing radiative flux) from surface $i$, - - $G_i$ is the irradiation (total incoming radiative flux) onto surface $i$. - - The radiosity is given by: - - $$J_i = \epsilon_i E_{b,i} + \rho_i G_i$$ - - where $\epsilon_i$ is the emissivity, $\rho_i = 1 - \epsilon_i$ is the - reflectivity (for opaque surfaces), and $E_{b,i}$ is the blackbody - emission from $i$ surface. - - The irradiation for the $i$ surface is: - - $$G_i A_i = \sum_{j=1,\, j\neq i}^n J_j A_j F_{ji}$$ - - where $F_{ji}$ is the view factor from surface $j$ to $i$. - - Combining these, the radiosity equation for all surfaces can be written in - vector-matrix form as: - - $$\tilde{\mathbf{A}}\, \mathbf{J} = \mathbf{E}_b$$ - - where $\tilde{A}_{ij} = - \delta_{ij} - \frac{(1-\epsilon_i) F_{ij}}{\epsilon_i}$. - - Solving for $\mathbf{J}$: - - $$\mathbf{J} = \tilde{\mathbf{A}}^{-1} \mathbf{E}_b$$ - - The net heat flux vector for all surfaces is: - - $$\mathbf{q}= - (\mathbf{I}-\tilde{\mathbf{F}})\tilde{\mathbf{A}}^{-1}\mathbf{E}_b$$ - - where $\tilde{\mathbf{F}}$ is the matrix of view factors, - $F_{ij}$ and$\mathbf{E}_b$ is $\sigma \mathbf{T}^4$. - - Nomenclature and Units: - ----------------------- - - $q_i$ : Net radiative heat flux from surface $i$ [$\mathrm{W/m^2}$] - - $\mathbf{q}$ : Vector of $q_i$ for all $i=1..n$ [$\mathrm{W/m^2}$] - - $J_i$ : Radiosity of surface $i$ [$\mathrm{W/m^2}$] - - $\mathbf{J}$ : Vector of $J_i$ for all $i=1..n$ [$\mathrm{W/m^2}$] - - $G_i$ : Irradiation on surface $i$ [$\mathrm{W/m^2}$] - - $E_{b,i}$ : Blackbody emissive power of surface $i$ [$\mathrm{W/m^2}$]$ - - $\mathbf{E}_b$: Vector of $E_{b,i}$ for all $i=1..n$ [$\mathrm{W/m^2}$] - - $\epsilon_i$ : Emissivity of surface $i$ [dimensionless] - - $\rho_i$ : Reflectivity of surface $i$ [dimensionless], - ($\rho_i=1-\epsilon_i$) - - $A_i$ : Area of surface $i$ [$\mathrm{m^2}$] - - $F_{ij}$ : View factor from surface $i$ to $j$ [dimensionless] - - $\tilde{\mathbf{A}}$: Matrix with elements - ($\tilde{A}_{ij} = \delta_{ij} - \frac{(1-\epsilon_i) F_{ij}}{\epsilon_i}$) - - $\mathbf{I}$ : $n \times n$ identity matrix - - $\tilde{\mathbf{F}}$: Matrix of $F_{ij}$ (view factors) - - $\delta_{ij}$: Kronecker delta ($=1$ if $i=j$, $=0$ otherwise) - - $\sigma$: Stefan-Boltzmann constant [$\mathrm{W/m^2K^4}$] - - $\mathbf{T}$: Vector of surface temperatures [K] - - References: - ----------- - - Incropera, F.P., DeWitt, D.P., "Fundamentals of Heat and Mass Transfer" - - Args: - T (np.ndarray): Surface temperatures in Kelvin. - ifa_inv (np.ndarray): (I - F) @ A_inv. - - Returns: - q : Net radiative heat flux [W/m^2] - - """ - sigma = ( - constants.STEFAN_BOLTZMANN_CONSTANT - ) # [W/m^2K^4] Stefan-Boltzmann constant - - q = sigma * ifa_inv @ np.power(T, 4) - return q - - -def mark_air_connected_interior_walls( - indexed_floor_plan: np.ndarray, - start_pos: Tuple[int, int], - interior_wall_value: int = constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - marked_value: int = TEMPORARY_MARKED_VALUE, - air_value: int = constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, -) -> Tuple[Optional[np.ndarray], Optional[np.ndarray]]: - """ - Mark all interior wall nodes that are connected to the same air space as the - starting position (interior wall or air cell). - Uses 4-directional connectivity to check wall-air adjacency. - All connected walls are marked. - - Args: - indexed_floor_plan (np.ndarray): 2D numpy array representing the floor plan - where different values represent different types of cells (walls, air, - etc.). - start_pos (Tuple[int, int]): Starting position (row, col). Can be either an - interior wall or an air cell. If it's an interior wall, finds all walls - connected to the same air space. If it's an air cell, finds all walls - connected to that air space. - interior_wall_value (int, optional): Value used to represent interior walls - in the floor plan. Defaults to -3 (from "constants.py"). - marked_value (int, optional): Value used to mark connected interior walls. - Only used internally. Defaults to -33. - air_value (int, optional): Value used to represent air spaces in the floor - plan. Defaults to 0 (from "constants.py"). - - Returns: - A tuple containing: - - - `modified_floor_plan`: Copy of input floor plan with connected walls - marked with marked_value. `None` if `start_pos` is invalid. - - - `interior_space_array`: Extracted interior space containing only air and - marked walls, cropped to the bounding box of the connected region. - `None` if `start_pos` is invalid or no interior space is found. - - Raises: - ValueError: If the starting position is out of bounds of the floor plan. - - Note: - This function is used as the first step in radiative heat transfer - calculations to identify all interior wall nodes that are connected to the - same air space. The marked_value (-33) indicates walls that can - potentially participate in radiative heat transfer with each other. - """ - # Make a copy to avoid modifying the original - floor_plan = indexed_floor_plan.copy() - if ( - start_pos[0] < 0 - or start_pos[0] >= floor_plan.shape[0] - or start_pos[1] < 0 - or start_pos[1] >= floor_plan.shape[1] - ): - raise ValueError('Starting position is out of bounds') - - start_row, start_col = start_pos - start_cell_value = floor_plan[start_row, start_col] - - # Return None if start_pos is neither interior_wall_value nor air_value - if start_cell_value != interior_wall_value and start_cell_value != air_value: - return None, None - - # 4-connectivity for all steps - directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] - - # Find all air cells that are connected to the starting position - connected_air_cells = set() - air_queue = deque() - - if start_cell_value == air_value: - # If starting from an air cell, start BFS from that cell - air_queue.append((start_row, start_col)) - connected_air_cells.add((start_row, start_col)) - else: - # If starting from an interior wall, find air cells adjacent to it - for dr, dc in directions: - new_row, new_col = start_row + dr, start_col + dc - if ( - 0 <= new_row < floor_plan.shape[0] - and 0 <= new_col < floor_plan.shape[1] - and floor_plan[new_row, new_col] == air_value - ): - air_queue.append((new_row, new_col)) - connected_air_cells.add((new_row, new_col)) - - # BFS to find all connected air cells (4-connectivity) - while air_queue: - current_row, current_col = air_queue.popleft() - for dr, dc in directions: - new_row, new_col = current_row + dr, current_col + dc - if ( - 0 <= new_row < floor_plan.shape[0] - and 0 <= new_col < floor_plan.shape[1] - and floor_plan[new_row, new_col] == air_value - and (new_row, new_col) not in connected_air_cells - ): - air_queue.append((new_row, new_col)) - connected_air_cells.add((new_row, new_col)) - - # Now find all interior walls that are adjacent to - # any of the connected air cells (4-connectivity) - walls_to_mark = set() - for air_row, air_col in connected_air_cells: - for dr, dc in directions: - wall_row, wall_col = air_row + dr, air_col + dc - if ( - 0 <= wall_row < floor_plan.shape[0] - and 0 <= wall_col < floor_plan.shape[1] - and floor_plan[wall_row, wall_col] == interior_wall_value - ): - walls_to_mark.add((wall_row, wall_col)) - - # Mark all the connected interior walls - # If starting from an interior wall, exclude it from marking - # (it will be marked separately) - # If starting from an air cell, mark all walls found - for wall_row, wall_col in walls_to_mark: - if start_cell_value == interior_wall_value and (wall_row, wall_col) == ( - start_row, - start_col, - ): - # Skip marking the starting wall here; will mark it below if any walls - # were found - continue - floor_plan[wall_row, wall_col] = marked_value - - # If starting from an interior wall and any walls were found, mark the - # starting position - if start_cell_value == interior_wall_value and walls_to_mark: - floor_plan[start_row, start_col] = marked_value - - # Create interior space array containing only air and marked walls - all_interior_positions = connected_air_cells.union(walls_to_mark) - if not all_interior_positions: - return floor_plan, None - - min_row = min(pos[0] for pos in all_interior_positions) - max_row = max(pos[0] for pos in all_interior_positions) - min_col = min(pos[1] for pos in all_interior_positions) - max_col = max(pos[1] for pos in all_interior_positions) - - interior_height = max_row - min_row + 1 - interior_width = max_col - min_col + 1 - interior_space = np.full( - (interior_height, interior_width), - interior_wall_value, - dtype=floor_plan.dtype, - ) - - for air_row, air_col in connected_air_cells: - interior_space[air_row - min_row, air_col - min_col] = air_value - - # Mark all walls in interior space - # If starting from interior wall, it will be included in walls_to_mark - # and marked - for wall_row, wall_col in walls_to_mark: - interior_space[wall_row - min_row, wall_col - min_col] = marked_value - - return floor_plan, interior_space - - -def fix_view_factors(F: np.ndarray, A: np.ndarray = None) -> np.ndarray: - """ - Fix approximate view factors and enforce reciprocity and completeness. - - Args: - F (np.ndarray): Approximate direct view factor matrix (N x N) - A (np.ndarray, optional): Area vector (N elements). Defaults to None. - - Returns: - Fixed view factor matrix - - References: - See `FixViewFactors` function in [EnergyPlus](https://github.com/NREL/EnergyPlus/blob/develop/src/EnergyPlus/HeatBalanceIntRadExchange.cc) # pylint: disable=line-too-long - """ - - # Parameter definitions - PRIMARY_CONVERGENCE = 0.001 - DIFFERENCE_CONVERGENCE = 0.00001 - MAX_ITERATIONS = 400 - - # Convert inputs to numpy arrays - if A is None: - A = np.ones(F.shape[0]) - - # F = np.array(F, dtype=np.float64) - F = F.T # since EP calculation is based on F[j,i] - N = F.shape[0] - - # Initialize return values - results = { - 'original_check_value': 0.0, - 'fixed_check_value': 0.0, - 'final_check_value': 0.0, - 'num_iterations': 0, - 'row_sum': 0.0, - 'enforced_reciprocity': False, - } - - # OriginalCheckValue is the first pass at a completeness check - results['original_check_value'] = abs(np.sum(F) - N) - - # Allocate and initialize arrays - FixedAF = F.copy() # store for largest area check - - ConvrgOld = 10.0 - LargestArea = np.max(A) - severe_error_present = False - largest_surf = -1 - - # Check for Strange Geometry - # When one surface has an area that exceeds the sum of all other surface areas - if LargestArea > 0.99 * (np.sum(A) - LargestArea) and N > 3: - for i in range(N): - if LargestArea == A[i]: - largest_surf = i - break - - if largest_surf >= 0: - # Give self view to big surface - FixedAF[largest_surf, largest_surf] = min( - 0.9, 1.2 * LargestArea / np.sum(A) - ) - - # Set up AF matrix (AREA * DIRECT VIEW FACTOR) MATRIX - AF = np.zeros((N, N)) - for i in range(N): - for j in range(N): - AF[j, i] = FixedAF[j, i] * A[i] - - # Enforce reciprocity by averaging AiFij and AjFji - FixedAF = 0.5 * (AF + AF.T) - - FixedF = np.zeros((N, N)) - results['num_iterations'] = 0 - results['row_sum'] = 0.0 - - # Check for physically unreasonable enclosures (N <= 3) - if N <= 3: - for i in range(N): - for j in range(N): - if A[i] != 0: - FixedF[j, i] = FixedAF[j, i] / A[i] - - results['row_sum'] = np.sum(FixedF) - - if results['row_sum'] > (N + 0.01): - # Find the largest row summation and normalize - sum_FixedF = np.sum(FixedF, axis=1) # Sum along rows - MaxFixedFRowSum = np.max(sum_FixedF) - - if MaxFixedFRowSum < 1.0: - raise RuntimeError( - 'FixViewFactors: Three surface or less zone failing ViewFactorFix' - ' correction which should never happen.' - ) - else: - FixedF *= 1.0 / MaxFixedFRowSum - - results['row_sum'] = np.sum(FixedF) # Recalculate - - results['final_check_value'] = results['fixed_check_value'] = abs( - results['row_sum'] - N - ) - F[:] = FixedF # Update F in place - results['enforced_reciprocity'] = True - return results - - # Regular fix cases (N > 3) - RowCoefficient = np.zeros(N) - Converged = False - - while not Converged: - results['num_iterations'] += 1 - - for i in range(N): - # Determine row coefficients which will enforce closure - sum_FixedAF_i = np.sum(FixedAF[:, i]) - if abs(sum_FixedAF_i) > 1.0e-10: - RowCoefficient[i] = A[i] / sum_FixedAF_i - else: - RowCoefficient[i] = 1.0 - - FixedAF[:, i] *= RowCoefficient[i] - - # Enforce reciprocity by averaging AiFij and AjFji - FixedAF = 0.5 * (FixedAF + FixedAF.T) - - # Form FixedF matrix - for i in range(N): - for j in range(N): - if A[i] != 0: - FixedF[j, i] = FixedAF[j, i] / A[i] - if abs(FixedF[j, i]) < 1.0e-10: - FixedF[j, i] = 0.0 - FixedAF[j, i] = 0.0 - - ConvrgNew = abs(np.sum(FixedF) - N) - - # Check convergence - if ( - abs(ConvrgOld - ConvrgNew) < DIFFERENCE_CONVERGENCE - or ConvrgNew <= PRIMARY_CONVERGENCE - ): - Converged = True - - ConvrgOld = ConvrgNew - - # Emergency exit after too many iterations - if results['num_iterations'] > MAX_ITERATIONS: - # Enforce reciprocity by averaging AiFij and AjFji - FixedAF = 0.5 * (FixedAF + FixedAF.T) - - # Form FixedF matrix - for i in range(N): - for j in range(N): - if A[i] != 0: - FixedF[j, i] = FixedAF[j, i] / A[i] - - sum_FixedF = np.sum(FixedF) - results['final_check_value'] = results['fixed_check_value'] = ( - CheckConvergeTolerance - ) = abs(sum_FixedF - N) - results['row_sum'] = sum_FixedF - - # pylint:disable=line-too-long - if CheckConvergeTolerance > 0.005: - if CheckConvergeTolerance > 0.1: - pass - pass - # pylint:enable=line-too-long - - if abs(results['fixed_check_value']) < abs( - results['original_check_value'] - ): - F[:] = FixedF - results['final_check_value'] = results['fixed_check_value'] - - return results - - # Normal completion - results['fixed_check_value'] = ConvrgNew - - if results['fixed_check_value'] < results['original_check_value']: - F[:] = FixedF - results['final_check_value'] = results['fixed_check_value'] - else: - results['final_check_value'] = results['original_check_value'] - results['row_sum'] = np.sum(FixedF) - - if abs(results['row_sum'] - N) < PRIMARY_CONVERGENCE: - F[:] = FixedF - results['final_check_value'] = results['fixed_check_value'] - else: - pass - - if severe_error_present: - raise RuntimeError( - 'FixViewFactors: View factor calculations significantly out of' - ' tolerance. See above messages for more information.' - ) - - F = F.T - return F - - -def get_vf( - indexed_floor_plan: np.ndarray, - interior_wall_mask: np.ndarray, - view_factor_method: str = 'ScriptF', - marked_value: int = TEMPORARY_MARKED_VALUE, - interior_mass_mask: Optional[np.ndarray] = None, - interior_mass_value: int = AIR_IN_LINE_OF_SIGHT, -) -> np.ndarray: - """ - Calculate view factors between interior walls in the floor plan. - - Args: - indexed_floor_plan (np.ndarray): 2D array representing the floor plan with - indexed values. - view_factor_method (str, optional): Method to use for view factors. - Defaults to 'ScriptF'. Either "ScriptF" or "CarrollMRT". - marked_value (int, optional): Value used to mark connected interior walls. - Only used internally. Defaults to -33. - interior_mass_mask (Optional[np.ndarray], optional): Mask for interior - mass nodes. Defaults to None. - interior_mass_value (int, optional): Value used to represent interior - mass nodes. Defaults to 9 (`AIR_IN_LINE_OF_SIGHT`). - Returns: - View factor matrix where `VF[i,j]` represents the view factor from wall - `i` to wall `j`. - - """ - if view_factor_method == 'ScriptF': - if interior_mass_mask is not None: - interior_wall_mask_all = interior_wall_mask | interior_mass_mask - else: - interior_wall_mask_all = interior_wall_mask - - n_interior_wall = np.sum(interior_wall_mask_all) - interior_wall_tuples = [ - (r, c) - for r in range(indexed_floor_plan.shape[0]) - for c in range(indexed_floor_plan.shape[1]) - if interior_wall_mask_all[r, c] - ] - - vf = np.zeros((n_interior_wall, n_interior_wall)) - - for i in range(n_interior_wall): - result_floor_plan, _ = mark_air_connected_interior_walls( - indexed_floor_plan, interior_wall_tuples[i] - ) - result_floor_plan = mark_directly_seeing_nodes( - floor_plan=result_floor_plan, base_node=interior_wall_tuples[i] - ) - if interior_mass_mask is not None: - vf_ = 1 / np.sum( - (result_floor_plan == marked_value) - | (result_floor_plan == interior_mass_value) - ) - else: - vf_ = 1 / np.sum((result_floor_plan == marked_value)) - - result_floor_plan_ = np.zeros_like(result_floor_plan).astype('float') - - if interior_mass_mask is not None: - result_floor_plan_[ - (result_floor_plan == marked_value) - | (result_floor_plan == interior_mass_value) - ] = vf_ - else: - result_floor_plan_[(result_floor_plan == marked_value)] = vf_ - vf[i, :] = result_floor_plan_[interior_wall_mask_all] - - elif view_factor_method == 'CarrollMRT': - raise NotImplementedError('CarrollMRT view factor method not implemented') - else: - raise ValueError( - f'Invalid view factor method: {view_factor_method}. Either "ScriptF" or' - ' "CarrollMRT"' - ) - - vf = fix_view_factors(vf) - return vf - - -def mark_interior_wall_adjacent_to_air( - arr: np.ndarray, - interior_wall_value: int = constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - air_value: int = constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, -) -> np.ndarray: - """Marks interior walls that are adjacent to air spaces. - - Creates a boolean mask identifying interior walls that share an edge with an - air space (value of 0) in the floor plan. Checks for adjacency in four - directions: up, down, left, and right. - - Args: - arr: 2D array representing the floor plan with interior walls marked as - interior_wall_value and air spaces as 0. - interior_wall_value: Value used to represent interior walls in the floor - plan. Defaults to -3 (constants.INTERIOR_WALL_VALUE_IN_FUNCTION). - - Returns: - Boolean mask array where True indicates an interior wall that is adjacent to - at least one air space. - """ - mask_minus_interior_wall = arr == interior_wall_value - mask_zero = arr == air_value - # Find -3s that have a 0 neighbor (up/down/left/right) - contact = np.zeros_like(arr, dtype=bool) - # up - contact[1:, :] |= mask_zero[:-1, :] & mask_minus_interior_wall[1:, :] - # down - contact[:-1, :] |= mask_zero[1:, :] & mask_minus_interior_wall[:-1, :] - # left - contact[:, 1:] |= mask_zero[:, :-1] & mask_minus_interior_wall[:, 1:] - # right - contact[:, :-1] |= mask_zero[:, 1:] & mask_minus_interior_wall[:, :-1] - # Only mark the -3 cells that are adjacent to a 0 - marked = mask_minus_interior_wall & contact - return marked - - -def get_line_points( - start: Tuple[float, float], end: Tuple[float, float] -) -> list[Tuple[float, float]]: - """Generate points where the line crosses integer grid lines. - - This function calculates all intersection points between a line segment and - the integer grid lines. It handles vertical, horizontal, and diagonal lines - by finding intersections with both vertical (x = integer) and horizontal - (y = integer) grid lines. - - Args: - start: Starting point of the line segment as (x, y) coordinates. - end: Ending point of the line segment as (x, y) coordinates. - - Returns: - List of intersection points sorted by distance from the start point. - Each point is a tuple of (x, y) coordinates as floats. - - - """ - x1, y1 = start - x2, y2 = end - - points = [] - - # Handle vertical line case - if abs(x2 - x1) < 1e-10: # Vertical line - min_y, max_y = min(y1, y2), max(y2, y1) - for y in range(int(math.ceil(min_y)), int(math.floor(max_y)) + 1): - if min_y <= y <= max_y: - points.append((x1, float(y))) - # Handle horizontal line case - elif abs(y2 - y1) < 1e-10: # Horizontal line - min_x, max_x = min(x1, x2), max(x1, x2) - for x in range(int(math.ceil(min_x)), int(math.floor(max_x)) + 1): - if min_x <= x <= max_x: - points.append((float(x), y1)) - else: - # General case: line has slope - # Find intersections with vertical grid lines (x = integer) - min_x, max_x = min(x1, x2), max(x1, x2) - for x in range(int(math.ceil(min_x)), int(math.floor(max_x)) + 1): - if min_x <= x <= max_x: - # Calculate y for this x using line equation - t = (x - x1) / (x2 - x1) - y = y1 + t * (y2 - y1) - points.append((float(x), y)) - - # Find intersections with horizontal grid lines (y = integer) - min_y, max_y = min(y1, y2), max(y1, y2) - for y in range(int(math.ceil(min_y)), int(math.floor(max_y)) + 1): - if min_y <= y <= max_y: - # Calculate x for this y using line equation - t = (y - y1) / (y2 - y1) - x = x1 + t * (x2 - x1) - points.append((x, float(y))) - - # Remove duplicates and sort by distance from start - unique_points = [] - for point in points: - # Check if this point is already in the list (within tolerance) - is_duplicate = False - for existing_point in unique_points: - if ( - abs(point[0] - existing_point[0]) < 1e-10 - and abs(point[1] - existing_point[1]) < 1e-10 - ): - is_duplicate = True - break - if not is_duplicate: - unique_points.append(point) - - # Sort by distance from start point - def distance_from_start(point): - return (point[0] - x1) ** 2 + (point[1] - y1) ** 2 - - unique_points.sort(key=distance_from_start) - - return unique_points - - -def is_line_blocked( - floor_plan: np.ndarray, - start: Tuple[float, float], - end: Tuple[float, float], - interior_wall_value: int = constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - marked_value: int = TEMPORARY_MARKED_VALUE, - blocked_value: int = TEMPORARY_BLOCKED_VALUE, -) -> bool: - """Check if the line between start and end is blocked by walls. - - This function determines if a line of sight between two points is blocked - by walls in the floor plan. It checks all grid intersections along the line - and determines if the line is blocked by examining the 4 surrounding grid - cells at each intersection point. - - Args: - floor_plan: 2D numpy array representing the floor plan where different - values represent different types of cells (walls, air, etc.). - start: Starting point of the line as (x, y) coordinates. - end: Ending point of the line as (x, y) coordinates. - interior_wall_value: Value used to represent interior walls in the floor - plan. Defaults to -3 (from "constants.py"). - marked_value: Value used to represent marked wall nodes. Only used - internally. Defaults: -33. Only used internally. - blocked_value: Value used to represent blocked wall nodes. Only used - internally. Default: -34. Only used internally. - - - Returns: - True if the line is blocked by walls, False if the line of sight is clear. - - Note: - The function considers a line blocked if all 4 grid cells surrounding - an intersection point are walls (values -3, -33, or -34). - """ - line_points = get_line_points(start, end) - - # Skip start and end points for blocking check - for _, point in enumerate(line_points[1:-1], 1): - x, y = point - - # Get 4 integer coordinates by rounding up/down - coords = [ - (math.floor(x), math.floor(y)), - (math.floor(x), math.ceil(y)), - (math.ceil(x), math.floor(y)), - (math.ceil(x), math.ceil(y)), - ] - - # Check if all 4 coordinates are within bounds and get their values - coord_values = [] - all_walls = True - - for cx, cy in coords: - if 0 <= cx < floor_plan.shape[0] and 0 <= cy < floor_plan.shape[1]: - value = floor_plan[cx, cy] - coord_values.append(value) - if ( - value != interior_wall_value - and value != marked_value - and value != blocked_value - ): - all_walls = False - else: - coord_values.append('OUT_OF_BOUNDS') - all_walls = False - - # If all 4 coordinates are walls, the line is blocked - if all_walls: - return True - - return False - - -def are_neighbors(pos1: Tuple[int, int], pos2: Tuple[int, int]) -> bool: - """Check if two positions are physically neighboring (adjacent). - - This function determines if two grid positions are adjacent to each other - using 4-connectivity. Two positions are considered neighbors if they are - within 1 unit distance in both x and y directions, but not the same position. - - Args: - pos1: First position as (row, col) coordinates. - pos2: Second position as (row, col) coordinates. - - Returns: - True if the positions are neighbors, False otherwise. - - - """ - dx = abs(pos1[0] - pos2[0]) - dy = abs(pos1[1] - pos2[1]) - return (dx == 1 and dy == 0) or (dx == 0 and dy == 1) - - -def mark_directly_seeing_nodes( - floor_plan: np.ndarray, - base_node: Tuple[int, int], - interior_wall_value: int = constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - marked_value: int = TEMPORARY_MARKED_VALUE, - blocked_value: int = TEMPORARY_BLOCKED_VALUE, - air_value: int = constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, -) -> np.ndarray: - """Mark nodes that are directly seeing the base node as blocked_value. - - This function identifies and marks wall nodes that have a direct line of sight - to the base node. It processes all connected wall nodes (marked with - marked_value) and determines which ones can directly see the base node without - being blocked by other walls. Additionally, it marks air nodes along unblocked - lines of sight between wall nodes for interior mass radiative heat transfer. - - When the base node is an air cell, it finds directly seeing nodes among the - interior walls, but does NOT mark air nodes as `AIR_IN_LINE_OF_SIGHT`. - - Args: - floor_plan: 2D numpy array representing the floor plan where different - values represent different types of cells (walls, air, etc.). - base_node: Position of the base node as (row, col) coordinates. Can be - either an interior wall node or an air cell. - interior_wall_value: Value used to represent interior walls in the floor - plan. Defaults to -3 (from "constants.py"). - marked_value: Value used to represent connected wall nodes that should - be checked for line of sight. Only used internally. Defaults to -33. - blocked_value: Value used to mark nodes that cannot directly see the - base node. Only used internally. Defaults to -34. - air_value: Value used to represent air spaces in the floor plan. - Defaults to 0 (from "constants.py"). - - Returns: - Copy of the floor plan with nodes marked according to their visibility - to the base node. Nodes that cannot see the base node are marked - with blocked_value, and the base node itself is marked with - blocked_value + marked_value. When starting from a wall node, air - nodes along unblocked lines of sight are marked with - `AIR_IN_LINE_OF_SIGHT` (9). - When starting from an air node, air nodes are NOT marked. - Air nodes along blocked lines remain as air_value (0). - - Note: - - When starting from a wall node: Neighboring wall nodes are automatically - marked as blocked (no line of sight calculation needed, and no air nodes - between directly adjacent walls). - - When starting from an air node: Neighboring wall nodes are NOT marked as - blocked; they remain as marked_value and can participate in radiative - transfer. - - For non-neighboring nodes, the function first checks if the line of - sight is blocked by walls using is_line_blocked(). - - When starting from a wall node: Air nodes are ONLY marked as 9 along - lines that are NOT blocked. If a line is blocked, air nodes along that - line remain as 0 (air_value). - - When starting from an air node: Air nodes are NOT marked, even along - unblocked lines. - - The base node itself is marked with a special value to distinguish it. - - Value meanings for radiative heat transfer: - * marked_value (-33): Interior wall nodes connected to the same air - space (can participate in radiative transfer) - * blocked_value (-34): Interior wall nodes that cannot see the base node - (blocked from radiative transfer) - * blocked_value + marked_value (-67): The starting node itself - * `AIR_IN_LINE_OF_SIGHT` (9): Air nodes along unblocked line of sight - between wall nodes (for interior mass radiative transfer) - """ - floor_plan_copy = floor_plan.copy() - base_row, base_col = base_node - base_cell_value = floor_plan_copy[base_row, base_col] - is_base_air = base_cell_value == air_value - - # Find all marked_value nodes (connected wall nodes) - connected_nodes = np.where(floor_plan_copy == marked_value) - connected_positions = list(zip(connected_nodes[0], connected_nodes[1])) - - directly_seeing_count = 0 - - for pos in connected_positions: - row, col = pos - - # Skip if it's the base node itself - if (row, col) == (base_row, base_col): - continue - # Check if not physically neighboring - is_neighbor = are_neighbors((base_row, base_col), (row, col)) - - if is_neighbor: - # Neighbors are directly adjacent - # Only mark as blocked if starting from an interior wall node - # (not when starting from an air node) - if not is_base_air: - # When starting from wall, mark neighboring walls as blocked - # (no air nodes between directly adjacent wall nodes) - floor_plan_copy[row, col] = blocked_value - # When starting from air node, leave neighboring walls as marked_value - # (they can participate in radiative transfer) - else: - # Check if line of sight is blocked first - blocked = is_line_blocked( - floor_plan_copy, - (base_row, base_col), - (row, col), - interior_wall_value, - marked_value, - blocked_value, - ) - - if blocked: - # Line is blocked, so mark the wall node as blocked - # and DON'T mark air nodes along this line - floor_plan_copy[row, col] = blocked_value - directly_seeing_count += 1 - else: - # Line is NOT blocked - # Only mark air nodes along the line if starting from a wall node - # (not when starting from an air node) - if not is_base_air: - line_points = get_line_points( - (float(base_row), float(base_col)), (float(row), float(col)) - ) - - # Mark air nodes along the line (excluding start and end points) - for point in line_points[1:-1]: - px, py = point - # Check all 4 integer coordinates around the floating point - for cx, cy in [ - (math.floor(px), math.floor(py)), - (math.floor(px), math.ceil(py)), - (math.ceil(px), math.floor(py)), - (math.ceil(px), math.ceil(py)), - ]: - if ( - 0 <= cx < floor_plan_copy.shape[0] - and 0 <= cy < floor_plan_copy.shape[1] - and floor_plan_copy[cx, cy] == air_value - ): - floor_plan_copy[cx, cy] = AIR_IN_LINE_OF_SIGHT - # Wall node is visible (not blocked), so leave it as marked_value (-33) - - # Mark the base node with a special value - floor_plan_copy[base_row, base_col] = blocked_value + marked_value - return floor_plan_copy diff --git a/smart_control/simulator/building_radiation_utils_test.py b/smart_control/simulator/building_radiation_utils_test.py deleted file mode 100644 index c32dc3f8..00000000 --- a/smart_control/simulator/building_radiation_utils_test.py +++ /dev/null @@ -1,542 +0,0 @@ -"""Tests for radiation utility functions.""" - -from absl.testing import absltest -import numpy as np -from numpy.testing import assert_array_almost_equal - -from smart_control.simulator import building_radiation_utils as utils -from smart_control.simulator import constants - -# Import the constant for air in line of sight -AIR_IN_LINE_OF_SIGHT = utils.AIR_IN_LINE_OF_SIGHT -TEMPORARY_MARKED_VALUE = utils.TEMPORARY_MARKED_VALUE -TEMPORARY_BLOCKED_VALUE = utils.TEMPORARY_BLOCKED_VALUE - -# we are choosing to keep the mathematical notation names -# pylint: disable=invalid-name - - -class BuildingRadiationUtilsTest(absltest.TestCase): - - def test_calculate_A_tilde_inv_and_ifa_inv(self): - """Test calculation of A-tilde inverse and IFA inverse matrices. - - Tests the core matrix calculations used in radiative heat transfer: - - a_tilde_inv: Matrix relating radiosity to blackbody emissive power - - ifa_inv: Matrix used to calculate net radiative heat flux - - Uses a 3-surface system with different emissivities (0.8, 0.4, 0.8) - and symmetric view factors. - """ - epsilon = np.array([0.8, 0.4, 0.8]) - F = np.array([[0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]]) - expected_a_tilde_inv = np.array([ - [0.83982684, 0.04761905, 0.11255411], - [0.28571429, 0.42857143, 0.28571429], - [0.11255411, 0.04761905, 0.83982684], - ]) - - expected_ifa_inv = np.array([ - [0.64069264, -0.19047619, -0.45021645], - [-0.19047619, 0.38095238, -0.19047619], - [-0.45021645, -0.19047619, 0.64069264], - ]) - - a_tilde_inv = utils.calculate_a_tilde_inv(epsilon, F) - ifa_inv = utils.calculate_ifa_inv(F, a_tilde_inv) - with self.subTest("a_tilde_inv shape"): - self.assertEqual(a_tilde_inv.shape, F.shape) - with self.subTest("ifa_inv shape"): - self.assertEqual(ifa_inv.shape, F.shape) - - with self.subTest("a_tilde_inv"): - assert_array_almost_equal(a_tilde_inv, expected_a_tilde_inv, decimal=3) - with self.subTest("ifa_inv"): - assert_array_almost_equal(ifa_inv, expected_ifa_inv, decimal=3) - - def test_net_radiative_heatflux_function_of_t(self): - """Test calculation of net radiative heat flux from surface temperatures. - - Tests the main radiative heat transfer equation that calculates net heat - flux for each surface given their temperatures and the IFA inverse matrix. - - Uses a 3-surface system with temperatures [1200, 500, 1102] K and - the IFA inverse matrix from the previous test. - """ - # fmt: off - #pylint:disable=line-too-long - temperatures=np.array([1200,500,1102])# [K] - ifa_inv = np.array([ - [0.64069264, -0.19047619, -0.45021645], - [-0.19047619, 0.38095238, -0.19047619], - [-0.45021645, -0.19047619, 0.64069264], - ]) - # fmt: on - # pylint:enable=line-too-long - expected_q = np.array([3.70061961e04, -3.69724724e04, -3.37237040e01]) - - q = utils.net_radiative_heatflux_function_of_t(temperatures, ifa_inv) - - with self.subTest("q results as expected"): - assert_array_almost_equal( - np.round(q, 4), np.round(expected_q, 4), decimal=4 - ) - - def test_mark_air_connected_interior_walls(self): - """Test identification of interior walls connected through air spaces. - - This test verifies that interior wall nodes connected to the same air space - are correctly identified and marked. This is the first step in radiative - heat transfer calculations to determine which walls can potentially - exchange heat through radiation. - - Test case: - - Starting node at (2,3) - tests connectivity from a top-left corner - position. - - Value meanings: - - -33: Interior wall nodes that are connected to the same air space through - 4-directional connectivity (can potentially participate in radiative - transfer) - - 0: Air spaces that connect the interior walls - - -3: Interior wall nodes that are not connected to the starting air space - - -2: Exterior wall nodes (not part of the interior space) - - -1: Exterior space (outside the building) - - The function uses 4-directional connectivity to find all air cells connected - to the starting wall, then marks all interior walls adjacent to those air - cells. - """ - # fmt: off - #pylint:disable=line-too-long - - indexed_floor_plan =\ - np.array([[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [-1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [-1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [-1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, -3, -3, -3, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, -3, 0, -3, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, -3, 0, -3, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, -3, 0, -3, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, -3, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [-1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, -3, -3, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [-1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [-1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]) - - - expected_result = \ - np.array([[ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -2, -3, -33, -33, -33, -33, -33, -33, -3, -2, -1], - [ -1, -2, -33, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, -33, -33, -33, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, -33, 0, -33, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, -33, 0, -33, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, -33, 0, -33, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, -33, 0, 0, 0, -33, -2, -1], - [ -1, -2, -3, -33, -33, -3, -33, -33, -33, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]) - # fmt: on - # pylint:enable=line-too-long - # Test case: Starting node at (2,3) - top-left corner - # Tests 4-directional connectivity to find all interior walls connected - # to the same air space - result, _ = utils.mark_air_connected_interior_walls( - indexed_floor_plan=indexed_floor_plan, - start_pos=(2, 3), - interior_wall_value=constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - marked_value=-33, - air_value=constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, - ) - # setup (temperatures and ifa_inv have same number of rows): - self.assertEqual(result.shape, indexed_floor_plan.shape) - - # result has same shape as the temperatures array: - with self.subTest("air-connected interior walls correctly marked"): - assert_array_almost_equal(result, expected_result) - - def test_mark_directly_seeing_nodes(self): - """Test line-of-sight calculations for radiative heat transfer. - - This test verifies that wall nodes are correctly classified based on their - visibility to a starting node for radiative heat transfer calculations. - - Test cases: - - case_23: Starting node at (2,3) - tests visibility from top-left corner - - case_27: Starting node at (2,7) - tests visibility from top-right corner - - case_116: Starting node at (11,6) - tests visibility from bottom-center - - case_33: Starting node at (3,3) - tests visibility from air node - - case_128: Starting node at (12,8) - tests visibility from air node - Value meanings: - - -33: Interior wall nodes connected to the same air space - (can participate in radiative transfer) - - -34: Interior wall nodes that cannot see the starting node - (blocked from radiative transfer) - - -67: The starting node itself (marked_value + blocked_value) - - 9: Air nodes along line of sight between wall nodes - """ - # fmt: off - #pylint:disable=line-too-long - - indexed_floor_plan =\ - np.array( - [[ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, -3, -3, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, 0, -3, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, 0, -3, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, 0, -3, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]] - ) - - # Expected results for cases - expected_result_23 = \ - np.array([[ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -2, -3, -67, -34, -34, -34, -34, -34, -3, -2, -1], - [ -1, -2, -33, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, -33, -33, -33, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, -33, 0, -34, 0, -33, -2, -1], - [ -1, -2, -33, 9, 9, -33, 0, -34, 0, -34, -2, -1], - [ -1, -2, -33, 9, 9, -33, 0, -34, 0, -34, -2, -1], - [ -1, -2, -33, 9, 9, -33, 0, 0, 0, -34, -2, -1], - [ -1, -2, -3, -33, -33, -3, -34, -34, -34, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]) - - expected_result_27 = \ - np.array([[ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -2, -3, -34, -34, -34, -34, -67, -34, -3, -2, -1], - [ -1, -2, -33, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, -33, -33, -33, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, -34, 0, -34, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, -34, 0, -34, 9, -33, -2, -1], - [ -1, -2, -33, 9, 0, -34, 0, -34, 9, -33, -2, -1], - [ -1, -2, -33, 0, 0, -34, 0, 9, 9, -33, -2, -1], - [ -1, -2, -3, -34, -34, -3, -34, -34, -33, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]) - - expected_result_116 = \ - np.array([[ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -2, -3, -34, -34, -34, -34, -34, -34, -3, -2, -1], - [ -1, -2, -34, 0, 0, 0, 0, 0, 0, -34, -2, -1], - [ -1, -2, -34, 0, 0, 0, 0, 0, 0, -34, -2, -1], - [ -1, -2, -34, 0, 0, 0, 0, 0, 0, -34, -2, -1], - [ -1, -2, -34, 0, 0, -33, -33, -33, 0, -33, -2, -1], - [ -1, -2, -34, 0, 0, -33, 9, -33, 9, -33, -2, -1], - [ -1, -2, -34, 0, 0, -33, 9, -33, 9, -33, -2, -1], - [ -1, -2, -34, 0, 0, -33, 9, -33, 9, -33, -2, -1], - [ -1, -2, -34, 0, 0, -33, 9, 9, 9, -33, -2, -1], - [ -1, -2, -3, -34, -34, -34, -67, -34, -34, -3, -2, -1], - [ -1, -2, -3, 0, -33, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -3, 0, -33, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -3, -34, -33, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -34, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -34, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -34, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -33, 9, 9, 9, 9, 9, 9, -33, -2, -1], - [ -1, -2, -3, -33, -33, -33, -33, -33, -33, -3, -2, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]) - - # Additional test cases for (3,3) and (12,8) - expected_result_33 = \ - np.array([[ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -2, -3, -33, -33, -33, -33, -33, -33, -3, -2, -1], - [ -1, -2, -33, -67, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, -33, -33, -33, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, -33, 0, -34, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, -33, 0, -34, 0, -34, -2, -1], - [ -1, -2, -33, 0, 0, -33, 0, -34, 0, -34, -2, -1], - [ -1, -2, -33, 0, 0, -33, 0, 0, 0, -34, -2, -1], - [ -1, -2, -3, -33, -33, -3, -34, -34, -34, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]) - - expected_result_128 = \ - np.array([[ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, 0, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, -3, -3, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, 0, -3, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, 0, -3, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, 0, -3, 0, -3, -2, -1], - [ -1, -2, -3, 0, 0, -3, 0, 0, 0, -3, -2, -1], - [ -1, -2, -3, -3, -3, -33, -33, -33, -33, -3, -2, -1], - [ -1, -2, -3, 0, -33, 0, 0, 0, -67, -33, -2, -1], - [ -1, -2, -3, 0, -33, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -3, -34, -33, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -34, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -33, 0, 0, 0, 0, 0, 0, -33, -2, -1], - [ -1, -2, -3, -33, -33, -33, -33, -33, -33, -3, -2, -1], - [ -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1], - [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]) - - # fmt: on - # pylint:enable=line-too-long - # Test case 1: Starting node at (2,3) - top-left corner - # Tests visibility from a corner position with clear line of sight to - # some walls - result23_, _ = utils.mark_air_connected_interior_walls( - indexed_floor_plan=indexed_floor_plan, - start_pos=(2, 3), - interior_wall_value=constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - marked_value=utils.TEMPORARY_MARKED_VALUE, - air_value=constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, - ) - - result23 = utils.mark_directly_seeing_nodes( - floor_plan=result23_, base_node=(2, 3) - ) - - # result has same shape as the temperatures array: - with self.subTest("case_23 - top-left corner visibility"): - # Check that wall visibility markings match (excluding air nodes) - # Air nodes may be marked as TEMPORARY_MARKED_VALUE - wall_mask = ( - (result23 == TEMPORARY_MARKED_VALUE) - | (result23 == TEMPORARY_BLOCKED_VALUE) - | (result23 == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE) - ) - expected_wall_mask = ( - (expected_result_23 == TEMPORARY_MARKED_VALUE) - | (expected_result_23 == TEMPORARY_BLOCKED_VALUE) - | ( - expected_result_23 - == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE - ) - ) - assert_array_almost_equal( - result23[wall_mask], expected_result_23[expected_wall_mask] - ) - # Verify that some air nodes along lines are marked - air_in_line = np.sum(result23 == AIR_IN_LINE_OF_SIGHT) - self.assertGreater(air_in_line, 0, "Some air nodes should be marked") - - # Test case 2: Starting node at (2,7) - top-right corner - # Tests visibility from another corner position with different line of - # sight patterns - result27_, _ = utils.mark_air_connected_interior_walls( - indexed_floor_plan=indexed_floor_plan, - start_pos=(2, 7), - interior_wall_value=constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - marked_value=-33, - air_value=constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, - ) - - result27 = utils.mark_directly_seeing_nodes( - floor_plan=result27_, base_node=(2, 7) - ) - - # result has same shape as the temperatures array: - with self.subTest("case_27 - top-right corner visibility"): - # Check that wall visibility markings match (excluding air nodes) - wall_mask = ( - (result27 == TEMPORARY_MARKED_VALUE) - | (result27 == TEMPORARY_BLOCKED_VALUE) - | (result27 == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE) - ) - expected_wall_mask = ( - (expected_result_27 == TEMPORARY_MARKED_VALUE) - | (expected_result_27 == TEMPORARY_BLOCKED_VALUE) - | ( - expected_result_27 - == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE - ) - ) - assert_array_almost_equal( - result27[wall_mask], expected_result_27[expected_wall_mask] - ) - # Verify that some air nodes along lines are marked - air_in_line = np.sum(result27 == AIR_IN_LINE_OF_SIGHT) - self.assertGreater(air_in_line, 0, "Some air nodes should be marked") - - # Test case 3: Starting node at (11,6) - bottom-center - # Tests visibility from a center position with complex line of sight - # through interior walls - result116_, _ = utils.mark_air_connected_interior_walls( - indexed_floor_plan=indexed_floor_plan, - start_pos=(11, 6), - interior_wall_value=constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - marked_value=-33, - air_value=constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, - ) - - result116 = utils.mark_directly_seeing_nodes( - floor_plan=result116_, base_node=(11, 6) - ) - - # result has same shape as the temperatures array: - with self.subTest("case_116 - bottom-center visibility"): - # Check that wall visibility markings match (excluding air nodes) - wall_mask = ( - (result116 == TEMPORARY_MARKED_VALUE) - | (result116 == TEMPORARY_BLOCKED_VALUE) - | (result116 == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE) - ) - expected_wall_mask = ( - (expected_result_116 == TEMPORARY_MARKED_VALUE) - | (expected_result_116 == TEMPORARY_BLOCKED_VALUE) - | ( - expected_result_116 - == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE - ) - ) - assert_array_almost_equal( - result116[wall_mask], expected_result_116[expected_wall_mask] - ) - # Verify that some air nodes along lines are marked - air_in_line = np.sum(result116 == AIR_IN_LINE_OF_SIGHT) - self.assertGreater(air_in_line, 0, "Some air nodes should be marked") - - # Test case 4: Starting node at (3,3) - mid air node - # Tests visibility from an air node to surrounding walls - result33_, _ = utils.mark_air_connected_interior_walls( - indexed_floor_plan=indexed_floor_plan, - start_pos=(3, 3), - interior_wall_value=constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - marked_value=utils.TEMPORARY_MARKED_VALUE, - air_value=constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, - ) - result33 = utils.mark_directly_seeing_nodes( - floor_plan=result33_, base_node=(3, 3) - ) - with self.subTest("case_33 - air node visibility"): - wall_mask = ( - (result33 == TEMPORARY_MARKED_VALUE) - | (result33 == TEMPORARY_BLOCKED_VALUE) - | (result33 == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE) - ) - expected_wall_mask = ( - (expected_result_33 == TEMPORARY_MARKED_VALUE) - | (expected_result_33 == TEMPORARY_BLOCKED_VALUE) - | ( - expected_result_33 - == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE - ) - ) - assert_array_almost_equal( - result33[wall_mask], expected_result_33[expected_wall_mask] - ) - air_in_line = np.sum(result33 == AIR_IN_LINE_OF_SIGHT) - self.assertEqual(air_in_line, 0, "No air in line of sight.") - - # Test case 5: Starting node at (12,8) - air node - # Tests visibility from another air node deeper inside - result128_, _ = utils.mark_air_connected_interior_walls( - indexed_floor_plan=indexed_floor_plan, - start_pos=(12, 8), - interior_wall_value=constants.INTERIOR_WALL_VALUE_IN_FUNCTION, - marked_value=utils.TEMPORARY_MARKED_VALUE, - air_value=constants.INTERIOR_SPACE_VALUE_IN_FUNCTION, - ) - result128 = utils.mark_directly_seeing_nodes( - floor_plan=result128_, base_node=(12, 8) - ) - with self.subTest("case_128 - air node (deeper) visibility"): - wall_mask = ( - (result128 == TEMPORARY_MARKED_VALUE) - | (result128 == TEMPORARY_BLOCKED_VALUE) - | (result128 == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE) - ) - expected_wall_mask = ( - (expected_result_128 == TEMPORARY_MARKED_VALUE) - | (expected_result_128 == TEMPORARY_BLOCKED_VALUE) - | ( - expected_result_128 - == TEMPORARY_MARKED_VALUE + TEMPORARY_BLOCKED_VALUE - ) - ) - assert_array_almost_equal( - result128[wall_mask], expected_result_128[expected_wall_mask] - ) - air_in_line = np.sum(result128 == AIR_IN_LINE_OF_SIGHT) - self.assertEqual(air_in_line, 0, "No air in line of sight.") - - -if __name__ == "__main__": - absltest.main() diff --git a/smart_control/simulator/building_test.py b/smart_control/simulator/building_test.py index 7762751f..f7c16653 100644 --- a/smart_control/simulator/building_test.py +++ b/smart_control/simulator/building_test.py @@ -1,15 +1,13 @@ -"""Tests for building.""" - import random from absl.testing import absltest from absl.testing import parameterized import numpy as np -from smart_control.simulator import building -from smart_control.simulator import building_utils -from smart_control.simulator import constants -from smart_control.simulator import stochastic_convection_simulator +from smart_buildings.smart_control.simulator import building +from smart_buildings.smart_control.simulator import building_utils +from smart_buildings.smart_control.simulator import constants +from smart_buildings.smart_control.simulator import stochastic_convection_simulator def _create_dummy_floor_plan(): @@ -86,9 +84,11 @@ def _create_dummy_post_refactor_building_matching_deprecation(): inside_air_properties = building.MaterialProperties( conductivity=50.0, heat_capacity=700.0, density=1.0 ) - inside_wall_properties = building.DefaultInsideWallMaterialProperties() - building_exterior_properties = ( - building.DefaultExteriorWallMaterialProperties() + inside_wall_properties = building.MaterialProperties( + conductivity=2.0, heat_capacity=1000.0, density=1800.0 + ) + building_exterior_properties = building.MaterialProperties( + conductivity=0.05, heat_capacity=1000.0, density=3000.0 ) floor_plan = _create_dummy_floor_plan_matching_deprecation() @@ -175,9 +175,11 @@ def _create_dummy_building_post_refactor(): inside_air_properties = building.MaterialProperties( conductivity=50.0, heat_capacity=700.0, density=1.0 ) - inside_wall_properties = building.DefaultInsideWallMaterialProperties() - building_exterior_properties = ( - building.DefaultExteriorWallMaterialProperties() + inside_wall_properties = building.MaterialProperties( + conductivity=2.0, heat_capacity=1000.0, density=1800.0 + ) + building_exterior_properties = building.MaterialProperties( + conductivity=0.05, heat_capacity=1000.0, density=3000.0 ) floor_plan = _create_dummy_floor_plan() @@ -195,6 +197,7 @@ def _create_dummy_building_post_refactor(): zone_map=zone_map, zone_map_filepath=None, buffer_from_walls=0, + min_room_size=1, ) return b @@ -225,9 +228,11 @@ def _create_dummy_building_weird_shape(): inside_air_properties = building.MaterialProperties( conductivity=50.0, heat_capacity=700.0, density=1.0 ) - inside_wall_properties = building.DefaultInsideWallMaterialProperties() - building_exterior_properties = ( - building.DefaultExteriorWallMaterialProperties() + inside_wall_properties = building.MaterialProperties( + conductivity=2.0, heat_capacity=1000.0, density=1800.0 + ) + building_exterior_properties = building.MaterialProperties( + conductivity=0.05, heat_capacity=1000.0, density=3000.0 ) floor_plan = _create_dummy_floor_plan_weird_shape() @@ -363,9 +368,11 @@ def test_init_flexible_floor_plan_direct_attributes(self): inside_air_properties = building.MaterialProperties( conductivity=50.0, heat_capacity=700.0, density=1.0 ) - inside_wall_properties = building.DefaultInsideWallMaterialProperties() - building_exterior_properties = ( - building.DefaultExteriorWallMaterialProperties() + inside_wall_properties = building.MaterialProperties( + conductivity=2.0, heat_capacity=1000.0, density=1800.0 + ) + building_exterior_properties = building.MaterialProperties( + conductivity=0.05, heat_capacity=1000.0, density=3000.0 ) i = constants.INTERIOR_WALL_VALUE_IN_FUNCTION @@ -577,6 +584,7 @@ def test_assign_thermal_diffusers(self, diffuser_spacing, expected_output): diffuser_spacing=diffuser_spacing, buffer_from_walls=0, interior_walls=None, + min_room_size=1, ) np.testing.assert_array_equal(outcome, expected_output) @@ -1706,70 +1714,6 @@ def test_stochastic_convection_simulator_shuffle_max_dist( self.assertEqual(b.temp[3][2], vals[2]) self.assertEqual(b.temp[3][3], vals[3]) - def test_interior_mass_initialization(self): - """Test that interior mass is correctly initialized.""" - cv_size_cm = 20.0 - floor_height_cm = 300.0 - initial_temp = 292.0 - inside_air_properties = building.MaterialProperties( - conductivity=50.0, heat_capacity=700.0, density=1.0 - ) - inside_wall_properties = building.DefaultInsideWallMaterialProperties() - building_exterior_properties = ( - building.DefaultExteriorWallMaterialProperties() - ) - interior_mass_properties = building.MaterialProperties( - conductivity=0.5, heat_capacity=1000.0, density=2000.0 - ) - - floor_plan = _create_dummy_floor_plan() - zone_map = _create_dummy_floor_plan() - - b = building.FloorPlanBasedBuilding( - cv_size_cm=cv_size_cm, - floor_height_cm=floor_height_cm, - initial_temp=initial_temp, - inside_air_properties=inside_air_properties, - inside_wall_properties=inside_wall_properties, - building_exterior_properties=building_exterior_properties, - floor_plan=floor_plan, - zone_map=zone_map, - buffer_from_walls=0, - interior_mass_properties=interior_mass_properties, - include_interior_mass=True, - ) - - # Check that interior mass is enabled - with self.subTest("Check that interior mass is enabled"): - self.assertTrue(b.include_interior_mass) - - # Check that interior mass mask exists and has correct shape - with self.subTest("Check that interior mass mask exists"): - self.assertIsNotNone(b.interior_mass_mask) - with self.subTest("Check that interior mass mask has correct shape"): - self.assertEqual(b.interior_mass_mask.shape, floor_plan.shape) - with self.subTest("All interior space values should be 0 (air nodes)"): - self.assertEqual(np.sum(b.floor_plan[b.interior_mass_mask]), 0) - # Check that interior mass temperature array exists - with self.subTest("Check that interior mass temperature array exists"): - self.assertIsNotNone(b.interior_mass_temp) - with self.subTest( - "Check that interior mass temperature array has correct shape" - ): - self.assertEqual(b.interior_mass_temp.shape, floor_plan.shape) - - # Check that interior mass properties are assigned - with self.subTest("Check that interior mass conductivity is assigned"): - self.assertIsNotNone(b.interior_mass_conductivity) - with self.subTest("Check that interior mass heat capacity is assigned"): - self.assertIsNotNone(b.interior_mass_heat_capacity) - with self.subTest("Check that interior mass density is assigned"): - self.assertIsNotNone(b.interior_mass_density) - - # Check that interior mass is only assigned to air nodes - with self.subTest("Check that interior mass is only assigned to air nodes"): - self.assertEqual(np.sum(b.interior_mass_mask), np.sum(b.floor_plan == 0)) - if __name__ == "__main__": absltest.main() diff --git a/smart_control/simulator/building_utils.py b/smart_control/simulator/building_utils.py index 482bf6b5..f259aa20 100644 --- a/smart_control/simulator/building_utils.py +++ b/smart_control/simulator/building_utils.py @@ -2,16 +2,19 @@ import collections import datetime +import json +import gin import pathlib -from typing import Any, NewType, Tuple, Union +from typing import Any, Dict, NewType, Tuple, Union import warnings import cv2 import matplotlib.pyplot as plt import numpy as np from scipy import ndimage +from smart_buildings.smart_control.simulator import constants -from smart_control.simulator import constants +from google3.pyglib import gfile Coordinates2D = Tuple[int, int] RoomIndicesDict = collections.defaultdict[str, Any] @@ -59,7 +62,7 @@ def read_floor_plan_from_filepath( filepath: str, save_debugging_image: bool = False, -) -> FileInputFloorPlan: +) -> tuple[FileInputFloorPlan, tuple[int, int]]: """Reads a file from a disk (including CNS) and returns it. Args: @@ -70,7 +73,11 @@ def read_floor_plan_from_filepath( to cns. Returns: - a FileInputFloorPlan + A tuple containing: + - floor_plan: The floor plan read from the file as a FileInputFloorPlan. + - offset: A tuple of (row_offset, col_offset) that indicates + the number of rows and columns of padding added to the floor plan + by prepending rows/columns of air. """ # function to return the file extension @@ -92,7 +99,7 @@ def read_floor_plan_from_filepath( FileInputFloorPlan(floor_plan), "file_from_input" ) - return FileInputFloorPlan(floor_plan) + return FileInputFloorPlan(floor_plan), (0, 0) def save_images_to_cns_for_debugging( @@ -128,7 +135,7 @@ def save_images_to_cns_for_debugging( def guarantee_air_padding_in_frame( floor_plan: FileInputFloorPlan, -) -> FileInputFloorPlan: +) -> tuple[FileInputFloorPlan, tuple[int, int]]: """Adds a row or column of air if a building is abuts its frame edge. Future computation relies on buildings being surrounded by at least one @@ -150,8 +157,9 @@ def guarantee_air_padding_in_frame( floor_plan: a FileInputFloorPlan Returns: - an FileInputFloorPlan that has 2's padded along whichever array edge was - missing them. + A tuple (padded_floor_plan, offset), where: + padded_floor_plan: A FileInputFloorPlan that has 2's padded. + offset: A tuple of (row_offset, col_offset). """ # handle the case of a floor_plan that is trivial in its dimensions (i.e. has @@ -185,6 +193,9 @@ def determine_column_size_of_exterior_space_to_add() -> np.ndarray: (1, floor_plan.shape[1]), constants.EXTERIOR_SPACE_VALUE_IN_FILE_INPUT ) + row_offset = 1 if np.any(floor_plan[0, :] == 1) else 0 + col_offset = 1 if np.any(floor_plan[:, 0] == 1) else 0 + if np.any(floor_plan[0, :] == 1): xs_to_concat = determine_column_size_of_exterior_space_to_add() floor_plan = np.concatenate((xs_to_concat, floor_plan), axis=0) @@ -201,7 +212,7 @@ def determine_column_size_of_exterior_space_to_add() -> np.ndarray: ys_to_concat = determine_row_size_of_exterior_space_to_add() floor_plan = np.concatenate((floor_plan, ys_to_concat), axis=1) - return floor_plan + return floor_plan, (row_offset, col_offset) def _determine_exterior_space( @@ -423,7 +434,13 @@ def construct_building_data_types( floor_plan: FileInputFloorPlan, zone_map: FileInputFloorPlan, save_debugging_image: bool = False, -) -> Tuple[RoomIndicesDict, ExteriorWalls, InteriorWalls, ExteriorSpace]: +) -> Tuple[ + RoomIndicesDict, + ExteriorWalls, + InteriorWalls, + ExteriorSpace, + Tuple[int, int], +]: """Sequentially calls all preprocessing functions in building_utils.py. This function links together the necessary helper functions in @@ -442,11 +459,22 @@ def construct_building_data_types( to CNS. Returns: - connections output with exterior space set negative. + A tuple (room_dict, exterior_walls, interior_walls, exterior_space, offset), + where: + room_dict: A dictionary mapping of room names to coordinates. + exterior_walls: An array marking exterior walls. + interior_walls: An array marking interior walls. + exterior_space: An array marking exterior space. + offset: A tuple of (row_offset, col_offset). """ - padded_floor_plan = guarantee_air_padding_in_frame(floor_plan) - padded_zone_map = guarantee_air_padding_in_frame(zone_map) + if floor_plan.shape != zone_map.shape: + raise ValueError( + f"floor_plan and zone_map shapes must match. " + f"Received {floor_plan.shape} and {zone_map.shape}." + ) + padded_floor_plan, offset = guarantee_air_padding_in_frame(floor_plan) + padded_zone_map, _ = guarantee_air_padding_in_frame(zone_map) merged_floor_zone = padded_floor_plan.copy() merged_floor_zone = np.where(padded_zone_map == 1, 1, merged_floor_zone) @@ -464,7 +492,7 @@ def construct_building_data_types( ) room_dict = _construct_room_dict(connected_components_neg) - return room_dict, exterior_walls, interior_walls, exterior_space + return room_dict, exterior_walls, interior_walls, exterior_space, offset def enlarge_component( @@ -490,5 +518,18 @@ def enlarge_component( cv2.distanceTransform(array_with_component_zero, cv2.DIST_L2, 3), decimals=2, ) - return np.uint8(distances <= distance_to_augment) + + +@gin.configurable +def load_json_to_dict(filepath: str) -> Dict[str, Any]: + """Loads a JSON file from the specified filepath and returns it as a dict. + + Args: + filepath: The path to the JSON file. + + Returns: + A dictionary containing the JSON data. + """ + with gfile.Open(filepath, mode="r") as f: + return json.load(f) diff --git a/smart_control/simulator/building_utils_test.py b/smart_control/simulator/building_utils_test.py index e777d453..c7e98370 100644 --- a/smart_control/simulator/building_utils_test.py +++ b/smart_control/simulator/building_utils_test.py @@ -1,13 +1,14 @@ -"""Tests for building_utils.""" - +import json import os +from google3.pyglib import gfile + from absl import flags from absl.testing import absltest from absl.testing import parameterized import numpy as np -from smart_control.simulator import building_utils +from smart_buildings.smart_control.simulator import building_utils flags.FLAGS([""]) # Required to avoid error with create_tempdir @@ -27,7 +28,7 @@ def test_read_floor_plan_from_filepath_does_not_raise_error(self): [[2.0, 2.0, 2.0], [2.0, 1.0, 2.0], [2.0, 2.0, 2.0]] ) np.savetxt(filename, sample_floorplan, delimiter=",") - f = building_utils.read_floor_plan_from_filepath( + f, _ = building_utils.read_floor_plan_from_filepath( filename, save_debugging_image=False ) np.testing.assert_array_equal(f, sample_floorplan) @@ -39,7 +40,7 @@ def test_read_floor_plan_from_filepath_npy(self): [[2.0, 2.0, 2.0], [2.0, 1.0, 2.0], [2.0, 2.0, 2.0]] ) np.save(filename, sample_floorplan) - f = building_utils.read_floor_plan_from_filepath( + f, _ = building_utils.read_floor_plan_from_filepath( filename, save_debugging_image=False ) np.testing.assert_array_equal(f, sample_floorplan) @@ -51,11 +52,13 @@ def test_read_floor_plan_from_filepath_npy(self): np.array( [[2, 2, 2, 2, 2, 2], [2, 1, 1, 1, 1, 2], [2, 2, 2, 2, 2, 2]] ), + (0, 0), ), ( "placebo", np.array([[2, 2, 2, 2, 2], [2, 1, 1, 1, 2], [2, 2, 2, 2, 2]]), np.array([[2, 2, 2, 2, 2], [2, 1, 1, 1, 2], [2, 2, 2, 2, 2]]), + (0, 0), ), ( "no_air_at_all", @@ -67,13 +70,15 @@ def test_read_floor_plan_from_filepath_npy(self): [2, 1, 1, 1, 2], [2, 2, 2, 2, 2], ]), + (1, 1), ), ) - def test_guarantee_air_padding_in_frame(self, floor_plan, expected_output): - np.testing.assert_array_equal( - building_utils.guarantee_air_padding_in_frame(floor_plan), - expected_output, - ) + def test_guarantee_air_padding_in_frame( + self, floor_plan, expected_output, expected_offset + ): + outcome, offset = building_utils.guarantee_air_padding_in_frame(floor_plan) + np.testing.assert_array_equal(outcome, expected_output) + self.assertEqual(offset, expected_offset) @parameterized.named_parameters( ( @@ -463,6 +468,29 @@ def test_enlarge_component(self): expected_enlargement_1, ) + def test_load_json_to_dict(self): + tempdir = self.create_tempdir() + filename = os.path.join(tempdir, "test.json") + json_content = {"key1": "value1", "key2": 123, "key3": [1, 2, 3]} + with open(filename, "w") as f: + json.dump(json_content, f) + + loaded_dict = building_utils.load_json_to_dict(filename) + self.assertEqual(loaded_dict, json_content) + + def test_load_json_to_dict_invalid_json(self): + tempdir = self.create_tempdir() + filename = os.path.join(tempdir, "invalid.json") + with open(filename, "w") as f: + f.write("this is not valid json") + + with self.assertRaises(json.JSONDecodeError): + building_utils.load_json_to_dict(filename) + + def test_load_json_to_dict_file_not_found(self): + with self.assertRaises(gfile.FileError): + building_utils.load_json_to_dict("non_existent_file.json") + if __name__ == "__main__": absltest.main() diff --git a/smart_control/simulator/conftest.py b/smart_control/simulator/conftest.py deleted file mode 100644 index f79859f1..00000000 --- a/smart_control/simulator/conftest.py +++ /dev/null @@ -1,91 +0,0 @@ -"""Configuration and helpers for building radiation tests.""" - -import copy - -import numpy as np - -from smart_control.simulator import building - -FLOOR_PLAN = np.array([ - [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], -]) - - -def create_building_with_radiative_properties( - view_factor_method: str = "ScriptF", - include_interior_mass: bool = False, - floor_plan: np.array = FLOOR_PLAN, - initial_temp: float = 292.0, - cv_size_cm: float = 20.0, - floor_height_cm: float = 300.0, - inside_air_radiative_properties: building.RadiationProperties = None, - inside_wall_radiative_properties: building.RadiationProperties = None, - building_exterior_radiative_properties: building.RadiationProperties = None, -): - - inside_air_properties = building.MaterialProperties( - conductivity=50.0, heat_capacity=700.0, density=1.0 - ) - inside_wall_properties = building.MaterialProperties( - conductivity=2.0, heat_capacity=500.0, density=1800.0 - ) - building_exterior_properties = building.MaterialProperties( - conductivity=0.05, heat_capacity=500.0, density=3000.0 - ) - interior_mass_properties = building.MaterialProperties( - conductivity=0.5, heat_capacity=1000.0, density=2000.0 - ) - - inside_air_radiative_properties = inside_air_radiative_properties or ( - building.DefaultInsideAirRadiationProperties() - ) - inside_wall_radiative_properties = inside_wall_radiative_properties or ( - building.DefaultInsideWallRadiationProperties() - ) - building_exterior_radiative_properties = ( - building_exterior_radiative_properties - or building.DefaultExteriorWallRadiationProperties() - ) - - zone_map = copy.deepcopy(floor_plan) - - return building.FloorPlanBasedBuilding( - cv_size_cm=cv_size_cm, - floor_height_cm=floor_height_cm, - initial_temp=initial_temp, - inside_air_properties=inside_air_properties, - inside_wall_properties=inside_wall_properties, - building_exterior_properties=building_exterior_properties, - floor_plan=floor_plan, - zone_map=zone_map, - buffer_from_walls=0, - inside_air_radiative_properties=inside_air_radiative_properties, - inside_wall_radiative_properties=inside_wall_radiative_properties, - building_exterior_radiative_properties=building_exterior_radiative_properties, # pylint: disable=line-too-long - include_radiative_heat_transfer=True, - view_factor_method=view_factor_method, - interior_mass_properties=interior_mass_properties, - include_interior_mass=include_interior_mass, - ) diff --git a/smart_control/simulator/constants.py b/smart_control/simulator/constants.py index e4741d7c..82f04072 100644 --- a/smart_control/simulator/constants.py +++ b/smart_control/simulator/constants.py @@ -1,58 +1,41 @@ -"""Defines constants for use in simulation code suite.""" +"""Constants for use in the simulation code suite.""" -import os - -from dotenv import load_dotenv - -from smart_control.utils.constants import ROOT_DIR - -load_dotenv() - -# Path to save videos generated by the simulation's visual logger. -# fmt: off -# pylint: disable=line-too-long -DEFAULT_SIM_VIDEOS_DIRPATH = os.path.join(ROOT_DIR, "smart_control", "simulator", "videos") -SIM_VIDEOS_DIRPATH = os.getenv("SIM_VIDEOS_DIRPATH", default=DEFAULT_SIM_VIDEOS_DIRPATH) -# pylint: enable=line-too-long -# fmt: on - - -#################### FILE_INPUT ################################ -# Here we use a specific placeholder value, matching with the file input schema, -# that designates interior space in the file input. -# there is no exterior wall value in file input. 1 includes all walls. -INTERIOR_WALL_VALUE_IN_FILE_INPUT = 1 - -# Here we use a specific placeholder value, matching with the file input schema, -# that designates exterior space in the file input. -# this is ambient air. -EXTERIOR_SPACE_VALUE_IN_FILE_INPUT = 2 - -# Here we use a specific placeholder value, matching with the file input schema, -# that designates interior space in the file input. -INTERIOR_SPACE_VALUE_IN_FILE_INPUT = 0 - -# Fenestration node constants -FENESTRATION_VALUE_IN_FILE_INPUT = 4 - - -#################### FUNCTION ################################ # Here we use a specific placeholder value that helps us pick out interior walls # and will not be used by connectedComponents() function (which only counts # upwards positively) or the FileInputFloorPlan, which has 0, 1, and 2. +# It is intentionally set to -3 so that the connectedComponent function can have +# access to all nonzero integers to count upwards in an unbounded way. INTERIOR_WALL_VALUE_IN_FUNCTION = -3 +# Here we use a specific placeholder value that helps us pick out interior walls +# AFTER connectedComponents labels them. +INTERIOR_WALL_VALUE_IN_COMPONENT = 0 + # Here we use a specific placeholder value that helps us pick out exterior walls # and will not be used by connectedComponents() function (which only counts # upwards positively) or the FileInputFloorPlan, which has 0, 1, and 2. EXTERIOR_WALL_VALUE_IN_FUNCTION = -2 +# Here we use a specific placeholder value, matching with the file input schema, +# that designates exterior space in the file input. +EXTERIOR_SPACE_VALUE_IN_FILE_INPUT = 2 + # Here we designate a specific placeholder to help use demarcate which CVs # are for exterior space once processed in the function. It is intentionally # set to -1 so that the connectedComponent function can have access to all # nonzero integers to count upwards in an unbounded way. EXTERIOR_SPACE_VALUE_IN_FUNCTION = -1 +# Here we designate a specific placeholder to help use demarcate which CVs +# are for exterior space are noted in the component. It is intentionally +# set to -1 so that the connectedComponent function can have access to all +# nonzero integers to count upwards in an unbounded way. +EXTERIOR_SPACE_VALUE_IN_COMPONENT = 0 + +# Here we use a specific placeholder value, matching with the file input schema, +# that designates interior space in the file input. +INTERIOR_SPACE_VALUE_IN_FILE_INPUT = 0 + # Here we pick out a specific value that we know will code for interior space # after connectedComponents() processes it. We know this because we have ensured # that the CV at index (0,0) will always be an "space" CV when ready for @@ -63,27 +46,6 @@ # _INTERIOR_SPACE_VALUE_IN_CONNECTION_INPUT equal to 0. INTERIOR_SPACE_VALUE_IN_FUNCTION = 0 -# Here we designate a specific placeholder to help use demarcate which CVs -# are for interior walls once processed in the function. It is intentionally -# set to -3 so that the connectedComponent function can have access to all -# nonzero integers to count upwards in an unbounded way. -INTERIOR_WALL_VALUE_IN_FUNCTION = -3 - -# Fenestration node constants -FENESTRATION_VALUE_IN_FUNCTION = -4 - -# Here we designate a specific placeholder to help use demarcate which CVs -# are for exterior space are noted in the component. It is intentionally -# set to -1 so that the connectedComponent function can have access to all -# nonzero integers to count upwards in an unbounded way. -EXTERIOR_SPACE_VALUE_IN_COMPONENT = 0 - - -# Here we use a specific placeholder value that helps us pick out interior walls -# AFTER connectedComponents labels them. -INTERIOR_WALL_VALUE_IN_COMPONENT = 0 - - # connectedComponents function operates by accepting a matrix in which # components, defined as 1's, are surrounded by 0's. This schema is # opposite that which we were fed via the floorplan file input. @@ -106,12 +68,9 @@ # returning expanded exterior walls when calling enlarge_component() WALLS_AND_EXPANDED_BOOLS = 2 -# Here we wish to specifically set exterior space as indistinguishable -# from exterior walls, as we wish to perform connectedComponents only on -# connected groups of interior space. Thus, we set exterior space to a generic -# space value, i.e. 0. -GENERIC_SPACE_VALUE_IN_CONNECTION_INPUT = 0 - +# Here we use a specific placeholder value, matching with the file input schema, +# that designates interior space in the file input. +INTERIOR_WALL_VALUE_IN_FILE_INPUT = 1 # Here we set a specific string for exterior space to be labelled as in # constructing a room dictionary. @@ -137,36 +96,36 @@ # by design of the construct_room_dict() function. ROOM_STRING_DESIGNATOR = "room" +# Path to save videos generated by the simulation's visual logger. +VIDEO_PATH_ROOT = "/cns/oz-d/home/smart-buildings-control-team/smart-buildings/geometric_sim_videos/" # pylint: disable=line-too-long + # The limit above which we do not want thermal diffusers to be dispensing energy WATT_LIMIT = 500 -# Interior mass node constants -# Marker to indicate if a CV has an associated interior mass node -INTERIOR_MASS_NODE_MARKER = 1 -# Label for interior mass CV type -LABEL_FOR_INTERIOR_MASS = "interior_mass" +# Physical constants for air. +AIR_DENSITY = 1.2 # kg/m3 +AIR_HEAT_CAPACITY = 1006.0 # J/kg/K, standard atmosphere +WATER_DENSITY = 1000.0 # kg/m3 +WATER_HEAT_CAPACITY = 4180.0 # J/kg/K +GRAVITY = 9.8 # m/s2 -# Fenestration position markers for radiative heat transfer -# Exterior fenestration nodes (adjacent to exterior space, value 2) -EXTERIOR_FENESTRATION_VALUE = -42 -# Most interior fenestration nodes (adjacent to indoor air, value 0) -INTERIOR_FENESTRATION_VALUE = -43 -# In-between fenestration nodes (neither exterior nor interior adjacent) -INBETWEEN_FENESTRATION_VALUE = -425 -# Default fenestration tilt angle (vertical surface) -FENESTRATION_TILT_ANGLE = 90 # degrees from horizontal +def is_non_physical_space(zone_id: str) -> bool: + """Checks if a given zone_id represents a non-physical space. -# Fenestration optical properties (default values for typical window glass) -# Solar absorptance: fraction of solar radiation absorbed by the glass -FENESTRATION_SOLAR_ABSORPTANCE = 0.1 # typical for single pane clear glass -# Solar transmittance: fraction of solar radiation transmitted through the glass -FENESTRATION_SOLAR_TRANSMITTANCE = 0.8 # typical for single pane clear glass -# Note: reflectance = 1 - absorptance - transmittance = 0.1 + Non-physical spaces include exterior spaces and interior walls, which are + not considered occupiable or thermally controlled zones within the + simulation. + Args: + zone_id: The identifier string for the zone. -#################### PHYSICS CONSTANTS ################################ -# Stefan-Boltzmann constant for radiative heat transfer calculations. -# Units: W/(m^2*K^4) -STEFAN_BOLTZMANN_CONSTANT = 5.67e-8 + Returns: + True if the zone_id corresponds to a non-physical space (e.g., exterior + space or an interior wall), False otherwise. + """ + return zone_id in [ + EXTERIOR_SPACE_NAME_IN_ROOM_DICT, + INTERIOR_WALL_NAME_IN_ROOM_DICT, + ] diff --git a/smart_control/simulator/enhanced_occupancy.py b/smart_control/simulator/enhanced_occupancy.py deleted file mode 100644 index 93150076..00000000 --- a/smart_control/simulator/enhanced_occupancy.py +++ /dev/null @@ -1,469 +0,0 @@ -"""An enhanced stochastic occupancy model for building simulation -with minute-level control and different worker types. This model is based on the -LIGHTSWITCHOccupancy model from stochastic_occupancy.py to include minute-level -control instead of hour-level control. It has the same arrival/departure/lunch -logic but it provides more fine-grained control and realistic occupant -behaviour, such as optional weekend work and daily changing work hours and lunch -break times (instead of a constant set of parameters for each occupant leading -to a static occupancy profile that repeats itself every weekday of the year). -The model samples new work and lunch time parameters for each occupant every -day, caches them for the day and clears the cache on the next day to ensure -consistency. It is possible to model low occupancy levels on the weekends by -using different worker types. -""" - -import datetime -import enum -from typing import Dict, Union - -from absl import logging -import gin -import numpy as np -import pandas as pd - -from smart_control.models.base_occupancy import BaseOccupancy -from smart_control.utils import conversion_utils - -# Seeds for np.random.RandomState must be integers in [0, 2**32 - 1]. -# We use modulo SEED_MOD_32 to constrain hashes into this valid range. -SEED_MOD_32 = 2**32 - - -class OccupancyStateEnum(enum.Enum): - AWAY = 1 - WORK = 2 - - -class WorkerType(enum.Enum): - WEEKDAY_ONLY = 1 - WEEKEND_REGULAR = 2 # worker types that works on weekends and weekdays - WEEKEND_OCCASIONAL = ( - 3 # regular weekday workers who need to work on weekends occasionally - ) - - -class MinuteLevelZoneOccupant: - """MinuteLevelZoneOccupant with minute-level control and day-specific - parameters. - This class samples a full daily schedule (arrival, lunch, departure) at minute - resolution, caches it per occupant per day, and supports weekend worker types. - We intentionally do not inherit from the legacy occupant classes because their - semantics differ: - - stochastic_occupancy.ZoneOccupant: samples fixed hour‑level times once at - initialisation and repeats the same schedule every workday. - - randomized_arrival_departure_occupancy.ZoneOccupant: uses independent - per-step Bernoulli draws in hour-level arrival/departure windows. - Inheritance would require overriding most behaviours and would reduce clarity, - so we keep the implementations separate. - """ - - def __init__( - self, - earliest_expected_arrival_min: int, - latest_expected_arrival_min: int, - earliest_expected_departure_min: int, - latest_expected_departure_min: int, - lunch_start_min: int, - lunch_end_min: int, - step_size: pd.Timedelta, - random_state: np.random.RandomState, - time_zone: Union[datetime.tzinfo, str] = "UTC", - worker_type: WorkerType = WorkerType.WEEKDAY_ONLY, - weekend_work_prob: float = 0.10, - occupant_id: int = 0, - lunch_duration_min: int = 30, - lunch_duration_max: int = 90, - ): - if not ( - earliest_expected_arrival_min - < latest_expected_arrival_min - < earliest_expected_departure_min - < latest_expected_departure_min - ): - raise ValueError( - "Expected arrival/departure minutes to satisfy:" - " earliest_expected_arrival_min < latest_expected_arrival_min <" - " earliest_expected_departure_min < latest_expected_departure_min" - f" (got {earliest_expected_arrival_min}," - f" {latest_expected_arrival_min}, {earliest_expected_departure_min}," - f" {latest_expected_departure_min})." - ) - if not lunch_start_min < lunch_end_min: - raise ValueError( - f"Expected lunch_start_min < lunch_end_min (got {lunch_start_min} >=" - f" {lunch_end_min})." - ) - - self._earliest_expected_arrival_min = earliest_expected_arrival_min - self._latest_expected_arrival_min = latest_expected_arrival_min - self._earliest_expected_departure_min = earliest_expected_departure_min - self._latest_expected_departure_min = latest_expected_departure_min - self._lunch_start_min = lunch_start_min - self._lunch_end_min = lunch_end_min - self._step_size = step_size - self._random_state = random_state - - if time_zone is None: - raise ValueError( - "time_zone must be provided (e.g., 'UTC' or an IANA zone)." - ) - try: - _ = pd.Timestamp("2000-01-01", tz=time_zone) - except Exception as e: - raise ValueError(f"Invalid time_zone: {time_zone!r}") from e - - self._time_zone = time_zone - self.state = OccupancyStateEnum.AWAY - self.daily_cache = {} - self.worker_type = worker_type - self.weekend_work_prob = weekend_work_prob - self.occupant_id = occupant_id - self.daily_work_cache = {} - self._lunch_duration_min = lunch_duration_min - self._lunch_duration_max = lunch_duration_max - - def _generate_cpf(self, start, end, random_state=None): - if random_state is None: - random_state = self._random_state - values = np.arange(start, end + 1) - probabilities = random_state.rand(len(values)) - cumulative_probabilities = np.cumsum(probabilities / probabilities.sum()) - return values, cumulative_probabilities - - def _sample_event_time(self, start, end, random_state=None): - if random_state is None: - random_state = self._random_state - values, cumulative_probabilities = self._generate_cpf( - start, end, random_state - ) - random_value = random_state.rand() - index = np.searchsorted(cumulative_probabilities, random_value) - logging.info( - "Sampled event time: start=%s, end=%s, value=%s", - start, - end, - values[index], - ) - return values[index] - - def _sample_lunch_duration(self, random_state=None): - if random_state is None: - random_state = self._random_state - values, cumulative_probabilities = self._generate_cpf( - self._lunch_duration_min, self._lunch_duration_max, random_state - ) - random_value = random_state.rand() - index = np.searchsorted(cumulative_probabilities, random_value) - logging.info("Sampled lunch duration: %s minutes", values[index]) - return values[index] - - def _to_local_time(self, timestamp: pd.Timestamp) -> pd.Timestamp: - """Return timestamp localised/converted to this occupant's time zone.""" - if timestamp.tz is None: - return timestamp.tz_localize(self._time_zone) - return timestamp.tz_convert(self._time_zone) - - def _get_daily_params(self, timestamp: pd.Timestamp) -> Dict[str, int]: - local_timestamp = self._to_local_time(timestamp) - date_key = local_timestamp.date() - - if self.daily_cache and list(self.daily_cache.keys())[0] != date_key: - self.daily_cache.clear() - logging.info( - "MinuteLevelZoneOccupant: cleared day cache for new date %s", date_key - ) - - if date_key in self.daily_cache: - return self.daily_cache[date_key] - - day_seed = hash(str(date_key) + str(self.occupant_id) + "daily_params") % ( - SEED_MOD_32 - ) - day_random_state = np.random.RandomState(day_seed) - - arrival = self._sample_event_time( - self._earliest_expected_arrival_min, - self._latest_expected_arrival_min, - day_random_state, - ) - departure = self._sample_event_time( - self._earliest_expected_departure_min, - self._latest_expected_departure_min, - day_random_state, - ) - lunch_start = self._sample_event_time( - self._lunch_start_min, self._lunch_end_min, day_random_state - ) - lunch_duration = self._sample_lunch_duration(day_random_state) - - self.daily_cache[date_key] = { - "arrival_time": arrival, - "departure_time": departure, - "lunch_start_time": lunch_start, - "lunch_duration": lunch_duration, - } - return self.daily_cache[date_key] - - def _minutes_since_midnight(self, local_timestamp: pd.Timestamp) -> int: - return local_timestamp.hour * 60 + local_timestamp.minute - - def _should_work_today(self, timestamp: pd.Timestamp) -> bool: - local_timestamp = self._to_local_time(timestamp) - - day = pd.Timestamp( - year=local_timestamp.year, - month=local_timestamp.month, - day=local_timestamp.day, - ) - date_key = day.date() - - if date_key in self.daily_work_cache: - return self.daily_work_cache[date_key] - - if conversion_utils.is_work_day(day): - self.daily_work_cache[date_key] = True - return True - - if self.worker_type == WorkerType.WEEKDAY_ONLY: - self.daily_work_cache[date_key] = False - return False - - if self.worker_type == WorkerType.WEEKEND_REGULAR: - self.daily_work_cache[date_key] = True - return True - - elif self.worker_type == WorkerType.WEEKEND_OCCASIONAL: - seed = hash(str(date_key) + str(self.occupant_id)) % SEED_MOD_32 - random_state = np.random.RandomState(seed) - work_today = random_state.rand() < self.weekend_work_prob - self.daily_work_cache[date_key] = work_today - return work_today - - self.daily_work_cache[date_key] = False - return False - - def _occupant_arrived(self, timestamp: pd.Timestamp) -> bool: - local_timestamp = self._to_local_time(timestamp) - - current_min = self._minutes_since_midnight(local_timestamp) - params = self._get_daily_params(timestamp) - - arrived = current_min >= params["arrival_time"] - logging.info( - "Arrival check: hour=%s, arrival_time=%s, arrived=%s", - local_timestamp.hour, - params["arrival_time"], - arrived, - ) - return arrived - - def _occupant_departed(self, timestamp: pd.Timestamp) -> bool: - local_timestamp = self._to_local_time(timestamp) - - current_min = self._minutes_since_midnight(local_timestamp) - params = self._get_daily_params(timestamp) - - departed = current_min >= params["departure_time"] - logging.info( - "Departure check: hour=%s, departure_time=%s, departed=%s", - local_timestamp.hour, - params["departure_time"], - departed, - ) - return departed - - def peek(self, current_time: pd.Timestamp) -> OccupancyStateEnum: - """Checks the current occupancy state based on the provided timestamp. - - This method determines the occupancy state (AWAY or WORK) based on - the current time, considering workdays, weekends, arrival/departure times, - and a lunch break. - - Args: - current_time: The current timestamp to evaluate. - - Returns: - The current `OccupancyStateEnum` (AWAY or WORK). - """ - local_timestamp = self._to_local_time(current_time) - - logging.info( - "Peek called: current_time=%s, local_time=%s, state_before=%s", - current_time, - local_timestamp, - self.state, - ) - - if not self._should_work_today(current_time): - self.state = OccupancyStateEnum.AWAY - return self.state - - if self._occupant_arrived(current_time) and not self._occupant_departed( - current_time - ): - self.state = OccupancyStateEnum.WORK - else: - self.state = OccupancyStateEnum.AWAY - - if self.state == OccupancyStateEnum.WORK: - current_min = self._minutes_since_midnight(local_timestamp) - params = self._get_daily_params(current_time) - lunch_start = params["lunch_start_time"] - lunch_end = lunch_start + params["lunch_duration"] - if lunch_start <= current_min < lunch_end: - self.state = OccupancyStateEnum.AWAY - return OccupancyStateEnum.AWAY - - logging.info("Peek result state=%s", self.state) - - return self.state - - -@gin.configurable -class EnhancedOccupancy(BaseOccupancy): - """Enhanced occupancy model with minute-level control and different - worker types. - """ - - def __init__( - self, - zone_assignment: int, - earliest_expected_arrival_hour: int, - latest_expected_arrival_hour: int, - earliest_expected_departure_hour: int, - latest_expected_departure_hour: int, - lunch_start_hour: int = 12, - lunch_end_hour: int = 14, - time_step: pd.Timedelta = pd.Timedelta(minutes=5), - time_zone: str = "UTC", - # 5% of the workforce are regular weekend workers - weekend_regular_pct: float = 0.05, - # 5% of the workforce are occasional weekend worker - weekend_occasional_pct: float = 0.05, - # 10% chance per weekend day that an occasional worker will work - occasional_daily_prob: float = 0.10, - ): - self._zone_assignment = zone_assignment - self._zone_occupants = {} - self._step_size = time_step - self._earliest_expected_arrival = earliest_expected_arrival_hour * 60 - self._latest_expected_arrival = latest_expected_arrival_hour * 60 - self._earliest_expected_departure = earliest_expected_departure_hour * 60 - self._latest_expected_departure = latest_expected_departure_hour * 60 - self._lunch_start = lunch_start_hour * 60 - self._lunch_end = lunch_end_hour * 60 - self._time_zone = time_zone - self._weekend_regular_pct = weekend_regular_pct - self._weekend_occasional_pct = weekend_occasional_pct - self._occasional_prob = occasional_daily_prob - - total_pct = weekend_regular_pct + weekend_occasional_pct - if total_pct > 1.0: - raise ValueError( - "Total percentage of weekend workers must be less than or equal to 1" - ) - - def _initialize_zone(self, zone_id: str): - if zone_id not in self._zone_occupants: - self._zone_occupants[zone_id] = [] - for i in range(self._zone_assignment): - worker_random_state = np.random.RandomState( - hash(f"{zone_id}_{i}") % SEED_MOD_32 - ) - u = worker_random_state.rand() - if u < self._weekend_regular_pct: - worker_type = WorkerType.WEEKEND_REGULAR - weekend_prob = 1.0 - elif u < self._weekend_regular_pct + self._weekend_occasional_pct: - worker_type = WorkerType.WEEKEND_OCCASIONAL - weekend_prob = self._occasional_prob - else: - worker_type = WorkerType.WEEKDAY_ONLY - weekend_prob = 0.0 - - occupant_random_state = np.random.RandomState( - (hash(f"{zone_id}_{i}_behaviour") % SEED_MOD_32) - ) - - self._zone_occupants[zone_id].append( - MinuteLevelZoneOccupant( - self._earliest_expected_arrival, - self._latest_expected_arrival, - self._earliest_expected_departure, - self._latest_expected_departure, - self._lunch_start, - self._lunch_end, - self._step_size, - occupant_random_state, - self._time_zone, - worker_type=worker_type, - weekend_work_prob=weekend_prob, - occupant_id=i, - ) - ) - - def average_zone_occupancy( - self, zone_id: str, start_time: pd.Timestamp, end_time: pd.Timestamp - ) -> float: - """Calculates the average occupancy within a time interval for a zone. - - Args: - zone_id: specific zone identifier for the building. - start_time: **local time** with TZ for the beginning of the interval. - end_time: **local time** with TZ for the end of the interval. - - Raises: - ValueError: If start_time or end_time is timezone-naive, or if end_time - is not after start_time. - - Returns: - Average number of people in the zone for the interval. - """ - self._initialize_zone(zone_id) - - if start_time.tz is None or end_time.tz is None: - raise ValueError("start_time and end_time must be timezone-aware.") - if start_time >= end_time: - raise ValueError("end_time must be after start_time.") - - current_time = start_time - total_occupancy = 0 - steps = 0 - - while current_time < end_time: - num_occupants = 0 - for occupant in self._zone_occupants[zone_id]: - state = occupant.peek(current_time) - if state == OccupancyStateEnum.WORK: - num_occupants += 1 - - total_occupancy += num_occupants - steps += 1 - current_time += self._step_size - - return total_occupancy / steps if steps > 0 else 0.0 - - def get_worker_distribution(self, zone_id: str) -> Dict[str, int]: - """Returns the distribution of worker types in the given zone. - - Args: - zone_id: The specific zone identifier for the building. - - Returns: - A dictionary with counts for each worker type: - { - "weekday_only": int, - "weekend_regular": int, - "weekend_occasional": int, - }. - """ - self._initialize_zone(zone_id) - counts = {"weekday_only": 0, "weekend_regular": 0, "weekend_occasional": 0} - for occupant in self._zone_occupants[zone_id]: - if occupant.worker_type == WorkerType.WEEKDAY_ONLY: - counts["weekday_only"] += 1 - elif occupant.worker_type == WorkerType.WEEKEND_REGULAR: - counts["weekend_regular"] += 1 - elif occupant.worker_type == WorkerType.WEEKEND_OCCASIONAL: - counts["weekend_occasional"] += 1 - return counts diff --git a/smart_control/simulator/enhanced_occupancy_test.py b/smart_control/simulator/enhanced_occupancy_test.py deleted file mode 100644 index 517cd6b7..00000000 --- a/smart_control/simulator/enhanced_occupancy_test.py +++ /dev/null @@ -1,282 +0,0 @@ -"""Test the enhanced occupancy model.""" - -from absl.testing import absltest -from absl.testing import parameterized -import numpy as np -import pandas as pd - -from smart_control.simulator.enhanced_occupancy import EnhancedOccupancy -from smart_control.simulator.enhanced_occupancy import MinuteLevelZoneOccupant -from smart_control.simulator.enhanced_occupancy import OccupancyStateEnum -from smart_control.simulator.enhanced_occupancy import WorkerType - -DEBUG_PRINT = False -SEED = 511211 -TIME_STEP = pd.Timedelta(minutes=5) -EARLIEST_EXPECTED_ARRIVAL_HOUR = 8 -LATEST_EXPECTED_ARRIVAL_HOUR = 10 -EARLIEST_EXPECTED_DEPARTURE_HOUR = 16 -LATEST_EXPECTED_DEPARTURE_HOUR = 18 -LUNCH_START_HOUR = 12 -LUNCH_END_HOUR = 14 -NUM_OCCUPANTS = 10 -DEFAULT_TIMEZONE = 'UTC' -NO_WEEKEND_WORKERS_REGULAR_PCT = 0.0 -NO_WEEKEND_WORKERS_OCCASIONAL_PCT = 0.0 -NO_WEEKEND_WORKERS_DAILY_PROB = 0.0 -REGULAR_WEEKEND_WORKERS_REGULAR_PCT = 0.2 -REGULAR_WEEKEND_WORKERS_OCCASIONAL_PCT = 0.0 -REGULAR_WEEKEND_WORKERS_DAILY_PROB = 0.0 -TEST_SETUP_REGULAR_PCT = 0.1 -TEST_SETUP_OCCASIONAL_PCT = 0.2 -TEST_SETUP_DAILY_PROB = 0.3 - - -class EnhancedOccupancyTest(parameterized.TestCase): - - @parameterized.parameters('UTC', 'US/Pacific', 'US/Eastern') - def test_average_occupancy_weekday(self, tz): - occupancy = EnhancedOccupancy( - zone_assignment=NUM_OCCUPANTS, - earliest_expected_arrival_hour=EARLIEST_EXPECTED_ARRIVAL_HOUR, - latest_expected_arrival_hour=LATEST_EXPECTED_ARRIVAL_HOUR, - earliest_expected_departure_hour=EARLIEST_EXPECTED_DEPARTURE_HOUR, - latest_expected_departure_hour=LATEST_EXPECTED_DEPARTURE_HOUR, - lunch_start_hour=LUNCH_START_HOUR, - lunch_end_hour=LUNCH_END_HOUR, - time_step=TIME_STEP, - time_zone=tz, - weekend_regular_pct=NO_WEEKEND_WORKERS_REGULAR_PCT, - weekend_occasional_pct=NO_WEEKEND_WORKERS_OCCASIONAL_PCT, - occasional_daily_prob=NO_WEEKEND_WORKERS_DAILY_PROB, - ) - - current_time = pd.Timestamp('2021-09-01 00:00', tz=tz) - occupancies = [] - while current_time < pd.Timestamp('2021-09-02 00:00', tz=tz): - n = occupancy.average_zone_occupancy( - 'zone_0', current_time, current_time + TIME_STEP - ) - occupancies.append(n) - current_time += TIME_STEP - - early_morning_avg = np.mean(occupancies[0:48]) # 48 time steps = 4 hours - morning_avg = np.mean(occupancies[96:132]) # 8-11 - lunch_avg = np.mean(occupancies[144:168]) # 12-14 - afternoon_avg = np.mean(occupancies[180:204]) # 15-17 - evening_avg = np.mean(occupancies[240:288]) # 20-24 - - self.assertEqual(early_morning_avg, 0.0) - self.assertEqual(evening_avg, 0.0) - self.assertGreater(morning_avg, 0.0) - self.assertGreater(afternoon_avg, 0.0) - self.assertLess(lunch_avg, NUM_OCCUPANTS) - - def test_weekend_occupancy(self): - weekday_only_occupancy = EnhancedOccupancy( - zone_assignment=100, - earliest_expected_arrival_hour=EARLIEST_EXPECTED_ARRIVAL_HOUR, - latest_expected_arrival_hour=LATEST_EXPECTED_ARRIVAL_HOUR, - earliest_expected_departure_hour=EARLIEST_EXPECTED_DEPARTURE_HOUR, - latest_expected_departure_hour=LATEST_EXPECTED_DEPARTURE_HOUR, - lunch_start_hour=LUNCH_START_HOUR, - lunch_end_hour=LUNCH_END_HOUR, - time_step=TIME_STEP, - time_zone=DEFAULT_TIMEZONE, - weekend_regular_pct=NO_WEEKEND_WORKERS_REGULAR_PCT, - weekend_occasional_pct=NO_WEEKEND_WORKERS_OCCASIONAL_PCT, - occasional_daily_prob=NO_WEEKEND_WORKERS_DAILY_PROB, - ) - - weekend_regular_occupancy = EnhancedOccupancy( - zone_assignment=100, - earliest_expected_arrival_hour=EARLIEST_EXPECTED_ARRIVAL_HOUR, - latest_expected_arrival_hour=LATEST_EXPECTED_ARRIVAL_HOUR, - earliest_expected_departure_hour=EARLIEST_EXPECTED_DEPARTURE_HOUR, - latest_expected_departure_hour=LATEST_EXPECTED_DEPARTURE_HOUR, - lunch_start_hour=LUNCH_START_HOUR, - lunch_end_hour=LUNCH_END_HOUR, - time_step=TIME_STEP, - time_zone=DEFAULT_TIMEZONE, - weekend_regular_pct=REGULAR_WEEKEND_WORKERS_REGULAR_PCT, - weekend_occasional_pct=REGULAR_WEEKEND_WORKERS_OCCASIONAL_PCT, - occasional_daily_prob=REGULAR_WEEKEND_WORKERS_DAILY_PROB, - ) - saturday_morning_start = pd.Timestamp( - '2021-09-04 08:00', tz=DEFAULT_TIMEZONE - ) - saturday_morning_end = pd.Timestamp('2021-09-04 12:00', tz=DEFAULT_TIMEZONE) - weekday_only_occupancy = weekday_only_occupancy.average_zone_occupancy( - 'zone_0', saturday_morning_start, saturday_morning_end - ) - weekend_regular_occupancy = ( - weekend_regular_occupancy.average_zone_occupancy( - 'zone_0', saturday_morning_start, saturday_morning_end - ) - ) - self.assertEqual(weekday_only_occupancy, 0.0) - self.assertGreater(weekend_regular_occupancy, 0.0) - - def test_worker_distribution(self): - occupancy = EnhancedOccupancy( - zone_assignment=1000, - earliest_expected_arrival_hour=EARLIEST_EXPECTED_ARRIVAL_HOUR, - latest_expected_arrival_hour=LATEST_EXPECTED_ARRIVAL_HOUR, - earliest_expected_departure_hour=EARLIEST_EXPECTED_DEPARTURE_HOUR, - latest_expected_departure_hour=LATEST_EXPECTED_DEPARTURE_HOUR, - lunch_start_hour=LUNCH_START_HOUR, - lunch_end_hour=LUNCH_END_HOUR, - time_step=TIME_STEP, - time_zone=DEFAULT_TIMEZONE, - weekend_regular_pct=TEST_SETUP_REGULAR_PCT, - weekend_occasional_pct=TEST_SETUP_OCCASIONAL_PCT, - occasional_daily_prob=TEST_SETUP_DAILY_PROB, - ) - distribution = occupancy.get_worker_distribution('zone_0') - total_workers = sum(distribution.values()) - self.assertEqual(total_workers, 1000) - - expected_regular = 1000 * TEST_SETUP_REGULAR_PCT - expected_occasional = 1000 * TEST_SETUP_OCCASIONAL_PCT - expected_weekday = 1000 * ( - 1.0 - TEST_SETUP_REGULAR_PCT - TEST_SETUP_OCCASIONAL_PCT - ) - self.assertAlmostEqual( - distribution['weekday_only'], expected_weekday, delta=100 - ) - self.assertAlmostEqual( - distribution['weekend_regular'], expected_regular, delta=100 - ) - self.assertAlmostEqual( - distribution['weekend_occasional'], expected_occasional, delta=100 - ) - - def test_parameter_variation(self): - occupant = MinuteLevelZoneOccupant( - earliest_expected_arrival_min=EARLIEST_EXPECTED_ARRIVAL_HOUR * 60, - latest_expected_arrival_min=LATEST_EXPECTED_ARRIVAL_HOUR * 60, - earliest_expected_departure_min=EARLIEST_EXPECTED_DEPARTURE_HOUR * 60, - latest_expected_departure_min=LATEST_EXPECTED_DEPARTURE_HOUR * 60, - lunch_start_min=LUNCH_START_HOUR * 60, - lunch_end_min=LUNCH_END_HOUR * 60, - step_size=TIME_STEP, - random_state=np.random.RandomState(seed=SEED), - time_zone=DEFAULT_TIMEZONE, - worker_type=WorkerType.WEEKDAY_ONLY, - weekend_work_prob=NO_WEEKEND_WORKERS_DAILY_PROB, - occupant_id=0, - ) - day1_morning = pd.Timestamp('2021-09-01 09:00', tz=DEFAULT_TIMEZONE) - day1_afternoon = pd.Timestamp('2021-09-01 15:00', tz=DEFAULT_TIMEZONE) - day2_morning = pd.Timestamp('2021-09-02 09:00', tz=DEFAULT_TIMEZONE) - params1_morning = occupant._get_daily_params(day1_morning) - params1_afternoon = occupant._get_daily_params(day1_afternoon) - params2_morning = occupant._get_daily_params(day2_morning) - self.assertEqual(params1_morning, params1_afternoon) - self.assertNotEqual(params1_morning, params2_morning) - - @parameterized.parameters('UTC', 'US/Eastern', 'US/Pacific') - def test_occupant_peek(self, tz): - occupant = MinuteLevelZoneOccupant( - earliest_expected_arrival_min=EARLIEST_EXPECTED_ARRIVAL_HOUR * 60, - latest_expected_arrival_min=LATEST_EXPECTED_ARRIVAL_HOUR * 60, - earliest_expected_departure_min=EARLIEST_EXPECTED_DEPARTURE_HOUR * 60, - latest_expected_departure_min=LATEST_EXPECTED_DEPARTURE_HOUR * 60, - lunch_start_min=LUNCH_START_HOUR * 60, - lunch_end_min=LUNCH_END_HOUR * 60, - step_size=TIME_STEP, - random_state=np.random.RandomState(seed=SEED), - time_zone=tz, - worker_type=WorkerType.WEEKDAY_ONLY, - weekend_work_prob=NO_WEEKEND_WORKERS_DAILY_PROB, - occupant_id=0, - ) - day = pd.Timestamp('2021-09-01 00:00', tz=tz) - params = occupant._get_daily_params(day) - day1_early_morning = pd.Timestamp('2021-09-01 06:00', tz=tz) - day1_work_morning = pd.Timestamp('2021-09-01 10:00', tz=tz) - day1_afternoon = pd.Timestamp('2021-09-01 15:00', tz=tz) - day1_evening = pd.Timestamp('2021-09-01 20:00', tz=tz) - weekend = pd.Timestamp('2021-09-05 08:00', tz=tz) - - def expected_state(ts: pd.Timestamp): - ts_local = ts.tz_convert(tz) - minutes = ts_local.hour * 60 + ts_local.minute - in_work = params['arrival_time'] <= minutes < params['departure_time'] - in_lunch = ( - params['lunch_start_time'] - <= minutes - < params['lunch_start_time'] + params['lunch_duration'] - ) - return ( - OccupancyStateEnum.WORK - if (in_work and not in_lunch) - else OccupancyStateEnum.AWAY - ) - - self.assertEqual(occupant.peek(day1_early_morning), OccupancyStateEnum.AWAY) - self.assertEqual( - occupant.peek(day1_work_morning), expected_state(day1_work_morning) - ) - self.assertEqual( - occupant.peek(day1_afternoon), expected_state(day1_afternoon) - ) - self.assertEqual(occupant.peek(day1_evening), OccupancyStateEnum.AWAY) - self.assertEqual(occupant.peek(weekend), OccupancyStateEnum.AWAY) - - def test_occasional_worker(self): - occupant = MinuteLevelZoneOccupant( - earliest_expected_arrival_min=EARLIEST_EXPECTED_ARRIVAL_HOUR * 60, - latest_expected_arrival_min=LATEST_EXPECTED_ARRIVAL_HOUR * 60, - earliest_expected_departure_min=EARLIEST_EXPECTED_DEPARTURE_HOUR * 60, - latest_expected_departure_min=LATEST_EXPECTED_DEPARTURE_HOUR * 60, - lunch_start_min=LUNCH_START_HOUR * 60, - lunch_end_min=LUNCH_END_HOUR * 60, - step_size=TIME_STEP, - random_state=np.random.RandomState(seed=SEED), - time_zone=DEFAULT_TIMEZONE, - worker_type=WorkerType.WEEKEND_OCCASIONAL, - weekend_work_prob=0.5, - occupant_id=13, - ) - saturday_morning = pd.Timestamp('2021-09-04 08:00', tz=DEFAULT_TIMEZONE) - saturday_afternoon = pd.Timestamp('2021-09-04 15:00', tz=DEFAULT_TIMEZONE) - work_decision_morning = occupant._should_work_today(saturday_morning) - work_decision_afternoon = occupant._should_work_today(saturday_afternoon) - self.assertEqual(work_decision_morning, work_decision_afternoon) - - def test_minutes_precision(self): - occupancy = EnhancedOccupancy( - zone_assignment=NUM_OCCUPANTS, - earliest_expected_arrival_hour=EARLIEST_EXPECTED_ARRIVAL_HOUR, - latest_expected_arrival_hour=LATEST_EXPECTED_ARRIVAL_HOUR, - earliest_expected_departure_hour=EARLIEST_EXPECTED_DEPARTURE_HOUR, - latest_expected_departure_hour=LATEST_EXPECTED_DEPARTURE_HOUR, - lunch_start_hour=LUNCH_START_HOUR, - lunch_end_hour=LUNCH_END_HOUR, - time_step=TIME_STEP, - time_zone=DEFAULT_TIMEZONE, - weekend_regular_pct=NO_WEEKEND_WORKERS_REGULAR_PCT, - weekend_occasional_pct=NO_WEEKEND_WORKERS_OCCASIONAL_PCT, - occasional_daily_prob=NO_WEEKEND_WORKERS_DAILY_PROB, - ) - time_758 = pd.Timestamp('2021-09-01 07:58', tz=DEFAULT_TIMEZONE) - time_759 = pd.Timestamp('2021-09-01 07:59', tz=DEFAULT_TIMEZONE) - morning_start = pd.Timestamp('2021-09-01 08:30', tz=DEFAULT_TIMEZONE) - morning_end = pd.Timestamp('2021-09-01 11:30', tz=DEFAULT_TIMEZONE) - occ_758 = occupancy.average_zone_occupancy( - 'zone_0', time_758, time_758 + pd.Timedelta(minutes=1) - ) - occ_759 = occupancy.average_zone_occupancy( - 'zone_0', time_759, time_759 + pd.Timedelta(minutes=1) - ) - morning_occupancy = occupancy.average_zone_occupancy( - 'zone_0', morning_start, morning_end - ) - self.assertEqual(occ_758, 0.0) - self.assertEqual(occ_759, 0.0) - self.assertGreater(morning_occupancy, 0.0) - - -if __name__ == '__main__': - absltest.main() diff --git a/smart_control/simulator/hot_water_heat_source.py b/smart_control/simulator/hot_water_heat_source.py new file mode 100644 index 00000000..771d30d7 --- /dev/null +++ b/smart_control/simulator/hot_water_heat_source.py @@ -0,0 +1,93 @@ +"""Defines the base class for hot water heating sources in sbsim. + +This module establishes the `HotWaterHeatSource` abstract base class, +which serves as the foundational contract for any equipment responsible for +generating thermal energy within a hydronic heating system. By decoupling the +heat generation physics from the broader distribution system, this architecture +allows for modular, plug-and-play building simulations. + +Overview: + In commercial HVAC systems, the method of generating hot water drastically + changes the thermodynamic math, energy consumption profiles, and efficiency + curves of the plant. A traditional gas boiler operates differently than an + Air Source Heat Pump (ASHP). + + This module standardizes how the orchestrating `HotWaterSystem` interacts + with these distinct physical units. It ensures that regardless of the + underlying technology, the system can reliably request thermal + calculations, update telemetry, and actuate controls. + +Core Abstractions: + Any concrete heat source inheriting from this class must implement the + following thermodynamic and state-management behaviors: + + * Thermal Generation (`compute_thermal_energy_rate`): Calculates the actual + power (electrical or fuel) consumed by the equipment to raise the supplied + return water to the target setpoint, factoring in mass flow rates and + environmental conditions (e.g., dynamic COP for heat pumps). + * Thermal Dissipation (`compute_thermal_dissipation_rate`): Calculates the + passive heat loss from the equipment to its surrounding ambient + environment. + * State Management: Standard properties for BMS telemetry, including + `return_water_temperature_sensor`, `run_command`, and equipment `reset()`. + +Extensibility: + To introduce a new heating technology (e.g., an Electric Resistance Boiler + or a District Hot Water Heat Exchanger) to the simulation ecosystem, + developers only need to create a new concrete class that inherits from + `HotWaterHeatSource` and implements its abstract methods. + The `gin` configuration factory will + then be able to seamlessly inject it into the overarching building model. +""" + +import abc + +from smart_buildings.smart_control.simulator import smart_device + + +class HotWaterHeatSource(smart_device.SmartDevice, abc.ABC): + """Base class for any hot water heating source (Boiler, ASHP, etc.).""" + + @abc.abstractmethod + def reset(self) -> None: + """Resets the heat source to its initial state.""" + + @property + @abc.abstractmethod + def return_water_temperature_sensor(self) -> float: + """Gets the return water temperature.""" + + @property + @abc.abstractmethod + def supply_water_temperature_setpoint(self) -> float: + """Gets the supply water setpoint.""" + + @supply_water_temperature_setpoint.setter + @abc.abstractmethod + def supply_water_temperature_setpoint(self, value: float) -> None: + """Sets the supply water setpoint.""" + + @property + @abc.abstractmethod + def run_command(self) -> smart_device.RunStatus: + """Gets the run command.""" + + @run_command.setter + @abc.abstractmethod + def run_command(self, value: smart_device.RunStatus) -> None: + """Sets the run command.""" + + @abc.abstractmethod + def compute_thermal_energy_rate( + self, + return_water_temp: float, + outside_temp: float, + flow_rate: float, + ) -> float: + """Computes energy rate in W consumed to heat the water.""" + + @abc.abstractmethod + def compute_thermal_dissipation_rate( + self, water_temp: float, outside_temp: float + ) -> float: + """Computes the thermal loss rate in W to the environment.""" diff --git a/smart_control/simulator/hot_water_system.py b/smart_control/simulator/hot_water_system.py new file mode 100644 index 00000000..627fa785 --- /dev/null +++ b/smart_control/simulator/hot_water_system.py @@ -0,0 +1,446 @@ +"""Models a commercial hot water system for building simulations. + +This module provides a flexible, discrete-time thermodynamic simulation +environment for hot water plants. It is designed to evaluate smart control +strategies, including Reinforcement Learning (RL) agents or LLM agents, +by exposing standard Building Management System (BMS) telemetry (observables) +and control points (actions). + +Architecture: + The simulation relies on a component-based, dependency-injected architecture + to separate the physics of heat generation from fluid distribution: + + * HotWaterHeatSource (Abstract Base Class): Defines the standard interface + for any hot water generating equipment. It mandates methods for + calculating thermal energy consumption, ambient thermal dissipation, and + state management. + * Concrete Heat Sources: Physical implementations of the + `HotWaterHeatSource`such as `Boiler` (traditional gas/electric heating) and + `AirSourceHeatPump` (dynamic, environment-dependent COP-based heating). + * WaterPump: Models the fluid flow and differential pressure dynamics + required to distribute the heated water to the building's terminal units + (e.g., VAVs). + * HotWaterSystem: The system orchestrator. It acts as the primary device + interface, coupling a `HotWaterHeatSource` and a `WaterPump`. It + aggregates building-level flow demand, calculates total system power draw, + and manages the mixed return water temperatures. + +Thermodynamics & Physics: + * Energy calculations rely on steady-state heat transfer equations + (Q = m * c_p * dT), dynamically constrained by the physical capacity + limits and efficiencies of the instantiated equipment. + * Flow calculations utilize square-root pressure-to-flow relationships + adjusted by the specified piping header resistance. + +Configuration: + Major physical parameters, setpoints, and equipment types are exposed via + the `gin` configuration framework. This allows researchers to seamlessly + switch a simulation from a legacy boiler system to a modernized heat pump + array strictly through configuration files, without altering the + underlying Python code. +""" + +import enum +import math +import uuid +import gin +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import air_source_heat_pump +from smart_buildings.smart_control.simulator import boiler as boiler_py +from smart_buildings.smart_control.simulator import hot_water_heat_source +from smart_buildings.smart_control.simulator import pump as pump_py +from smart_buildings.smart_control.simulator import smart_device + +ZoneID = str + +# Default ASHP parameters. +DEFAULT_ASHP_MAX_CAPACITY_W: float = 180000.0 +DEFAULT_ASHP_NOMINAL_COP: float = 3.2 + + +@gin.constants_from_enum +class HeatSourceType(enum.Enum): + BOILER = 1 + ASHP = 2 + + +@gin.configurable +class HotWaterSystem(smart_device.SmartDevice): + """A model of a commercial hot water system. + + For simplicity, we model a single pump and heat source. We can view multiple + sources/pumps as a single big boiler/pump that has their combined capacity. + + TODO: sipple - Add support for multiple pumps and multiple heat sources. + + Attributes: + heat_source: a boiler or ASHP responsible for heating water + pump: a pump respnsible for circulating water to the VAVs + device_id: unique name of the device. + run_command: Run command of the hot water system. + differential_pressure: Differential pressure setpoint of the hot water + system in bars. + header_resistance: Resistance of the header in bar/(m^3/h)^2 + """ + + def __init__( + self, + heat_source: hot_water_heat_source.HotWaterHeatSource, + pump: pump_py.WaterPump, + device_id: str | None = None, + header_resistance: float = 0.0, + ): + observable_fields = { + smart_device.SUPPLY_WATER_TEMPERATURE_SETPOINT: ( + smart_device.AttributeInfo( + smart_device.SUPPLY_WATER_TEMPERATURE_SETPOINT, float + ) + ), + smart_device.SUPPLY_WATER_TEMPERATURE_SENSOR: ( + smart_device.AttributeInfo( + smart_device.SUPPLY_WATER_TEMPERATURE_SENSOR, float + ) + ), + smart_device.HEATING_REQUEST_COUNT: smart_device.AttributeInfo( + smart_device.HEATING_REQUEST_COUNT, int + ), + smart_device.SUPERVISOR_RUN_COMMAND: smart_device.AttributeInfo( + smart_device.RUN_COMMAND, smart_device.RunStatus + ), + smart_device.RUN_STATUS: smart_device.AttributeInfo( + smart_device.RUN_STATUS, smart_device.RunStatus + ), + smart_device.DIFFERENTIAL_PRESSURE_SETPOINT: smart_device.AttributeInfo( + smart_device.DIFFERENTIAL_PRESSURE_SETPOINT, float + ), + smart_device.DIFFERENTIAL_PRESSURE_SENSOR: smart_device.AttributeInfo( + smart_device.DIFFERENTIAL_PRESSURE_SENSOR, float + ), + } + + action_fields = { + smart_device.SUPPLY_WATER_TEMPERATURE_SETPOINT: ( + smart_device.AttributeInfo( + smart_device.SUPPLY_WATER_TEMPERATURE_SETPOINT, float + ) + ), + smart_device.SUPERVISOR_RUN_COMMAND: smart_device.AttributeInfo( + smart_device.RUN_COMMAND, smart_device.RunStatus + ), + smart_device.DIFFERENTIAL_PRESSURE_SETPOINT: smart_device.AttributeInfo( + smart_device.DIFFERENTIAL_PRESSURE_SETPOINT, float + ), + } + + if device_id is None: + device_id = f"hot_water_system_id_{uuid.uuid4()}" + + super().__init__( + observable_fields, + action_fields, + device_type=smart_control_building_pb2.DeviceInfo.DeviceType.HWS, + device_id=device_id, + ) + + self._heat_source = heat_source + self._pump = pump + self._header_resistance = header_resistance + self.reset() + + def reset(self): + self.reset_demand() + self._heat_source.reset() + self._pump.reset() + self._run_command = smart_device.RunStatus.ON + + def reset_demand(self) -> None: + self.flow_rate = 0.0 + self._heating_request_count = 0 + self._flow_factor_sum = 0.0 + + @property + def heat_source_device_type( + self, + ) -> smart_control_building_pb2.DeviceInfo.DeviceType: + return self._heat_source.device_type() + + @property + def return_water_temperature_sensor(self) -> float: + return self._heat_source.return_water_temperature_sensor + + @return_water_temperature_sensor.setter + def return_water_temperature_sensor(self, value: float) -> None: + self._heat_source.return_water_temperature_sensor = value + + @property + def supply_water_temperature_setpoint(self) -> float: + return self._heat_source.get_observation( + smart_device.SUPPLY_WATER_TEMPERATURE_SETPOINT, + self._observation_timestamp, + ) + + @supply_water_temperature_setpoint.setter + def supply_water_temperature_setpoint(self, value: float) -> None: + self._heat_source.set_action( + smart_device.SUPPLY_WATER_TEMPERATURE_SETPOINT, + value, + self._action_timestamp, + ) + + @property + def heating_request_count(self) -> int: + return self._heating_request_count + + @property + def supply_water_temperature_sensor(self) -> float: + return self._heat_source.get_observation( + smart_device.SUPPLY_WATER_TEMPERATURE_SENSOR, + self._observation_timestamp, + ) + + @property + def run_status(self) -> smart_device.RunStatus: + return self._run_command + + @property + def run_command(self) -> smart_device.RunStatus: + return self._run_command + + @run_command.setter + def run_command(self, value: smart_device.RunStatus) -> None: + self._run_command = value + self._heat_source.run_command = value + self._pump.run_command = value + + @property + def water_pump_differential_head(self) -> float: + return self._pump.water_pump_differential_head + + @water_pump_differential_head.setter + def water_pump_differential_head(self, value: float) -> None: + self._pump.water_pump_differential_head = value + + @property + def differential_pressure_sensor(self) -> float: + # TODO(sipple) Add differential pressure sensor to the pump model. + return self._pump.differential_pressure_setpoint + + @property + def differential_pressure_setpoint(self) -> float: + return self._pump.differential_pressure_setpoint + + @differential_pressure_setpoint.setter + def differential_pressure_setpoint(self, value: float) -> None: + self._pump.differential_pressure_setpoint = value + + def add_demand(self, flow_factor: float): + """Adds to current flow rate demand. + + Args: + flow_factor: The flow factor of the VAV. + + Raises: + ValueError: If flow_rate is less than 0. + """ + if flow_factor < 0.0: + raise ValueError("Flow factor cannot be less than 0.") + + self._flow_factor_sum += flow_factor + self._heating_request_count += 1 + + @property + def flow_factor_sum(self) -> float: + return self._flow_factor_sum + + def compute_thermal_energy_rate( + self, return_water_temp: float | list[float], outside_temp: float + ) -> float: + """Returns energy rate in W consumed by boiler to heat water. + + Args: + return_water_temp: Temperature in K that water is received at. + outside_temp: Temperature in K that the water tank is in. + """ + return self._heat_source.compute_thermal_energy_rate( + return_water_temp, outside_temp, self.total_flow_rate + ) + + def compute_thermal_dissipation_rate( + self, water_temp: float | list[float], outside_temp: float + ) -> float: + """Returns the amount of thermal loss in W from a boiler tank. + + Args: + water_temp: average temperature of the water [K] + outside_temp: temperature outside of the tank, can be ambient [K] + + Returns: + thermal loss rate of the tank in Watts + """ + return self._heat_source.compute_thermal_dissipation_rate( + water_temp, outside_temp + ) + + def compute_pump_power(self): + """Returns power consumed by pump in W to move water to VAVs.""" + return self._pump.compute_pump_power(self.total_flow_rate) + + def _calculate_flow_rate( + self, differential_pressure: float, flow_factor: float + ) -> float: + """Calculates the total water flow rate based on pressure and demand. + + Args: + differential_pressure: The pressure from the pump in bar. + flow_factor: The flow factor of the VAV. + + Returns: + The calculated total flow rate in cubic meters per second (m^3/s). + """ + + flow_rate = flow_factor * math.sqrt( + differential_pressure / (1 + flow_factor**2 * self._header_resistance) + ) + assert not math.isnan(flow_rate) + return flow_rate + + @property + def total_flow_rate(self) -> float: + return self._calculate_flow_rate( + self.differential_pressure_setpoint, self._flow_factor_sum + ) + + def set_action(self, action_field_name, value, action_timestamp): + if "supervisor_run_command" in action_field_name: + if value == 1: + value = smart_device.RunStatus.ON + else: + value = smart_device.RunStatus.OFF + self._pump.run_command = value + super().set_action(action_field_name, value, action_timestamp) + + +# TODO(sipple): Add keyword arguments for all parameters in construct_hot_water_ +# system. +@gin.configurable +def construct_hot_water_system( + # --- Shared System & Pump Parameters --- + water_pump_differential_head: float, + water_pump_efficiency: float, + supply_water_temperature_setpoint: float, + device_id: str | None = None, + pump_device_id: str | None = None, + heat_source_device_id: str | None = None, + header_resistance: float = 0.0, + # --- Heat Source Toggle --- + heat_source_type: HeatSourceType = HeatSourceType.BOILER, + init_return_water_temperature_sensor: float = 295.0, + # --- Boiler-Specific Parameters --- + heating_rate: float | None = 0, + cooling_rate: float | None = 0, + convection_coefficient: float | None = 5.6, + tank_length: float | None = 2.0, + tank_radius: float | None = 0.5, + water_capacity: float | None = 1.5, + insulation_conductivity: float | None = 0.067, + insulation_thickness: float | None = 0.06, + # --- ASHP-Specific Parameters --- + ashp_max_capacity_w: float = DEFAULT_ASHP_MAX_CAPACITY_W, + ashp_nominal_cop: float = DEFAULT_ASHP_NOMINAL_COP, +) -> HotWaterSystem: + """Constructs a hot water system based on the requested heat source. + + How to use this in .gin configuration files: + + Example 1: A traditional building with a Boiler + ```gin + construct_hot_water_system.heat_source_type = "boiler" + construct_hot_water_system.supply_water_temperature_setpoint = 338.0 # 65C + construct_hot_water_system.water_pump_differential_head = 15.0 + construct_hot_water_system.water_pump_efficiency = 0.75 + # Boiler specific configs + construct_hot_water_system.water_capacity = 2.0 + construct_hot_water_system.insulation_thickness = 0.08 + + + Example 2: A building with an Air Source Heat Pump + ```gin + construct_hot_water_system.heat_source_type = "ashp" + # 40C / 104F (Lower temp for ASHP efficiency) + construct_hot_water_system.water_pump_differential_head = 15.0 + construct_hot_water_system.reheat_water_setpoint = 313.0 + construct_hot_water_system.water_pump_efficiency = 0.85 + # ASHP specific configs + construct_hot_water_system.ashp_max_capacity_w = 250000.0 + construct_hot_water_system.ashp_nominal_cop = 3.5 + ``` + + Args: + water_pump_differential_head: The differential head of the water pump in + meters of water column. + water_pump_efficiency: The efficiency of the water pump. + supply_water_temperature_setpoint: The water temperature setpoint in Kelvin. + device_id: The unique identifier for the hot water system. + pump_device_id: The unique identifier for the water pump. + heat_source_device_id: The unique identifier for the heat source. + header_resistance: The resistance of the header in bar/(m^3/h)^2. + heat_source_type: The type of heat source to use ("boiler" or "ashp"). + init_return_water_temperature_sensor: The initial return water temperature + in Kelvin. + heating_rate: The heating rate of the boiler in Watts per Kelvin. + cooling_rate: The cooling rate of the boiler in Watts per Kelvin. + convection_coefficient: The convection coefficient of the boiler in + W/(m^2*K). + tank_length: The length of the boiler tank in meters. + tank_radius: The radius of the boiler tank in meters. + water_capacity: The volume of water the boiler tank can hold in m^3. + insulation_conductivity: The thermal conductivity of the boiler tank + insulation in W/(m*K). + insulation_thickness: The thickness of the boiler tank insulation in meters. + ashp_max_capacity_w: The maximum heating capacity of the ASHP in Watts. + ashp_nominal_cop: The nominal Coefficient of Performance of the ASHP. + """ + + # 1. Instantiate the requested Heat Source + if heat_source_type == HeatSourceType.ASHP: + heat_source = air_source_heat_pump.AirSourceHeatPump( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + device_id=heat_source_device_id, + max_heating_capacity_w=ashp_max_capacity_w, + nominal_cop=ashp_nominal_cop, + init_return_water_temperature_sensor=init_return_water_temperature_sensor, + ) + elif heat_source_type == HeatSourceType.BOILER: + heat_source = boiler_py.Boiler( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + device_id=heat_source_device_id, + heating_rate=heating_rate, + cooling_rate=cooling_rate, + convection_coefficient=convection_coefficient, + tank_length=tank_length, + tank_radius=tank_radius, + water_capacity=water_capacity, + insulation_conductivity=insulation_conductivity, + insulation_thickness=insulation_thickness, + init_return_water_temperature_sensor=init_return_water_temperature_sensor, + ) + else: + raise ValueError( + f"Unknown heat_source_type: '{heat_source_type}'. " + "Must be HeatSourceType.BOILER or HeatSourceType.ASHP." + ) + + # 2. Instantiate the Pump + pump = pump_py.WaterPump( + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=water_pump_efficiency, + device_id=pump_device_id, + ) + + # 3. Assemble and return the System + return HotWaterSystem( + heat_source=heat_source, + pump=pump, + device_id=device_id, + header_resistance=header_resistance, + ) diff --git a/smart_control/simulator/hot_water_system_test.py b/smart_control/simulator/hot_water_system_test.py new file mode 100644 index 00000000..f5debf78 --- /dev/null +++ b/smart_control/simulator/hot_water_system_test.py @@ -0,0 +1,664 @@ +import math +from unittest import mock +from absl.testing import absltest +from absl.testing import parameterized +import pandas as pd +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import air_source_heat_pump as ashp +from smart_buildings.smart_control.simulator import boiler +from smart_buildings.smart_control.simulator import hot_water_system +from smart_buildings.smart_control.simulator import pump +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.utils import constants + + +def get_single_boiler_hot_water_system( + b: boiler.Boiler, + p: pump.WaterPump, +) -> hot_water_system.HotWaterSystem: + return hot_water_system.HotWaterSystem(b, p, device_id='hws_id') + + +def get_ashp_hot_water_system( + a: ashp.AirSourceHeatPump, + p: pump.WaterPump, +) -> hot_water_system.HotWaterSystem: + """Factory for an ASHP-driven hot water system.""" + return hot_water_system.HotWaterSystem(a, p, device_id='hws_ashp_id') + + +differential_head_val = 10.204081632653061 + + +class HotWaterSystemTest(parameterized.TestCase): + + def get_default_boiler(self): + supply_water_temperature_setpoint = 360 + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + return get_single_boiler_hot_water_system( + boiler.Boiler( + supply_water_temperature_setpoint, + device_id='boiler_id', + heating_rate=0.0, + cooling_rate=0.0, + convection_coefficient=5.6, + tank_length=2.0, + tank_radius=0.5, + water_capacity=1.5, + insulation_conductivity=0.067, + insulation_thickness=0.06, + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + + def test_init(self): + supply_water_temperature_setpoint = 260 + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + b = get_single_boiler_hot_water_system( + boiler.Boiler( + supply_water_temperature_setpoint, + device_id='boiler_id', + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + + self.assertEqual( + b.supply_water_temperature_setpoint, supply_water_temperature_setpoint + ) + self.assertEqual( + b.water_pump_differential_head, water_pump_differential_head + ) + self.assertEqual(b._pump._water_pump_efficiency, water_pump_efficiency) + self.assertEqual(b.total_flow_rate, 0) + + def test_reset(self): + supply_water_temperature_setpoint = 260 + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + b = get_single_boiler_hot_water_system( + boiler.Boiler( + supply_water_temperature_setpoint, + device_id='boiler_id', + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + + b.supply_water_temperature_setpoint += 1.0 + b.water_pump_differential_head = 4.0 + b._pump._water_pump_efficiency = 0.1 + b._heating_request_count = 10 + b._return_water_temperature_sensor = 310.0 + + b.reset() + + self.assertEqual( + b.supply_water_temperature_setpoint, supply_water_temperature_setpoint + ) + self.assertEqual( + b.water_pump_differential_head, water_pump_differential_head + ) + self.assertEqual(b._pump._water_pump_efficiency, water_pump_efficiency) + self.assertEqual(b.total_flow_rate, 0) + + def test_init_default_id(self): + supply_water_temperature_setpoint = 260 + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + b = get_single_boiler_hot_water_system( + boiler.Boiler( + supply_water_temperature_setpoint, + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + self.assertIsNotNone(b._device_id) + + def test_reset_demand(self): + b = self.get_default_boiler() + + b.add_demand(5) + b.reset_demand() + + self.assertEqual(b.total_flow_rate, 0) + self.assertEqual(b.heating_request_count, 0) + + def test_add_demand(self): + b = self.get_default_boiler() + + b.add_demand(5) + self.assertEqual(b._flow_factor_sum, 5) + self.assertEqual(b.heating_request_count, 1) + + def test_add_demand_raises_value_error(self): + b = self.get_default_boiler() + + with self.assertRaisesRegex( + ValueError, 'Flow factor cannot be less than 0.' + ): + b.add_demand(-0.01) + + def test_ashp_system_integration(self): + """Verifies that the HotWaterSystem works properly with an ASHP.""" + supply_water_temperature_setpoint = 313.15 # 40C + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + + sys = get_ashp_hot_water_system( + ashp.AirSourceHeatPump( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + device_id='ashp_id', + max_heating_capacity_w=180000.0, + nominal_cop=3.2, + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + + self.assertEqual(sys.device_id(), 'hws_ashp_id') + self.assertEqual( + sys.supply_water_temperature_setpoint, supply_water_temperature_setpoint + ) + + # Mock observation to simulate standard conditions + sys._heat_source.get_observation = mock.MagicMock(return_value=313.15) + sys.add_demand(0.002) # Trigger flow + + power = sys.compute_thermal_energy_rate( + return_water_temp=308.15, outside_temp=280.15 + ) + self.assertGreater(power, 0.0) # Ensure delegating calculation works + + def test_compute_thermal_energy_rate_heating(self): + b = self.get_default_boiler() + setpoint_temperature = 370.0 + return_water_temp = 300 + outside_temp = 280 + q0 = b.compute_thermal_energy_rate(return_water_temp, outside_temp) + b.supply_water_temperature_setpoint = setpoint_temperature + _ = b._heat_source._adjust_temperature( + setpoint_temperature, outside_temp, pd.Timedelta(5, unit='minute') + ) + b._last_step_duration = pd.Timedelta(5, unit='minute') + q1 = b.compute_thermal_energy_rate(return_water_temp, outside_temp) + + self.assertAlmostEqual(500.066862, q0, places=4) + self.assertAlmostEqual(562.57521, q1, places=4) + + @parameterized.parameters( + (340.0, 300.0, 280.0, 0.6, 100695.0501), + (300.0, 300.0, 280.0, 0.6, 125.0167), + (300.0, 300.0, 280.0, 0.01, 125.0167), + (300.0, 300.0, 300.0, 0.01, 0.0), + ) + def test_compute_thermal_energy_rate( + self, + water_temp_setpoint, + return_water_temp, + outside_temp, + total_flow_rate, + expected_energy_rate, + ): + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + b = get_single_boiler_hot_water_system( + boiler.Boiler( + water_temp_setpoint, + device_id='boiler_id', + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + self.assertEqual(b._pump.differential_pressure_setpoint, 1) + b.add_demand(total_flow_rate) + self.assertAlmostEqual( + b.compute_thermal_energy_rate(return_water_temp, outside_temp), + expected_energy_rate, + places=3, + ) + + def test_compute_thermal_energy_rate_zero(self): + return_water_temp = 200 + total_flow_rate = 0.5 + supply_water_temperature_setpoint = 100 + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + outside_temp = 293 + b = get_single_boiler_hot_water_system( + boiler.Boiler( + supply_water_temperature_setpoint, + device_id='boiler_id', + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + + b.add_demand(total_flow_rate) + + self.assertAlmostEqual( + b.compute_thermal_energy_rate(return_water_temp, outside_temp), + 0.0, + places=3, + ) + + @parameterized.parameters( + (330.0, 290.0, pd.Timedelta(60, unit='second'), 0.0, 0.0, 290.0), + (330.0, 290.0, pd.Timedelta(60, unit='second'), 2.0, 0.0, 292.0), + (300.0, 290.0, pd.Timedelta(600, unit='second'), 2.0, 0.0, 300.0), + (320.0, 330.0, pd.Timedelta(60, unit='second'), 0.0, 0.5, 329.5), + (320.0, 330.0, pd.Timedelta(600, unit='second'), 0.0, 2.0, 320.0), + ) + def test_adjust_temperature( + self, + setpoint_temperature, + actual_temperature, + time_difference, + heating_rate, + cooling_rate, + expected_temperature, + ): + supply_water_temperature_setpoint = 310 + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + b = get_single_boiler_hot_water_system( + boiler.Boiler( + supply_water_temperature_setpoint, + device_id='boiler_id', + heating_rate=heating_rate, + cooling_rate=cooling_rate, + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + + self.assertAlmostEqual( + expected_temperature, + b._heat_source._adjust_temperature( + setpoint_temperature, actual_temperature, time_difference + ), + ) + + @parameterized.parameters( + (0.5, 3, 0.9), + (0.2, 7, 0.5), + (0.5, 8, 0.23), + (0.5, 9, 0.7), + ) + def test_compute_pump_power( + self, + total_flow_factor, + water_pump_differential_head, + water_pump_efficiency, + ): + supply_water_temperature_setpoint = 100 + b = get_single_boiler_hot_water_system( + boiler.Boiler( + supply_water_temperature_setpoint, + device_id='boiler_id', + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + + b.add_demand(total_flow_factor) + + expected = ( + total_flow_factor + * math.sqrt(b.differential_pressure_setpoint) + * constants.WATER_DENSITY + * constants.GRAVITY + * water_pump_differential_head + / water_pump_efficiency + ) + self.assertEqual(b.compute_pump_power(), expected) + + def test_observable_field_names(self): + b = self.get_default_boiler() + + self.assertSameElements( + b.observable_field_names(), + [ + 'supply_water_temperature_setpoint', + 'supply_water_temperature_sensor', + 'heating_request_count', + 'differential_pressure_setpoint', + 'differential_pressure_sensor', + 'supervisor_run_command', + 'run_status', + ], + ) + + def test_observe_supply_water_temperature_setpoint(self): + supply_water_temperature_setpoint = 360 + b = self.get_default_boiler() + + observed_value = b.get_observation( + 'supply_water_temperature_setpoint', pd.Timestamp('2021-09-01 10:00') + ) + + self.assertEqual(observed_value, supply_water_temperature_setpoint) + + def test_observe_supply_water_temperature_sensor(self): + supply_water_temperature_setpoint = 360 + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + heating_rate = 2.0 + cooling_rate = 0.5 + b = get_single_boiler_hot_water_system( + boiler.Boiler( + supply_water_temperature_setpoint, + device_id='boiler_id', + heating_rate=heating_rate, + cooling_rate=cooling_rate, + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + + # Start with a temp & setpoint at 360. + observed_value = b.get_observation( + 'supply_water_temperature_sensor', pd.Timestamp('2021-09-01 10:00') + ) + self.assertEqual(observed_value, supply_water_temperature_setpoint) + + # Up the setpoint to 365, one minute later, the temp should go to 362. + b.set_action( + 'supply_water_temperature_setpoint', + 365.0, + pd.Timestamp('2021-09-01 10:00:00'), + ) + observed_value = b.get_observation( + 'supply_water_temperature_sensor', pd.Timestamp('2021-09-01 10:01') + ) + self.assertEqual(b._heat_source._has_tank, True) + + self.assertAlmostEqual(observed_value, 362.0) + + # At 10 min after the change, the temp should be at set point, 365. + observed_value = b.get_observation( + 'supply_water_temperature_sensor', pd.Timestamp('2021-09-01 10:10') + ) + self.assertAlmostEqual(observed_value, 365.0) + + # Drop the setpoint to 350; after 20 min, should drop to 355. + b.set_action( + 'supply_water_temperature_setpoint', + 350.0, + pd.Timestamp('2021-09-01 10:10:00'), + ) + + observed_value = b.get_observation( + 'supply_water_temperature_sensor', pd.Timestamp('2021-09-01 10:30') + ) + self.assertAlmostEqual(observed_value, 355.0) + + # And 50 min later should be at setpoint (no lower). + observed_value = b.get_observation( + 'supply_water_temperature_sensor', pd.Timestamp('2021-09-01 11:00') + ) + self.assertAlmostEqual(observed_value, 350.0) + + @parameterized.parameters( + ( + 300.0, + 310.0, + pd.Timestamp('2021-09-01 11:00'), + pd.Timestamp('2021-09-01 11:10'), + 0.0, + 0.0, + 310.0, + 137.518, + ), + ( + 300.0, + 310.0, + pd.Timestamp('2021-09-01 11:00'), + pd.Timestamp('2021-09-01 11:05'), + 1.0, + 1.0, + 305.0, + 242.0183, + ), + ( + 300.0, + 320.0, + pd.Timestamp('2021-09-01 11:00'), + pd.Timestamp('2021-09-01 11:30'), + 5.0, + 1.0, + 320.0, + 269.6934, + ), + ( + 320.0, + 300.0, + pd.Timestamp('2021-09-01 11:00'), + pd.Timestamp('2021-09-01 11:05'), + 5.0, + 2.0, + 310.0, + -133.9899, + ), + ( + 320.0, + 300.0, + pd.Timestamp('2021-09-01 11:00'), + pd.Timestamp('2021-09-01 11:30'), + 5.0, + 1.0, + 300.0, + 5.3433, + ), + ) + def test_set_current_temperature_default( + self, + current_temp, + setpoint_temp, + action_timestamp, + observation_timestamp, + heating_rate, + cooling_rate, + expected_temp, + expected_energy_rate, + ): + supply_water_temperature_setpoint = current_temp + water_pump_differential_head = differential_head_val + water_pump_efficiency = 0.6 + b = get_single_boiler_hot_water_system( + boiler.Boiler( + supply_water_temperature_setpoint, + device_id='boiler_id', + heating_rate=heating_rate, + cooling_rate=cooling_rate, + ), + pump.WaterPump( + water_pump_differential_head, + water_pump_efficiency, + device_id='pump_id', + ), + ) + + b.set_action( + 'supply_water_temperature_setpoint', setpoint_temp, action_timestamp + ) + + observed_temp = b.get_observation( + 'supply_water_temperature_sensor', observation_timestamp + ) + + self.assertAlmostEqual(expected_temp, observed_temp) + energy_rate = b.compute_thermal_energy_rate(300, 288) + self.assertAlmostEqual(expected_energy_rate, energy_rate, places=3) + + def test_observe_heating_request_count(self): + b = self.get_default_boiler() + + b.add_demand(1.5) + b.add_demand(1.5) + + observed_value = b.get_observation( + 'heating_request_count', pd.Timestamp('2021-09-01 10:00') + ) + + self.assertEqual(observed_value, 2) + + def test_compute_thermal_dissipation_rate_valid(self): + b = self.get_default_boiler() + q = b.compute_thermal_dissipation_rate(340.0, 290.0) + self.assertAlmostEqual(q, 312.5418, places=4) + + def test_compute_thermal_dissipation_rate_zero(self): + b = self.get_default_boiler() + q = b.compute_thermal_dissipation_rate(290.0, 290.0) + self.assertAlmostEqual(q, 0.0, places=4) + + def test_compute_thermal_dissipation_rate_zero_low_temp(self): + b = self.get_default_boiler() + self.assertAlmostEqual( + b.compute_thermal_dissipation_rate(240.0, 290.0), 0.0 + ) + + def test_action_field_names(self): + b = self.get_default_boiler() + + self.assertSameElements( + b.action_field_names(), + [ + 'supply_water_temperature_setpoint', + 'differential_pressure_setpoint', + 'supervisor_run_command', + ], + ) + + def test_action_supply_water_temperature_setpoint(self): + b = self.get_default_boiler() + + new_value = 280.0 + b.set_action( + 'supply_water_temperature_setpoint', + new_value, + pd.Timestamp('2021-09-01 10:00'), + ) + + self.assertEqual(b.supply_water_temperature_setpoint, new_value) + + def test_device_type(self): + b = self.get_default_boiler() + + device_type = b.device_type() + + self.assertEqual( + device_type, smart_control_building_pb2.DeviceInfo.DeviceType.HWS + ) + + def test_run_status(self): + b = self.get_default_boiler() + + self.assertEqual(b.run_status, smart_device.RunStatus.ON) + + b.run_command = smart_device.RunStatus.OFF + self.assertEqual(b.run_status, smart_device.RunStatus.OFF) + + b.run_command = smart_device.RunStatus.ON + self.assertEqual(b.run_status, smart_device.RunStatus.ON) + + def test_device_id(self): + b = self.get_default_boiler() + + device_id = b.device_id() + + self.assertEqual(device_id, 'hws_id') + + def test_differential_pressure(self): + b = self.get_default_boiler() + # Default differential pressure setpoint of the pump is 1.0 + self.assertAlmostEqual(b.differential_pressure_setpoint, 1.0) + self.assertAlmostEqual(b.differential_pressure_sensor, 1.0) + + b.differential_pressure_setpoint = 2.5 + self.assertAlmostEqual(b.differential_pressure_setpoint, 2.5) + self.assertAlmostEqual(b.differential_pressure_sensor, 2.5) + + def test_construct_hot_water_system_boiler(self): + system = hot_water_system.construct_hot_water_system( + heat_source_type=hot_water_system.HeatSourceType.BOILER, + supply_water_temperature_setpoint=313.0, + water_pump_differential_head=15.0, + water_pump_efficiency=0.85, + heating_rate=0.0, + cooling_rate=0.0, + convection_coefficient=5.6, + tank_length=2.0, + tank_radius=0.5, + water_capacity=1.5, + insulation_conductivity=0.067, + insulation_thickness=0.06, + ) + self.assertIsInstance(system, hot_water_system.HotWaterSystem) + self.assertIsInstance(system._heat_source, boiler.Boiler) + self.assertEqual(system.supply_water_temperature_setpoint, 313.0) + self.assertEqual(system.water_pump_differential_head, 15.0) + self.assertEqual(system._pump._water_pump_efficiency, 0.85) + self.assertEqual(system._heat_source._heating_rate, 0.0) + self.assertEqual(system._heat_source._cooling_rate, 0.0) + self.assertEqual(system._heat_source._convection_coefficient, 5.6) + self.assertEqual(system._heat_source._tank_length, 2.0) + self.assertEqual(system._heat_source._tank_radius, 0.5) + self.assertEqual(system._heat_source._water_capacity, 1.5) + self.assertEqual(system._heat_source._insulation_conductivity, 0.067) + self.assertEqual(system._heat_source._insulation_thickness, 0.06) + + def test_construct_hot_water_system_ashp(self): + system = hot_water_system.construct_hot_water_system( + heat_source_type=hot_water_system.HeatSourceType.ASHP, + supply_water_temperature_setpoint=313.0, + water_pump_differential_head=15.0, + water_pump_efficiency=0.85, + ashp_max_capacity_w=250000.0, + ashp_nominal_cop=3.5, + ) + self.assertIsInstance(system, hot_water_system.HotWaterSystem) + self.assertIsInstance(system._heat_source, ashp.AirSourceHeatPump) + self.assertEqual(system.supply_water_temperature_setpoint, 313.0) + self.assertEqual(system.water_pump_differential_head, 15.0) + self.assertEqual(system._pump._water_pump_efficiency, 0.85) + self.assertEqual(system._heat_source._max_capacity_w, 250000.0) + self.assertEqual(system._heat_source._nominal_cop, 3.5) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/simulator/hvac.py b/smart_control/simulator/hvac.py index 8e2c5af6..bb6931e4 100644 --- a/smart_control/simulator/hvac.py +++ b/smart_control/simulator/hvac.py @@ -1,33 +1,33 @@ """Models HVAC for simulation. -The model assumes a single boiler and air handler, with one VAV per zone in the -building. +The model assumes a hot water system with a single boiler, and a single air +handler, with one VAV per zone in the building. """ from typing import List, Mapping, Tuple import gin import pandas as pd - -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import air_handler as air_handler_py -from smart_control.simulator import boiler as boiler_py -from smart_control.simulator import setpoint_schedule -from smart_control.simulator import thermostat -from smart_control.simulator import vav -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import air_handler as air_handler_py +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import thermostat +from smart_buildings.smart_control.simulator import vav +from smart_buildings.smart_control.utils import conversion_utils @gin.configurable class Hvac: """Model for the HVAC components of the building. - Creates a single boiler and air handler, along with one vav for each zone. + Creates a single hot water system and air handler, along with one vav for each + zone. Attributes: vavs: Mapping from zone_coordinates to VAV. air_handler: AirHandler - boiler: Boiler + hot_water_system: HotWaterSystem zone_infos: information about each zone in the building. """ @@ -35,23 +35,26 @@ def __init__( self, zone_coordinates: List[Tuple[int, int]], air_handler: air_handler_py.AirHandler, - boiler: boiler_py.Boiler, + hot_water_system: hot_water_system_py.HotWaterSystem, schedule: setpoint_schedule.SetpointSchedule, vav_max_air_flow_rate: float, vav_reheat_max_water_flow_rate: float, + vav_max_air_flow_static_pressure: float = 20000.0, ): """Initialize HVAC. Args: zone_coordinates: List of 2-tuple containing zone coordinates to service. air_handler: the air handler for hte HVAC - boiler: the boiler for the HVAC + hot_water_system: the hot water system for the HVAC schedule: the setpoint_schedule for the thermostats vav_max_air_flow_rate: the max airflow rate for the vavs vav_reheat_max_water_flow_rate: the max water reheat flowrate for the vavs + vav_max_air_flow_static_pressure: the air flow static pressure for the + vavs at which the max air flow rate can be reached. """ self._air_handler = air_handler - self._boiler = boiler + self._hot_water_system = hot_water_system self._vav_max_air_flow_rate = vav_max_air_flow_rate self._vav_reheat_max_water_flow_rate = vav_reheat_max_water_flow_rate self._zone_coordinates = zone_coordinates @@ -67,9 +70,11 @@ def __init__( self._vav_max_air_flow_rate, self._vav_reheat_max_water_flow_rate, therm, - self._boiler, + self._hot_water_system, + self._air_handler, device_id=device_id, zone_id=zone_id, + max_air_flow_static_pressure=vav_max_air_flow_static_pressure, ) self._zone_infos[z] = smart_control_building_pb2.ZoneInfo( zone_id=zone_id, @@ -83,7 +88,7 @@ def __init__( def reset(self): self.air_handler.reset() - self.boiler.reset() + self.hot_water_system.reset() for z in self._zone_coordinates: self._vavs[z].reset() @@ -96,8 +101,8 @@ def air_handler(self) -> air_handler_py.AirHandler: return self._air_handler @property - def boiler(self) -> boiler_py.Boiler: - return self._boiler + def hot_water_system(self) -> hot_water_system_py.HotWaterSystem: + return self._hot_water_system def is_comfort_mode(self, current_time: pd.Timestamp) -> bool: """Returns True if building is in comfort mode.""" diff --git a/smart_control/simulator/hvac_floorplan_based.py b/smart_control/simulator/hvac_floorplan_based.py index 3e295ae0..2d59c737 100644 --- a/smart_control/simulator/hvac_floorplan_based.py +++ b/smart_control/simulator/hvac_floorplan_based.py @@ -1,34 +1,35 @@ """Models HVAC for simulation post refactor for flexible floorplan geometries. -The model assumes a single boiler and air handler, with one VAV per zone in the +The model assumes a hot water system with a single boiler, and a singleair +handler, with one VAV per zone in the building. """ -from typing import List, Mapping, Optional +import collections +from typing import Mapping +from typing import Union import gin import pandas as pd - -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import air_handler as air_handler_py -from smart_control.simulator import boiler as boiler_py -from smart_control.simulator import constants -from smart_control.simulator import setpoint_schedule -from smart_control.simulator import thermostat -from smart_control.simulator import vav -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.simulator import air_handler as air_handler_py +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import thermostat +from smart_buildings.smart_control.simulator import vav @gin.configurable class FloorPlanBasedHvac: """Model for the HVAC components of the building. - Creates a single boiler and air handler, along with one vav for each zone. + Creates a single hot water system and air handler, along with one vav for each + zone. Attributes: vavs: Mapping from zone_identifier to VAV. air_handler: AirHandler - boiler: Boiler + hot_water_system: HotWaterSystem zone_infos: information about each zone in the building. fill_zone_identifier_exogenously: flag to tell simulator to fill the zone coordinates exogenously or not. @@ -36,83 +37,151 @@ class FloorPlanBasedHvac: def __init__( self, - air_handler: air_handler_py.AirHandler, - boiler: boiler_py.Boiler, + air_handler: Union[ + air_handler_py.AirHandler, air_handler_py.AirHandlerSystem + ], + hot_water_system: hot_water_system_py.HotWaterSystem, schedule: setpoint_schedule.SetpointSchedule, vav_max_air_flow_rate: float, - vav_reheat_max_water_flow_rate: float, - zone_identifier: Optional[List[str]] = None, + vav_reheat_max_water_flow_factor: float, + zone_to_vavs: Mapping[str, list[str]] | None = None, + vav_max_air_flow_static_pressure: float = 20000.0, + zone_identifier: list[str] | None = None, ): """Initialize HVAC. Args: air_handler: the air handler for the HVAC - boiler: the boiler for the HVAC + hot_water_system: the hot water system for the HVAC schedule: the setpoint_schedule for the thermostats vav_max_air_flow_rate: the max airflow rate for the vavs - vav_reheat_max_water_flow_rate: the max water reheat flowrate for the vavs - zone_identifier: List of strings containing zone coordinates to service. + vav_reheat_max_water_flow_factor: the max water reheat flow factor for the + vavs in (m^3/s)/sqrt(Pa). + zone_to_vavs: mapping of custom zone to vavs. For example: + {'zone_a': ['vav_1', 'vav_2'], 'zone_b': ['vav_3']}. + vav_max_air_flow_static_pressure: the air flow static pressure for the + vavs at which the max air flow rate can be reached. + zone_identifier: list of strings containing zone coordinates to service. If None, then the Simulator which calls the hvac must have a list of rooms that it plans on passing. """ self.fill_zone_identifier_exogenously = True self._air_handler = air_handler - self._boiler = boiler + self._hot_water_system = hot_water_system self._vav_max_air_flow_rate = vav_max_air_flow_rate - self._vav_reheat_max_water_flow_rate = vav_reheat_max_water_flow_rate + self._vav_reheat_max_water_flow_factor = vav_reheat_max_water_flow_factor + self._vav_max_air_flow_static_pressure = vav_max_air_flow_static_pressure self._vavs = {} self._schedule = schedule self._zone_infos = {} if zone_identifier is not None: - self.initialize_zone_identifier(zone_identifier) + self.initialize_zone_identifier(zone_identifier, zone_to_vavs) self.fill_zone_identifier_exogenously = False - def initialize_zone_identifier(self, zone_identifier: List[str]): + @property + def schedule(self) -> setpoint_schedule.SetpointSchedule: + """Returns the building operational schedule for the HVAC.""" + return self._schedule + + @property + def vav_max_air_flow_rate(self) -> float: + """Returns the max air flow rate for the vavs.""" + return self._vav_max_air_flow_rate + + @property + def vav_reheat_max_water_flow_factor(self) -> float: + """Returns the max water reheat flow factor for the vavs.""" + return self._vav_reheat_max_water_flow_factor + + @property + def vav_max_air_flow_static_pressure(self) -> float: + """Returns the max air flow static pressure for the vavs.""" + return self._vav_max_air_flow_static_pressure + + def get_zones_for_vav(self, vav_id: str) -> list[str]: + """Returns the list of zone identifiers serviced by a specific VAV.""" + return self._vav_id_to_zones.get(vav_id, []) + + def get_vav_ids_for_zone(self, zone_id: str) -> list[str]: + """Returns the list of VAV identifiers servicing a specific zone.""" + return self._zone_to_vav_ids.get(zone_id, []) + + def initialize_zone_identifier( + self, + zone_identifier: list[str], + zone_to_vavs: Mapping[str, list[str]] | None = None, + ): """Initializes the zone devices with zone coordinates passed in. Args: zone_identifier: list of strings with the room names. + zone_to_vavs: mapping of custom zone to vavs. """ - filtered_zone_identifier = [] + if zone_to_vavs is None: + zone_to_vavs = {z: [z.replace("room", "VAV")] for z in zone_identifier} - for z in zone_identifier: - if ( - z == constants.INTERIOR_WALL_NAME_IN_ROOM_DICT - or z == constants.EXTERIOR_SPACE_NAME_IN_ROOM_DICT - ): - continue - zone_id = conversion_utils.floor_plan_based_zone_identifier_to_id( - identifier=z - ) - therm = thermostat.Thermostat(self._schedule) - device_id = f"vav_{z}" - self._vavs[z] = vav.Vav( - self._vav_max_air_flow_rate, - self._vav_reheat_max_water_flow_rate, - therm, - self._boiler, - device_id=device_id, - zone_id=zone_id, - ) - self._zone_infos[z] = smart_control_building_pb2.ZoneInfo( - zone_id=zone_id, + self._zone_to_vav_ids = zone_to_vavs + self._vav_id_to_zones = collections.defaultdict(list) + for zone, v_ids in self._zone_to_vav_ids.items(): + for v_id in v_ids: + self._vav_id_to_zones[v_id].append(zone) + + self._create_vavs() + + for z, v_ids in self._zone_to_vav_ids.items(): + self._zone_infos[z] = building_pb2.ZoneInfo( + zone_id=z, building_id="US-SIM-001", zone_description="Simulated zone", - devices=[device_id], - zone_type=smart_control_building_pb2.ZoneInfo.ROOM, + devices=v_ids, + zone_type=building_pb2.ZoneInfo.ROOM, floor=0, ) - filtered_zone_identifier.append(z) - self._zone_identifier = filtered_zone_identifier - self.reset() + + def set_override_zones(self, zones: list[building_pb2.ZoneInfo]): + """Overrides the zones in the HVAC system. + + Args: + zones: A list of ZoneInfo objects. + """ + self._zone_infos.clear() + self._zone_to_vav_ids = {} + self._vav_id_to_zones = collections.defaultdict(list) + + for zone in zones: + self._zone_infos[zone.zone_id] = zone + self._zone_to_vav_ids[zone.zone_id] = list(zone.devices) + for v_id in zone.devices: + self._vav_id_to_zones[v_id].append(zone.zone_id) + + self._create_vavs() + + def _create_vavs(self) -> None: + """Creates VAV devices for the HVAC system.""" + self._vavs = {} + for v_id, affected_zones in sorted(self._vav_id_to_zones.items()): + # Vav constructor requires a single zone as id + rep_zone = affected_zones[0] + therm = thermostat.Thermostat(self._schedule) + vav_device = vav.Vav( + max_air_flow_rate=self._vav_max_air_flow_rate, + reheat_max_water_flow_factor=self._vav_reheat_max_water_flow_factor, + therm=therm, + hot_water_system=self._hot_water_system, + air_handler=self._air_handler.get_vav_air_handler(rep_zone), + device_id=v_id, + zone_id=rep_zone, + max_air_flow_static_pressure=self._vav_max_air_flow_static_pressure, + ) + self._vavs[v_id] = vav_device def reset(self): self.air_handler.reset() - self.boiler.reset() - for z in self._zone_identifier: - self._vavs[z].reset() + self.hot_water_system.reset() + for v_id in self._vavs: + self._vavs[v_id].reset() @property def vavs(self) -> Mapping[str, vav.Vav]: @@ -123,13 +192,13 @@ def air_handler(self) -> air_handler_py.AirHandler: return self._air_handler @property - def boiler(self) -> boiler_py.Boiler: - return self._boiler + def hot_water_system(self) -> hot_water_system_py.HotWaterSystem: + return self._hot_water_system def is_comfort_mode(self, current_time: pd.Timestamp) -> bool: """Returns True if building is in comfort mode.""" return self._schedule.is_comfort_mode(current_time) @property - def zone_infos(self) -> Mapping[str, smart_control_building_pb2.ZoneInfo]: + def zone_infos(self) -> Mapping[str, building_pb2.ZoneInfo]: return self._zone_infos diff --git a/smart_control/simulator/hvac_floorplan_based_test.py b/smart_control/simulator/hvac_floorplan_based_test.py index 74935eb8..2186f673 100644 --- a/smart_control/simulator/hvac_floorplan_based_test.py +++ b/smart_control/simulator/hvac_floorplan_based_test.py @@ -1,15 +1,14 @@ -"""Tests for floor plan based hvac.""" - from typing import Collection, Optional from absl.testing import absltest import pandas as pd - -from smart_control.simulator import air_handler -from smart_control.simulator import boiler -from smart_control.simulator import hvac_floorplan_based -from smart_control.simulator import setpoint_schedule -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.simulator import air_handler +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import hvac_floorplan_based +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.simulator import weather_controller class FloorPlanBasedHvacTest(absltest.TestCase): @@ -17,7 +16,7 @@ class FloorPlanBasedHvacTest(absltest.TestCase): def setUp(self): super(FloorPlanBasedHvacTest, self).setUp() self._zone_identifier = ["room_0", "room_1", "room_2"] - self._global_boiler = self._get_default_boiler() + self._global_hot_water_system = self._get_default_hot_water_system() self._global_handler = self._get_default_air_handler() self._global_setpoint_schedule = self._get_default_setpoint_schedule() self._hvac = self._create_default_hvac(self._zone_identifier) @@ -26,45 +25,58 @@ def _create_default_hvac( self, zone_identifier: Optional[Collection[str]] = None ) -> hvac_floorplan_based.FloorPlanBasedHvac: handler = self._global_handler - b = self._global_boiler + hws = self._global_hot_water_system schedule = self._global_setpoint_schedule vav_max_air_flow_rate = 0.2 - vav_reheat_max_water_flow_rate = 0.4 + vav_reheat_max_water_flow_factor = 0.4 + zone_to_vavs = ( + {z: [f"vav_{z}"] for z in zone_identifier} if zone_identifier else {} + ) h = hvac_floorplan_based.FloorPlanBasedHvac( zone_identifier=zone_identifier, air_handler=handler, - boiler=b, + hot_water_system=hws, schedule=schedule, vav_max_air_flow_rate=vav_max_air_flow_rate, - vav_reheat_max_water_flow_rate=vav_reheat_max_water_flow_rate, + vav_reheat_max_water_flow_factor=vav_reheat_max_water_flow_factor, + zone_to_vavs=zone_to_vavs, ) return h - def _get_default_boiler(self): + def _get_default_hot_water_system(self): reheat_water_setpoint = 260 water_pump_differential_head = 3 water_pump_efficiency = 0.6 - b = boiler.Boiler( + hot_water_system = hot_water_system_py.construct_hot_water_system( reheat_water_setpoint, water_pump_differential_head, water_pump_efficiency, - "boiler_id", + "hws_id", ) - return b + return hot_water_system def _get_default_air_handler(self): + + class TestWeatherController(weather_controller.BaseWeatherController): + + def get_current_temp(self, timestamp): + del self, timestamp # Unused by this test implementation. + return 285.15 + recirculation = 0.3 - heating_air_temp_setpoint = 270 - cooling_air_temp_setpoint = 288 - fan_differential_pressure = 20000.0 - fan_efficiency = 0.8 + supply_air_temperature_setpoint = 292 + + fan_static_pressure = 20000.0 + fan_efficiency = 0.9 handler = air_handler.AirHandler( - recirculation, - heating_air_temp_setpoint, - cooling_air_temp_setpoint, - fan_differential_pressure, - fan_efficiency, + recirculation=recirculation, + supply_air_temperature_setpoint=supply_air_temperature_setpoint, + fan_static_pressure=fan_static_pressure, + fan_efficiency=fan_efficiency, + sim_weather_controller=TestWeatherController(), + device_id="ah_id", + run_command=smart_device.RunStatus.ON, ) return handler @@ -86,44 +98,44 @@ def _get_default_setpoint_schedule(self): def test_init(self): vav_max_air_flow_rate = 0.2 - vav_reheat_max_water_flow_rate = 0.4 + vav_reheat_max_water_flow_factor = 0.4 h = self._create_default_hvac(self._zone_identifier) self.assertEqual(h.air_handler, self._global_handler) - self.assertEqual(h.boiler, self._global_boiler) + self.assertEqual(h.hot_water_system, self._global_hot_water_system) - self.assertCountEqual(h.vavs.keys(), self._zone_identifier) + expected_vav_ids = [f"vav_{z}" for z in self._zone_identifier] + self.assertCountEqual(h.vavs.keys(), expected_vav_ids) for coord in self._zone_identifier: - vav = h.vavs[coord] + v_id = f"vav_{coord}" + vav = h.vavs[v_id] # vavs are not indexed by zone_id anymore self.assertEqual( vav.thermostat._setpoint_schedule, self._global_setpoint_schedule ) - self.assertEqual(vav.boiler, self._global_boiler) + self.assertEqual(vav.hot_water_system, self._global_hot_water_system) self.assertEqual(vav.max_air_flow_rate, vav_max_air_flow_rate) self.assertEqual( - vav._reheat_max_water_flow_rate, vav_reheat_max_water_flow_rate + vav._reheat_max_water_flow_factor, vav_reheat_max_water_flow_factor ) self.assertEqual( vav._zone_id, - conversion_utils.floor_plan_based_zone_identifier_to_id(coord), + coord, ) def test_reset(self): - self._hvac.boiler._return_water_temperature_sensor += 10.0 - self._hvac.boiler._water_pump_differential_head += 100.0 - self._hvac.boiler._reheat_water_setpoint += 2.0 + self._hvac.hot_water_system.water_pump_differential_head += 100.0 + self._hvac.hot_water_system.supply_water_temperature_setpoint += 2.0 self._hvac.air_handler._air_flow_rate += 0.1 - self._hvac.air_handler._fan_differential_pressure = 0.1 + self._hvac.air_handler._fan_static_pressure = 0.1 for coord in self._zone_identifier: - vav = self._hvac.vavs[coord] + vav = self._hvac.vavs[f"vav_{coord}"] vav.thermostat._setpoint_schedule.morning_start_hour += 1.0 vav.thermostat._setpoint_schedule.comfort_temp_window = (280, 310) vav.max_air_flow_rate += 0.1 - vav._reheat_max_water_flow_rate += 0.1 self._hvac.reset() @@ -131,55 +143,53 @@ def test_reset(self): self.assertEqual( self._hvac.air_handler.recirculation, expected_air_handler.recirculation ) + self.assertEqual( - self._hvac.air_handler.heating_air_temp_setpoint, - expected_air_handler.heating_air_temp_setpoint, + self._hvac.air_handler.supply_air_temperature_sensor, + expected_air_handler.supply_air_temperature_sensor, ) self.assertEqual( - self._hvac.air_handler.cooling_air_temp_setpoint, - expected_air_handler.cooling_air_temp_setpoint, + self._hvac.air_handler.supply_air_temperature_setpoint, + expected_air_handler.supply_air_temperature_setpoint, ) self.assertEqual( - self._hvac.air_handler.fan_differential_pressure, - expected_air_handler.fan_differential_pressure, + self._hvac.air_handler.outside_air_temperature_sensor, + expected_air_handler.outside_air_temperature_sensor, ) self.assertEqual( self._hvac.air_handler.fan_efficiency, expected_air_handler.fan_efficiency, ) - expected_boiler = self._global_boiler + expected_hot_water_system = self._global_hot_water_system self.assertEqual( - self._hvac.boiler.reheat_water_setpoint, - expected_boiler._reheat_water_setpoint, + self._hvac.hot_water_system.supply_water_temperature_setpoint, + expected_hot_water_system.supply_water_temperature_setpoint, ) self.assertEqual( - self._hvac.boiler._water_pump_differential_head, - expected_boiler._water_pump_differential_head, + self._hvac.hot_water_system._pump._water_pump_differential_head, + expected_hot_water_system._pump._water_pump_differential_head, ) self.assertEqual( - self._hvac.boiler._water_pump_efficiency, - expected_boiler._water_pump_efficiency, + self._hvac.hot_water_system._pump._water_pump_efficiency, + expected_hot_water_system._pump._water_pump_efficiency, ) - self.assertEqual(self._hvac.boiler._total_flow_rate, 0) + self.assertEqual(self._hvac.hot_water_system.total_flow_rate, 0) vav_max_air_flow_rate = 0.2 - vav_reheat_max_water_flow_rate = 0.4 + vav_reheat_max_water_flow_factor = 0.4 for coord in self._zone_identifier: - vav = self._hvac.vavs[coord] + vav = self._hvac.vavs[f"vav_{coord}"] self.assertEqual( vav.thermostat._setpoint_schedule, self._global_setpoint_schedule ) - self.assertEqual(vav.boiler, self._global_boiler) + self.assertEqual(vav.hot_water_system, self._global_hot_water_system) self.assertEqual(vav.max_air_flow_rate, vav_max_air_flow_rate) self.assertEqual( - vav._reheat_max_water_flow_rate, vav_reheat_max_water_flow_rate - ) - self.assertEqual( - vav._zone_id, - conversion_utils.floor_plan_based_zone_identifier_to_id(coord), + vav._reheat_max_water_flow_factor, vav_reheat_max_water_flow_factor ) + self.assertEqual(vav._zone_id, coord) def test_vav_device_ids(self): expected_vav_ids = [ @@ -190,7 +200,7 @@ def test_vav_device_ids(self): vav_ids = [] for coord in self._zone_identifier: - vav = self._hvac.vavs[coord] + vav = self._hvac.vavs[f"vav_{coord}"] vav_ids.append(vav._device_id) self.assertListEqual(vav_ids, expected_vav_ids) @@ -214,12 +224,66 @@ def test_hvac_init_without_zone_identifier(self): with self.subTest("check_fill_zone_identifier_flag"): self.assertTrue(test_hvac.fill_zone_identifier_exogenously) - zones = self._hvac.vavs.keys() - test_hvac.initialize_zone_identifier(zones) + zones = list(self._zone_identifier) + zone_to_vavs = {z: [f"vav_{z}"] for z in zones} + test_hvac.initialize_zone_identifier(zones, zone_to_vavs) with self.subTest("check_zone_assignment_is_equal"): self.assertEqual(test_hvac._vavs.keys(), self._hvac.vavs.keys()) + def test_set_override_zones(self): + hvac = self._create_default_hvac() + + zone1 = building_pb2.ZoneInfo( + zone_id="new_zone_1", + devices=["new_vav_1"] + ) + zone2 = building_pb2.ZoneInfo( + zone_id="new_zone_2", + devices=["new_vav_2"] + ) + + hvac.set_override_zones([zone1, zone2]) + + with self.subTest("check_vavs_created"): + self.assertCountEqual(hvac.vavs.keys(), ["new_vav_1", "new_vav_2"]) + + with self.subTest("check_vav_attributes"): + vav1 = hvac.vavs["new_vav_1"] + self.assertEqual(vav1._device_id, "new_vav_1") + self.assertEqual(vav1._zone_id, "new_zone_1") + + def test_set_override_zones_many_to_many(self): + hvac = self._create_default_hvac() + + zone1 = building_pb2.ZoneInfo( + zone_id="zone_1", + devices=["shared_vav", "vav_1"] + ) + zone2 = building_pb2.ZoneInfo( + zone_id="zone_2", + devices=["shared_vav", "vav_2"] + ) + + hvac.set_override_zones([zone1, zone2]) + + with self.subTest("check_vavs_created"): + self.assertCountEqual( + hvac.vavs.keys(), ["shared_vav", "vav_1", "vav_2"] + ) + + with self.subTest("check_vav_mapping"): + self.assertCountEqual( + hvac.get_zones_for_vav("shared_vav"), ["zone_1", "zone_2"] + ) + self.assertCountEqual(hvac.get_zones_for_vav("vav_1"), ["zone_1"]) + self.assertCountEqual(hvac.get_zones_for_vav("vav_2"), ["zone_2"]) + + with self.subTest("check_vav_representative_zone"): + shared_vav = hvac.vavs["shared_vav"] + self.assertEqual(shared_vav._device_id, "shared_vav") + self.assertEqual(shared_vav._zone_id, "zone_1") + if __name__ == "__main__": absltest.main() diff --git a/smart_control/simulator/hvac_test.py b/smart_control/simulator/hvac_test.py index 06b549d4..486f6d6f 100644 --- a/smart_control/simulator/hvac_test.py +++ b/smart_control/simulator/hvac_test.py @@ -1,40 +1,38 @@ -"""Tests for hvac.""" - from absl.testing import absltest import pandas as pd -from smart_control.simulator import air_handler -from smart_control.simulator import boiler -from smart_control.simulator import hvac -from smart_control.simulator import setpoint_schedule -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.simulator import air_handler +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import hvac +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.utils import conversion_utils -def _get_default_boiler(): +def _get_default_hot_water_system(): reheat_water_setpoint = 260 water_pump_differential_head = 3 water_pump_efficiency = 0.6 - b = boiler.Boiler( + hot_water_system = hot_water_system_py.construct_hot_water_system( reheat_water_setpoint, water_pump_differential_head, water_pump_efficiency, - 'boiler_id', + 'hws_id', ) - return b + return hot_water_system def _get_default_air_handler(): recirculation = 0.3 heating_air_temp_setpoint = 270 cooling_air_temp_setpoint = 288 - fan_differential_pressure = 20000.0 + fan_static_pressure = 20000.0 fan_efficiency = 0.8 handler = air_handler.AirHandler( recirculation, heating_air_temp_setpoint, cooling_air_temp_setpoint, - fan_differential_pressure, + fan_static_pressure, fan_efficiency, ) return handler @@ -62,30 +60,30 @@ class HvacTest(absltest.TestCase): def test_init(self): zone_coordinates = [(0, 0), (1, 0), (1, 1), (0, 1)] handler = _get_default_air_handler() - b = _get_default_boiler() + b = _get_default_hot_water_system() schedule = _get_default_setpoint_schedule() vav_max_air_flow_rate = 0.2 - vav_reheat_max_water_flow_rate = 0.4 + vav_reheat_max_water_flow_factor = 0.4 h = hvac.Hvac( zone_coordinates, handler, b, schedule, vav_max_air_flow_rate, - vav_reheat_max_water_flow_rate, + vav_reheat_max_water_flow_factor, ) self.assertEqual(h.air_handler, handler) - self.assertEqual(h.boiler, b) + self.assertEqual(h.hot_water_system, b) self.assertCountEqual(h.vavs.keys(), zone_coordinates) for coord in zone_coordinates: vav = h.vavs[coord] self.assertEqual(vav.thermostat._setpoint_schedule, schedule) - self.assertEqual(vav.boiler, b) + self.assertEqual(vav.hot_water_system, b) self.assertEqual(vav.max_air_flow_rate, vav_max_air_flow_rate) self.assertEqual( - vav._reheat_max_water_flow_rate, vav_reheat_max_water_flow_rate + vav._reheat_max_water_flow_factor, vav_reheat_max_water_flow_factor ) self.assertEqual( vav._zone_id, conversion_utils.zone_coordinates_to_id(coord) @@ -94,25 +92,24 @@ def test_init(self): def test_reset(self): zone_coordinates = [(0, 0), (1, 0), (1, 1), (0, 1)] handler = _get_default_air_handler() - b = _get_default_boiler() + b = _get_default_hot_water_system() schedule = _get_default_setpoint_schedule() vav_max_air_flow_rate = 0.2 - vav_reheat_max_water_flow_rate = 0.4 + vav_reheat_max_water_flow_factor = 0.4 h = hvac.Hvac( zone_coordinates, handler, b, schedule, vav_max_air_flow_rate, - vav_reheat_max_water_flow_rate, + vav_reheat_max_water_flow_factor, ) - h.boiler._return_water_temperature_sensor += 10.0 - h.boiler._water_pump_differential_head += 100.0 - h.boiler._reheat_water_setpoint += 2.0 + h.hot_water_system.water_pump_differential_head += 100.0 + h.hot_water_system.supply_water_temperature_setpoint += 2.0 h.air_handler._air_flow_rate += 0.1 - h.air_handler._fan_differential_pressure = 0.1 + h.air_handler.supply_air_static_pressure_setpoint = 0.1 for coord in zone_coordinates: vav = h.vavs[coord] @@ -120,7 +117,6 @@ def test_reset(self): vav.thermostat._setpoint_schedule.comfort_temp_window = (280, 310) vav.max_air_flow_rate += 0.1 - vav._reheat_max_water_flow_rate += 0.1 h.reset() @@ -128,42 +124,41 @@ def test_reset(self): self.assertEqual( h.air_handler.recirculation, expected_air_handler.recirculation ) + self.assertEqual( - h.air_handler.heating_air_temp_setpoint, - expected_air_handler.heating_air_temp_setpoint, - ) - self.assertEqual( - h.air_handler.cooling_air_temp_setpoint, - expected_air_handler.cooling_air_temp_setpoint, + h.air_handler.supply_air_temperature_setpoint, + expected_air_handler.supply_air_temperature_setpoint, ) self.assertEqual( - h.air_handler.fan_differential_pressure, - expected_air_handler.fan_differential_pressure, + h.air_handler.supply_air_static_pressure_setpoint, + expected_air_handler.supply_air_static_pressure_setpoint, ) self.assertEqual( h.air_handler.fan_efficiency, expected_air_handler.fan_efficiency ) - expected_boiler = _get_default_boiler() + expected_hot_water_system = _get_default_hot_water_system() self.assertEqual( - h.boiler.reheat_water_setpoint, expected_boiler._reheat_water_setpoint + h.hot_water_system.supply_water_temperature_setpoint, + expected_hot_water_system.supply_water_temperature_setpoint, ) self.assertEqual( - h.boiler._water_pump_differential_head, - expected_boiler._water_pump_differential_head, + h.hot_water_system.water_pump_differential_head, + expected_hot_water_system.water_pump_differential_head, ) self.assertEqual( - h.boiler._water_pump_efficiency, expected_boiler._water_pump_efficiency + h.hot_water_system._pump._water_pump_efficiency, + expected_hot_water_system._pump._water_pump_efficiency, ) - self.assertEqual(h.boiler._total_flow_rate, 0) + self.assertEqual(h.hot_water_system.total_flow_rate, 0) for coord in zone_coordinates: vav = h.vavs[coord] self.assertEqual(vav.thermostat._setpoint_schedule, schedule) - self.assertEqual(vav.boiler, b) + self.assertEqual(vav.hot_water_system, b) self.assertEqual(vav.max_air_flow_rate, vav_max_air_flow_rate) self.assertEqual( - vav._reheat_max_water_flow_rate, vav_reheat_max_water_flow_rate + vav._reheat_max_water_flow_factor, vav_reheat_max_water_flow_factor ) self.assertEqual( vav._zone_id, conversion_utils.zone_coordinates_to_id(coord) @@ -179,17 +174,17 @@ def test_vav_device_ids(self): zone_coordinates = [(0, 0), (1, 0), (1, 1), (0, 1)] handler = _get_default_air_handler() - b = _get_default_boiler() + b = _get_default_hot_water_system() schedule = _get_default_setpoint_schedule() vav_max_air_flow_rate = 0.2 - vav_reheat_max_water_flow_rate = 0.4 + vav_reheat_max_water_flow_factor = 0.4 h = hvac.Hvac( zone_coordinates, handler, b, schedule, vav_max_air_flow_rate, - vav_reheat_max_water_flow_rate, + vav_reheat_max_water_flow_factor, ) vav_ids = [] @@ -202,17 +197,17 @@ def test_vav_device_ids(self): def test_id_comfort_mode(self): zone_coordinates = [(0, 0), (1, 0), (1, 1), (0, 1)] handler = _get_default_air_handler() - b = _get_default_boiler() + b = _get_default_hot_water_system() schedule = _get_default_setpoint_schedule() vav_max_air_flow_rate = 0.2 - vav_reheat_max_water_flow_rate = 0.4 + vav_reheat_max_water_flow_factor = 0.4 h = hvac.Hvac( zone_coordinates, handler, b, schedule, vav_max_air_flow_rate, - vav_reheat_max_water_flow_rate, + vav_reheat_max_water_flow_factor, ) self.assertFalse(h.is_comfort_mode(pd.Timestamp('2021-10-31 10:00'))) self.assertFalse(h.is_comfort_mode(pd.Timestamp('2021-11-01 03:00'))) diff --git a/smart_control/simulator/local_weather_test_data.csv b/smart_control/simulator/local_weather_test_data.csv index c2eb9a21..67ce5fa2 100644 --- a/smart_control/simulator/local_weather_test_data.csv +++ b/smart_control/simulator/local_weather_test_data.csv @@ -9,17 +9,4 @@ 7,20230701-0700,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",24.0,14.0,-9999.0,-9999.0,-9999.0,16.56,340,0,-9999.0,50.0,75.2 8,20230701-0800,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",23.0,13.0,-9999.0,-9999.0,-9999.0,16.56,330,0,-9999.0,50.0,73.4 9,20230701-0900,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",22.0,14.0,-9999.0,-9999.0,-9999.0,14.76,330,0,-9999.0,60.0,71.6 -10,20230701-1000,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",21.0,14.0,-9999.0,-9999.0,-9999.0,7.5600000000000005,300,25,-9999.0,65.0,69.8 -11,20230701-1100,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",22.0,15.0,-9999.0,-9999.0,-9999.0,9.360000000000001,350,50,-9999.0,60.0,71.6 -12,20230701-1200,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",23.0,15.0,-9999.0,-9999.0,-9999.0,12.959999999999999,350,100,-9999.0,50.0,73.4 -13,20230701-1300,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",24.0,15.0,-9999.0,-9999.0,-9999.0,14.76,350,0,-9999.0,65.0,75.2 -14,20230701-1400,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",24.0,15.0,-9999.0,-9999.0,-9999.0,12.959999999999999,340,0,-9999.0,50.0,75.2 -15,20230701-1500,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",25.0,15.0,-9999.0,-9999.0,-9999.0,16.56,350,0,-9999.0,50.0,77 -16,20230701-1600,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",24.5,15.0,-9999.0,-9999.0,-9999.0,18.36,350,0,-9999.0,50.0,76.1 -17,20230701-1700,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",24.0,14.0,-9999.0,-9999.0,-9999.0,12.959999999999999,330,0,-9999.0,40.0,75.2 -18,20230701-1800,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",23.0,14.0,-9999.0,-9999.0,-9999.0,16.56,340,0,-9999.0,50.0,73.4 -19,20230701-1900,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",22.0,13.0,-9999.0,-9999.0,-9999.0,16.56,330,0,-9999.0,50.0,71.6 -20,20230701-2000,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",21.0,14.0,-9999.0,-9999.0,-9999.0,14.76,330,0,-9999.0,50.0,69.8 -21,20230701-2100,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",19.0,14.0,-9999.0,-9999.0,-9999.0,7.5600000000000005,300,0,-9999.0,40.0,66.2 -22,20230701-2200,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",18.0,13.0,-9999.0,-9999.0,-9999.0,14.76,330,0,-9999.0,50.0,64.4 -23,20230701-2300,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",16.5,13.0,-9999.0,-9999.0,-9999.0,7.5600000000000005,300,0,-9999.0,50.0,61.7 +10,20230701-1000,Mountain View Moffett Field Naval Air Station,"Mountain View, California, US",21.0,14.0,-9999.0,-9999.0,-9999.0,7.5600000000000005,300,0,-9999.0,65.0,69.8 \ No newline at end of file diff --git a/smart_control/simulator/pump.py b/smart_control/simulator/pump.py new file mode 100644 index 00000000..742fb05d --- /dev/null +++ b/smart_control/simulator/pump.py @@ -0,0 +1,168 @@ +"""Models a pump for the simulation.""" + +from typing import Optional +import uuid + +import gin +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.utils import constants + + +@gin.configurable +class WaterPump(smart_device.SmartDevice): + """Models a water pump. + + Attributes: + differential_pressure_setpoint: Differential pressure of the pump in bars. + run_command: Command indicating if the pump is on or off + _water_pump_differential_head: Length in meters of pump head. + _water_pump_efficiency: Electrical efficiency of water pump [0,1]. + """ + + def __init__( + self, + water_pump_differential_head: float, + water_pump_efficiency: float, + device_id: Optional[str] = None, + ): + observable_fields = { + 'differential_pressure_setpoint': smart_device.AttributeInfo( + 'differential_pressure_setpoint', float + ), + 'supervisor_run_command': smart_device.AttributeInfo( + 'run_command', smart_device.RunStatus + ), + 'run_status': smart_device.AttributeInfo( + 'run_status', smart_device.RunStatus + ), + } + + action_fields = { + 'differential_pressure_setpoint': smart_device.AttributeInfo( + 'differential_pressure_setpoint', float + ), + 'supervisor_run_command': smart_device.AttributeInfo( + 'run_command', smart_device.RunStatus + ), + 'run_status': smart_device.AttributeInfo( + 'run_status', smart_device.RunStatus + ), + } + + if device_id is None: + device_id = f'pump_id_{uuid.uuid4()}' + + super().__init__( + observable_fields, + action_fields, + device_type=smart_control_building_pb2.DeviceInfo.DeviceType.PMP, + device_id=device_id, + ) + + self._init_water_pump_differential_head = water_pump_differential_head + self._init_water_pump_efficiency = water_pump_efficiency + self._init_run_command = smart_device.RunStatus.ON + self.reset() + + def reset(self): + self._water_pump_differential_head = self._init_water_pump_differential_head + self._water_pump_efficiency = self._init_water_pump_efficiency + self._run_command = self._init_run_command + + def compute_pump_power(self, total_flow_rate_demand) -> float: + """Returns power consumed by pump in W to move water to VAVs. + + derived from: https://www.engineeringtoolbox.com/pumps-power-d_505.html + + Args: + total_flow_rate_demand: The total flow rate of water through the pump in + m3/s. + """ + return ( + total_flow_rate_demand + * constants.WATER_DENSITY + * constants.GRAVITY + * self.water_pump_differential_head + / self._water_pump_efficiency + ) + + def _convert_differential_head_to_pressure( + self, differential_head: float + ) -> float: + """Converts a differential head (m) to differential pressure (bar). + + formula derived from: + https://www.engineeringtoolbox.com/pump-head-pressure-d_663.html + pressure (pa) = fluid_density * gravity * differential_head + water density = 1000 kg/m^3, gravity = 9.81 m/s^2, + so we get p= 9810 * differential_head + now, to convert to bar, 1 bar = 100,000 Pa, so we get: + pressure (bar) = differential_head * 0.0981 + (specific gravity of water is 1 so we leave it as is) + + Args: + differential_head: The differential head of the pump in meters. + + Returns: + The differential pressure of the pump in bars. + """ + return ( + constants.GRAVITY + * constants.WATER_DENSITY + * differential_head + / constants.PASCALS_PER_BAR + ) + + def _convert_pressure_to_differential_head(self, pressure: float) -> float: + """Converts a differential pressure (bar) to differential head (m). + + We simmple reverse the conversion above: + differential_head = pressure / 0.0981 + This simplifies to differential_head = pressure * 10.1937 + + Args: + pressure: The differential pressure of the pump in bars. + + Returns: + The differential head of the pump in meters. + """ + return pressure / ( + constants.GRAVITY * constants.WATER_DENSITY / constants.PASCALS_PER_BAR + ) + + @property + def differential_pressure_setpoint(self) -> float: + if self._run_command == smart_device.RunStatus.OFF: + return 0.0 + return self._convert_differential_head_to_pressure( + self._water_pump_differential_head + ) + + @differential_pressure_setpoint.setter + def differential_pressure_setpoint(self, value: float) -> None: + self._water_pump_differential_head = ( + self._convert_pressure_to_differential_head(value) + ) + + @property + def water_pump_differential_head(self) -> float: + if self._run_command == smart_device.RunStatus.OFF: + return 0.0 + return self._water_pump_differential_head + + @water_pump_differential_head.setter + def water_pump_differential_head(self, value: float) -> None: + self._water_pump_differential_head = value + + @property + def run_command(self) -> smart_device.RunStatus: + return self._run_command + + @run_command.setter + def run_command(self, value: smart_device.RunStatus) -> None: + self._run_command = value + + @property + def run_status(self) -> smart_device.RunStatus: + return self._run_command # in simulation, these are equivalent diff --git a/smart_control/simulator/pump_test.py b/smart_control/simulator/pump_test.py new file mode 100644 index 00000000..190e12bc --- /dev/null +++ b/smart_control/simulator/pump_test.py @@ -0,0 +1,96 @@ +from absl.testing import absltest +from absl.testing import parameterized + +from smart_buildings.smart_control.simulator import pump as pump_py +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.utils import constants + + +class PumpTest(parameterized.TestCase): + + @parameterized.parameters( + (0.5, 3, 0.9), + (0.2, 7, 0.5), + (0.5, 8, 0.23), + (0.5, 9, 0.7), + ) + def test_compute_pump_power( + self, total_flow_rate, water_pump_differential_head, water_pump_efficiency + ): + pump = pump_py.WaterPump( + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=water_pump_efficiency, + ) + + expected = ( + total_flow_rate + * constants.WATER_DENSITY + * constants.GRAVITY + * water_pump_differential_head + / water_pump_efficiency + ) + self.assertEqual(pump.compute_pump_power(total_flow_rate), expected) + + def test_run_command(self): + pump = pump_py.WaterPump( + water_pump_differential_head=3, + water_pump_efficiency=0.9, + ) + self.assertEqual(pump.run_command, smart_device.RunStatus.ON) + pump.run_command = smart_device.RunStatus.OFF + self.assertEqual(pump.run_command, smart_device.RunStatus.OFF) + + def test_differential_pressure(self): + water_pump_differential_head = 3 + pump = pump_py.WaterPump( + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=0.9, + ) + expected_dp = ( + constants.GRAVITY + * constants.WATER_DENSITY + * water_pump_differential_head + / constants.PASCALS_PER_BAR + ) + self.assertAlmostEqual(pump.differential_pressure_setpoint, expected_dp) + pump.differential_pressure_setpoint = 30 + self.assertAlmostEqual(pump.differential_pressure_setpoint, 30) + expected_head = 30 / ( + constants.GRAVITY * constants.WATER_DENSITY / constants.PASCALS_PER_BAR + ) + self.assertAlmostEqual(pump._water_pump_differential_head, expected_head) + + def test_pressure_conversion(self): + pump = pump_py.WaterPump( + water_pump_differential_head=3, + water_pump_efficiency=0.9, + ) + self.assertAlmostEqual( + pump._convert_pressure_to_differential_head( + pump._convert_differential_head_to_pressure(3) + ), + 3, + ) + self.assertAlmostEqual( + pump._convert_differential_head_to_pressure( + pump._convert_pressure_to_differential_head(30) + ), + 30, + ) + + def test_reset(self): + pump = pump_py.WaterPump( + water_pump_differential_head=3, + water_pump_efficiency=0.9, + ) + pump.run_command = smart_device.RunStatus.ON + pump._water_pump_differential_head = 4 + pump._water_pump_efficiency = 0.1 + pump.reset() + self.assertEqual(pump.run_command, smart_device.RunStatus.ON) + self.assertEqual(pump._water_pump_differential_head, 3) + self.assertEqual(pump._water_pump_efficiency, 0.9) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/simulator/randomized_arrival_departure_occupancy.py b/smart_control/simulator/randomized_arrival_departure_occupancy.py index e7446dd9..8b2e63b5 100644 --- a/smart_control/simulator/randomized_arrival_departure_occupancy.py +++ b/smart_control/simulator/randomized_arrival_departure_occupancy.py @@ -9,14 +9,16 @@ import datetime import enum -from typing import Optional, Union +from typing import Any, Optional, Union import gin import numpy as np import pandas as pd -from smart_control.models.base_occupancy import BaseOccupancy -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models import base_occupancy +from smart_buildings.smart_control.utils import conversion_utils + +SerializableData = dict[str, Any] class OccupancyStateEnum(enum.Enum): @@ -43,24 +45,14 @@ def __init__( latest_expected_departure_hour: int, step_size: pd.Timedelta, random_state: np.random.RandomState, - time_zone: Union[datetime.tzinfo, str] = "UTC", + time_zone: Union[datetime.tzinfo, str] = 'UTC', ): - - if not ( + assert ( earliest_expected_arrival_hour < latest_expected_arrival_hour < earliest_expected_departure_hour < latest_expected_departure_hour - ): - raise ValueError( - "Arrival and departure hours must be strictly increasing: " - "earliest_arrival < latest_arrival < earliest_departure < " - "latest_departure. " - f"Got: {earliest_expected_arrival_hour}, " - f"{latest_expected_arrival_hour}, " - f"{earliest_expected_departure_hour}, " - f"{latest_expected_departure_hour}." - ) + ) self._earliest_expected_arrival_hour = earliest_expected_arrival_hour self._latest_expected_arrival_hour = latest_expected_arrival_hour @@ -80,21 +72,15 @@ def __init__( def _to_local_time(self, timestamp: pd.Timestamp) -> pd.Timestamp: """Converts timestamp to local time.""" if timestamp.tz is None: - return timestamp + return timestamp.tz_localize(self._time_zone) else: return timestamp.tz_convert(self._time_zone) def _get_event_probability(self, start_hour, end_hour): """Returns the probability of an event based on the number of time steps.""" - - if start_hour >= end_hour: - raise ValueError( - "Start hour must be less than end hour to calculate event " - f"probability: start_hour={start_hour}, end_hour={end_hour}" - ) - + assert start_hour < end_hour # The window is the number of Bernoulli trials (i.e. tests for arrival). - window = pd.Timedelta(end_hour - start_hour, unit="hour") + window = pd.Timedelta(end_hour - start_hour, unit='hour') # The halfway point is the firts half of the trials. n_halfway = window / self._step_size / 2.0 # We'd like to return the probability of event happening in a single time- @@ -149,7 +135,7 @@ def peek(self, current_time: pd.Timestamp) -> OccupancyStateEnum: @gin.configurable -class RandomizedArrivalDepartureOccupancy(BaseOccupancy): +class RandomizedArrivalDepartureOccupancy(base_occupancy.BaseOccupancy): """Provides the RL agent information about how many people are in a zone. Attributes: @@ -170,11 +156,11 @@ def __init__( latest_expected_departure_hour: int, time_step_sec: int, seed: Optional[int] = 17321, - time_zone: str = "UTC", + time_zone: str = 'UTC', ): self._zone_assignment = zone_assignment self._zone_occupants = {} - self._step_size = pd.Timedelta(time_step_sec, unit="second") + self._step_size = pd.Timedelta(time_step_sec, unit='second') self._earliest_expected_arrival_hour = earliest_expected_arrival_hour self._latest_expected_arrival_hour = latest_expected_arrival_hour self._earliest_expected_departure_hour = earliest_expected_departure_hour @@ -182,6 +168,49 @@ def __init__( self._random_state = np.random.RandomState(seed) self._time_zone = time_zone + @property + def json_metadata(self) -> SerializableData: + """Returns JSON-serializable data about the occupancy.""" + metadata = super().json_metadata + metadata.update({ + 'zone_assignment': self._zone_assignment, + 'earliest_arrival': self.earliest_expected_arrival_hour, + 'latest_arrival': self.latest_expected_arrival_hour, + 'earliest_departure': self.earliest_expected_departure_hour, + 'latest_departure': self.latest_expected_departure_hour, + 'time_step_sec': self.step_size.total_seconds(), + 'time_zone': self.time_zone, + }) + return metadata + + @property + def zone_assignment(self) -> int: + return self._zone_assignment + + @property + def time_zone(self) -> datetime.tzinfo | str: + return self._time_zone + + @property + def step_size(self) -> pd.Timedelta: + return self._step_size + + @property + def earliest_expected_arrival_hour(self) -> int: + return self._earliest_expected_arrival_hour + + @property + def latest_expected_arrival_hour(self) -> int: + return self._latest_expected_arrival_hour + + @property + def earliest_expected_departure_hour(self) -> int: + return self._earliest_expected_departure_hour + + @property + def latest_expected_departure_hour(self) -> int: + return self._latest_expected_departure_hour + def average_zone_occupancy( self, zone_id: str, start_time: pd.Timestamp, end_time: pd.Timestamp ) -> float: @@ -213,15 +242,8 @@ def average_zone_occupancy( ) ) - current_time = start_time - total_occupants = 0.0 - steps = 0 - while current_time < end_time: - num_occupants = 0.0 - for occupant in self._zone_occupants[zone_id]: - if occupant.peek(current_time) == OccupancyStateEnum.WORK: - num_occupants += 1.0 - total_occupants += num_occupants - steps += 1 - current_time += self._step_size - return total_occupants / steps if steps > 0 else 0.0 + num_occupants = 0.0 + for occupant in self._zone_occupants[zone_id]: + if occupant.peek(start_time) == OccupancyStateEnum.WORK: + num_occupants += 1.0 + return num_occupants diff --git a/smart_control/simulator/randomized_arrival_departure_occupancy_test.py b/smart_control/simulator/randomized_arrival_departure_occupancy_test.py index 82e57f5a..232ef052 100644 --- a/smart_control/simulator/randomized_arrival_departure_occupancy_test.py +++ b/smart_control/simulator/randomized_arrival_departure_occupancy_test.py @@ -1,13 +1,14 @@ -"""Tests for randomized_arrival_departure_occupancy.""" - from absl.testing import absltest from absl.testing import parameterized import numpy as np import pandas as pd -from smart_control.simulator import randomized_arrival_departure_occupancy -from smart_control.simulator.randomized_arrival_departure_occupancy import OccupancyStateEnum -from smart_control.simulator.randomized_arrival_departure_occupancy import RandomizedArrivalDepartureOccupancy +from smart_buildings.smart_control.simulator import randomized_arrival_departure_occupancy + +OccupancyStateEnum = randomized_arrival_departure_occupancy.OccupancyStateEnum +RandomizedArrivalDepartureOccupancy = randomized_arrival_departure_occupancy.RandomizedArrivalDepartureOccupancy # pylint: disable=line-too-long +ZoneOccupant = randomized_arrival_departure_occupancy.ZoneOccupant + # fmt: off # pylint: disable=bad-continuation @@ -80,6 +81,48 @@ # fmt: off +def create_zone_occupant( + time_zone='US/Pacific', + step_size=pd.Timedelta(5, unit='minute'), + arrival_earliest=6, + arrival_latest=11, + departure_earliest=15, + departure_latest=20, +): + return ZoneOccupant( + time_zone=time_zone, + step_size=step_size, + random_state=np.random.RandomState(seed=99), + earliest_expected_arrival_hour=arrival_earliest, + latest_expected_arrival_hour=arrival_latest, + earliest_expected_departure_hour=departure_earliest, + latest_expected_departure_hour=departure_latest, + ) + + +def create_occupancy( + zone_assignment=1, + earliest_arrival=6, + latest_arrival=11, + earliest_departure=15, + latest_departure=20, + time_step_sec=300, + time_zone='US/Pacific', + seed=99, +): + """Creates an occupancy object, using default parameters, for use in tests.""" + return RandomizedArrivalDepartureOccupancy( + zone_assignment=zone_assignment, + earliest_expected_arrival_hour=earliest_arrival, + latest_expected_arrival_hour=latest_arrival, + earliest_expected_departure_hour=earliest_departure, + latest_expected_departure_hour=latest_departure, + time_step_sec=time_step_sec, + time_zone=time_zone, + seed=seed, + ) + + class RandomizedArrivalDepartureOccupancyTest(parameterized.TestCase): @parameterized.parameters( @@ -91,7 +134,7 @@ class RandomizedArrivalDepartureOccupancyTest(parameterized.TestCase): def test_average_zone_occupancy_weekday(self, tz, expected_zone_occupancies): step_size = pd.Timedelta(5, unit='minute') - occupancy = randomized_arrival_departure_occupancy.RandomizedArrivalDepartureOccupancy( # pylint: disable=line-too-long + occupancy = RandomizedArrivalDepartureOccupancy( 10, 7, 11, 15, 20, step_size.total_seconds(), 511211, tz ) current_time = pd.Timestamp('2021-09-01 00:00', tz='UTC') @@ -106,7 +149,7 @@ def test_average_zone_occupancy_weekday(self, tz, expected_zone_occupancies): self.assertSequenceEqual(expected_zone_occupancies, actual_occupancies) def test_get_event_probability(self): - occupant = randomized_arrival_departure_occupancy.ZoneOccupant( + occupant = ZoneOccupant( 8, 12, 13, @@ -120,96 +163,66 @@ def test_get_event_probability(self): @parameterized.parameters((None), 'UTC', 'US/Eastern', 'US/Pacific') def test_peek(self, tz): random_state = np.random.RandomState(seed=55213) - occupant = randomized_arrival_departure_occupancy.ZoneOccupant( + occupant = ZoneOccupant( 8, 12, 13, 18, pd.Timedelta(5, unit='minute'), random_state, tz ) current_time = pd.Timestamp('2021-09-01 00:00', tz=tz) while current_time < pd.Timestamp('2021-09-01 23:00', tz=tz): state = occupant.peek(current_time=current_time) - if current_time < pd.Timestamp( - '2021-09-01 11:10', tz=tz - ) or current_time >= pd.Timestamp('2021-09-01 17:00', tz=tz): - self.assertEqual( - randomized_arrival_departure_occupancy.OccupancyStateEnum.AWAY, - state, - ) + work_begin = pd.Timestamp('2021-09-01 11:10', tz=tz) + work_end = pd.Timestamp('2021-09-01 17:00', tz=tz) + if current_time < work_begin or current_time >= work_end: + self.assertEqual(OccupancyStateEnum.AWAY, state) else: - self.assertEqual( - randomized_arrival_departure_occupancy.OccupancyStateEnum.WORK, - state, - ) - current_time += pd.Timedelta(5, unit='minute') - - def test_zone_occupant_invalid_hour_order(self): - """ValueError when arrival/departure hours are not strictly increasing.""" - random_state = np.random.RandomState(seed=55213) - step_size = pd.Timedelta(5, unit='minute') + self.assertEqual(OccupancyStateEnum.WORK, state) - # latest_arrival >= earliest_departure is invalid - with self.assertRaisesRegex( - ValueError, 'Arrival and departure hours must be strictly increasing' - ): - randomized_arrival_departure_occupancy.ZoneOccupant( - earliest_expected_arrival_hour=8, - latest_expected_arrival_hour=14, # > earliest_departure (13) - earliest_expected_departure_hour=13, - latest_expected_departure_hour=18, - step_size=step_size, - random_state=random_state, - ) - - def test_get_event_probability_invalid_hours(self): - """ValueError when start_hour >= end_hour.""" - random_state = np.random.RandomState(seed=55213) - step_size = pd.Timedelta(5, unit='minute') - occupant = randomized_arrival_departure_occupancy.ZoneOccupant( - earliest_expected_arrival_hour=8, - latest_expected_arrival_hour=12, - earliest_expected_departure_hour=13, - latest_expected_departure_hour=18, - step_size=step_size, - random_state=random_state, - ) - - with self.assertRaisesRegex( - ValueError, 'Start hour must be less than end hour' - ): - occupant._get_event_probability(start_hour=12, end_hour=8) - - def test_average_zone_occupancy_matches_manual_two_steps(self): - """average_zone_occupancy should equal the mean of per-step counts.""" - step = pd.Timedelta(minutes=5) - tz = 'UTC' - - occ = RandomizedArrivalDepartureOccupancy( - zone_assignment=7, - earliest_expected_arrival_hour=8, - latest_expected_arrival_hour=12, - earliest_expected_departure_hour=16, - latest_expected_departure_hour=20, - time_step_sec=step.total_seconds(), - seed=55213, - time_zone=tz, - ) - - t0 = pd.Timestamp('2021-09-01 10:00', tz=tz) - t1 = t0 + 2 * step - - # initialise the zone - _ = occ.average_zone_occupancy('zone_0', t0, t0 + step) - - manual_counts = [] - for cur in (t0, t0 + step): - c = 0.0 - for zocc in occ._zone_occupants['zone_0']: - if zocc.peek(cur) == OccupancyStateEnum.WORK: - c += 1.0 - manual_counts.append(c) - manual_avg = sum(manual_counts) / 2.0 + current_time += pd.Timedelta(5, unit='minute') - result = occ.average_zone_occupancy('zone_0', t0, t1) - self.assertEqual(result, manual_avg) + @parameterized.named_parameters( + dict( + testcase_name='naive', + time_zone=None, + expected_timestamp='2026-01-01 19:30:00-08:00', + ), + dict( + testcase_name='utc', + time_zone='UTC', + expected_timestamp='2026-01-01 11:30:00-08:00', + ), + dict( + testcase_name='eastern', + time_zone='US/Eastern', + expected_timestamp='2026-01-01 16:30:00-08:00', + ), + dict( + testcase_name='pacific', + time_zone='US/Pacific', + expected_timestamp='2026-01-01 19:30:00-08:00', + ), + ) + def test_time_zone_conversion(self, time_zone, expected_timestamp): + occupant = create_zone_occupant(time_zone='US/Pacific') + + timestamp = pd.Timestamp('2026-01-01 19:30', tz=time_zone) + local_time = occupant._to_local_time(timestamp) + + self.assertEqual(str(local_time.tz), 'US/Pacific') + self.assertEqual(str(local_time), expected_timestamp) + + def test_json_metadata(self): + occupancy = create_occupancy() + expected_metadata = { + 'type': 'RandomizedArrivalDepartureOccupancy', + 'zone_assignment': 1, + 'earliest_arrival': 6, + 'latest_arrival': 11, + 'earliest_departure': 15, + 'latest_departure': 20, + 'time_step_sec': 300.0, + 'time_zone': 'US/Pacific', + } + self.assertDictEqual(expected_metadata, occupancy.json_metadata) if __name__ == '__main__': diff --git a/smart_control/simulator/rejection_simulator_building.py b/smart_control/simulator/rejection_simulator_building.py index a67ffb9d..f9c31548 100644 --- a/smart_control/simulator/rejection_simulator_building.py +++ b/smart_control/simulator/rejection_simulator_building.py @@ -5,9 +5,12 @@ import gin import pandas as pd -from smart_control.models.base_building import BaseBuilding -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.models.base_building import BaseBuilding +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.simulator import simulator as simulator_py +from smart_buildings.smart_control.simulator import simulator_flexible_floor_plan +from smart_buildings.smart_control.simulator import tf_simulator _ValueType = smart_control_building_pb2.DeviceInfo.ValueType _ActionResponseType = ( @@ -85,6 +88,20 @@ def zones(self) -> Sequence[smart_control_building_pb2.ZoneInfo]: """Lists the zones in the building managed by the RL agent.""" return self._base_building.zones + @property + def simulator( + self, + ) -> ( + simulator_py.Simulator + | simulator_flexible_floor_plan.SimulatorFlexibleGeometries + | tf_simulator.TFSimulator + ): + """The simulator instance.""" + # Instead of using getattr, we could check the type of the building, and + # only conditionally return the simulator if it is a simulator building, + # however that requires a messy casting approach to make type checks work. + return getattr(self._base_building, 'simulator') + @property def current_timestamp(self) -> pd.Timestamp: """Lists the current local time of the building.""" diff --git a/smart_control/simulator/rejection_simulator_building_test.py b/smart_control/simulator/rejection_simulator_building_test.py index 5a9a48c7..3f726ae0 100644 --- a/smart_control/simulator/rejection_simulator_building_test.py +++ b/smart_control/simulator/rejection_simulator_building_test.py @@ -1,23 +1,30 @@ -"""Tests for rejection_simulator_building.""" - from absl.testing import absltest from absl.testing import parameterized -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import rejection_simulator_building as rj_sb_py -from smart_control.simulator import simulator_building as sb_py -from smart_control.simulator import simulator_building_test_lib +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import rejection_simulator_building as rj_sb_py +from smart_buildings.smart_control.simulator import simulator_building as sb_py +from smart_buildings.smart_control.simulator import simulator_building_test_lib class RejectionSimulatorBuildingTest( simulator_building_test_lib.SimulatorBuildingTestBase ): + def setUp(self): + super().setUp() + self.expected_devices = { + "zone_id_(0, 0)": ["vav_0_0"], + "zone_id_(1, 0)": ["vav_1_0"], + } + def get_sim_building( - self, initial_rejection_count: int = 0 + self, initial_rejection_count: int = 0, zones=None, simulator=None ) -> rj_sb_py.RejectionSimulatorBuilding: - simulator = self._create_small_simulator() - simulator_building = sb_py.SimulatorBuilding(simulator, self.occupancy) + sim = simulator or self._create_small_simulator() + simulator_building = sb_py.SimulatorBuilding( + simulator=sim, occupancy=self.occupancy, zones=zones + ) return rj_sb_py.RejectionSimulatorBuilding( simulator_building, initial_rejection_count ) @@ -32,7 +39,7 @@ def test_request_action_responses_multiple_success_with_rejection( single_field_request_1 = smart_control_building_pb2.SingleActionRequest( device_id="boiler_id", - setpoint_name="supply_water_setpoint", + setpoint_name="supply_water_temperature_setpoint", continuous_value=300, ) action_request.single_action_requests.append(single_field_request_1) @@ -70,7 +77,7 @@ def test_request_action_request_multiple_success_with_rejection( single_field_request_1 = smart_control_building_pb2.SingleActionRequest( device_id="boiler_id", - setpoint_name="supply_water_setpoint", + setpoint_name="supply_water_temperature_setpoint", continuous_value=300, ) action_request.single_action_requests.append(single_field_request_1) diff --git a/smart_control/simulator/setpoint_schedule.py b/smart_control/simulator/setpoint_schedule.py index a55f0d23..13a94072 100644 --- a/smart_control/simulator/setpoint_schedule.py +++ b/smart_control/simulator/setpoint_schedule.py @@ -5,6 +5,7 @@ import gin import pandas as pd +from pandas.tseries import holiday import pytz TemperatureWindow = Tuple[int, int] @@ -30,6 +31,7 @@ class SetpointSchedule: eco_temp_window: 2-Tuple containing heating and cooling setpoints in K for eco mode. holidays: Set of days of year (1-365) to set as eco mode. + time_zone: Time zone of the schedule. """ # TODO(judahg): make holidays a set of Timestamps @@ -68,6 +70,11 @@ def __init__( else: self.holidays = set() + @property + def time_zone(self) -> datetime.tzinfo: + """Returns the schedule's time zone.""" + return self._time_zone + def is_comfort_mode(self, current_timestamp: pd.Timestamp) -> bool: """Returns whether setpoint schedule dictates comfort mode. @@ -202,3 +209,68 @@ def get_plot_data( 'heating_setpoint': heating_setpoints, 'cooling_setpoint': cooling_setpoints, }) + + +class HolidaySchedule(SetpointSchedule): + """Holiday-aware building operational schedule. + + Implements reasonable default values for holidays, operational hours, and + temperatures, to improve usability. + + Currently requires a year, due to limitations of the parent class (which + require the holidays to be represented as day numbers in the current year, + instead of timestamps. However if we update the parent class to be more + flexible and accept timestamps instead, this class should be able to handle + multiple years worth of holidays, and therefore will be able to be used in + trials that span multiple years (e.g. a trial that covers the last week of one + year and continues onto the first week of the next year). + + Attributes: + year: Designates the year to get holidays for. + calendar_class: The holiday calendar class from `pandas.tseries.holiday`. + Default is `USFederalHolidayCalendar` for US holidays. + cal: An instance of the holiday calendar class, used to get the holidays. + holidays_df: Pandas DataFrame with columns "date", "holiday", and + "day_of_year". The "holiday" column references the holiday name (e.g. + "New Year's Day"). The "day_of_year" column provides the day number of the + holiday within the given year (1-365), which is used to interface with the + parent class. + """ + + def __init__( + self, + year: int, # required param for now, due to limitations of parent class + morning_start_hour=6, + evening_start_hour=19, + comfort_temp_window=(294, 297), # 'ON' mode + eco_temp_window=(289, 298), # 'OFF' mode + calendar_class: type[ + holiday.AbstractHolidayCalendar + ] = holiday.USFederalHolidayCalendar, + time_zone=pytz.UTC, + ): + self.cal = calendar_class() + + self.year = year + + # holidays for a specific year: + holidays_df = self.cal.holidays( + start=pd.Timestamp(f'{year}-01-01 00:00:00'), + end=pd.Timestamp(f'{year}-12-31 23:59:59'), + return_name=True + ).reset_index() + + holidays_df.columns = ['date', 'holiday'] + # shim for current setpoint schedule interface, add day of year (1-365): + holidays_df['day_of_year'] = holidays_df['date'].dt.dayofyear + + holiday_numbers_this_year = set(holidays_df['day_of_year']) + super().__init__( + morning_start_hour=morning_start_hour, + evening_start_hour=evening_start_hour, + comfort_temp_window=comfort_temp_window, + eco_temp_window=eco_temp_window, + holidays=holiday_numbers_this_year, + time_zone=time_zone, + ) + self.holidays_df = holidays_df diff --git a/smart_control/simulator/setpoint_schedule_test.py b/smart_control/simulator/setpoint_schedule_test.py index 230eb0dd..1d37add8 100644 --- a/smart_control/simulator/setpoint_schedule_test.py +++ b/smart_control/simulator/setpoint_schedule_test.py @@ -1,11 +1,10 @@ -"""Tests for setpoint_schedule.""" - from absl.testing import absltest from absl.testing import parameterized import pandas as pd +from pandas.tseries import holiday import pytz -from smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import setpoint_schedule class SetpointScheduleTest(parameterized.TestCase): @@ -263,5 +262,86 @@ def test_get_plot_data(self): ) +class HolidayScheduleTest(parameterized.TestCase): + """NOTE: consider updating the SetpointScheduleTest and inheriting from it.""" + + def setUp(self): + super().setUp() + self.schedule = setpoint_schedule.HolidaySchedule(year=2024) + + def test_calendar(self): + self.assertIsInstance(self.schedule.cal, holiday.USFederalHolidayCalendar) + self.assertEqual(self.schedule.cal.name, 'USFederalHolidayCalendar') + + def test_holidays(self): + holiday_nums_this_year = {1, 15, 50, 148, 171, 186, 246, 288, 316, 333, 360} + self.assertEqual(self.schedule.holidays, holiday_nums_this_year) + + def test_holidays_df(self): + records = self.schedule.holidays_df.to_dict('records') + expected_records = [ + { + 'date': pd.Timestamp('2024-01-01 00:00:00'), + 'holiday': "New Year's Day", + 'day_of_year': 1, + }, + { + 'date': pd.Timestamp('2024-01-15 00:00:00'), + 'holiday': 'Birthday of Martin Luther King, Jr.', + 'day_of_year': 15, + }, + { + 'date': pd.Timestamp('2024-02-19 00:00:00'), + 'holiday': "Washington's Birthday", + 'day_of_year': 50, + }, + { + 'date': pd.Timestamp('2024-05-27 00:00:00'), + 'holiday': 'Memorial Day', + 'day_of_year': 148, + }, + { + 'date': pd.Timestamp('2024-06-19 00:00:00'), + 'holiday': 'Juneteenth National Independence Day', + 'day_of_year': 171, + }, + { + 'date': pd.Timestamp('2024-07-04 00:00:00'), + 'holiday': 'Independence Day', + 'day_of_year': 186, + }, + { + 'date': pd.Timestamp('2024-09-02 00:00:00'), + 'holiday': 'Labor Day', + 'day_of_year': 246, + }, + { + 'date': pd.Timestamp('2024-10-14 00:00:00'), + 'holiday': 'Columbus Day', + 'day_of_year': 288, + }, + { + 'date': pd.Timestamp('2024-11-11 00:00:00'), + 'holiday': 'Veterans Day', + 'day_of_year': 316, + }, + { + 'date': pd.Timestamp('2024-11-28 00:00:00'), + 'holiday': 'Thanksgiving Day', + 'day_of_year': 333, + }, + { + 'date': pd.Timestamp('2024-12-25 00:00:00'), + 'holiday': 'Christmas Day', + 'day_of_year': 360, + }, + ] + self.assertEqual(records, expected_records) + + with self.subTest('correct holiday numbers'): + holiday_nums = self.schedule.holidays_df['day_of_year'].unique().tolist() + self.assertEqual(self.schedule.holidays, set(holiday_nums)) + + if __name__ == '__main__': absltest.main() diff --git a/smart_control/simulator/simulator.py b/smart_control/simulator/simulator.py index 762d0622..029ec0f8 100644 --- a/smart_control/simulator/simulator.py +++ b/smart_control/simulator/simulator.py @@ -6,13 +6,13 @@ import gin import numpy as np import pandas as pd - -from smart_control.models.base_occupancy import BaseOccupancy -from smart_control.proto import smart_control_reward_pb2 -from smart_control.simulator import building as building_py -from smart_control.simulator import hvac as hvac_py -from smart_control.simulator import weather_controller as weather_controller_py -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_occupancy import BaseOccupancy +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.simulator import building as building_py +from smart_buildings.smart_control.simulator import hvac as hvac_py +from smart_buildings.smart_control.simulator import weather_controller as weather_controller_py +from smart_buildings.smart_control.utils import conversion_utils RewardInfo = smart_control_reward_pb2.RewardInfo @@ -40,8 +40,6 @@ def __init__( iteration_limit: int, iteration_warning: int, start_timestamp: pd.Timestamp, - relative_convergence_threshold: float | None = 1e-6, - relative_convergence_streak: int = 20, ): """Simulator init. @@ -56,13 +54,6 @@ def __init__( iteration_warning: Number of iterations for FDM after which a warning will be logged. start_timestamp: Pandas timestamp representing start time for simulation. - relative_convergence_threshold: If not None, also converge when the - change in max_delta is <= this value for - relative_convergence_streak consecutive iterations. Change is - |max_delta(n) - max_delta(n-1)|. Default 1e-6. - Set to None to disable early stopping. - relative_convergence_streak: Consecutive iterations required for early - stopping when relative_convergence_threshold is set. Default 20. """ self.building = building self._hvac = hvac @@ -72,8 +63,6 @@ def __init__( self._iteration_limit = iteration_limit self._iteration_warning = iteration_warning self._start_timestamp = start_timestamp - self._relative_convergence_threshold = relative_convergence_threshold - self._relative_convergence_streak = relative_convergence_streak self.reset() def reset(self): @@ -82,18 +71,38 @@ def reset(self): self._hvac.reset() self._current_timestamp = self._start_timestamp + @property + def hvac(self) -> hvac_py.Hvac: + return self._hvac + + @property + def weather_controller(self) -> weather_controller_py.WeatherController: + return self._weather_controller + @property def time_step_sec(self) -> float: return self._time_step_sec @property - def hvac(self) -> hvac_py.Hvac: - return self._hvac + def start_timestamp(self) -> pd.Timestamp: + return self._start_timestamp @property def current_timestamp(self) -> pd.Timestamp: return self._current_timestamp + @property + def convergence_threshold(self) -> float: + return self._convergence_threshold + + @property + def iteration_limit(self) -> int: + return self._iteration_limit + + @property + def iteration_warning(self) -> int: + return self._iteration_warning + def _get_corner_cv_temp_estimate( self, cv_coordinates: CVCoordinates, @@ -124,12 +133,7 @@ def _get_corner_cv_temp_estimate( neighbor_temps = [temperature_estimates[nx][ny] for nx, ny in neighbors] # Ensure corner CV. - if len(neighbors) != 2: - raise ValueError( - f'Expected 2 neighbors for a corner CV, but found {len(neighbors)} ' - f'at coordinates {cv_coordinates}. ' - 'This indicates an invalid building structure.' - ) + assert len(neighbors) == 2 t0 = density * delta_x**2 * heat_capacity / delta_t / 2.0 retained_heat = t0 * last_temp @@ -175,12 +179,7 @@ def _get_edge_cv_temp_estimate( neighbor_temps = [temperature_estimates[nx][ny] for nx, ny in neighbors] # Ensure edge CV. - if len(neighbors) != 3: - raise ValueError( - f'Expected 3 neighbors for an edge CV, but found {len(neighbors)} ' - f'at coordinates {cv_coordinates}. ' - 'This indicates an invalid building structure.' - ) + assert len(neighbors) == 3 t0 = density * delta_x**2 / 2 * heat_capacity / delta_t retained_heat = t0 * last_temp @@ -206,67 +205,11 @@ def _get_edge_cv_temp_estimate( def _get_interior_cv_temp_estimate( self, cv_coordinates: CVCoordinates, temperature_estimates: np.ndarray ) -> float: - r"""Returns temperature estimate for interior CV in K for next time step. + """Returns temperature estimate for interior CV in K for next time step. This function calculates the solution to an equation involving the energy - transfer by conduction to neighboring air CVs, heat input from a diffuser, - radiative exchange with interior surfaces, and heat exchange with interior - mass nodes (if present). - - Equations: - -------------------- - The energy balance for an interior control volume (CV) with interior mass - is given by: - - $$\begin{multline} - k_1 (v z) \frac{T_{i-1,j} - T_{i,j}}{u} + - k_2 (u z) \frac{T_{i,j-1} - T_{i,j}}{v} + - k_3 (v z) \frac{T_{i+1,j} - T_{i,j}}{u} + - k_4 (u z) \frac{T_{i,j+1} - T_{i,j}}{v} \\ - + Q_x + \frac{k_{\text{mass}} u v}{z} - (T_{\text{mass},i,j} - T_{i,j}) + q_{\text{lwx}} = - \frac{\rho c u v z}{\Delta t} \left( T_{i,j} - T_{i,j}^{(-)} \right) - \end{multline}$$ - - Solving for $T_{i,j}$ with uniform spacing ($u = v = \delta_x$) and uniform - conductivity ($k_1 = k_2 = k_3 = k_4 = k$): - - $$T_{i,j} = \frac{\sum_{\text{neighbors}} T_{\text{neighbor}} + - \frac{Q_x}{z k} + \frac{k_{\text{mass}} \delta_x^2}{z^2 k} - T_{\text{mass},i,j}+\frac{q_\text{lwx}}{zk} + t_0 T_{i,j}^{(-)}} - {4 + \frac{k_{\text{mass}} \delta_x^2}{z^2 k} + t_0}$$ - - where the temporal parameter is: - - $$t_0 = \frac{\rho c \delta_x^2}{k \Delta t} = - \frac{\delta_x^2}{\Delta t \cdot \alpha}$$ - - and the thermal diffusivity is: - - $$\alpha = \frac{k}{\rho c}$$ - - Nomenclature and Units: - ----------------------- - - $T_{i,j}$: Air temperature at CV $(i,j)$ at new time step [K] - - $T_{i,j}^{(-)}$: Air temperature at CV $(i,j)$ at previous time step [K] - - $T_{\text{mass},i,j}$: Interior mass temperature at CV $(i,j)$ [K] - - $T_{i-1,j}, T_{i+1,j}, T_{i,j-1}, T_{i,j+1}$: Neighbor CV temperatures - (left, right, bottom, top) [K] - - $k_1, k_2, k_3, k_4$: Thermal conductivity for left, bottom, right, top - faces [$\mathrm{W/(m \cdot K)}$] - - $k$: Thermal conductivity (uniform assumption) [$\mathrm{W/(m \cdot K)}$] - - $k_{\text{mass}}$: Thermal conductivity of interior mass - [$\mathrm{W/(m \cdot K)}$] - - $Q_x$: External heat source (e.g., diffuser) [$\mathrm{W}$] - - $q_{\text{lwx}}$: Longwave radiative exchange [$\mathrm{W}$] - - $u, v$: CV dimensions in x and y directions [$\mathrm{m}$] - - $\delta_x$: Spatial discretization (uniform CV size) [$\mathrm{m}$] - - $z$: CV height (floor height) [$\mathrm{m}$] - - $\rho$: Density [$\mathrm{kg/m^3}$] - - $c$: Specific heat capacity [$\mathrm{J/(kg \cdot K)}$] - - $\alpha$: Thermal diffusivity [$\mathrm{m^2/s}$] - - $\Delta t$: Time step [$\mathrm{s}$] - - $t_0$: Temporal parameter [dimensionless] + transfer by conduction to neighoring air CVs as well as energy transfer + from heat input to the CV from a diffuser. Args: cv_coordinates: 2-Tuple representing coordinates in building of CV. @@ -278,83 +221,28 @@ def _get_interior_cv_temp_estimate( z = self.building.floor_height_cm / 100.0 density = self.building.density[x][y] conductivity = self.building.conductivity[x][y] - heat_capacity = self.building.heat_capacity[x][y] last_temp = self.building.temp[x][y] input_q = self.building.input_q[x][y] neighbors = self.building.neighbors[x][y] neighbor_temps = [temperature_estimates[nx][ny] for nx, ny in neighbors] + # Ensure interior CV. - if len(neighbors) != 4: - raise ValueError( - 'Expected 4 neighbors for an interior CV, but found' - f' {len(neighbors)} at coordinates {cv_coordinates}. This indicates' - ' an invalid building structure.' - ) + assert len(neighbors) == 4 alpha = conductivity / density / heat_capacity t0 = delta_x**2 / delta_t / alpha + denominator = 4.0 + t0 + neighbor_transfer = sum(neighbor_temps) retained_heat = t0 * last_temp thermal_source = input_q / conductivity / z - # Interior mass heat transfer (adiabatic node connected only to air CV) - if ( - hasattr(self.building, 'include_interior_mass') - and self.building.include_interior_mass - and self.building.interior_mass_mask[x, y] - ): - interior_mass_conductivity = self.building.interior_mass_conductivity[x][ - y - ] - denominator = ( - 4.0 - + interior_mass_conductivity * delta_x**2 / conductivity / z**2 - + t0 - ) - - # Heat transfer between air CV and its interior mass node - interior_mass_temp = self.building.interior_mass_temp[x, y] - # Heat flux from interior mass to air CV - neighbor_transfer += ( - interior_mass_temp - * delta_x**2 - * interior_mass_conductivity - / conductivity - / z**2 - ) - else: - denominator = 4.0 + t0 - - # checking for implementation of `include_radiative_heat_transfer` because - # the `FloorPlanBasedBuilding` implements it, but the `Building` doesn't - if ( - hasattr(self.building, 'include_radiative_heat_transfer') - and self.building.include_radiative_heat_transfer - ): - # Radiative heat transfer - q_lwx_array = ( - self.building.apply_longwave_interior_radiative_heat_transfer( - temperature_estimates - ) - ) - # q_lwx_idx is -1 if the CV does not have LWX - q_lwx_idx = self.building.lwx_index[x, y] - q_lwx = ( - (q_lwx_array[q_lwx_idx] * delta_x / conductivity) - if q_lwx_idx != -1 - else 0.0 - ) - else: - q_lwx = 0.0 - - return ( - neighbor_transfer + thermal_source + retained_heat + q_lwx - ) / denominator + return (neighbor_transfer + thermal_source + retained_heat) / denominator def _get_cv_temp_estimate( self, @@ -435,147 +323,6 @@ def update_temperature_estimates( return temperature_estimates, max_delta - def update_interior_mass_temperatures( - self, air_temperature_estimates: np.ndarray - ) -> tuple[np.ndarray, float]: - r"""Updates interior mass node temperatures based on heat transfer with air - CVs. - - Interior mass nodes are adiabatic (no interaction with each other) and only - exchange heat with their corresponding air CV. The heat exchange occurs - through the vertical direction (height z) of the control volume. - - Equations: - -------------------- - The energy balance for the interior mass node exchanging heat only with its - corresponding air CV through a characteristic length z is: - - $$\frac{k_{\text{mass}} u v}{z} (T_{i,j} - T_{\text{mass},i,j}) = - \rho_{\text{mass}} c_{\text{mass}} u v z - \frac{T_{\text{mass},i,j} - T_{\text{mass},i,j}^{(-)}}{\Delta t}$$ - - Dividing both sides by $(u v)$ and rearranging: - - $$\frac{k_{\text{mass}}}{z} (T_{i,j} - T_{\text{mass},i,j}) = - \rho_{\text{mass}} c_{\text{mass}} z - \frac{T_{\text{mass},i,j} - T_{\text{mass},i,j}^{(-)}}{\Delta t}$$ - - Multiplying both sides by $z$: - - $$k_{\text{mass}} (T_{i,j} - T_{\text{mass},i,j}) = - \rho_{\text{mass}} c_{\text{mass}} z^2 - \frac{T_{\text{mass},i,j} - T_{\text{mass},i,j}^{(-)}}{\Delta t}$$ - - Expanding and collecting terms with $T_{\text{mass},i,j}$: - - $$k_{\text{mass}} T_{i,j} + - \rho_{\text{mass}} c_{\text{mass}} \frac{z^2}{\Delta t} - T_{\text{mass},i,j}^{(-)} = - \left( k_{\text{mass}} + - \rho_{\text{mass}} c_{\text{mass}} \frac{z^2}{\Delta t} \right) - T_{\text{mass},i,j}$$ - - Dividing both sides by $k_{\text{mass}}$ and defining the temporal - parameter: - - $$t_{0,\text{mass}} = \frac{\rho_{\text{mass}} c_{\text{mass}} z^2} - {k_{\text{mass}} \Delta t} = - \frac{z^2}{\Delta t \cdot \alpha_{\text{mass}}}$$ - - where $\alpha_{\text{mass}} = \frac{k_{\text{mass}}} - {\rho_{\text{mass}} c_{\text{mass}}}$ is the thermal diffusivity of the - interior mass. - - The final solution for the interior mass temperature update is: - - $$T_{\text{mass},i,j} = - \frac{T_{i,j} + t_{0,\text{mass}} \cdot T_{\text{mass},i,j}^{(-)}} - {1 + t_{0,\text{mass}}}$$ - - This formulation is consistent with the air CV energy balance where the - interior mass coupling term is $\frac{k_{\text{mass}} u v}{z} - (T_{\text{mass},i,j} - T_{i,j})$. - - Nomenclature and Units: - ----------------------- - - $T_{i,j}$: Converged air temperature at new time step [K] - - $T_{\text{mass},i,j}$: Interior mass temperature at new time step - (unknown) [$\mathrm{K}$] - - $T_{\text{mass},i,j}^{(-)}$: Interior mass temperature at previous - time step (known) [$\mathrm{K}$] - - $k_{\text{mass}}$: Thermal conductivity of interior mass - [$\mathrm{W/(m \cdot K)}$] - - $\rho_{\text{mass}}$: Density of interior mass [$\mathrm{kg/m^3}$] - - $c_{\text{mass}}$: Specific heat capacity of interior mass - [$\mathrm{J/(kg \cdot K)}$] - - $\alpha_{\text{mass}}$: Thermal diffusivity of interior mass - [$\mathrm{m^2/s}$] - - $u, v$: CV dimensions in x and y directions [$\mathrm{m}$] - - $z$: CV height (floor height), characteristic length for heat exchange - [$\mathrm{m}$] - - $\Delta t$: Time step [$\mathrm{s}$] - - $t_{0,\text{mass}}$: Temporal parameter for interior mass [dimensionless] - - Args: - air_temperature_estimates: Current air temperature estimates for each CV. - - Returns: - Tuple of (updated interior mass temperatures, maximum temperature change) - """ - if not ( - hasattr(self.building, 'include_interior_mass') - and self.building.include_interior_mass - ): - return self.building.interior_mass_temp.copy(), 0.0 - - z = self.building.floor_height_cm / 100.0 - delta_t = self._time_step_sec - - # Copy current interior mass temperatures for updates - interior_mass_temp_estimates = self.building.interior_mass_temp.copy() - max_delta = 0.0 - - # Iterate over all CVs that have interior mass nodes - for x in range(self.building.interior_mass_mask.shape[0]): - for y in range(self.building.interior_mass_mask.shape[1]): - if not self.building.interior_mass_mask[x, y]: - continue - - # Get properties - air_temp = air_temperature_estimates[x, y] - interior_mass_temp = self.building.interior_mass_temp[x, y] - interior_mass_conductivity = self.building.interior_mass_conductivity[ - x - ][y] - interior_mass_density = self.building.interior_mass_density[x][y] - interior_mass_heat_capacity = self.building.interior_mass_heat_capacity[ - x - ][y] - - # Calculate thermal diffusivity for interior mass - alpha_mass = ( - interior_mass_conductivity - / interior_mass_density - / interior_mass_heat_capacity - ) - - # Temperature update using finite difference with z as characteristic - # length. Heat exchange with air CV occurs through height z, consistent - # with the air CV energy balance coupling term k_mass * u * v / z. - t0_mass = z**2 / (delta_t * alpha_mass) - denominator = 1.0 + t0_mass - - # New interior mass temperature - new_temp = (air_temp + t0_mass * interior_mass_temp) / denominator - - # Track maximum change - delta = abs(new_temp - interior_mass_temp) - max_delta = max(delta, max_delta) - - interior_mass_temp_estimates[x, y] = new_temp - - return interior_mass_temp_estimates, max_delta - def finite_differences_timestep( self, *, ambient_temperature: float, convection_coefficient: float ) -> bool: @@ -588,8 +335,6 @@ def finite_differences_timestep( 2. For each CV, solve for temperature T, based on the current estimate for neighboring CVs and known thermal losses/gains. 3. Calculate the difference between previous T and new T. - 4. If interior mass is enabled, update interior mass temperatures and - check their convergence as well. If the maximum difference in the grid is less than some small constant, conversion_threshold, then quit. Otherwise, return to step 2. @@ -607,76 +352,30 @@ def finite_differences_timestep( # TODO(gusatb): Please provide a unit test for convergence. temp_estimate = self.building.temp.copy() - # Check if interior mass is enabled - include_interior_mass = ( - hasattr(self.building, 'include_interior_mass') - and self.building.include_interior_mass - ) - converged_successfully = False for iteration_count in range(self._iteration_limit): - # Update air CV temperatures - temp_estimate, max_delta_air = self.update_temperature_estimates( + temp_estimate, max_delta = self.update_temperature_estimates( temp_estimate, ambient_temperature=ambient_temperature, convection_coefficient=convection_coefficient, ) - - # Update interior mass temperatures if enabled - if include_interior_mass: - # Update interior mass temperatures based on current air temperature - # estimates - interior_mass_temp_estimate, max_delta_mass = ( - self.update_interior_mass_temperatures(temp_estimate) - ) - # Store the updated interior mass temperatures - self.building.interior_mass_temp = interior_mass_temp_estimate - - # Combined convergence check - max_delta = max(max_delta_air, max_delta_mass) - else: - max_delta = max_delta_air - if iteration_count + 1 == self._iteration_warning: - if include_interior_mass: - logging.warning( - 'Step %d, not converged in %d steps, ' - 'max_delta_air = %3.3f, max_delta_mass = %3.3f', - iteration_count, - self._iteration_warning, - max_delta_air, - max_delta_mass, - ) - else: - logging.warning( - 'Step %d, not converged in %d steps, max_delta = %3.3f', - iteration_count, - self._iteration_warning, - max_delta, - ) + logging.warning( + 'Step %d, not converged in %d steps, max_delta = %3.3f', + iteration_count, + self._iteration_warning, + max_delta, + ) if max_delta <= self._convergence_threshold: converged_successfully = True break else: - if include_interior_mass: - logging.warning( - 'Max iteration count reached, max_delta_air = %3.3f, ' - 'max_delta_mass = %3.3f', - max_delta_air, - max_delta_mass, - ) - else: - logging.warning( - 'Max iteration count reached, max_delta = %3.3f', max_delta - ) - - # Final update of building temperatures + logging.warning( + 'Max iteration count reached, max_delta = %3.3f', max_delta + ) self.building.temp = temp_estimate - # Interior mass temperatures are already updated in the loop - # No need for additional update here - return converged_successfully def _calculate_return_water_temperature( @@ -732,9 +431,16 @@ def execute_step_sim(self) -> None: convection_coefficient=convection_coefficient, ) - # Reset the air handler and boiler flow rate demand before accumulating. + # Reset the air handler and hws flow rate demand before accumulating. hvac.air_handler.reset_demand() - hvac.boiler.reset_demand() + hvac.hot_water_system.reset_demand() + + # sum up all the VAV hot waterdemands for the current timestep + # this needs to be calculated first before the output function is called, + # since the flow rate of the entire system can only be determined if we know + # the total demand from all VAVs + for vav in hvac.vavs.values(): + hvac.hot_water_system.add_demand(vav.reheat_flow_factor) zone_supply_temp_map = {} @@ -749,14 +455,10 @@ def execute_step_sim(self) -> None: if vav.flow_rate_demand > 0: hvac.air_handler.add_demand(vav.flow_rate_demand) - # Update the boiler demand for hot water as the sum of each VAV's demand. - if vav.reheat_demand > 0: - hvac.boiler.add_demand(vav.reheat_demand) - # Apply the thermal energy to the zone. self.building.apply_thermal_power_zone(zone, q_zone) - hvac.boiler.return_water_temperature_sensor = ( + hvac.hot_water_system.return_water_temperature_sensor = ( self._calculate_return_water_temperature(zone_supply_temp_map) ) @@ -842,29 +544,55 @@ def _get_air_handler_reward_infos( air_handler_reward_infos[air_handler_id] = air_handler_reward_info return air_handler_reward_infos - def _get_boiler_reward_infos( + def _get_hws_reward_infos( self, - ) -> Mapping[str, RewardInfo.BoilerRewardInfo]: - """Returns a map of messages with boiler data. + ) -> tuple[ + Mapping[str, RewardInfo.BoilerRewardInfo | RewardInfo.HeatPumpRewardInfo], + smart_control_building_pb2.DeviceInfo.DeviceType, + ]: + """Returns a map of messages with hot water system data. This data is used to compute the instantaneous reward. """ - boiler_reward_infos = {} - boiler_id = self._hvac.boiler.device_id() - return_water_temp = self._hvac.boiler.return_water_temperature_sensor - natural_gas_heating_energy_rate = ( - self._hvac.boiler.compute_thermal_energy_rate( + hws_reward_infos = {} + hws_id = self._hvac.hot_water_system.device_id() + return_water_temp = ( + self._hvac.hot_water_system.return_water_temperature_sensor + ) + + heating_energy_rate = ( + self._hvac.hot_water_system.compute_thermal_energy_rate( return_water_temp, self._weather_controller.get_current_temp(self._current_timestamp), ) ) - pump_electrical_energy_rate = self._hvac.boiler.compute_pump_power() - boiler_reward_info = RewardInfo.BoilerRewardInfo( - natural_gas_heating_energy_rate=natural_gas_heating_energy_rate, - pump_electrical_energy_rate=pump_electrical_energy_rate, + pump_electrical_energy_rate = ( + self._hvac.hot_water_system.compute_pump_power() ) - boiler_reward_infos[boiler_id] = boiler_reward_info - return boiler_reward_infos + + if ( + self._hvac.hot_water_system.heat_source_device_type + == smart_control_building_pb2.DeviceInfo.DeviceType.BLR + ): + hws_reward_info = RewardInfo.BoilerRewardInfo( + natural_gas_heating_energy_rate=heating_energy_rate, + pump_electrical_energy_rate=pump_electrical_energy_rate, + ) + elif ( + self._hvac.hot_water_system.heat_source_device_type + == smart_control_building_pb2.DeviceInfo.DeviceType.ASHP + ): + hws_reward_info = RewardInfo.HeatPumpRewardInfo( + electricity_heating_energy_rate=heating_energy_rate, + pump_electrical_energy_rate=pump_electrical_energy_rate, + ) + else: + raise ValueError( + 'Unsupported heat source device type:' + f' {self._hvac.hot_water_system.heat_source_device_type}' + ) + hws_reward_infos[hws_id] = hws_reward_info + return hws_reward_infos, self._hvac.hot_water_system.heat_source_device_type def reward_info(self, occupancy_function: BaseOccupancy) -> RewardInfo: """Returns a message with data to compute the instantaneous reward.""" @@ -879,39 +607,61 @@ def reward_info(self, occupancy_function: BaseOccupancy) -> RewardInfo: # get air handler info air_handler_reward_infos = self._get_air_handler_reward_infos() - # get boiler info - boiler_reward_infos = self._get_boiler_reward_infos() - - return RewardInfo( - start_timestamp=conversion_utils.pandas_to_proto_timestamp( - start_time_stamp - ), - end_timestamp=conversion_utils.pandas_to_proto_timestamp( - end_time_stamp - ), - zone_reward_infos=zone_reward_infos, - air_handler_reward_infos=air_handler_reward_infos, - boiler_reward_infos=boiler_reward_infos, - ) - - def step_sim(self) -> None: - """Steps the simulation by a small amount of time. - - The following steps are completed in order to proceed to the next time step: + # get hws info + hws_reward_infos, hws_device_type = self._get_hws_reward_infos() - 1. Get external temperature. - 2. Update temperatures for each CV using FDM. - 3. Reset HVAC reheat and flow demands. - 4. For each zone/VAV: + if ( + hws_device_type + == smart_control_building_pb2.DeviceInfo.DeviceType.BLR + ): - a. Update the VAV using the zone's temperature. + return RewardInfo( + start_timestamp=conversion_utils.pandas_to_proto_timestamp( + start_time_stamp + ), + end_timestamp=conversion_utils.pandas_to_proto_timestamp( + end_time_stamp + ), + zone_reward_infos=zone_reward_infos, + air_handler_reward_infos=air_handler_reward_infos, + boiler_reward_infos=hws_reward_infos, + ) - b. Apply thermal energy from VAV to the zone. + elif ( + hws_device_type + == smart_control_building_pb2.DeviceInfo.DeviceType.ASHP + ): + return RewardInfo( + start_timestamp=conversion_utils.pandas_to_proto_timestamp( + start_time_stamp + ), + end_timestamp=conversion_utils.pandas_to_proto_timestamp( + end_time_stamp + ), + zone_reward_infos=zone_reward_infos, + air_handler_reward_infos=air_handler_reward_infos, + heat_pump_reward_infos=hws_reward_infos, + ) + else: + raise ValueError( + 'Unsupported heat source device type:' + f' {self._hvac.hot_water_system.heat_source_device_type}' + ) - c. Accumulate HVAC reheat and flow demands from VAV. + def step_sim(self) -> None: + """Steps the simulation by a small amount of time. - Note: There is a one step delay in application of current vav - settings/heating. + The following steps are completed in order to proceed to the next time step: + 1: Get external temperature. + 2: Update temperatures for each CV using FDM. + 3: Reset HVAC reheat and flow demands. + 4: For each zone/VAV: + a: Update the VAV using the zone's temperature. + b: Apply thermal energy from VAV to the zone. + c: Accumulate HVAC reheat and flow demands from VAV + + Note: There is a one step delay in application of current vav + settings/heating. """ self.setup_step_sim() self.execute_step_sim() diff --git a/smart_control/simulator/simulator_building.py b/smart_control/simulator/simulator_building.py index 62d9942e..c2fa0253 100644 --- a/smart_control/simulator/simulator_building.py +++ b/smart_control/simulator/simulator_building.py @@ -4,22 +4,23 @@ thermodynamics and observation/action space. """ -from typing import Sequence, Type, Union +from collections.abc import Sequence import uuid from absl import logging import gin import pandas as pd - -from smart_control.models.base_building import BaseBuilding -from smart_control.models.base_occupancy import BaseOccupancy -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.simulator import simulator as simulator_py -from smart_control.simulator import simulator_flexible_floor_plan -from smart_control.simulator import smart_device -from smart_control.simulator import tf_simulator -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models import base_building +from smart_buildings.smart_control.models import base_occupancy +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.simulator import hvac as hvac_py +from smart_buildings.smart_control.simulator import hvac_floorplan_based +from smart_buildings.smart_control.simulator import simulator as simulator_py +from smart_buildings.smart_control.simulator import simulator_flexible_floor_plan +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.simulator import tf_simulator +from smart_buildings.smart_control.utils import conversion_utils _ValueType = smart_control_building_pb2.DeviceInfo.ValueType _ActionResponseType = ( @@ -27,36 +28,57 @@ ) +def _synchronize_zones( + hvac: hvac_py.Hvac | hvac_floorplan_based.FloorPlanBasedHvac, + zones: Sequence[smart_control_building_pb2.ZoneInfo] | None, +) -> Sequence[smart_control_building_pb2.ZoneInfo]: + """Synchronizes the zones in the HVAC system and the building.""" + + if zones is None: + # Use HVAC zones by default. + return list(hvac.zone_infos.values()) + + # Overwrite HVAC zones to match the provided building zones. + if isinstance(hvac, hvac_floorplan_based.FloorPlanBasedHvac): + hvac.set_override_zones(zones) + + return zones + + @gin.configurable -class SimulatorBuilding(BaseBuilding): +class SimulatorBuilding(base_building.BaseBuilding): """Base class for a controllable building for reinforcement learning.""" def __init__( self, - simulator: Union[ - simulator_flexible_floor_plan.SimulatorFlexibleGeometries, - simulator_py.Simulator, - tf_simulator.TFSimulator, - ], - occupancy: BaseOccupancy, + simulator: ( + simulator_flexible_floor_plan.SimulatorFlexibleGeometries + | simulator_py.Simulator + | tf_simulator.TFSimulator + ), + occupancy: base_occupancy.BaseOccupancy, + zones: Sequence[smart_control_building_pb2.ZoneInfo] | None = None, ): """Creates SimulatorBuilding. Args: - simulator: Simulator to run for the RL environment. This can take in - either the floor_plan based simulator or the rectangular sim - (deprecated). - occupancy: a function to determine building occupancy by zone. + simulator: Simulator to run for the RL environment. + occupancy: A function to determine building occupancy by zone. + zones: A list of the thermal zones in the building. """ - self.simulator = simulator - self._occupancy = occupancy hvac = self.simulator.hvac + synchronized_zones = _synchronize_zones(hvac, zones) + super().__init__(zones=synchronized_zones) + # List of tuple (device, device_info) all_devices = [ - (hvac.boiler, self._create_device_info(hvac.boiler)), + ( + hvac.hot_water_system, + self._create_device_info(hvac.hot_water_system), + ), (hvac.air_handler, self._create_device_info(hvac.air_handler)), ] all_devices.extend([ @@ -73,7 +95,7 @@ def __init__( for smart_device, device_info in all_devices } - def _class_to_value_type(self, clazz: Type[object]) -> _ValueType: + def _class_to_value_type(self, clazz: type[object]) -> _ValueType: """Returns a ValueType that corresponds to a given class/type. Args: @@ -119,6 +141,10 @@ def _create_device_info( return device_info + @property + def occupancy(self) -> base_occupancy.BaseOccupancy: + return self._occupancy + @property def reward_info(self) -> smart_control_reward_pb2.RewardInfo: """Returns a message with data to compute the instantaneous reward.""" @@ -261,12 +287,6 @@ def devices(self) -> Sequence[smart_control_building_pb2.DeviceInfo]: """Lists the devices that can be queried and/or controlled.""" return self._device_infos - @property - def zones(self) -> Sequence[smart_control_building_pb2.ZoneInfo]: - """Lists the zones in the building managed by the RL agent.""" - - return list(self.simulator.hvac.zone_infos.values()) - @property def time_step_sec(self) -> float: """Returns the amount of time between time steps.""" diff --git a/smart_control/simulator/simulator_building_test.py b/smart_control/simulator/simulator_building_test.py index 03300df3..cba02ca0 100644 --- a/smart_control/simulator/simulator_building_test.py +++ b/smart_control/simulator/simulator_building_test.py @@ -1,9 +1,21 @@ -"""Tests for simulator_building.""" +from unittest import mock from absl.testing import absltest +import numpy as np +import pandas as pd -from smart_control.simulator import simulator_building as sb_py -from smart_control.simulator import simulator_building_test_lib +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.simulator import air_handler +from smart_buildings.smart_control.simulator import building as building_py +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import hvac_floorplan_based +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import simulator as simulator_py +from smart_buildings.smart_control.simulator import simulator_building as sb_py +from smart_buildings.smart_control.simulator import simulator_building_test_lib +from smart_buildings.smart_control.simulator import simulator_flexible_floor_plan +from smart_buildings.smart_control.simulator import step_function_occupancy +from smart_buildings.smart_control.simulator import weather_controller class SimulatorBuildingTest( @@ -11,11 +23,155 @@ class SimulatorBuildingTest( ): def get_sim_building( - self, initial_rejection_count: int = 0 + self, + initial_rejection_count: int = 0, + zones: list[building_pb2.ZoneInfo] | None = None, + simulator: ( + simulator_py.Simulator + | simulator_flexible_floor_plan.SimulatorFlexibleGeometries + | None + ) = None, ) -> sb_py.SimulatorBuilding: - simulator = self._create_small_simulator() - return sb_py.SimulatorBuilding(simulator, self.occupancy) + sim = simulator or self._create_small_simulator() + return sb_py.SimulatorBuilding( + simulator=sim, + occupancy=self.occupancy, + zones=zones, + ) -if __name__ == '__main__': +class FloorPlanBasedSimulatorBuildingTest( + simulator_building_test_lib.SimulatorBuildingTestBase +): + + def setUp(self): + self.zone_ids = ["room_0", "room_1", "room_2"] + + self.wc = weather_controller.WeatherController( + default_low_temp=280, + default_high_temp=290, + ) + self.occ = step_function_occupancy.StepFunctionOccupancy( + work_start_time=pd.Timedelta("9h"), + work_end_time=pd.Timedelta("17h"), + work_occupancy=1.0, + nonwork_occupancy=0.0, + ) + + ahu = air_handler.AirHandler( + recirculation=0.3, + supply_air_temperature_setpoint=270, + fan_static_pressure=20000.0, + fan_efficiency=0.8, + ) + hws = hot_water_system_py.construct_hot_water_system( + supply_water_temperature_setpoint=260, + water_pump_differential_head=3, + water_pump_efficiency=0.6, + device_id="hws_id", + ) + schedule = setpoint_schedule.SetpointSchedule( + morning_start_hour=9, + evening_start_hour=18, + comfort_temp_window=(292, 295), + eco_temp_window=(290, 297), + holidays={7, 223, 245}, + ) + + zone_to_vavs = {z: [f"vav_{z}"] for z in self.zone_ids} + self.hvac = hvac_floorplan_based.FloorPlanBasedHvac( + zone_identifier=self.zone_ids, + air_handler=ahu, + hot_water_system=hws, + schedule=schedule, + vav_max_air_flow_rate=0.2, + vav_reheat_max_water_flow_factor=0.4, + zone_to_vavs=zone_to_vavs, + ) + + building_mock = mock.create_autospec( + building_py.FloorPlanBasedBuilding, instance=True + ) + building_mock.get_zone_average_temps.return_value = { + "room_0": 295, + "room_1": 295, + "room_2": 295, + } + building_mock.floor_plan = np.array([[1]]) + building_mock.room_dict = {"room_0": [], "room_1": [], "room_2": []} + building_mock.custom_zone_to_vavs = None + + self.sim = simulator_flexible_floor_plan.SimulatorFlexibleGeometries( + hvac=self.hvac, + building=building_mock, + weather_controller=self.wc, + start_timestamp=pd.Timestamp("2021-01-01 00:00"), + time_step_sec=300, + convergence_threshold=0.01, + iteration_limit=100, + iteration_warning=50, + ) + + super().setUp() + + def get_sim_building( + self, + initial_rejection_count: int = 0, + zones: list[building_pb2.ZoneInfo] | None = None, + simulator: ( + simulator_py.Simulator + | simulator_flexible_floor_plan.SimulatorFlexibleGeometries + | None + ) = None, + ) -> sb_py.SimulatorBuilding: + sim = simulator or self.sim + return sb_py.SimulatorBuilding( + simulator=sim, + occupancy=self.occ, + zones=zones, + ) + + def test_devices(self): + self.assertLen(self.building.devices, 5) + + def test_init_with_zones_uses_provided_zones_overwrites_hvac_zones(self): + zones = [ + building_pb2.ZoneInfo(zone_id="the_real_zone_1"), + building_pb2.ZoneInfo(zone_id="the_real_zone_2"), + ] + sim_building = self.get_sim_building(zones=zones) + + self.assertEqual(zones, sim_building.zones) + self.assertEqual( + zones, list(sim_building.simulator.hvac.zone_infos.values()) + ) + + def test_init_with_zones_uses_provided_zones_overwrites_hvac_devices(self): + zones = [ + building_pb2.ZoneInfo(zone_id="new_room_0", devices=["vav_custom_0"]), + building_pb2.ZoneInfo(zone_id="new_room_1", devices=["vav_custom_1"]), + ] + sim_building = self.get_sim_building(zones=zones) + + with self.subTest("HVAC devices are overwritten"): + self.assertEqual( + sim_building.simulator.hvac.get_vav_ids_for_zone("new_room_0"), + ["vav_custom_0"], + ) + self.assertEqual( + sim_building.simulator.hvac.get_zones_for_vav("vav_custom_0"), + ["new_room_0"], + ) + + # TODO(b/512158835) - Update after cascading zone info overrides into the + # room dict as well. + with self.subTest("FloorPlanBasedBuilding room dict is not yet updated"): + self.assertEqual( + sim_building.simulator.building.room_dict, + {"room_0": [], "room_1": [], "room_2": []}, + ) + self.assertIsNone(sim_building.simulator.building.custom_zone_to_vavs) + + +if __name__ == "__main__": absltest.main() diff --git a/smart_control/simulator/simulator_building_test_lib.py b/smart_control/simulator/simulator_building_test_lib.py index 8e7279db..125b6dea 100644 --- a/smart_control/simulator/simulator_building_test_lib.py +++ b/smart_control/simulator/simulator_building_test_lib.py @@ -1,18 +1,18 @@ -"""Tests for rejection_simulator_building.""" +"""Provides a base class for testing variants of Simulator Building.""" from absl.testing import parameterized import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import air_handler as air_handler_py -from smart_control.simulator import boiler as boiler_py -from smart_control.simulator import building as building_py -from smart_control.simulator import hvac as hvac_py -from smart_control.simulator import setpoint_schedule -from smart_control.simulator import simulator as simulator_py -from smart_control.simulator import simulator_building as sb_py -from smart_control.simulator import step_function_occupancy -from smart_control.simulator import weather_controller as weather_controller_py +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import air_handler as air_handler_py +from smart_buildings.smart_control.simulator import building as building_py +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import hvac as hvac_py +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import simulator as simulator_py +from smart_buildings.smart_control.simulator import simulator_building as sb_py +from smart_buildings.smart_control.simulator import step_function_occupancy +from smart_buildings.smart_control.simulator import weather_controller as weather_controller_py _ACTION_RESPONSE_TYPE = ( smart_control_building_pb2.SingleActionResponse.ActionResponseType @@ -23,9 +23,16 @@ class SimulatorBuildingTestBase(parameterized.TestCase): """Base class for testing variants of Simulator Building.""" occupancy = step_function_occupancy.StepFunctionOccupancy( - pd.Timedelta(9, unit='h'), pd.Timedelta(17, unit='h'), 10, 0.1 + work_start_time=pd.Timedelta(9, unit='h'), + work_end_time=pd.Timedelta(17, unit='h'), + work_occupancy=10, + nonwork_occupancy=0.1, ) + def setUp(self): + super().setUp() + self.building = self.get_sim_building() + def _create_small_building(self, initial_temp): """Returns building with specified initial temperature. @@ -64,27 +71,27 @@ def _create_small_building(self, initial_temp): def _create_small_hvac(self): """Returns hvac matching zones for small test building.""" - reheat_water_setpoint = 260 + supply_water_temperature_setpoint = 260 water_pump_differential_head = 3 water_pump_efficiency = 0.6 - boiler = boiler_py.Boiler( - reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, - device_id='boiler_id', + hot_water_system = hot_water_system_py.construct_hot_water_system( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=water_pump_efficiency, + device_id='hws_id', ) recirculation = 0.3 heating_air_temp_setpoint = 270 cooling_air_temp_setpoint = 288 - fan_differential_pressure = 20000.0 + fan_static_pressure = 20000.0 fan_efficiency = 0.8 air_handler = air_handler_py.AirHandler( recirculation, heating_air_temp_setpoint, cooling_air_temp_setpoint, - fan_differential_pressure, + fan_static_pressure, fan_efficiency, device_id='air_handler_id', ) @@ -106,7 +113,7 @@ def _create_small_hvac(self): zone_coordinates = [(0, 0), (1, 0)] hvac = hvac_py.Hvac( - zone_coordinates, air_handler, boiler, schedule, 0.45, 0.02 + zone_coordinates, air_handler, hot_water_system, schedule, 0.45, 0.02 ) return hvac @@ -136,19 +143,28 @@ def _create_small_simulator(self): ) def get_sim_building( - self, initial_rejection_count: int = 0 + self, + initial_rejection_count: int = 0, + zones=None, + simulator=None, ) -> sb_py.SimulatorBuilding: raise NotImplementedError() # pragma: nocover def test_devices(self): - simulator_building = self.get_sim_building() + simulator_building = self.building devices = simulator_building.devices self.assertLen(devices, 4) + # OBSERVATIONS + @parameterized.named_parameters( - ('obs_supply_water_setpoint', 'supply_water_setpoint', 260), + ( + 'obs_supply_water_temperature_setpoint', + 'supply_water_temperature_setpoint', + 260, + ), ( 'obs_supply_water_temperature_sensor', 'supply_water_temperature_sensor', @@ -160,11 +176,11 @@ def test_request_observation_single_success( self, measurement_name, expected_value ): """Tests request observations.""" - simulator_building = self.get_sim_building() + simulator_building = self.building observation_request = smart_control_building_pb2.ObservationRequest() single_field_request = smart_control_building_pb2.SingleObservationRequest( - device_id='boiler_id', measurement_name=measurement_name + device_id='hws_id', measurement_name=measurement_name ) observation_request.single_observation_requests.append(single_field_request) @@ -190,13 +206,14 @@ def test_request_observation_single_success( def test_request_observation_multiple_success(self): """Tests request multiple observations.""" - simulator_building = self.get_sim_building() + simulator_building = self.building observation_request = smart_control_building_pb2.ObservationRequest() single_field_request_1 = ( smart_control_building_pb2.SingleObservationRequest( - device_id='boiler_id', measurement_name='supply_water_setpoint' + device_id='hws_id', + measurement_name='supply_water_temperature_setpoint', ) ) observation_request.single_observation_requests.append( @@ -205,7 +222,7 @@ def test_request_observation_multiple_success(self): single_field_request_2 = ( smart_control_building_pb2.SingleObservationRequest( - device_id='boiler_id', measurement_name='heating_request_count' + device_id='hws_id', measurement_name='heating_request_count' ) ) observation_request.single_observation_requests.append( @@ -241,7 +258,7 @@ def test_request_observation_multiple_success(self): def test_request_observation_incorrect_device(self): """Tests when an observation is requested on a nonexistent device.""" - simulator_building = self.get_sim_building() + simulator_building = self.building observation_request = smart_control_building_pb2.ObservationRequest() single_field_request = smart_control_building_pb2.SingleObservationRequest( @@ -260,11 +277,11 @@ def test_request_observation_incorrect_device(self): def test_request_observation_incorrect_measurement(self): """Tests when an observation is requested for a nonexistnt measurement.""" - simulator_building = self.get_sim_building() + simulator_building = self.building observation_request = smart_control_building_pb2.ObservationRequest() single_field_request = smart_control_building_pb2.SingleObservationRequest( - device_id='boiler_id', measurement_name='incorrect_measurement' + device_id='hws_id', measurement_name='incorrect_measurement' ) observation_request.single_observation_requests.append(single_field_request) @@ -277,16 +294,18 @@ def test_request_observation_incorrect_measurement(self): observation_response.single_observation_responses[0].observation_valid ) + # ACTIONS + @parameterized.named_parameters( - ('act_supply_water_setpoint', 'supply_water_setpoint', 301), + ('act_supply_water_setpoint', 'supply_water_temperature_setpoint', 260), ) def test_request_action_single_success(self, setpoint_name, set_value): """Tests request single action with success.""" - simulator_building = self.get_sim_building() + simulator_building = self.building action_request = smart_control_building_pb2.ActionRequest() single_field_request = smart_control_building_pb2.SingleActionRequest( - device_id='boiler_id', + device_id='hws_id', setpoint_name=setpoint_name, continuous_value=set_value, ) @@ -307,7 +326,7 @@ def test_request_action_single_success(self, setpoint_name, set_value): def test_request_action_incorrect_device(self): """Tests when an action is sent to a nonexistent device.""" - simulator_building = self.get_sim_building() + simulator_building = self.building action_request = smart_control_building_pb2.ActionRequest() single_field_request = smart_control_building_pb2.SingleActionRequest( @@ -325,11 +344,11 @@ def test_request_action_incorrect_device(self): def test_request_action_incorrect_setpoint(self): """Tests when an action is sent to a nonexistent setpoint.""" - simulator_building = self.get_sim_building() + simulator_building = self.building action_request = smart_control_building_pb2.ActionRequest() single_field_request = smart_control_building_pb2.SingleActionRequest( - device_id='boiler_id', setpoint_name='incorrect_setpoint' + device_id='hws_id', setpoint_name='incorrect_setpoint' ) action_request.single_action_requests.append(single_field_request) @@ -340,3 +359,13 @@ def test_request_action_incorrect_setpoint(self): action_response.single_action_responses[0].response_type, _ACTION_RESPONSE_TYPE.REJECTED_NOT_ENABLED_OR_AVAILABLE, ) + + # ZONES + + def test_init_uses_hvac_zones_by_default(self): + self.assertEqual( + list(self.building.zones), + list(self.building.simulator.hvac.zone_infos.values()), + ) + + diff --git a/smart_control/simulator/simulator_flexible_floor_plan.py b/smart_control/simulator/simulator_flexible_floor_plan.py index 20e4de7b..ed6f8feb 100644 --- a/smart_control/simulator/simulator_flexible_floor_plan.py +++ b/smart_control/simulator/simulator_flexible_floor_plan.py @@ -1,22 +1,44 @@ -"""Simulator of a simplified thermodynamic system for flexible geometries.""" +"""Simulator of a simplified thermodynamic system for flexible geometries. +This simulator uses finite differences method (FDM) to approximate the +temperature changes in each Control Volume (CV) in a building. + +The `execute_step_sim` method is responsible for calculating the supply air +temperature from the air handler(s) for the current simulation time step. + +First, it calculates the recirculation air temperature for each air handler +unit (AHU). This is the area-weighted average temperature of all zones serviced +by that AHU. + +It iterates through each Variable Air Volume (VAV) unit to find the average +temperature of the zones it serves (v_sensing_temp), weighted by the area of +each zone. It then calculates the recirculation temperature for each AHU by +taking an area-weighted average of the v_sensing_temp of all VAVs connected +to it. Finally, it uses this per-AHU recirculation temperature and the outside +ambient temperature to calculate the temperature of the air that will be +supplied by each AHU. This logic handles both single and multiple AHU +configurations. +""" + +import collections from typing import Mapping, Optional, Tuple from absl import logging import gin import numpy as np import pandas as pd - -from smart_control.models.base_occupancy import BaseOccupancy -from smart_control.proto import smart_control_reward_pb2 -from smart_control.simulator import building as building_py -from smart_control.simulator import constants -from smart_control.simulator import hvac_floorplan_based -from smart_control.simulator import simulator -from smart_control.simulator import weather_controller as weather_controller_py -from smart_control.utils import building_renderer -from smart_control.utils import conversion_utils -from smart_control.utils import visual_logger +from smart_buildings.smart_control.models.base_occupancy import BaseOccupancy +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.simulator import air_handler as air_handler_py +from smart_buildings.smart_control.simulator import building as building_py +from smart_buildings.smart_control.simulator import constants +from smart_buildings.smart_control.simulator import hvac_floorplan_based +from smart_buildings.smart_control.simulator import simulator +from smart_buildings.smart_control.simulator import weather_controller as weather_controller_py +from smart_buildings.smart_control.utils import building_renderer +from smart_buildings.smart_control.utils import conversion_utils +from smart_buildings.smart_control.utils import visual_logger RewardInfo = smart_control_reward_pb2.RewardInfo @@ -46,8 +68,6 @@ def __init__( iteration_limit: int, iteration_warning: int, start_timestamp: pd.Timestamp, - relative_convergence_threshold: float | None = 1e-6, - relative_convergence_streak: int = 20, ): """Simulator init. @@ -63,19 +83,18 @@ def __init__( iteration_warning: Number of iterations for FDM after which a warning will be logged. start_timestamp: Pandas timestamp representing start time for simulation. - relative_convergence_threshold: If not None, also converge when the change - in max_delta is <= this for relative_convergence_streak consecutive - iterations. Change is |max_delta(n) - max_delta(n-1)|. - relative_convergence_streak: Consecutive iterations for early stopping. """ self.building = building self._hvac = hvac - logging.info("Constructing the floorplan based simulation.") - - if self._hvac.fill_zone_identifier_exogenously: - logging.info("Filling zones exogenously") - self._hvac.initialize_zone_identifier(self.building._room_dict.keys()) + zone_identifiers = [ + z + for z in self.building.room_dict.keys() + if not constants.is_non_physical_space(z) + ] + self._hvac.initialize_zone_identifier( + zone_identifiers, self.building.custom_zone_to_vavs + ) super().__init__( self.building, @@ -86,12 +105,8 @@ def __init__( iteration_limit, iteration_warning, start_timestamp, - relative_convergence_threshold=relative_convergence_threshold, - relative_convergence_streak=relative_convergence_streak, ) - logging.info("Constructing the floorplan based simulation.") - render_zones = np.copy(self.building.floor_plan) render_zones[render_zones == 2] = 0 @@ -118,6 +133,21 @@ def hvac(self) -> hvac_floorplan_based.FloorPlanBasedHvac: def current_timestamp(self) -> pd.Timestamp: return self._current_timestamp + def setup_step_sim(self) -> None: + """Disables the base Simulator setup step. + + This method is overridden with a `pass` because SimulatorFlexibleGeometries + handles VAV updates more robustly in `execute_step_sim` using weighted + averages for shared zones and custom VAV IDs. The base class's + `setup_step_sim` assumes a 1:1 mapping between room names and VAV IDs, + which causes a KeyError when custom mappings are used. + """ + pass + + def step_sim(self, video_filename: Optional[str] = "sample.mp4") -> None: + """Steps simulation, executing one time step.""" + self.execute_step_sim(video_filename) + def execute_step_sim( self, video_filename: Optional[str] = "sample.mp4" ) -> None: @@ -125,19 +155,65 @@ def execute_step_sim( current_ts = self._current_timestamp hvac = self._hvac - - # Get the average temps in each zone. Assumes that the thermostat reads - # the average room temperatures. + room_dict = self.building.room_dict + room_areas = {z: len(coords) for z, coords in room_dict.items()} avg_temps = self.building.get_zone_average_temps() - - # Recirculation temperature at the air handler is the global average. - recirculation_temp = self.building.temp.mean() - ambient_temperature = self._weather_controller.get_current_temp(current_ts) - supply_air_temp = hvac.air_handler.get_supply_air_temp( - recirculation_temp, ambient_temperature - ) + ahu_temp_weighted_sum = collections.defaultdict(float) + ahu_area_total = collections.defaultdict(float) + vav_cached_data = {} + vav_sensing_temp_map = {} + vav_supply_temp_map = {} + + for v_id, vav in hvac.vavs.items(): + ahu_id = vav.air_handler.device_id() + assigned_zones = [ + z for z in hvac.get_zones_for_vav(v_id) if z in avg_temps + ] + if not assigned_zones: + continue + + v_area = sum(room_areas[z] for z in assigned_zones) + v_sensing_temp = ( + sum(avg_temps[z] * room_areas[z] for z in assigned_zones) / v_area + ) + vav.update_settings(v_sensing_temp, current_ts) + + vav_cached_data[v_id] = { + "assigned_zones": assigned_zones, + "v_area": v_area, + "v_sensing_temp": v_sensing_temp, + } + vav_sensing_temp_map[v_id] = v_sensing_temp + + ahu_temp_weighted_sum[ahu_id] += v_sensing_temp * v_area + ahu_area_total[ahu_id] += v_area + + if isinstance(hvac.air_handler, air_handler_py.AirHandlerSystem): + ahus = hvac.air_handler.ahus + else: + ahus = [hvac.air_handler] + + recirculation_temps = {} + for ahu in ahus: + ahu_id = ahu.device_id() + if ahu_area_total.get(ahu_id, 0) > 0: + recirculation_temps[ahu_id] = ( + ahu_temp_weighted_sum[ahu_id] / ahu_area_total[ahu_id] + ) + else: + recirculation_temps[ahu_id] = self.building.temp.mean() + + if isinstance(hvac.air_handler, air_handler_py.AirHandlerSystem): + supply_air_temp = hvac.air_handler.get_supply_air_temp( + recirculation_temps, ambient_temperature + ) + else: + # Single AHU case + supply_air_temp = hvac.air_handler.get_supply_air_temp( + recirculation_temps[hvac.air_handler.device_id()], ambient_temperature + ) convection_coefficient = ( self._weather_controller.get_air_convection_coefficient(current_ts) @@ -152,31 +228,61 @@ def execute_step_sim( # Simulate airflow self.building.apply_convection() - # Reset the air handler and boiler flow rate demand before accumulating. + # Reset the air handler and hws flow rate demand before accumulating. hvac.air_handler.reset_demand() - hvac.boiler.reset_demand() + hvac.hot_water_system.reset_demand() + + # sum up all the VAV hot waterdemands for the current timestep + # this needs to be calculated first before the output function is called, + # since the flow rate of the entire system can only be determined if we know + # the total demand from all VAVs + for vav in hvac.vavs.values(): + hvac.hot_water_system.add_demand(vav.reheat_flow_factor) + + # Stores the total thermal energy to be applied to each physical zone + zone_q_aggregate = collections.defaultdict(float) + + for v_id, vav in hvac.vavs.items(): + if v_id not in vav_cached_data: + continue + cached_data = vav_cached_data[v_id] + assigned_zones = cached_data["assigned_zones"] + total_vav_area = cached_data["v_area"] + weighted_sensing_temp = cached_data["v_sensing_temp"] + + # 2) thermal computation + if isinstance(supply_air_temp, dict): + current_supply_temp = supply_air_temp[vav.air_handler.device_id()] + else: + current_supply_temp = supply_air_temp + q_vav, temp_vav_supply = vav.output( + weighted_sensing_temp, current_supply_temp + ) - zone_supply_temp_map = {} + vav_supply_temp_map[v_id] = temp_vav_supply - # Iterate through each zone. - for zone, zone_temp in avg_temps.items(): - vav = hvac.vavs[zone] + # 3) virtual vav distribution to zones proportional to area + for z in assigned_zones: + area_share = room_areas[z] / total_vav_area + zone_q_aggregate[z] += q_vav * area_share - q_zone, zone_supply_temp = vav.output(zone_temp, supply_air_temp) - zone_supply_temp_map[zone] = zone_supply_temp # Update the air handler airflow demand by summing from all VAVs. if vav.flow_rate_demand > 0: - hvac.air_handler.add_demand(vav.flow_rate_demand) + vav.air_handler.add_demand(vav.flow_rate_demand) - # Update the boiler demand for hot water as the sum of each VAV"s demand. - if vav.reheat_demand > 0: - hvac.boiler.add_demand(vav.reheat_demand) + # apply aggregated power to building + for z, q_total in zone_q_aggregate.items(): + self.building.apply_thermal_power_zone(z, q_total) - # Apply the thermal energy to the zone. - self.building.apply_thermal_power_zone(zone, q_zone) + hvac.hot_water_system.return_water_temperature_sensor = ( + self._calculate_return_water_temperature(vav_supply_temp_map) + ) - hvac.boiler.return_water_temperature_sensor = ( - self._calculate_return_water_temperature(zone_supply_temp_map) + # stabilize + self.building.temp = np.clip( + self.building.temp, + 250, + 450, ) # Increment the timestamp. @@ -184,7 +290,34 @@ def execute_step_sim( self._log_and_plotter.log(self.building.temp) if self.current_timestamp == self._start_timestamp + pd.Timedelta(days=4): - self.get_video(path=constants.SIM_VIDEOS_DIRPATH + video_filename) + self.get_video(path=constants.VIDEO_PATH_ROOT + video_filename) + + def _calculate_return_water_temperature( + self, vav_supply_temps: Mapping[str, float] + ) -> float: + """Calculates return water temperature based on VAV supply air temperatures. + + This assumes that the water returning from each VAV is at the same + temperature as the VAV supply air it provides. + + Args: + vav_supply_temps: A mapping from VAV id to its supply air temperature. + + Returns: + The calculated return water temperature. + """ + numerator = 0.0 + denominator = 0.0 + for v_id, vav in self._hvac.vavs.items(): + if v_id in vav_supply_temps: + numerator += vav.reheat_flow_factor * vav_supply_temps[v_id] + denominator += vav.reheat_flow_factor + if denominator > 1e-6: + return numerator / denominator + else: + # If there is no reheat flow, the return water temperature does not + # change. Return the current sensor value. + return self._hvac.hot_water_system.return_water_temperature_sensor def _get_zone_reward_info( self, @@ -193,27 +326,58 @@ def _get_zone_reward_info( zone_id: str, zone_air_temperature: float, ) -> RewardInfo.ZoneRewardInfo: - """Returns a message with zone data to compute the instantaneous reward.""" - schedule = self._hvac.vavs[zone_coords].thermostat.get_setpoint_schedule() + """Returns a message with zone data to compute the instantaneous reward. + + This assumes all VAVs for a zone share the same setpoint schedule, + so the schedule is taken from the first VAV. If this assumption + changes with local control, this method will need updating. Airflow from all + VAVs feeding the zone is aggregated into a single virtual VAV to compute + the correct airflow setpoint and actual airflow. + + Args: + occupancy_function: The occupancy function to use for the zone. + zone_coords: The coordinates of the zone. + zone_id: The identifier of the zone. + zone_air_temperature: The air temperature in the zone. + + Returns: + A ZoneRewardInfo message. + """ + room_dict = self.building.room_dict + room_areas = {z: len(coords) for z, coords in room_dict.items()} + vav_ids = self._hvac.get_vav_ids_for_zone(zone_coords) + vavs = [self._hvac.vavs[v_id] for v_id in vav_ids] + if not vavs: + logging.warning("Zone %s has no servicing VAVs.", zone_id) + return RewardInfo.ZoneRewardInfo() + schedule = vavs[0].thermostat.get_setpoint_schedule() heating_setpoint_temperature, cooling_setpoint_temperature = ( schedule.get_temperature_window(self._current_timestamp) ) - air_flow_rate_setpoint = self._hvac.vavs[zone_coords].max_air_flow_rate - air_flow_rate = self._hvac.air_handler.air_flow_rate + # Aggregate Capacity and Demand with Area Weighting + zone_total_flow_setpoint = 0.0 + zone_total_flow_actual = 0.0 + for v in vavs: + # How much of this specific VAV's total footprint belongs to this room? + serviced_zones = self._hvac.get_zones_for_vav(v.device_id()) + total_vav_area = sum(room_areas[z] for z in serviced_zones) + area_share = room_areas[zone_coords] / total_vav_area + zone_total_flow_setpoint += v.max_air_flow_rate * area_share + zone_total_flow_actual += v.flow_rate_demand * area_share + average_occupancy = occupancy_function.average_zone_occupancy( zone_id, self._current_timestamp, self._current_timestamp + pd.Timedelta(self._time_step_sec, unit="s"), ) - zone_info = RewardInfo.ZoneRewardInfo( + return RewardInfo.ZoneRewardInfo( heating_setpoint_temperature=heating_setpoint_temperature, cooling_setpoint_temperature=cooling_setpoint_temperature, zone_air_temperature=zone_air_temperature, - air_flow_rate_setpoint=air_flow_rate_setpoint, - air_flow_rate=air_flow_rate, + air_flow_rate_setpoint=zone_total_flow_setpoint, + air_flow_rate=zone_total_flow_actual, average_occupancy=average_occupancy, ) - return zone_info def _get_zone_reward_infos( self, occupancy_function: BaseOccupancy @@ -230,9 +394,7 @@ def _get_zone_reward_infos( zone_coords, zone_air_temperature, ) in self.building.get_zone_average_temps().items(): - zone_id = conversion_utils.floor_plan_based_zone_identifier_to_id( - zone_coords - ) + zone_id = zone_coords zone_reward_infos[zone_id] = self._get_zone_reward_info( occupancy_function, zone_coords, zone_id, zone_air_temperature ) @@ -251,13 +413,58 @@ def _get_air_handler_reward_infos( self._hvac.air_handler.compute_intake_fan_energy_rate() + self._hvac.air_handler.compute_exhaust_fan_energy_rate() ) - recirculation_temp = self.building.temp.mean() ambient_temp = self._weather_controller.get_current_temp( self._current_timestamp ) + avg_temps = self.building.get_zone_average_temps() + room_dict = self.building.room_dict + room_areas = {z: len(coords) for z, coords in room_dict.items()} + + ahu_temp_weighted_sum = collections.defaultdict(float) + ahu_area_total = collections.defaultdict(float) + + for v_id, vav in self._hvac.vavs.items(): + ahu_id = vav.air_handler.device_id() + assigned_zones = [ + z for z in self._hvac.get_zones_for_vav(v_id) if z in avg_temps + ] + if not assigned_zones: + continue + + v_area = sum(room_areas[z] for z in assigned_zones) + if v_area > 0: + v_sensing_temp = ( + sum(avg_temps[z] * room_areas[z] for z in assigned_zones) / v_area + ) + ahu_temp_weighted_sum[ahu_id] += v_sensing_temp * v_area + ahu_area_total[ahu_id] += v_area + + if isinstance(self._hvac.air_handler, air_handler_py.AirHandlerSystem): + ahus = self._hvac.air_handler.ahus + else: + ahus = [self._hvac.air_handler] + + recirculation_temps = {} + for ahu in ahus: + ahu_id = ahu.device_id() + if ahu_area_total.get(ahu_id, 0) > 0: + recirculation_temps[ahu_id] = ( + ahu_temp_weighted_sum[ahu_id] / ahu_area_total[ahu_id] + ) + else: + recirculation_temps[ahu_id] = self.building.temp.mean() + + if isinstance(self._hvac.air_handler, air_handler_py.AirHandlerSystem): + recirculation_input = recirculation_temps + else: + # Single AHU case + recirculation_input = recirculation_temps[ + self._hvac.air_handler.device_id() + ] + air_conditioning_electrical_energy_rate = ( self._hvac.air_handler.compute_thermal_energy_rate( - recirculation_temp, ambient_temp + recirculation_input, ambient_temp ) ) air_handler_reward_info = RewardInfo.AirHandlerRewardInfo( @@ -267,29 +474,49 @@ def _get_air_handler_reward_infos( air_handler_reward_infos[air_handler_id] = air_handler_reward_info return air_handler_reward_infos - def _get_boiler_reward_infos( + def _get_hws_reward_infos( self, - ) -> Mapping[str, RewardInfo.BoilerRewardInfo]: - """Returns a map of messages with boiler data. + ) -> tuple[ + Mapping[str, RewardInfo.BoilerRewardInfo | RewardInfo.HeatPumpRewardInfo], + smart_control_building_pb2.DeviceInfo.DeviceType, + ]: + """Returns a map of messages with hot water system data. This data is used to compute the instantaneous reward. """ - boiler_reward_infos = {} - boiler_id = self._hvac.boiler.device_id() - return_water_temp = self._hvac.boiler.return_water_temperature_sensor - natural_gas_heating_energy_rate = ( - self._hvac.boiler.compute_thermal_energy_rate( + hws_reward_infos = {} + hws_id = self._hvac.hot_water_system.device_id() + return_water_temp = ( + self._hvac.hot_water_system.return_water_temperature_sensor + ) + heating_energy_rate = ( + self._hvac.hot_water_system.compute_thermal_energy_rate( return_water_temp, self._weather_controller.get_current_temp(self._current_timestamp), ) ) - pump_electrical_energy_rate = self._hvac.boiler.compute_pump_power() - boiler_reward_info = RewardInfo.BoilerRewardInfo( - natural_gas_heating_energy_rate=natural_gas_heating_energy_rate, - pump_electrical_energy_rate=pump_electrical_energy_rate, + pump_electrical_energy_rate = ( + self._hvac.hot_water_system.compute_pump_power() ) - boiler_reward_infos[boiler_id] = boiler_reward_info - return boiler_reward_infos + hws_device_type = self._hvac.hot_water_system.heat_source_device_type + device_type = smart_control_building_pb2.DeviceInfo.DeviceType + if hws_device_type == device_type.BLR: + hws_reward_info = RewardInfo.BoilerRewardInfo( + natural_gas_heating_energy_rate=heating_energy_rate, + pump_electrical_energy_rate=pump_electrical_energy_rate, + ) + elif hws_device_type == device_type.ASHP: + hws_reward_info = RewardInfo.HeatPumpRewardInfo( + electricity_heating_energy_rate=heating_energy_rate, + pump_electrical_energy_rate=pump_electrical_energy_rate, + ) + else: + raise ValueError( + f"Unsupported heat source device type: {hws_device_type}" + ) + + hws_reward_infos[hws_id] = hws_reward_info + return hws_reward_infos, hws_device_type def reward_info(self, occupancy_function: BaseOccupancy) -> RewardInfo: """Returns a message with data to compute the instantaneous reward.""" @@ -304,20 +531,31 @@ def reward_info(self, occupancy_function: BaseOccupancy) -> RewardInfo: # get air handler info air_handler_reward_infos = self._get_air_handler_reward_infos() - # get boiler info - boiler_reward_infos = self._get_boiler_reward_infos() + # get hot water system info + hws_reward_infos, hws_device_type = self._get_hws_reward_infos() - return RewardInfo( - start_timestamp=conversion_utils.pandas_to_proto_timestamp( + reward_info_args = { + "start_timestamp": conversion_utils.pandas_to_proto_timestamp( start_time_stamp ), - end_timestamp=conversion_utils.pandas_to_proto_timestamp( + "end_timestamp": conversion_utils.pandas_to_proto_timestamp( end_time_stamp ), - zone_reward_infos=zone_reward_infos, - air_handler_reward_infos=air_handler_reward_infos, - boiler_reward_infos=boiler_reward_infos, - ) + "zone_reward_infos": zone_reward_infos, + "air_handler_reward_infos": air_handler_reward_infos, + } + + if hws_device_type == smart_control_building_pb2.DeviceInfo.DeviceType.BLR: + reward_info_args["boiler_reward_infos"] = hws_reward_infos + elif ( + hws_device_type == smart_control_building_pb2.DeviceInfo.DeviceType.ASHP + ): + reward_info_args["heat_pump_reward_infos"] = hws_reward_infos + else: + raise ValueError( + f"Unsupported heat source device type: {hws_device_type}" + ) + return RewardInfo(**reward_info_args) def get_video(self, path: str) -> None: """Wraps the get_video function from the visual_logger. diff --git a/smart_control/simulator/simulator_flexible_floor_plan_test.py b/smart_control/simulator/simulator_flexible_floor_plan_test.py index 42307edf..4a31980d 100644 --- a/smart_control/simulator/simulator_flexible_floor_plan_test.py +++ b/smart_control/simulator/simulator_flexible_floor_plan_test.py @@ -1,5 +1,3 @@ -"""Tests for simulator.""" - import copy from unittest import mock @@ -8,17 +6,16 @@ import numpy as np import pandas as pd -from smart_control.proto import smart_control_reward_pb2 -from smart_control.simulator import air_handler as air_handler_py -from smart_control.simulator import boiler as boiler_py -from smart_control.simulator import building as building_py -from smart_control.simulator import constants -from smart_control.simulator import hvac_floorplan_based as floorplan_hvac_py -from smart_control.simulator import setpoint_schedule -from smart_control.simulator import simulator_flexible_floor_plan as simulator_py -from smart_control.simulator import step_function_occupancy -from smart_control.simulator import weather_controller as weather_controller_py -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.simulator import air_handler as air_handler_py +from smart_buildings.smart_control.simulator import building as building_py +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import hvac_floorplan_based as floorplan_hvac_py +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import simulator_flexible_floor_plan as simulator_py +from smart_buildings.smart_control.simulator import step_function_occupancy +from smart_buildings.smart_control.simulator import weather_controller as weather_controller_py +from smart_buildings.smart_control.utils import conversion_utils class FlexibleFloorplanSimulatorTest(parameterized.TestCase): @@ -87,35 +84,6 @@ def _create_dummy_floor_plan_small(self): return plan - def _create_dummy_floor_plan_small_with_fenestrations(self): - """Creates a normal dummy floor plan with fenestrations.""" - plan = np.array([ - [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 4, 4, 4, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 4, 4, 4, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 4, 4, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 4, 4, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 4, 4, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 4, 4, 0, 0, 0, 0, 0, 0, 1, 1, 2], - [2, 1, 1, 1, 4, 4, 4, 1, 1, 1, 1, 2], - [2, 1, 1, 1, 4, 4, 4, 1, 1, 1, 1, 2], - [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], - ]) - return plan - def _create_scenario_floor_plan(self) -> None: """Matches the previous deprecated building. @@ -220,14 +188,7 @@ def _create_dummy_floor_plan_weird_shape(self): ]) return plan - def _create_small_building( - self, - initial_temp, - match_diffusers=False, - include_radiative_heat_transfer=False, - floor_plan=None, - include_interior_mass=False, - ): + def _create_small_building(self, initial_temp, match_diffusers=False): """Returns building with specified initial temperature. The building returned will have a matrix size of: 21 x 10, this should be @@ -238,9 +199,6 @@ def _create_small_building( initial_temp: Initial temperature of all CVs in building. match_diffusers: borrow the diffuser allocation scheme of the deprecated building (for testing purposes) - include_radiative_heat_transfer: include radiative heat transfer - floor_plan: floor plan to use - include_interior_mass: include interior mass """ cv_size_cm = 20.0 floor_height_cm = 300.0 @@ -250,111 +208,9 @@ def _create_small_building( inside_wall_properties = building_py.MaterialProperties( conductivity=2.0, heat_capacity=500.0, density=1800.0 ) - building_exterior_properties = building_py.MaterialProperties( - conductivity=1.0, heat_capacity=500.0, density=3000.0 - ) - - if floor_plan is None: - floor_plan = self._create_dummy_floor_plan_small() - - zone_map = copy.deepcopy(floor_plan) - - if include_radiative_heat_transfer or include_interior_mass: - if include_radiative_heat_transfer: - inside_air_radiative_properties = building_py.RadiationProperties( - alpha=0.0, epsilon=0.0, tau=1.0, rho=None - ) - inside_wall_radiative_properties = building_py.RadiationProperties( - alpha=0.4, epsilon=0.6, tau=0.0, rho=None - ) - building_exterior_radiative_properties = ( - building_py.RadiationProperties( - alpha=0.65, epsilon=0.35, tau=0.0, rho=None - ) - ) - else: - inside_air_radiative_properties = None - inside_wall_radiative_properties = None - building_exterior_radiative_properties = None - - if include_interior_mass: - interior_mass_properties = building_py.MaterialProperties( - conductivity=5.0, heat_capacity=300.0, density=2000.0 - ) - else: - interior_mass_properties = None - - building = building_py.FloorPlanBasedBuilding( - cv_size_cm=cv_size_cm, - floor_height_cm=floor_height_cm, - initial_temp=initial_temp, - inside_air_properties=inside_air_properties, - inside_wall_properties=inside_wall_properties, - building_exterior_properties=building_exterior_properties, - floor_plan=floor_plan, - zone_map=zone_map, - buffer_from_walls=0, - inside_air_radiative_properties=inside_air_radiative_properties, - inside_wall_radiative_properties=inside_wall_radiative_properties, - building_exterior_radiative_properties=building_exterior_radiative_properties, # pylint: disable=line-too-long - include_radiative_heat_transfer=include_radiative_heat_transfer, - view_factor_method="ScriptF", - interior_mass_properties=interior_mass_properties, - include_interior_mass=include_interior_mass, - ) - else: - building = building_py.FloorPlanBasedBuilding( - cv_size_cm=cv_size_cm, - floor_height_cm=floor_height_cm, - initial_temp=initial_temp, - inside_air_properties=inside_air_properties, - inside_wall_properties=inside_wall_properties, - building_exterior_properties=building_exterior_properties, - floor_plan=floor_plan, - zone_map=zone_map, - buffer_from_walls=0, - ) - - if match_diffusers: - deprecated_building = self._create_small_building_deprecated(initial_temp) - building.diffusers = np.pad( - deprecated_building.diffusers, 2, "constant", constant_values=0 - ) - - return building - - def _create_simulator_and_building( - self, - initial_temp=292.0, - include_interior_mass=True, - include_radiative_heat_transfer=False, - convergence_threshold=0.001, - iteration_limit=100, - ): - """Creates a building and simulator instance with shared parameters.""" - weather_controller = mock.create_autospec( - weather_controller_py.WeatherController - ) - time_step_sec = 300.0 - hvac = self._create_small_hvac() - iteration_warning = 10 - start_timestamp = pd.Timestamp("2012-12-21") - - # Building geometry and base properties - cv_size_cm = 20.0 - floor_height_cm = 300.0 - inside_air_properties = building_py.MaterialProperties( - conductivity=50.0, heat_capacity=1.0, density=1.2 - ) - inside_wall_properties = building_py.MaterialProperties( - conductivity=2.0, heat_capacity=500.0, density=1800.0 - ) building_exterior_properties = building_py.MaterialProperties( conductivity=0.05, heat_capacity=500.0, density=3000.0 ) - interior_mass_properties = building_py.MaterialProperties( - conductivity=0.5, heat_capacity=1000.0, density=2000.0 - ) floor_plan = self._create_dummy_floor_plan_small() zone_map = copy.deepcopy(floor_plan) @@ -369,25 +225,15 @@ def _create_simulator_and_building( floor_plan=floor_plan, zone_map=zone_map, buffer_from_walls=0, - interior_mass_properties=interior_mass_properties, - include_interior_mass=include_interior_mass, - include_radiative_heat_transfer=include_radiative_heat_transfer, - view_factor_method="ScriptF" - if include_radiative_heat_transfer - else None, ) - simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - return simulator, building + if match_diffusers: + deprecated_building = self._create_small_building_deprecated(initial_temp) + building.diffusers = np.pad( + deprecated_building.diffusers, 2, "constant", constant_values=0 + ) + + return building def _create_weirdly_shaped_building(self, initial_temp): """Returns weird building with specified initial temperature. @@ -466,27 +312,27 @@ def _create_small_building_deprecated(self, initial_temp): def _create_small_hvac(self): """Returns hvac matching zones for small test building.""" - reheat_water_setpoint = 260 + supply_water_temperature_setpoint = 260 water_pump_differential_head = 3 water_pump_efficiency = 0.6 - boiler = boiler_py.Boiler( - reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, - "boiler_id", + hot_water_system = hot_water_system_py.construct_hot_water_system( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=water_pump_efficiency, + device_id="hws_id", ) recirculation = 0.3 heating_air_temp_setpoint = 270 cooling_air_temp_setpoint = 288 - fan_differential_pressure = 20000.0 + fan_static_pressure = 20000.0 fan_efficiency = 0.8 air_handler = air_handler_py.AirHandler( recirculation, heating_air_temp_setpoint, cooling_air_temp_setpoint, - fan_differential_pressure, + fan_static_pressure, fan_efficiency, ) @@ -505,40 +351,41 @@ def _create_small_hvac(self): ) zone_identifier = ["room_1", "room_2"] + zone_to_vavs = {z: [z.replace("room", "VAV")] for z in zone_identifier} hvac = floorplan_hvac_py.FloorPlanBasedHvac( zone_identifier=zone_identifier, + zone_to_vavs=zone_to_vavs, air_handler=air_handler, - boiler=boiler, + hot_water_system=hot_water_system, schedule=schedule, vav_max_air_flow_rate=0.45, - vav_reheat_max_water_flow_rate=0.02, + vav_reheat_max_water_flow_factor=0.03688555555, ) return hvac def _create_scenario_hvac(self, zone_identifier): """Returns hvac matching zones for small test building.""" - reheat_water_setpoint = 350 + supply_water_temperature_setpoint = 350 water_pump_differential_head = 3 water_pump_efficiency = 0.6 - boiler = boiler_py.Boiler( - reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, - "boiler_id", + hot_water_system = hot_water_system_py.construct_hot_water_system( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=water_pump_efficiency, + device_id="hws_id", ) - recirculation = 0.6 heating_air_temp_setpoint = 291 cooling_air_temp_setpoint = 295 - fan_differential_pressure = 20000.0 + fan_static_pressure = 20000.0 fan_efficiency = 0.8 air_handler = air_handler_py.AirHandler( recirculation, heating_air_temp_setpoint, cooling_air_temp_setpoint, - fan_differential_pressure, + fan_static_pressure, fan_efficiency, ) @@ -556,13 +403,16 @@ def _create_scenario_hvac(self, zone_identifier): holidays, ) + zone_to_vavs = {z: [z.replace("room", "VAV")] for z in zone_identifier} + hvac = floorplan_hvac_py.FloorPlanBasedHvac( zone_identifier=zone_identifier, + zone_to_vavs=zone_to_vavs, air_handler=air_handler, - boiler=boiler, + hot_water_system=hot_water_system, schedule=schedule, vav_max_air_flow_rate=0.45, - vav_reheat_max_water_flow_rate=0.02, + vav_reheat_max_water_flow_factor=0.03688555555, ) return hvac @@ -609,6 +459,99 @@ def _create_scenario_building(self, initial_temp, match_old_diffusers=False): building.diffusers = np.pad(old_building.diffusers, 1, mode="constant") return building + def _create_mn_scenario_building(self, initial_temp): + """Returns a building with M:N VAV-to-zone mapping. + + One VAV serves two zones, and one zone is fed by two VAVs. + + Args: + initial_temp: Initial temperature of all CVs in building. + """ + cv_size_cm = 10.0 + floor_height_cm = 300.0 + inside_air_properties = building_py.MaterialProperties( + conductivity=50.0, heat_capacity=700.0, density=1.0 + ) + inside_wall_properties = building_py.MaterialProperties( + conductivity=5.0, heat_capacity=800.0, density=1800.0 + ) + building_exterior_properties = building_py.MaterialProperties( + conductivity=5.0, heat_capacity=800.0, density=3000.0 + ) + + floor_plan = np.array([[0, 0], [0, 0]]) + + custom_room_dict = { + "zone_1abc": [(0, 0)], + "zone_2def": [(0, 1)], + "zone_3ghi": [(1, 0), (1, 1)], + } + + custom_zone_to_vavs = { + "zone_1abc": ["VAV_1"], + "zone_2def": ["VAV_1"], + "zone_3ghi": ["VAV_2", "VAV_3"], + } + + building = building_py.FloorPlanBasedBuilding( + cv_size_cm=cv_size_cm, + floor_height_cm=floor_height_cm, + initial_temp=initial_temp, + inside_air_properties=inside_air_properties, + inside_wall_properties=inside_wall_properties, + building_exterior_properties=building_exterior_properties, + floor_plan=floor_plan, + custom_room_dict=custom_room_dict, + custom_zone_to_vavs=custom_zone_to_vavs, + buffer_from_walls=0, + min_room_size=0, + ) + return building + + def _create_mn_scenario_hvac(self, air_handler=None): + """Returns hvac with M:N mapping for the M:N scenario building.""" + hot_water_system = hot_water_system_py.construct_hot_water_system( + supply_water_temperature_setpoint=350, + water_pump_differential_head=3, + water_pump_efficiency=0.6, + device_id="hws_id", + ) + if air_handler is None: + air_handler = air_handler_py.AirHandler( + recirculation=0.6, + heating_air_temp_setpoint=291, + cooling_air_temp_setpoint=295, + fan_static_pressure=20000.0, + fan_efficiency=0.8, + ) + + schedule = setpoint_schedule.SetpointSchedule( + morning_start_hour=9, + evening_start_hour=18, + comfort_temp_window=(292, 295), + eco_temp_window=(290, 297), + holidays=set([7, 223, 245]), + ) + + zone_identifier = ["zone_1abc", "zone_2def", "zone_3ghi"] + + zone_to_vavs = { + "zone_1abc": ["VAV_1"], + "zone_2def": ["VAV_1"], + "zone_3ghi": ["VAV_2", "VAV_3"], + } + + hvac = floorplan_hvac_py.FloorPlanBasedHvac( + air_handler=air_handler, + hot_water_system=hot_water_system, + schedule=schedule, + vav_max_air_flow_rate=0.45, + vav_reheat_max_water_flow_factor=0.03688555555, + zone_identifier=zone_identifier, + zone_to_vavs=zone_to_vavs, + ) + return hvac + def test_init(self): building = self._create_small_building(initial_temp=293) weather_controller = mock.create_autospec( @@ -622,14 +565,14 @@ def test_init(self): start_timestamp = pd.Timestamp("2012-12-21") simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) self.assertEqual(simulator.building, building) @@ -641,6 +584,10 @@ def test_init(self): self.assertEqual(simulator._iteration_warning, iteration_warning) self.assertEqual(simulator._current_timestamp, start_timestamp) + # TODO(sipple): Re-enable this test once the heating setpoint is fixed. + @absltest.skip( + "TODO(sipple): Re-enable this test once the heating setpoint is fixed." + ) def test_reset(self): initial_temp = 293 building = self._create_small_building(initial_temp) @@ -655,14 +602,14 @@ def test_reset(self): start_timestamp = pd.Timestamp("2012-12-21") simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) simulator.building.temp[2][2] += 10.0 @@ -670,19 +617,18 @@ def test_reset(self): simulator.building.input_q[2][2] = 1000.0 simulator.building.input_q[0][3] = 1000.0 - simulator.hvac.boiler._return_water_temperature_sensor += 10.0 - simulator.hvac.boiler._water_pump_differential_head += 100.0 - simulator.hvac.boiler._reheat_water_setpoint += 2.0 + simulator.hvac.hot_water_system.water_pump_differential_head += 100.0 + simulator.hvac.hot_water_system.supply_water_temperature_setpoint += 2.0 - simulator.hvac.air_handler._air_flow_rate += 0.1 - simulator.hvac.air_handler._fan_differential_pressure = 0.1 + simulator.hvac.air_handler.air_flow_rate += 0.1 + simulator.hvac.air_handler.supply_air_static_pressure_setpoint = 0.1 - for coord in simulator.hvac._zone_identifier: - vav = simulator.hvac.vavs[coord] + for v_id in simulator.hvac.vavs: + vav = simulator.hvac.vavs[v_id] vav.thermostat._setpoint_schedule.morning_start_hour += 1.0 vav.thermostat._setpoint_schedule.comfort_temp_window = (280, 310) vav.max_air_flow_rate += 0.1 - vav._reheat_max_water_flow_rate += 0.1 + vav._reheat_max_water_flow_factor += 0.1 simulator._current_timestamp += pd.Timedelta(360.0, unit="seconds") simulator.reset() @@ -702,28 +648,28 @@ def test_reset(self): expected_air_handler.cooling_air_temp_setpoint, ) self.assertEqual( - simulator._hvac.air_handler.fan_differential_pressure, - expected_air_handler.fan_differential_pressure, + simulator._hvac.air_handler.supply_air_static_pressure_setpoint, + expected_air_handler.supply_air_static_pressure_setpoint, ) self.assertEqual( simulator._hvac.air_handler.fan_efficiency, expected_air_handler.fan_efficiency, ) - expected_boiler = expected_hvac.boiler + expected_hot_water_system = expected_hvac.hot_water_system self.assertEqual( - simulator._hvac.boiler.reheat_water_setpoint, - expected_boiler._reheat_water_setpoint, + simulator._hvac.hot_water_system.supply_water_temperature_setpoint, + expected_hot_water_system.supply_water_temperature_setpoint, ) self.assertEqual( - simulator._hvac.boiler._water_pump_differential_head, - expected_boiler._water_pump_differential_head, + simulator._hvac.hot_water_system.water_pump_differential_head, + expected_hot_water_system.water_pump_differential_head, ) self.assertEqual( - simulator._hvac.boiler._water_pump_efficiency, - expected_boiler._water_pump_efficiency, + simulator._hvac.hot_water_system._pump._water_pump_efficiency, + expected_hot_water_system._pump._water_pump_efficiency, ) - self.assertEqual(simulator._hvac.boiler._total_flow_rate, 0) + self.assertEqual(simulator._hvac.hot_water_system.total_flow_rate, 0) self.assertEqual(simulator._current_timestamp, start_timestamp) self.assertEqual(simulator.building.temp[2][2], initial_temp) @@ -759,14 +705,14 @@ def test_get_cv_temp_estimate_cell_no_change(self): expected_temp_estimate = 292.0 simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) # Test every cell. @@ -779,6 +725,7 @@ def test_get_cv_temp_estimate_cell_no_change(self): ambient_temperature, convection_coefficient, ) + # Due to floating point precision errors. self.assertAlmostEqual( temp_estimate, @@ -816,14 +763,14 @@ def test_get_cv_temp_estimate_cell_increase_from_conduction( convection_coefficient = 12.0 simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) temp_estimate = simulator._get_cv_temp_estimate( @@ -864,14 +811,14 @@ def test_get_cv_temp_estimate_cell_decrease_from_conduction( convection_coefficient = 12.0 simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) temp_estimate = simulator._get_cv_temp_estimate( @@ -915,14 +862,14 @@ def test_get_cv_temp_estimate_convection_corner_increases_faster_than_edge( convection_coefficient = 12.0 simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) # Get estimates for corner and edge cells. @@ -990,14 +937,14 @@ def test_weird_building_get_cv_temp_estimate_convection_corner_increases( convection_coefficient = 12.0 simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) # Get estimates for corner and edge cells. @@ -1045,14 +992,14 @@ def test_get_cv_temp_estimate_convection_corner_decreases_faster_than_edge( convection_coefficient = 12.0 simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) corner_temp_estimate = simulator._get_cv_temp_estimate( @@ -1097,14 +1044,14 @@ def test_update_temperature_estimates_changes_temperatures(self): building.temp *= 0.0 simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) simulator.update_temperature_estimates( @@ -1134,14 +1081,14 @@ def test_update_temperature_estimates_return_value(self): temperature_estimates = building.temp.copy() simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) _, max_delta = simulator.update_temperature_estimates( @@ -1149,6 +1096,7 @@ def test_update_temperature_estimates_return_value(self): ambient_temperature=292.0, convection_coefficient=12.0, ) + self.assertAlmostEqual(max_delta, 0.0, places=3) def test_finite_differences_timestep_does_not_converge(self): @@ -1165,14 +1113,14 @@ def test_finite_differences_timestep_does_not_converge(self): building = self._create_small_building(initial_temp=292.0) sim = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) with self.assertLogs() as logs: @@ -1189,11 +1137,15 @@ def test_finite_differences_timestep_does_not_converge(self): [ x for x in logs.output - if "Max iteration count reached, max_delta = 0." in x + if x.endswith("Max iteration count reached, max_delta = 0.029") ], 1, ) + # TODO(sipple): Re-enable this test once the heating setpoint is fixed. + @absltest.skip( + "TODO(sipple): Re-enable this test once the heating setpoint is fixed." + ) def test_step_sim_heating_scenario_avg_temps_increase(self): """Tests that the average temperature increases. @@ -1216,14 +1168,14 @@ def test_step_sim_heating_scenario_avg_temps_increase(self): ) sim = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) for _ in range(5): @@ -1234,6 +1186,10 @@ def test_step_sim_heating_scenario_avg_temps_increase(self): for temperature in avg_temperatures.values(): self.assertGreater(temperature, initial_temperature) + # TODO(sipple): Re-enable this test once the heating setpoint is fixed. + @absltest.skip( + "TODO(sipple): Re-enable this test once the heating setpoint is fixed." + ) def test_step_sim_heating_scenario_zone_temperature_speeds(self): """Tests that certain zones heat faster than others. @@ -1261,14 +1217,14 @@ def test_step_sim_heating_scenario_zone_temperature_speeds(self): ) sim = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) for _ in range(5): @@ -1311,14 +1267,14 @@ def test_step_sim_heating_scenario_vavs_cools(self): ) sim = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) for _ in range(5): @@ -1354,14 +1310,14 @@ def test_step_sim_cooling_scenario_vavs_heat(self): ) sim = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) for _ in range(5): @@ -1393,14 +1349,14 @@ def test_step_sim_increments_current_time(self): ) sim = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) for _ in range(5): @@ -1408,45 +1364,6 @@ def test_step_sim_increments_current_time(self): self.assertEqual(sim._current_timestamp, expected_end_timestamp) - def test_step_sim_sets_boiler_return_water_temperature_sensor(self): - weather_controller = weather_controller_py.WeatherController(296.0, 296.0) - time_step_sec = 300.0 - convergence_threshold = 0.1 - iteration_limit = 100 - iteration_warning = 10 - start_timestamp = pd.Timestamp("12-21-2012") - - initial_temperature = 200.0 - expected_return_water_temperature = 301.895482 - - # Building is 3x3 zones. - building = self._create_scenario_building( - initial_temp=initial_temperature, match_old_diffusers=True - ) - - hvac = self._create_scenario_hvac( - zone_identifier=building._room_dict.keys() - ) - - sim = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - - sim.step_sim() - - self.assertAlmostEqual( - sim._hvac.boiler.return_water_temperature_sensor, - expected_return_water_temperature, - delta=1e-5, - ) - def test_reward_info(self): weather_controller = weather_controller_py.WeatherController(296.0, 296.0) time_step_sec = 300.0 @@ -1467,14 +1384,14 @@ def test_reward_info(self): ) sim = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) occupancy = step_function_occupancy.StepFunctionOccupancy( @@ -1494,42 +1411,44 @@ def test_reward_info(self): ) expected_zone_reward_infos = {} - zone_identifier = [ - "room_1", - "room_2", - "room_3", - "room_4", - "room_5", - "room_6", - "room_7", - "room_8", - "room_9", - ] - for coords in zone_identifier: - zone_id = conversion_utils.floor_plan_based_zone_identifier_to_id(coords) + room_areas = { + z: len(coords) for z, coords in sim.building.room_dict.items() + } + avg_temps = sim.building.get_zone_average_temps() + + for zone_id, avg_temp in avg_temps.items(): occupancy_value = occupancy.average_zone_occupancy( zone_id, sim._current_timestamp, sim._current_timestamp + pd.Timedelta(sim._time_step_sec, unit="s"), ) - air_flow_rate = sim._hvac.air_handler.air_flow_rate - air_flow_rate_setpoint = sim._hvac.vavs[coords].max_air_flow_rate + vav_ids = sim._hvac.get_vav_ids_for_zone(zone_id) + vavs = [sim._hvac.vavs[v_id] for v_id in vav_ids] + + zone_total_flow_setpoint = 0.0 + zone_total_flow_actual = 0.0 + for v in vavs: + # Flow is distributed to zones based on area share. + assigned_zones = sim._hvac.get_zones_for_vav(v.device_id()) + total_vav_area = sum(room_areas[z] for z in assigned_zones) + area_share = room_areas[zone_id] / total_vav_area + zone_total_flow_setpoint += v.max_air_flow_rate * area_share + zone_total_flow_actual += v.flow_rate_demand * area_share + + # assume that all vavs serving a zone should have same setpoints heating_setpoint, cooling_setpoint = ( - sim._hvac.vavs[coords] - .thermostat.get_setpoint_schedule() + vavs[0].thermostat.get_setpoint_schedule() .get_temperature_window(sim._current_timestamp) ) - zone_temperature = sim.building.get_zone_average_temps()[coords] - - expected_zone_info = smart_control_reward_pb2.RewardInfo.ZoneRewardInfo( + zone_reward_info = smart_control_reward_pb2.RewardInfo.ZoneRewardInfo( heating_setpoint_temperature=heating_setpoint, cooling_setpoint_temperature=cooling_setpoint, - zone_air_temperature=zone_temperature, - air_flow_rate_setpoint=air_flow_rate_setpoint, - air_flow_rate=air_flow_rate, + zone_air_temperature=avg_temp, + air_flow_rate_setpoint=zone_total_flow_setpoint, + air_flow_rate=zone_total_flow_actual, average_occupancy=occupancy_value, ) - expected_zone_reward_infos[zone_id] = expected_zone_info + expected_zone_reward_infos[zone_id] = zone_reward_info self.assertEqual(reward_info.zone_reward_infos, expected_zone_reward_infos) @@ -1562,11 +1481,12 @@ def test_reward_info(self): ) boiler_reward_info = reward_info.boiler_reward_infos[ - sim._hvac.boiler.device_id() + sim._hvac.hot_water_system.device_id() ] natural_gas_heating_energy_rate = ( - sim._hvac.boiler.compute_thermal_energy_rate( - sim._hvac.boiler.return_water_temperature_sensor, ambient_temp + sim._hvac.hot_water_system.compute_thermal_energy_rate( + sim._hvac.hot_water_system.supply_water_temperature_sensor, + ambient_temp, ) ) self.assertAlmostEqual( @@ -1575,234 +1495,351 @@ def test_reward_info(self): places=3, ) - pump_electrical_energy_rate = sim._hvac.boiler.compute_pump_power() + pump_electrical_energy_rate = ( + sim._hvac.hot_water_system.compute_pump_power() + ) self.assertEqual( pump_electrical_energy_rate, boiler_reward_info.pump_electrical_energy_rate, ) - def test_update_temperature_estimates_return_value_with_lwx( # pylint: disable=line-too-long - self, - ): - """Test that the temperature estimates are updated correctly with LWX""" - - weather_controller = mock.create_autospec( - weather_controller_py.WeatherController - ) + # TODO(sipple): Re-enable this test once the heating setpoint is fixed. + @absltest.skip( + "TODO(sipple): Re-enable this test once the heating setpoint is fixed." + ) + def test_mn_custom_zones(self): + """Verifies that m:n thermal distribution works with custom zones.""" + weather_controller = weather_controller_py.WeatherController(296.0, 296.0) time_step_sec = 300.0 - hvac = self._create_small_hvac() convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 - start_timestamp = pd.Timestamp("2012-12-21") + start_timestamp = pd.Timestamp("12-21-2012") - building = self._create_small_building( - initial_temp=292.0, include_radiative_heat_transfer=True - ) - # temperature_estimates = building.temp.copy() + initial_temperature = 296.0 - simulator = simulator_py.SimulatorFlexibleGeometries( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, + building = self._create_mn_scenario_building( + initial_temp=initial_temperature ) - converged = simulator.finite_differences_timestep( - ambient_temperature=292, convection_coefficient=12.0 + hvac = self._create_mn_scenario_hvac() + sim = simulator_py.SimulatorFlexibleGeometries( + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=convergence_threshold, + iteration_limit=iteration_limit, + iteration_warning=iteration_warning, + start_timestamp=start_timestamp, ) - self.assertTrue( - converged, - msg=( - "finite_differences_timestep converged with radiative heat" - " transfer." - ), + _ = step_function_occupancy.StepFunctionOccupancy( + pd.Timedelta(9, unit="h"), pd.Timedelta(17, unit="h"), 10, 0.1 ) - def test_update_temperature_estimates_return_value_with_lwx_no_interior_walls( # pylint: disable=line-too-long - self, - ): - weather_controller = mock.create_autospec( - weather_controller_py.WeatherController + q_vav1, q_vav2, q_vav3 = 100.0, 200.0, 300.0 + + self.enter_context( + mock.patch.object( + hvac.vavs["VAV_1"], + "output", + return_value=(q_vav1, 300.0), + autospec=True, + ) ) - time_step_sec = 300.0 - hvac = self._create_small_hvac() - convergence_threshold = 0.1 - iteration_limit = 100 - iteration_warning = 10 - start_timestamp = pd.Timestamp("2012-12-21") + self.enter_context( + mock.patch.object( + hvac.vavs["VAV_2"], + "output", + return_value=(q_vav2, 305.0), + autospec=True, + ) + ) + self.enter_context( + mock.patch.object( + hvac.vavs["VAV_3"], + "output", + return_value=(q_vav3, 310.0), + autospec=True, + ) + ) + sim.step_sim() - plan = np.array([ - [2, 2, 2, 2, 2, 2, 2, 2, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 0, 0, 1, 0, 0, 1, 2], - [2, 1, 0, 0, 1, 0, 0, 1, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 1, 0, 0, 1, 0, 0, 1, 2], - [2, 1, 0, 0, 1, 0, 0, 1, 2], - [2, 1, 1, 1, 1, 1, 1, 1, 2], - [2, 2, 2, 2, 2, 2, 2, 2, 2], - ]) + # zone_1abc (Area 1) gets 1/2 of VAV_1 (Area 2) = 50.0 + self.assertAlmostEqual( + building.get_zone_thermal_energy_rate("zone_1abc"), 50.0 + ) + # zone_2def (Area 1) gets 1/2 of VAV_1 (Area 2) = 50.0 + self.assertAlmostEqual( + building.get_zone_thermal_energy_rate("zone_2def"), 50.0 + ) + # zone_3ghi (Area 2) gets 1.0*VAV_2 + 1.0*VAV_3 = 200+300=500.0 + self.assertAlmostEqual( + building.get_zone_thermal_energy_rate("zone_3ghi"), 500.0 + ) - building = self._create_small_building( - initial_temp=292.0, - include_radiative_heat_transfer=True, - floor_plan=plan, + # TODO(sipple): Re-enable this test once the heating setpoint is fixed. + @absltest.skip( + "TODO(sipple): Re-enable this test once the heating setpoint is fixed." + ) + def test_mn_recirculation_temp(self): + """Verifies that the recirculating temperature is calculated correctly.""" + building = self._create_mn_scenario_building( + initial_temp=296.0, + ) + ahu1 = air_handler_py.AirHandler( + recirculation=0.6, + heating_air_temp_setpoint=291, + cooling_air_temp_setpoint=295, + fan_static_pressure=20000.0, + fan_efficiency=0.8, + device_id="AHU_1", + ) + ahu2 = air_handler_py.AirHandler( + recirculation=0.6, + heating_air_temp_setpoint=291, + cooling_air_temp_setpoint=295, + fan_static_pressure=20000.0, + fan_efficiency=0.8, + device_id="AHU_2", ) - simulator = simulator_py.SimulatorFlexibleGeometries( + ahus_map = {ahu1: ["zone_1abc", "zone_2def"], ahu2: ["zone_3ghi"]} + air_handler_system = air_handler_py.AirHandlerSystem(ahus=ahus_map) + + hvac = self._create_mn_scenario_hvac(air_handler=air_handler_system) + + sim = simulator_py.SimulatorFlexibleGeometries( building, hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) + weather_controller_py.WeatherController(296.0, 296.0), + time_step_sec=300.0, + convergence_threshold=0.1, + iteration_limit=100, + iteration_warning=10, + start_timestamp=pd.Timestamp("12-21-2012"), + ) + + room_dict = building.room_dict + # AHU_1 zones: zone_1abc (Temp 300, Area 1), zone_2def (Temp 310, Area 1) + for coord in room_dict["zone_1abc"]: + building.temp[coord] = 300.0 + for coord in room_dict["zone_2def"]: + building.temp[coord] = 310.0 + # AHU_2 zones: zone_3ghi (Temp 290, Area 2) + for coord in room_dict["zone_3ghi"]: + building.temp[coord] = 290.0 + + with mock.patch.object( + air_handler_py.AirHandlerSystem, + "get_supply_air_temp", + wraps=sim._hvac.air_handler.get_supply_air_temp, + ) as mock_get_supply: + sim.step_sim() - converged = simulator.finite_differences_timestep( - ambient_temperature=292, convection_coefficient=12.0 - ) + # recirculation_temps is the first argument passed to get_supply_air_temp + recirculation_temps = mock_get_supply.call_args[0][0] - self.assertTrue( - converged, - msg=( - "finite_differences_timestep converged with radiative heat" - " transfer." - ), - ) + # AHU_1 Recirculation = (Zone1_Temp * Area1 + Zone2_Temp * Area2) / + # Total_Area + # AHU_1 Recirculation = (300*1 + 310*1) / 2 = 305.0 + self.assertAlmostEqual(recirculation_temps["AHU_1"], 305.0) + + # AHU_2 Recirculation = (Zone3_Temp * Area2) / Total_Area + # AHU_2 Recirculation = (290*2) / 2 = 290.0 + self.assertAlmostEqual(recirculation_temps["AHU_2"], 290.0) - def test_interior_mass_temperatures_update(self): - """Test that interior mass temperatures are updated during simulation.""" - simulator, building = self._create_simulator_and_building( - convergence_threshold=0.001, + # TODO(sipple): Re-enable this test once the heating setpoint is fixed. + @absltest.skip( + "TODO(sipple): Re-enable this test once the heating setpoint is fixed." + ) + def test_recirculation_temp_with_ahu_lacking_vavs(self): + """Verifies recirc temp defaults to building mean for AHUs without VAVs.""" + building = self._create_mn_scenario_building( + initial_temp=296.0, + ) + ahu1 = air_handler_py.AirHandler( + recirculation=0.6, + heating_air_temp_setpoint=291, + cooling_air_temp_setpoint=295, + fan_static_pressure=20000.0, + fan_efficiency=0.8, + device_id="AHU_1", + ) + ahu2 = air_handler_py.AirHandler( + recirculation=0.6, + heating_air_temp_setpoint=291, + cooling_air_temp_setpoint=295, + fan_static_pressure=20000.0, + fan_efficiency=0.8, + device_id="AHU_2", + ) + # AHU_3 is not associated with any zones/VAVs in the ahus_map. + ahu3 = air_handler_py.AirHandler( + recirculation=0.6, + heating_air_temp_setpoint=291, + cooling_air_temp_setpoint=295, + fan_static_pressure=20000.0, + fan_efficiency=0.8, + device_id="AHU_3", + ) + + ahus_map = {ahu1: ["zone_1abc", "zone_2def"], ahu2: ["zone_3ghi"], ahu3: []} + air_handler_system = air_handler_py.AirHandlerSystem(ahus=ahus_map) + + hvac = self._create_mn_scenario_hvac(air_handler=air_handler_system) + + sim = simulator_py.SimulatorFlexibleGeometries( + building, + hvac, + weather_controller_py.WeatherController(296.0, 296.0), + time_step_sec=300.0, + convergence_threshold=0.1, iteration_limit=100, - include_interior_mass=True, + iteration_warning=10, + start_timestamp=pd.Timestamp("12-21-2012"), ) - # Store initial interior mass temperatures - initial_interior_mass_temp = building.interior_mass_temp.copy() + # Set building temperatures to ensure a non-trivial mean. + building.temp.fill(290.0) + building.temp[0, 0] = 300.0 + expected_mean_temp = building.temp.mean() - # Run a timestep with different ambient temperature to cause heat transfer - converged = simulator.finite_differences_timestep( - ambient_temperature=300.0, convection_coefficient=12.0 - ) + with mock.patch.object( + air_handler_py.AirHandlerSystem, + "get_supply_air_temp", + wraps=sim._hvac.air_handler.get_supply_air_temp, + ) as mock_get_supply: + sim.step_sim() - self.assertTrue(converged) + recirculation_temps = mock_get_supply.call_args[0][0] - # Check that interior mass temperatures have increased - # Use NumPy boolean indexing with mask for cleaner array comparison - temps_increased = np.any( - building.interior_mass_temp[building.interior_mass_mask] - > initial_interior_mass_temp[building.interior_mass_mask] - ) + # AHU_3 has no VAVs assigned to it, so its area total will be 0. + # The recirculation temperature should default to the building's + # mean temp. + self.assertAlmostEqual( + recirculation_temps["AHU_3"], expected_mean_temp + ) - self.assertTrue( - temps_increased, - msg="Interior mass temperatures should increase during simulation", - ) + def test_ashp_reward_info(self): + weather_controller = weather_controller_py.WeatherController(296.0, 296.0) + time_step_sec = 300.0 + start_timestamp = pd.Timestamp("12-21-2012") - def test_interior_mass_convergence(self): - """Test that simulation with interior mass converges.""" - simulator, _ = self._create_simulator_and_building( - convergence_threshold=0.001, iteration_limit=100 + building = self._create_scenario_building(initial_temp=292.0) + + # Create HVAC with ASHP + hws = hot_water_system_py.construct_hot_water_system( + heat_source_type=hot_water_system_py.HeatSourceType.ASHP, + water_pump_differential_head=3.0, + water_pump_efficiency=0.6, + supply_water_temperature_setpoint=313.0, + device_id="ashp_hws", ) + hvac = self._create_scenario_hvac( + zone_identifier=building._room_dict.keys() + ) + hvac._hot_water_system = hws - # Test convergence with same temperature (should converge quickly) - converged = simulator.finite_differences_timestep( - ambient_temperature=292.0, convection_coefficient=12.0 + sim = simulator_py.SimulatorFlexibleGeometries( + building=building, + hvac=hvac, + weather_controller=weather_controller, + time_step_sec=time_step_sec, + convergence_threshold=0.1, + iteration_limit=100, + iteration_warning=10, + start_timestamp=start_timestamp, ) - self.assertTrue( - converged, - msg=( - "Simulation with interior mass should converge when ambient temp" - " equals initial temp" - ), + occupancy = step_function_occupancy.StepFunctionOccupancy( + pd.Timedelta(9, unit="h"), pd.Timedelta(17, unit="h"), 10, 0.1 ) + reward_info = sim.reward_info(occupancy) + + self.assertNotEmpty(reward_info.heat_pump_reward_infos) + self.assertEmpty(reward_info.boiler_reward_infos) + self.assertIn("ashp_hws", reward_info.heat_pump_reward_infos) + + def test_execute_step_sim_vav_with_no_matching_zones(self): + """Tests that VAV update is skipped if no assigned zones match avg_temps.""" + # Initialize SimulatorFlexibleGeometries with mocked building and hvac + mock_building = mock.MagicMock(spec=building_py.FloorPlanBasedBuilding) + mock_hvac = mock.MagicMock(spec=floorplan_hvac_py.FloorPlanBasedHvac) + + # Mock weather controller + mock_weather = mock.create_autospec(weather_controller_py.WeatherController) + mock_weather.get_current_temp.return_value = 295.0 + mock_weather.get_air_convection_coefficient.return_value = 10.0 + + # Building setup + mock_building.room_dict = { + "z1": [(0, 0)], + "z2": [(0, 1)], + "z3": [(1, 0)], + "z4": [(1, 1)], + } + # Mocking for constructor + mock_building.floor_plan = np.zeros((2, 2)) + mock_building.custom_zone_to_vavs = {} - def test_interior_mass_affects_heat_transfer(self): - """Test that interior mass affects heat transfer in the building.""" - # Building without interior mass - simulator_no_mass, building_no_mass = self._create_simulator_and_building( - convergence_threshold=0.001, + simulator = simulator_py.SimulatorFlexibleGeometries( + building=mock_building, + hvac=mock_hvac, + weather_controller=mock_weather, + time_step_sec=300.0, + convergence_threshold=0.1, iteration_limit=100, - include_interior_mass=False, - ) - # Building with interior mass - simulator_with_mass, building_with_mass = ( - self._create_simulator_and_building( - convergence_threshold=0.001, - iteration_limit=100, - include_interior_mass=True, - ) + iteration_warning=10, + start_timestamp=pd.Timestamp("2012-12-21"), ) - # Run simulation with higher ambient temperature - ambient_temp = 300.0 - convection_coeff = 12.0 + # Configure a mock VAV + mock_vav = mock.MagicMock() + mock_ahu = mock.MagicMock() + mock_ahu.device_id.return_value = "ahu_1" + mock_vav.air_handler = mock_ahu + mock_vav.device_id.return_value = "vav_1" - simulator_no_mass.finite_differences_timestep( - ambient_temperature=ambient_temp, - convection_coefficient=convection_coeff, - ) - simulator_with_mass.finite_differences_timestep( - ambient_temperature=ambient_temp, - convection_coefficient=convection_coeff, - ) + mock_hvac.vavs = {"vav_1": mock_vav} + mock_hvac.air_handler = mock_ahu - # Compare average air temperatures - avg_temp_no_mass = np.mean( - building_no_mass.temp[ - building_with_mass.floor_plan - == constants.INTERIOR_SPACE_VALUE_IN_FILE_INPUT - ] - ) - avg_temp_with_mass = np.mean( - building_with_mass.temp[ - building_with_mass.floor_plan - == constants.INTERIOR_SPACE_VALUE_IN_FILE_INPUT - ] - ) + # Mock hot water system + mock_hws = mock.MagicMock() + mock_hvac.hot_water_system = mock_hws - # Building with interior mass should heat up differently due to thermal - # inertia - # The exact relationship depends on material properties, but they should - # differ - self.assertGreater( - avg_temp_no_mass - avg_temp_with_mass, - 0, - msg=( - "Average temperature without interior mass should be greater than" - " with interior mass" - ), - ) + # Configure get_zones_for_vav to return zones 'z1' and 'z2' + mock_hvac.get_zones_for_vav.return_value = ["z1", "z2"] - def test_interior_mass_convergence_with_lwx(self): - """Test that simulation with interior mass converges with LWX - (longwave interior radiative heat transfer).""" - simulator, _ = self._create_simulator_and_building( - convergence_threshold=0.001, - iteration_limit=100, - include_interior_mass=True, - include_radiative_heat_transfer=True, - ) + # Configure get_zone_average_temps to NOT include 'z1' or 'z2' + mock_building.get_zone_average_temps.return_value = { + "z3": 295.0, + "z4": 296.0, + } - # Test convergence with same temperature (should converge quickly) - converged = simulator.finite_differences_timestep( - ambient_temperature=292.0, convection_coefficient=12.0 - ) + # Mock mean temperature for AHU recirculation fallback + mock_building.temp = mock.MagicMock() + mock_building.temp.mean.return_value = 293.0 - self.assertTrue( - converged, - msg="converged.", - ) + # Mock visual logger to avoid side effects + simulator._log_and_plotter = mock.MagicMock() + + # Mock finite_differences_timestep to avoid side effects + + with mock.patch.object( + simulator_py.SimulatorFlexibleGeometries, "finite_differences_timestep" + ): + # Call the method under test + simulator.execute_step_sim() + + # Assert that update_settings was NOT called for mock_vav + mock_vav.update_settings.assert_not_called() + + # Assert that methods within the second loop body were not called for + # mock_vav because 'vav_1' was not in vav_cached_data. + mock_vav.output.assert_not_called() + mock_ahu.add_demand.assert_not_called() if __name__ == "__main__": diff --git a/smart_control/simulator/simulator_test.py b/smart_control/simulator/simulator_test.py index cd9227c0..671c9c16 100644 --- a/smart_control/simulator/simulator_test.py +++ b/smart_control/simulator/simulator_test.py @@ -1,24 +1,22 @@ -"""Tests for simulator.""" - from unittest import mock from absl.testing import absltest from absl.testing import parameterized import pandas as pd - -from smart_control.proto import smart_control_reward_pb2 -from smart_control.simulator import air_handler as air_handler_py -from smart_control.simulator import boiler as boiler_py -from smart_control.simulator import building as building_py -from smart_control.simulator import hvac as hvac_py -from smart_control.simulator import setpoint_schedule -from smart_control.simulator import simulator as simulator_py -from smart_control.simulator import step_function_occupancy -from smart_control.simulator import weather_controller as weather_controller_py -from smart_control.utils import conversion_utils +from google3.net.proto2.contrib.pyutil import compare +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.simulator import air_handler as air_handler_py +from smart_buildings.smart_control.simulator import building as building_py +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import hvac as hvac_py +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import simulator as simulator_py +from smart_buildings.smart_control.simulator import step_function_occupancy +from smart_buildings.smart_control.simulator import weather_controller as weather_controller_py +from smart_buildings.smart_control.utils import conversion_utils -class SimulatorTest(parameterized.TestCase): +class SimulatorTest(parameterized.TestCase, compare.Proto2Assertions): def _create_small_building(self, initial_temp): """Returns building with specified initial temperature. @@ -56,29 +54,46 @@ def _create_small_building(self, initial_temp): ) return building - def _create_small_hvac(self): + def _create_small_hvac( + self, + use_boiler=True, + ): """Returns hvac matching zones for small test building.""" - reheat_water_setpoint = 260 + supply_water_temperature_setpoint = 260 water_pump_differential_head = 3 water_pump_efficiency = 0.6 - boiler = boiler_py.Boiler( - reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, - 'boiler_id', - ) + + if use_boiler: + hot_water_system = hot_water_system_py.construct_hot_water_system( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=water_pump_efficiency, + device_id='hws_id', + heat_source_type=hot_water_system_py.HeatSourceType.BOILER, + ) + + else: + hot_water_system = hot_water_system_py.construct_hot_water_system( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + heat_source_type=hot_water_system_py.HeatSourceType.ASHP, + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=water_pump_efficiency, + ashp_max_capacity_w=600000.0, + ashp_nominal_cop=3.2, + device_id='hws_id', + ) recirculation = 0.3 heating_air_temp_setpoint = 270 cooling_air_temp_setpoint = 288 - fan_differential_pressure = 20000.0 + fan_static_pressure = 20000.0 fan_efficiency = 0.8 air_handler = air_handler_py.AirHandler( recirculation, heating_air_temp_setpoint, cooling_air_temp_setpoint, - fan_differential_pressure, + fan_static_pressure, fan_efficiency, ) @@ -99,7 +114,7 @@ def _create_small_hvac(self): zone_coordinates = [(0, 0), (1, 0)] hvac = hvac_py.Hvac( - zone_coordinates, air_handler, boiler, schedule, 0.45, 0.02 + zone_coordinates, air_handler, hot_water_system, schedule, 0.45, 0.02 ) return hvac @@ -137,30 +152,40 @@ def _create_scenario_building(self, initial_temp): ) return building - def _create_scenario_hvac(self): + def _create_scenario_hvac(self, use_boiler=True): """Returns hvac matching zones for scenario building.""" - reheat_water_setpoint = 350 + supply_water_temperature_setpoint = 350 water_pump_differential_head = 3 water_pump_efficiency = 0.6 - boiler = boiler_py.Boiler( - reheat_water_setpoint, - water_pump_differential_head, - water_pump_efficiency, - 'boiler_id', - ) + + if use_boiler: + hot_water_system = hot_water_system_py.construct_hot_water_system( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=water_pump_efficiency, + device_id='hws_id', + ) + else: + hot_water_system = hot_water_system_py.construct_hot_water_system( + supply_water_temperature_setpoint=supply_water_temperature_setpoint, + heat_source_type=hot_water_system_py.HeatSourceType.ASHP, + water_pump_differential_head=water_pump_differential_head, + water_pump_efficiency=water_pump_efficiency, + ashp_max_capacity_w=600000.0, + ashp_nominal_cop=3.2, + device_id='hws_id', + ) recirculation = 0.6 - heating_air_temp_setpoint = 291 - cooling_air_temp_setpoint = 295 - fan_differential_pressure = 20000.0 + supply_air_temperature_setpoint = 291 + fan_static_pressure = 20000.0 fan_efficiency = 0.8 air_handler = air_handler_py.AirHandler( recirculation, - heating_air_temp_setpoint, - cooling_air_temp_setpoint, - fan_differential_pressure, - fan_efficiency, + supply_air_temperature_setpoint=supply_air_temperature_setpoint, + fan_static_pressure=fan_static_pressure, + fan_efficiency=fan_efficiency, ) morning_start_hour = 9 @@ -188,24 +213,28 @@ def _create_scenario_hvac(self): ] vav_max_air_flow_rate = 0.45 - vav_reheat_max_water_flow_rate = 0.02 + reheat_max_water_flow_factor = 0.03688555555 hvac = hvac_py.Hvac( zone_coordinates, air_handler, - boiler, + hot_water_system, schedule, vav_max_air_flow_rate, - vav_reheat_max_water_flow_rate, + reheat_max_water_flow_factor, ) return hvac - def test_init(self): + @parameterized.named_parameters( + ('Boiler', True), + ('ASHP', False), + ) + def test_init(self, use_boiler): building = mock.create_autospec(building_py.Building) weather_controller = mock.create_autospec( weather_controller_py.WeatherController ) time_step_sec = 300.0 - hvac = self._create_small_hvac() + hvac = self._create_small_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 @@ -231,14 +260,18 @@ def test_init(self): self.assertEqual(simulator._iteration_warning, iteration_warning) self.assertEqual(simulator._current_timestamp, start_timestamp) - def test_reset(self): + @parameterized.named_parameters( + ('Boiler', True), + ('ASHP', False), + ) + def test_reset(self, use_boiler): initial_temp = 293 building = self._create_small_building(initial_temp) weather_controller = mock.create_autospec( weather_controller_py.WeatherController ) time_step_sec = 300.0 - hvac = self._create_small_hvac() + hvac = self._create_small_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 @@ -260,60 +293,58 @@ def test_reset(self): simulator.building.input_q[2][2] = 1000.0 simulator.building.input_q[0][3] = 1000.0 - simulator.hvac.boiler._return_water_temperature_sensor += 10.0 - simulator.hvac.boiler._water_pump_differential_head += 100.0 - simulator.hvac.boiler._reheat_water_setpoint += 2.0 + simulator.hvac.hot_water_system.water_pump_differential_head += 100.0 simulator.hvac.air_handler._air_flow_rate += 0.1 - simulator.hvac.air_handler._fan_differential_pressure = 0.1 + simulator.hvac.air_handler.supply_air_static_pressure_setpoint = 0.1 for coord in simulator.hvac._zone_coordinates: vav = simulator.hvac.vavs[coord] vav.thermostat._setpoint_schedule.morning_start_hour += 1.0 vav.thermostat._setpoint_schedule.comfort_temp_window = (280, 310) vav.max_air_flow_rate += 0.1 - vav._reheat_max_water_flow_rate += 0.1 + vav._reheat_max_water_flow_factor += 0.1 simulator._current_timestamp += pd.Timedelta(360.0, unit='seconds') simulator.reset() self.assertEqual(simulator.building, building) - expected_hvac = self._create_small_hvac() + expected_hvac = self._create_small_hvac(use_boiler=use_boiler) expected_air_handler = expected_hvac.air_handler self.assertEqual( simulator._hvac.air_handler.recirculation, expected_air_handler.recirculation, ) self.assertEqual( - simulator._hvac.air_handler.heating_air_temp_setpoint, - expected_air_handler.heating_air_temp_setpoint, + simulator._hvac.air_handler.supply_air_temperature_setpoint, + expected_air_handler.supply_air_temperature_setpoint, ) self.assertEqual( - simulator._hvac.air_handler.cooling_air_temp_setpoint, - expected_air_handler.cooling_air_temp_setpoint, + simulator._hvac.air_handler.supply_air_temperature_sensor, + expected_air_handler.supply_air_temperature_sensor, ) self.assertEqual( - simulator._hvac.air_handler.fan_differential_pressure, - expected_air_handler.fan_differential_pressure, + simulator._hvac.air_handler.supply_air_static_pressure_setpoint, + expected_air_handler.supply_air_static_pressure_setpoint, ) self.assertEqual( simulator._hvac.air_handler.fan_efficiency, expected_air_handler.fan_efficiency, ) - expected_boiler = expected_hvac.boiler + expected_hws = expected_hvac.hot_water_system self.assertEqual( - simulator._hvac.boiler.reheat_water_setpoint, - expected_boiler._reheat_water_setpoint, + simulator._hvac.hot_water_system.supply_water_temperature_setpoint, + expected_hws.supply_water_temperature_setpoint, ) self.assertEqual( - simulator._hvac.boiler._water_pump_differential_head, - expected_boiler._water_pump_differential_head, + simulator._hvac.hot_water_system.water_pump_differential_head, + expected_hws.water_pump_differential_head, ) self.assertEqual( - simulator._hvac.boiler._water_pump_efficiency, - expected_boiler._water_pump_efficiency, + simulator._hvac.hot_water_system._pump._water_pump_efficiency, + expected_hws._pump._water_pump_efficiency, ) - self.assertEqual(simulator._hvac.boiler._total_flow_rate, 0) + self.assertEqual(simulator._hvac.hot_water_system.total_flow_rate, 0) self.assertEqual(simulator._current_timestamp, start_timestamp) self.assertEqual(simulator.building.temp[2][2], initial_temp) @@ -321,18 +352,25 @@ def test_reset(self): self.assertEqual(simulator.building.input_q[2][2], 0) self.assertEqual(simulator.building.input_q[0][3], 0) - def test_get_cv_temp_estimate_cell_no_change(self): + @parameterized.named_parameters( + ('Boiler', True), + ('ASHP', False), + ) + def test_get_cv_temp_estimate_cell_no_change(self, use_boiler): """This tests that temperatures don't change in stable conditions. This test sets up a small building at temperature 292. The ambient conditions are also 292. + + Args: + use_boiler: Whether to use a boiler or ASHP. """ # Set up simulation parameters weather_controller = mock.create_autospec( weather_controller_py.WeatherController ) time_step_sec = 300.0 - hvac = self._create_small_hvac() + hvac = self._create_small_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 @@ -747,22 +785,29 @@ def test_finite_differences_timestep_does_not_converge(self): 1, ) - def test_step_sim_heating_scenario_avg_temps_increase(self): + @parameterized.named_parameters( + ('boiler', True), + ('heat_pump', False), + ) + def test_step_sim_heating_scenario_avg_temps_increase(self, use_boiler): """Tests that the average temperature increases. Ambient temperatures are set high. + + Args: + use_boiler: Whether to use a boiler or heat pump. """ # Constant temp of 300C weather_controller = weather_controller_py.WeatherController(300.0, 300.0) time_step_sec = 300.0 - hvac = self._create_scenario_hvac() + hvac = self._create_scenario_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 start_timestamp = pd.Timestamp('12-21-2012') - initial_temperature = 292.0 + initial_temperature = 285.0 building = self._create_scenario_building(initial_temp=initial_temperature) sim = simulator_py.Simulator( @@ -784,23 +829,30 @@ def test_step_sim_heating_scenario_avg_temps_increase(self): for temperature in avg_temperatures.values(): self.assertGreater(temperature, initial_temperature) - def test_step_sim_heating_scenario_zone_temperature_speeds(self): + @parameterized.named_parameters( + ('boiler', True), + ('heat_pump', False), + ) + def test_step_sim_heating_scenario_zone_temperature_speeds(self, use_boiler): """Tests that certain zones heat faster than others. Ambient temperatures are set high. Corner zones should heat fastest, followed by edge zones, lastly the center zone. + + Args: + use_boiler: Whether to use a boiler or heat pump. """ # Constant temp of 300C weather_controller = weather_controller_py.WeatherController(300.0, 300.0) time_step_sec = 3000.0 - hvac = self._create_scenario_hvac() + hvac = self._create_scenario_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 start_timestamp = pd.Timestamp('12-21-2012') - initial_temperature = 292.0 + initial_temperature = 285.0 # Building is 3x3 zones. building = self._create_scenario_building(initial_temp=initial_temperature) @@ -829,17 +881,24 @@ def test_step_sim_heating_scenario_zone_temperature_speeds(self): self.assertGreater(edge_temp, interior_temp) self.assertGreater(interior_temp, initial_temperature) - def test_step_sim_heating_scenario_vavs_cools(self): + @parameterized.named_parameters( + ('boiler', True), + ('heat_pump', False), + ) + def test_step_sim_heating_scenario_vavs_cools(self, use_boiler): """Tests that the vavs work to keep the building cool. Initial temperatures are set high. After a time step, thermostats should enter cooling mode and keep the building cool. + + Args: + use_boiler: Whether to use a boiler or heat pump. """ # Constant temp of 300C weather_controller = weather_controller_py.WeatherController(310.0, 310.0) time_step_sec = 3000.0 - hvac = self._create_scenario_hvac() + hvac = self._create_scenario_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 @@ -867,17 +926,24 @@ def test_step_sim_heating_scenario_vavs_cools(self): # Average building temperature should decrease. self.assertLess(building.temp.mean(), initial_temperature) - def test_step_sim_cooling_scenario_vavs_heat(self): + @parameterized.named_parameters( + ('boiler', True), + ('heat_pump', False), + ) + def test_step_sim_cooling_scenario_vavs_heat(self, use_boiler): """Tests that the vavs work to keep the building warm. Initial temperatures are set low. After a time step, thermostats should enter heating mode and keep the building warm. + + Args: + use_boiler: Whether to use a boiler or heat pump. """ # Constant temp of 300C weather_controller = weather_controller_py.WeatherController(275.0, 275.0) time_step_sec = 3000.0 - hvac = self._create_scenario_hvac() + hvac = self._create_scenario_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 @@ -905,10 +971,14 @@ def test_step_sim_cooling_scenario_vavs_heat(self): # Average building temperature should increase. self.assertGreater(building.temp.mean(), initial_temperature) - def test_step_sim_increments_current_time(self): + @parameterized.named_parameters( + ('boiler', True), + ('heat_pump', False), + ) + def test_step_sim_increments_current_time(self, use_boiler): weather_controller = weather_controller_py.WeatherController(296.0, 296.0) time_step_sec = 300.0 - hvac = self._create_scenario_hvac() + hvac = self._create_scenario_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 @@ -938,17 +1008,23 @@ def test_step_sim_increments_current_time(self): self.assertEqual(sim._current_timestamp, expected_end_timestamp) - def test_step_sim_sets_boiler_return_water_temperature_sensor(self): + @parameterized.named_parameters( + ('boiler', True), + ('heat_pump', False), + ) + def test_step_sim_sets_hot_water_system_return_water_temperature_sensor( + self, use_boiler + ): weather_controller = weather_controller_py.WeatherController(296.0, 296.0) time_step_sec = 300.0 - hvac = self._create_scenario_hvac() + hvac = self._create_scenario_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 start_timestamp = pd.Timestamp('12-21-2012') initial_temperature = 200.0 - expected_return_water_temperature = 301.895482 + expected_return_water_temperature = 265.771116 # Building is 3x3 zones. building = self._create_scenario_building(initial_temp=initial_temperature) @@ -964,18 +1040,23 @@ def test_step_sim_sets_boiler_return_water_temperature_sensor(self): start_timestamp, ) - sim.step_sim() + for _ in range(45): + sim.step_sim() self.assertAlmostEqual( - sim._hvac.boiler.return_water_temperature_sensor, + sim._hvac.hot_water_system.return_water_temperature_sensor, expected_return_water_temperature, delta=1e-5, ) - def test_reward_info(self): + @parameterized.named_parameters( + ('boiler', True), + ('heat_pump', False), + ) + def test_reward_info(self, use_boiler): weather_controller = weather_controller_py.WeatherController(296.0, 296.0) time_step_sec = 300.0 - hvac = self._create_scenario_hvac() + hvac = self._create_scenario_hvac(use_boiler=use_boiler) convergence_threshold = 0.1 iteration_limit = 100 iteration_warning = 10 @@ -1079,26 +1160,29 @@ def test_reward_info(self): air_conditioning_electrical_energy_rate, air_handler_reward_info.air_conditioning_electrical_energy_rate, ) - - boiler_reward_info = reward_info.boiler_reward_infos[ - sim._hvac.boiler.device_id() - ] - natural_gas_heating_energy_rate = ( - sim._hvac.boiler.compute_thermal_energy_rate( - sim._hvac.boiler.return_water_temperature_sensor, ambient_temp - ) - ) - self.assertAlmostEqual( - natural_gas_heating_energy_rate, - boiler_reward_info.natural_gas_heating_energy_rate, - places=3, - ) - - pump_electrical_energy_rate = sim._hvac.boiler.compute_pump_power() - self.assertEqual( - pump_electrical_energy_rate, - boiler_reward_info.pump_electrical_energy_rate, - ) + if use_boiler: + natural_gas_heating_energy_rate = ( + sim._hvac.hot_water_system.compute_thermal_energy_rate( + sim._hvac.hot_water_system.supply_water_temperature_sensor, + ambient_temp, + ) + ) + pump_electrical_energy_rate = ( + sim._hvac.hot_water_system.compute_pump_power() + ) + expected_boiler_reward_info = ( + smart_control_reward_pb2.RewardInfo.BoilerRewardInfo( + natural_gas_heating_energy_rate=natural_gas_heating_energy_rate, + pump_electrical_energy_rate=pump_electrical_energy_rate, + ) + ) + self.assertProto2Equal( + expected_boiler_reward_info, + reward_info.boiler_reward_infos[ + sim._hvac.hot_water_system.device_id() + ], + precision=3, + ) if __name__ == '__main__': diff --git a/smart_control/simulator/smart_device.py b/smart_control/simulator/smart_device.py index e5cabc29..012d4e70 100644 --- a/smart_control/simulator/smart_device.py +++ b/smart_control/simulator/smart_device.py @@ -10,11 +10,28 @@ """ import abc -from typing import Any, Mapping, NamedTuple, Optional, Sequence, Type +import enum +from typing import Any, Final, Mapping, NamedTuple, Optional, Sequence, Type import pandas as pd - -from smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_building_pb2 + +SUPPLY_WATER_TEMPERATURE_SETPOINT: Final[str] = ( + 'supply_water_temperature_setpoint' +) +SUPPLY_WATER_TEMPERATURE_SENSOR: Final[str] = 'supply_water_temperature_sensor' +HEATING_REQUEST_COUNT: Final[str] = 'heating_request_count' +SUPERVISOR_RUN_COMMAND: Final[str] = 'supervisor_run_command' +RUN_STATUS: Final[str] = 'run_status' +RUN_COMMAND: Final[str] = 'run_command' +DIFFERENTIAL_PRESSURE_SENSOR: Final[str] = 'differential_pressure_sensor' +DIFFERENTIAL_PRESSURE_SETPOINT: Final[str] = 'differential_pressure_setpoint' + + +class RunStatus(enum.IntEnum): + """Run status of a device (ON or OFF).""" + ON = 1 + OFF = 0 class AttributeInfo(NamedTuple): diff --git a/smart_control/simulator/smart_device_test.py b/smart_control/simulator/smart_device_test.py index 3c7d85cc..a3c395f7 100644 --- a/smart_control/simulator/smart_device_test.py +++ b/smart_control/simulator/smart_device_test.py @@ -1,10 +1,8 @@ -"""Tests for smart_device.""" - from absl.testing import absltest import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import smart_device +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import smart_device class SmartDeviceTest(absltest.TestCase): diff --git a/smart_control/simulator/solar_radiation.py b/smart_control/simulator/solar_radiation.py deleted file mode 100644 index 131a3618..00000000 --- a/smart_control/simulator/solar_radiation.py +++ /dev/null @@ -1,667 +0,0 @@ -"""Solar Radiation Calculations for Building Simulation. - -For computing irradiance components, solar position, and sky temperature. -""" - -import dataclasses -import math -from typing import Final, Mapping, Sequence - -import numpy as np -import pandas as pd -from pvlib import irradiance as pvlib_irradiance -from pvlib import location as pvlib_location - -from smart_control.simulator import constants -from smart_control.simulator import weather_controller as wc_module -from smart_control.utils import conversion_utils as utils - -# --------------------------------------------------------------------------- -# Valid irradiance method names -# --------------------------------------------------------------------------- -IRRADIANCE_METHODS = ('clearsky', 'linear', 'campbell_norman') - -# --------------------------------------------------------------------------- -# Sensor measurement names used when reading observation responses -# --------------------------------------------------------------------------- -GHI_SENSOR: Final[str] = 'ghi_sensor' -DNI_SENSOR: Final[str] = 'dni_sensor' -DHI_SENSOR: Final[str] = 'dhi_sensor' - -# Internal constants -_SECONDS_IN_A_DAY: Final[float] = 24 * 3600 -_MIN_RADIANS: Final[float] = -math.pi / 2.0 -_MAX_RADIANS: Final[float] = 3.0 * math.pi / 2.0 - -# Sensor measurement names used in replay helper functions -_OUTSIDE_AIR_TEMP_SENSOR: Final[str] = 'outside_air_temperature_sensor' -_DEW_POINT_TEMP_SENSOR: Final[str] = 'dew_point_temperature_sensor' -_CLOUD_COVER_SENSOR: Final[str] = 'cloud_cover_sensor' - - -# --------------------------------------------------------------------------- -# BuildingInfo -# --------------------------------------------------------------------------- -@dataclasses.dataclass -class BuildingInfo: - """Information about the building under control. - - On construction, `floor_plan_orientation` is validated to be within - [0, 360] degrees; a `ValueError` is raised otherwise. - - Attributes: - floor_plan_filepath: Path to the building's floor-plan `.npy` file. - floor_plan_orientation: Compass angle (degrees) of the floor-plan's - "up" direction. 0 / 360 = North, 90 = East, 180 = South, 270 = West. - Must be between 0 and 360 inclusive. - lat: Latitude of the building in decimal degrees. - lon: Longitude of the building in decimal degrees. - time_zone: IANA time-zone string (e.g. `"US/Pacific"`). - altitude: Altitude above sea level in metres. When *None* pvlib will - attempt to look it up automatically. - """ - - floor_plan_filepath: str = '' - floor_plan_orientation: float = 0.0 - lat: float = 37.4263 - lon: float = -122.0349 - time_zone: str = 'US/Pacific' - altitude: float | None = None - - def __post_init__(self): - self._validate_floor_plan_orientation() - - def _validate_floor_plan_orientation(self) -> None: - """Raise if `floor_plan_orientation` is outside [0, 360].""" - if self.floor_plan_orientation < 0 or self.floor_plan_orientation > 360: - raise ValueError( - 'Expecting floor_plan_orientation to be between 0 and 360, ' - f'but got {self.floor_plan_orientation}.' - ) - - -# --------------------------------------------------------------------------- -# IrradianceComponents -# --------------------------------------------------------------------------- -@dataclasses.dataclass -class IrradianceComponents: - """Irradiance components and solar position at a given timestamp. - - Attributes: - timestamp: Pandas timestamp for the measurement. May be *None* when - the timestamp is not available (e.g. when constructed from a weather - controller that does not track it). - ghi: Global Horizontal Irradiance in W/m². Total solar radiation - received on a horizontal surface. - dni: Direct Normal Irradiance in W/m². Solar radiation received - perpendicular to the sun's rays. - dhi: Diffuse Horizontal Irradiance in W/m². Solar radiation received - on a horizontal surface from the sky (excluding direct beam). - solar_zenith: Solar zenith angle in degrees (angle from vertical). - 0 = sun directly overhead, 90 = sun at horizon. - solar_azimuth: Solar azimuth angle in degrees (compass direction of - the sun). 0 / 360 = North, 90 = East, 180 = South, 270 = West. - """ - - ghi: float - dni: float - dhi: float - solar_zenith: float - solar_azimuth: float - timestamp: pd.Timestamp | None = None - - -@dataclasses.dataclass -class ExteriorRadiationData: - """Full exterior radiation state for a single timestep. - - Bundles the ambient dry-bulb temperature, sky temperature (for longwave - radiation), and irradiance components (for shortwave radiation) so that - the simulator can request all exterior radiation quantities in a single - call to :meth:`SolarRadiation.get_exterior_radiation`. - - Attributes: - timestamp: Pandas timestamp for the observation. - ambient_temp_k: Outdoor dry-bulb temperature in Kelvin. - sky_temp_k: Sky temperature in Kelvin (Clark & Allen formula). Used - for exterior longwave radiative heat transfer (LWR). - irradiance: Shortwave irradiance components (GHI, DNI, DHI) and solar - position. Used for solar gain through fenestrations. - """ - - timestamp: pd.Timestamp - ambient_temp_k: float - sky_temp_k: float - irradiance: IrradianceComponents - - -# --------------------------------------------------------------------------- -# SolarRadiation calculator -# --------------------------------------------------------------------------- -class SolarRadiation: - """Calculates solar radiation for a building location. - - Combines a :class:`simulator.weather_controller.BaseWeatherController` - with cloud-cover and irradiance-method settings to produce - :class:`IrradianceComponents` and sky-temperature values. - - Args: - building_info: Location metadata. Uses defaults (Mountain View, CA) if - not provided. - weather_controller: A weather controller instance used to obtain - temperature (for sky-temperature calculations). - dewpoint_depression: Difference between dry-bulb and dew-point - temperatures in K. Used when no dew-point sensor is available. - cloud_cover: Static cloud cover in percent (0–100). If *None* and no - dynamic cloud cover is configured, the clearsky model is used. - cloud_cover_low: Low cloud cover in percent at midnight (dynamic mode). - cloud_cover_high: High cloud cover in percent at noon (dynamic mode). - irradiance_method: One of `'clearsky'`, `'linear'`, or - `'campbell_norman'`. - """ - - def __init__( - self, - building_info: BuildingInfo | None = None, - weather_controller: wc_module.BaseWeatherController | None = None, - dewpoint_depression: float = 5.0, - cloud_cover: float | None = None, - cloud_cover_low: float | None = None, - cloud_cover_high: float | None = None, - irradiance_method: str = 'clearsky', - ): - self.building_info = building_info or BuildingInfo() - self.time_zone = self.building_info.time_zone - self.lat = self.building_info.lat - self.lon = self.building_info.lon - self.weather_controller = weather_controller - self.dewpoint_depression = dewpoint_depression - self.cloud_cover = cloud_cover - self.cloud_cover_low = cloud_cover_low - self.cloud_cover_high = cloud_cover_high - self.irradiance_method = irradiance_method - - self._validate_irradiance_method() - self._validate_cloud_cover() - self._location = self._get_pvlib_location() - - # ----- validation -------------------------------------------------------- - - def _validate_irradiance_method(self) -> None: - """Raise `ValueError` if `irradiance_method` is not recognised.""" - if self.irradiance_method not in IRRADIANCE_METHODS: - raise ValueError( - f'irradiance_method must be one of {IRRADIANCE_METHODS}, ' - f'got {self.irradiance_method!r}.' - ) - - def _validate_cloud_cover(self) -> None: - """Raise `ValueError` if cloud-cover parameters are invalid.""" - if self.cloud_cover is not None: - if self.cloud_cover < 0 or self.cloud_cover > 100: - raise ValueError('cloud_cover must be between 0 and 100.') - - if self.cloud_cover_low is not None or self.cloud_cover_high is not None: - if self.cloud_cover_low is None or self.cloud_cover_high is None: - raise ValueError( - 'Both cloud_cover_low and cloud_cover_high must be provided ' - 'for dynamic cloud cover.' - ) - if self.cloud_cover_low < 0 or self.cloud_cover_low > 100: - raise ValueError('cloud_cover_low must be between 0 and 100.') - if self.cloud_cover_high < 0 or self.cloud_cover_high > 100: - raise ValueError('cloud_cover_high must be between 0 and 100.') - if self.cloud_cover_low > self.cloud_cover_high: - raise ValueError( - 'cloud_cover_low cannot be greater than cloud_cover_high.' - ) - - def _get_pvlib_location(self) -> pvlib_location.Location: - """Construct and return the pvlib `Location` for this building.""" - kwargs: dict = dict( - latitude=self.lat, longitude=self.lon, tz=self.time_zone - ) - if self.building_info.altitude is not None: - kwargs['altitude'] = self.building_info.altitude - return pvlib_location.Location(**kwargs) - - # ----- timestamp helpers ------------------------------------------------ - - def _ensure_timestamp_tz(self, timestamp: pd.Timestamp) -> pd.Timestamp: - """Ensure *timestamp* has timezone info, localising if necessary.""" - if timestamp.tzinfo is None: - return timestamp.tz_localize(self.time_zone) - return timestamp.tz_convert(self.time_zone) - - @staticmethod - def _seconds_to_rads(seconds_in_day: float) -> float: - """Map seconds-in-day to a sinusoidal radian value.""" - return (seconds_in_day / _SECONDS_IN_A_DAY) * ( - _MAX_RADIANS - _MIN_RADIANS - ) + _MIN_RADIANS - - # ----- cloud cover ------------------------------------------------------ - - def get_current_cloud_cover(self, timestamp: pd.Timestamp) -> float: - """Return current cloud cover in percent (0–100). - - Supports static, dynamic (sinusoidal), and clearsky (returns 0.0) modes. - - Args: - timestamp: Pandas timestamp. If naive, will be localised to the - building's timezone. - - Returns: - Cloud cover in percent. - """ - timestamp = self._ensure_timestamp_tz(timestamp) - - # Dynamic cloud cover (sinusoidal like temperature) - if self.cloud_cover_low is not None and self.cloud_cover_high is not None: - seconds_in_day = (timestamp - timestamp.normalize()).total_seconds() - rad = self._seconds_to_rads(seconds_in_day) - return ( - 0.5 - * (math.sin(rad) + 1) - * (self.cloud_cover_high - self.cloud_cover_low) - + self.cloud_cover_low - ) - - # Static cloud cover - if self.cloud_cover is not None: - return self.cloud_cover - - # Default: clearsky - return 0.0 - - # ----- irradiance ------------------------------------------------------- - - def get_current_irradiance( - self, timestamp: pd.Timestamp - ) -> IrradianceComponents: - """Return current irradiance (GHI, DNI, DHI) in W/m². - - Uses the clearsky model by default, or adjusts for cloud cover when - configured. - - Args: - timestamp: Pandas timestamp. If naive, will be localised to the - building's timezone. - - Returns: - :class:`IrradianceComponents` with GHI, DNI, DHI and solar position. - """ - timestamp = self._ensure_timestamp_tz(timestamp) - - # Solar position (needed for all methods and output) - solar_position = self._location.get_solarposition( - pd.DatetimeIndex([timestamp]) - ) - solar_zenith = float(solar_position['apparent_zenith'].iloc[0]) - solar_azimuth = float(solar_position['azimuth'].iloc[0]) - - current_cloud_cover = self.get_current_cloud_cover(timestamp) - - has_cloud_cover = self.cloud_cover is not None or ( - self.cloud_cover_low is not None and self.cloud_cover_high is not None - ) - - # Clearsky model - if not has_cloud_cover or self.irradiance_method == 'clearsky': - clearsky = self._location.get_clearsky(pd.DatetimeIndex([timestamp])) - return IrradianceComponents( - ghi=float(clearsky['ghi'].iloc[0]), - dni=float(clearsky['dni'].iloc[0]), - dhi=float(clearsky['dhi'].iloc[0]), - solar_zenith=solar_zenith, - solar_azimuth=solar_azimuth, - timestamp=timestamp, - ) - - if self.irradiance_method == 'linear': - clearsky = self._location.get_clearsky( - pd.DatetimeIndex([timestamp]), model='ineichen' - ) - ghi = float(clearsky['ghi'].iloc[0]) * ( - 1.0 - 0.8 * (current_cloud_cover / 100.0) - ) - dni_result = pvlib_irradiance.disc( - pd.Series([ghi], index=pd.DatetimeIndex([timestamp])), - solar_position['zenith'], - pd.DatetimeIndex([timestamp]), - ) - dni = float(dni_result['dni'].iloc[0]) - zenith_rad = np.radians(solar_position['zenith'].iloc[0]) - dhi = max(0, ghi - dni * np.cos(zenith_rad)) - - elif self.irradiance_method == 'campbell_norman': - dni_extra = pvlib_irradiance.get_extra_radiation( - pd.DatetimeIndex([timestamp]) - ) - transmittance = 0.7 - 0.5 * (current_cloud_cover / 100.0) - irrads = pvlib_irradiance.campbell_norman( - solar_position['apparent_zenith'].iloc[0], - transmittance, - dni_extra=dni_extra.iloc[0], - ) - ghi = 0 if np.isnan(irrads['ghi']) else float(irrads['ghi']) - dni = 0 if np.isnan(irrads['dni']) else float(irrads['dni']) - dhi = 0 if np.isnan(irrads['dhi']) else float(irrads['dhi']) - - else: - raise ValueError(f'Invalid irradiance_method: {self.irradiance_method}') - - return IrradianceComponents( - ghi=max(0, ghi), - dni=max(0, dni), - dhi=max(0, dhi), - solar_zenith=solar_zenith, - solar_azimuth=solar_azimuth, - timestamp=timestamp, - ) - - # ----- sky temperature --------------------------------------------------- - - def get_current_sky_temperature(self, timestamp: pd.Timestamp) -> float: - """Return sky temperature in K using the Clark & Allen formula. - - Requires `weather_controller` to have been set during construction so - that the dry-bulb temperature can be obtained. - - Args: - timestamp: Pandas timestamp. Passed as-is to the weather controller's - `get_current_temp` method. - - Returns: - Sky temperature in K. - - Raises: - ValueError: If no weather controller was provided. - """ - if self.weather_controller is None: - raise ValueError( - 'A weather_controller must be provided to compute sky temperature.' - ) - - sigma = constants.STEFAN_BOLTZMANN_CONSTANT - - # Dry-bulb temperature from the weather controller. - # Pass the original timestamp so the controller can apply its own - # timezone handling (the sinusoidal WeatherController expects naive - # timestamps while ReplayWeatherController handles both). - temp_k = self.weather_controller.get_current_temp(timestamp) - - # Estimate dew-point temperature - dp_k = temp_k - self.dewpoint_depression - - # Sky emissivity (Clark & Allen) - epsilon_sky = 0.787 + 0.764 * np.log(dp_k / 273.0) - - # Horizontal infrared radiation - ir_h = epsilon_sky * sigma * (temp_k**4) - - # Sky temperature - temp_sky_k = (ir_h / sigma) ** 0.25 - - return float(temp_sky_k) - - # ----- combined exterior radiation state --------------------------------- - - def get_exterior_radiation( - self, timestamp: pd.Timestamp - ) -> ExteriorRadiationData: - """Return ambient temperature, sky temperature, and irradiance at once. - - Convenience method for the simulator that needs all exterior radiation - quantities (convection temperature, longwave sky temperature, and - shortwave irradiance) in a single call per timestep. - - Args: - timestamp: Pandas timestamp. If naive, will be localised to the - building's timezone for irradiance and sky-temperature calculations. - Passed as-is to `weather_controller.get_current_temp()`. - - Returns: - :class:`ExteriorRadiationData` with `ambient_temp_k`, - `sky_temp_k`, and `irradiance`. - - Raises: - ValueError: If no weather controller was provided. - """ - if self.weather_controller is None: - raise ValueError( - 'A weather_controller must be provided to compute exterior radiation.' - ) - - # Ambient temperature (naive-safe: each WC handles tz internally) - ambient_temp_k = float(self.weather_controller.get_current_temp(timestamp)) - - # Sky temperature (same tz rules as get_current_sky_temperature) - sky_temp_k = self.get_current_sky_temperature(timestamp) - - # Irradiance components + solar position - irrad = self.get_current_irradiance(timestamp) - - # Normalise timestamp for the return value - ts = ( - self._ensure_timestamp_tz(timestamp) - if timestamp.tzinfo is None - else timestamp - ) - - return ExteriorRadiationData( - timestamp=ts, - ambient_temp_k=ambient_temp_k, - sky_temp_k=sky_temp_k, - irradiance=irrad, - ) - - -# --------------------------------------------------------------------------- -# Replay helpers -# --------------------------------------------------------------------------- - - -def _get_observation_value( - observation_response, - measurement_name: str, - default=None, -): - """Return the continuous value for a named measurement in an observation. - - Searches the `single_observation_responses` of the given - *observation_response* for an entry whose `measurement_name` matches the - requested name. - - Args: - observation_response: A single `ObservationResponse` proto. - measurement_name: The sensor / measurement name to look up. - default: Value to return when the measurement is not found. - - Returns: - The `continuous_value` of the matching observation, or *default* if no - matching measurement is found. - """ - for r in observation_response.single_observation_responses: - if r.single_observation_request.measurement_name == measurement_name: - return r.continuous_value - return default - - -def get_replay_irradiance( - observation_responses: Sequence[object], -) -> Sequence[IrradianceComponents]: - """Extract irradiance data from past observation protos. - - Iterates over *observation_responses* and reads the `ghi_sensor`, - `dni_sensor`, and `dhi_sensor` measurements. Solar zenith and azimuth - are set to 0.0 because they are not typically recorded in observation - protos. - - Args: - observation_responses: Sequence of `ObservationResponse` protos. - - Returns: - A list of :class:`IrradianceComponents`, one per observation. - """ - irradiances: list[IrradianceComponents] = [] - for r in observation_responses: - ghi = _get_observation_value(r, GHI_SENSOR, default=0.0) - dni = _get_observation_value(r, DNI_SENSOR, default=0.0) - dhi = _get_observation_value(r, DHI_SENSOR, default=0.0) - - timestamp = utils.proto_to_pandas_timestamp(r.timestamp) - irradiances.append( - IrradianceComponents( - ghi=ghi, - dni=dni, - dhi=dhi, - solar_zenith=0.0, - solar_azimuth=0.0, - timestamp=timestamp, - ) - ) - - return irradiances - - -def get_replay_temperatures( - observation_responses: Sequence[object], -) -> Mapping[str, float]: - """Return temperature replays from past observations. - - Args: - observation_responses: Sequence of `ObservationResponse` protos. - - Returns: - Mapping from timestamp string to temperature in Kelvin. Entries missing - the `outside_air_temperature_sensor` measurement are mapped to -1.0. - """ - temps: dict[str, float] = {} - for r in observation_responses: - temp = _get_observation_value(r, _OUTSIDE_AIR_TEMP_SENSOR, default=-1.0) - timestamp = utils.proto_to_pandas_timestamp(r.timestamp) - temps[str(timestamp)] = temp - return temps - - -def get_replay_cloud_cover( - observation_responses: Sequence[object], -) -> Mapping[str, float]: - """Return cloud cover replays from past observations. - - Args: - observation_responses: Sequence of `ObservationResponse` protos. - - Returns: - Mapping from timestamp string to cloud cover in percent (0–100). - Entries missing the `cloud_cover_sensor` measurement default to 0.0 - (clear sky). - """ - cloud_covers: dict[str, float] = {} - for r in observation_responses: - cloud_cover = _get_observation_value(r, _CLOUD_COVER_SENSOR, default=0.0) - timestamp = utils.proto_to_pandas_timestamp(r.timestamp) - cloud_covers[str(timestamp)] = cloud_cover - return cloud_covers - - -def get_replay_sky_temperature( - observation_responses: Sequence[object], - dewpoint_depression: float = 5.0, -) -> Mapping[str, float]: - """Return sky temperature replays from past observations. - - Calculates sky temperature using Clark & Allen formula from dry-bulb - temperature and dew point. If a dew-point sensor is not present in the - observation, the dew point is estimated as - `dry_bulb - dewpoint_depression`. Observations that lack a dry-bulb - temperature are silently skipped. - - Args: - observation_responses: Sequence of `ObservationResponse` protos. - dewpoint_depression: Difference between dry-bulb and dew-point - temperatures in K. Used when no dew-point sensor is available. - - Returns: - Mapping from timestamp string to sky temperature in Kelvin. - """ - sigma = constants.STEFAN_BOLTZMANN_CONSTANT - sky_temps: dict[str, float] = {} - - for r in observation_responses: - temp_k = _get_observation_value(r, _OUTSIDE_AIR_TEMP_SENSOR) - if temp_k is None: - continue - - dp_k = _get_observation_value(r, _DEW_POINT_TEMP_SENSOR) - if dp_k is None: - dp_k = temp_k - dewpoint_depression - - epsilon_sky = 0.787 + 0.764 * np.log(dp_k / 273.0) - ir_h = epsilon_sky * sigma * (temp_k**4) - temp_sky_k = (ir_h / sigma) ** 0.25 - - timestamp = utils.proto_to_pandas_timestamp(r.timestamp) - sky_temps[str(timestamp)] = float(temp_sky_k) - - return sky_temps - - -# --------------------------------------------------------------------------- -# POA irradiance helper (migrated from building_radiation_utils) -# --------------------------------------------------------------------------- - - -def calculate_poa_irradiance( - irradiance_components: IrradianceComponents, - surface_tilt: float, - surface_azimuth: float, - solar_zenith: float, - solar_azimuth: float, -) -> float: - """Calculate plane-of-array (POA) global irradiance. - - Converts horizontal irradiance components (GHI, DNI, DHI) to the - irradiance incident on a tilted surface using pvlib's - `get_total_irradiance`. - - Args: - irradiance_components: :class:`IrradianceComponents` with `ghi`, - `dni`, and `dhi` fields (W/m²). - surface_tilt: Surface tilt angle from horizontal in degrees - (0 = horizontal, 90 = vertical). - surface_azimuth: Surface azimuth angle in degrees (180 = south-facing - in the Northern Hemisphere). - solar_zenith: Solar zenith angle in degrees. - solar_azimuth: Solar azimuth angle in degrees. - - Returns: - POA global irradiance in W/m². - - Examples: - ```python - irrad = IrradianceComponents( - ghi=800.0, dni=700.0, dhi=100.0, - solar_zenith=30.0, solar_azimuth=180.0, - ) - poa = calculate_poa_irradiance( - irrad, - surface_tilt=30.0, - surface_azimuth=180.0, - solar_zenith=30.0, - solar_azimuth=180.0, - ) - ``` - """ - poa_irrad = pvlib_irradiance.get_total_irradiance( - surface_tilt=surface_tilt, - surface_azimuth=surface_azimuth, - dni=irradiance_components.dni, - ghi=irradiance_components.ghi, - dhi=irradiance_components.dhi, - solar_zenith=solar_zenith, - solar_azimuth=solar_azimuth, - ) - - return float(poa_irrad['poa_global']) diff --git a/smart_control/simulator/solar_radiation_test.py b/smart_control/simulator/solar_radiation_test.py deleted file mode 100644 index 3bd5bef0..00000000 --- a/smart_control/simulator/solar_radiation_test.py +++ /dev/null @@ -1,1256 +0,0 @@ -"""Tests for solar_radiation module. - -Tests are structured using inheritance so that every test that applies to -:class:`SolarRadiation` with a plain :class:`WeatherController` is -automatically re-run with a :class:`ReplayWeatherController`. - -Class hierarchy: - SolarRadiationTest (uses WeatherController) - ReplaySolarRadiationTest(SolarRadiationTest) (uses ReplayWeatherController) -""" - -import os - -from absl.testing import absltest -from absl.testing import parameterized -import numpy as np -import pandas as pd -from pvlib import irradiance -from pvlib import location - -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import building_radiation_utils -from smart_control.simulator import constants as sim_constants -from smart_control.simulator import solar_radiation -from smart_control.simulator import weather_controller -from smart_control.utils import conversion_utils as utils - -# Paths to shared weather data files. -_LOCAL_WEATHER_TEST_DATA_PATH = os.path.join( - os.path.dirname(__file__), - 'local_weather_test_data.csv', -) - -# Test location constants (Mountain View, CA) -_TEST_LATITUDE = 37.4 -_TEST_LONGITUDE = -122.1 -_TEST_TIMEZONE_PACIFIC = 'US/Pacific' -_TEST_TIMEZONE_UTC = 'UTC' - -# Default temperature bounds (0 °C and 25 °C in Kelvin) -_DEFAULT_LOW_TEMP_K = utils.celsius_to_kelvin(0.0) -_DEFAULT_HIGH_TEMP_K = utils.celsius_to_kelvin(25.0) - -# A daytime timestamp valid for both controller types. -# 2023-07-01 19:00 UTC ≈ noon local time in Mountain View. -_DAYTIME_TIMESTAMP_UTC = pd.Timestamp('2023-07-01 19:00:00', tz='UTC') -_DAYTIME_TIMESTAMP_PACIFIC = pd.Timestamp( - '2023-07-01 12:00:00', tz=_TEST_TIMEZONE_PACIFIC -) - - -# --------------------------------------------------------------------------- -# Stand-alone dataclass tests -# --------------------------------------------------------------------------- -class BuildingInfoTest(absltest.TestCase): - """Tests for BuildingInfo dataclass.""" - - def test_default_values(self): - info = solar_radiation.BuildingInfo() - self.assertEqual(info.floor_plan_filepath, '') - self.assertEqual(info.floor_plan_orientation, 0.0) - self.assertAlmostEqual(info.lat, 37.4263) - self.assertAlmostEqual(info.lon, -122.0349) - self.assertEqual(info.time_zone, 'US/Pacific') - self.assertIsNone(info.altitude) - - def test_custom_values(self): - info = solar_radiation.BuildingInfo( - floor_plan_filepath='/path/to/plan.npy', - floor_plan_orientation=90.0, - lat=40.0, - lon=-74.0, - time_zone='US/Eastern', - altitude=100.0, - ) - self.assertEqual(info.floor_plan_filepath, '/path/to/plan.npy') - self.assertEqual(info.floor_plan_orientation, 90.0) - self.assertAlmostEqual(info.lat, 40.0) - self.assertAlmostEqual(info.lon, -74.0) - self.assertEqual(info.time_zone, 'US/Eastern') - self.assertEqual(info.altitude, 100.0) - - def test_valid_orientations(self): - for angle in [0.0, 90.0, 180.0, 270.0, 360.0]: - info = solar_radiation.BuildingInfo(floor_plan_orientation=angle) - self.assertEqual(info.floor_plan_orientation, angle) - - def test_invalid_orientation_below_zero(self): - with self.assertRaises(ValueError): - solar_radiation.BuildingInfo(floor_plan_orientation=-1.0) - - def test_invalid_orientation_above_360(self): - with self.assertRaises(ValueError): - solar_radiation.BuildingInfo(floor_plan_orientation=361.0) - - -class IrradianceComponentsTest(absltest.TestCase): - """Tests for IrradianceComponents dataclass.""" - - def test_basic_construction(self): - irrad = solar_radiation.IrradianceComponents( - ghi=800.0, - dni=700.0, - dhi=100.0, - solar_zenith=30.0, - solar_azimuth=180.0, - ) - self.assertEqual(irrad.ghi, 800.0) - self.assertEqual(irrad.dni, 700.0) - self.assertEqual(irrad.dhi, 100.0) - self.assertEqual(irrad.solar_zenith, 30.0) - self.assertEqual(irrad.solar_azimuth, 180.0) - self.assertIsNone(irrad.timestamp) - - def test_construction_with_timestamp(self): - ts = pd.Timestamp('2023-07-01 12:00:00', tz='UTC') - irrad = solar_radiation.IrradianceComponents( - ghi=800.0, - dni=700.0, - dhi=100.0, - solar_zenith=30.0, - solar_azimuth=180.0, - timestamp=ts, - ) - self.assertEqual(irrad.timestamp, ts) - - -# --------------------------------------------------------------------------- -# Base test helper for irradiance tests -# --------------------------------------------------------------------------- -class IrradianceTestBase(parameterized.TestCase): - """Base class providing shared helpers for irradiance tests.""" - - def setUp(self): - super().setUp() - self.latitude = _TEST_LATITUDE - self.longitude = _TEST_LONGITUDE - self.low_temp = _DEFAULT_LOW_TEMP_K - self.high_temp = _DEFAULT_HIGH_TEMP_K - - def _make_pvlib_location(self, timezone=_TEST_TIMEZONE_UTC): - return location.Location(self.latitude, self.longitude, tz=timezone) - - def _validate_irradiance_components(self, irrad): - self.assertGreaterEqual(irrad.ghi, 0) - self.assertGreaterEqual(irrad.dni, 0) - self.assertGreaterEqual(irrad.dhi, 0) - - def _validate_solar_position_against_pvlib(self, irrad, pvlib_loc, timestamp): - solar_position = pvlib_loc.get_solarposition(pd.DatetimeIndex([timestamp])) - self.assertAlmostEqual( - irrad.solar_zenith, - solar_position['apparent_zenith'].iloc[0], - places=4, - ) - self.assertAlmostEqual( - irrad.solar_azimuth, - solar_position['azimuth'].iloc[0], - places=4, - ) - - -# --------------------------------------------------------------------------- -# SolarRadiation – base test class (uses WeatherController) -# --------------------------------------------------------------------------- -class SolarRadiationTest(IrradianceTestBase): - """Tests for SolarRadiation using a plain WeatherController. - - Sub-classes only need to override setUp() to swap in a different - weather controller; all test methods are inherited and re-run. - """ - - def setUp(self): - super().setUp() - self.weather_controller = weather_controller.WeatherController( - self.low_temp, self.high_temp - ) - self.building_info = solar_radiation.BuildingInfo( - lat=self.latitude, - lon=self.longitude, - time_zone=_TEST_TIMEZONE_PACIFIC, - ) - self.solar_radiation = solar_radiation.SolarRadiation( - building_info=self.building_info, - weather_controller=self.weather_controller, - ) - - # ---- helpers ----------------------------------------------------------- - - def _make_solar_radiation(self, **kwargs): - defaults = dict( - building_info=self.building_info, - weather_controller=self.weather_controller, - ) - defaults.update(kwargs) - return solar_radiation.SolarRadiation(**defaults) - - # ---- validation tests -------------------------------------------------- - - def test_invalid_irradiance_method_raises(self): - with self.assertRaises(ValueError): - self._make_solar_radiation(irradiance_method='invalid_method') - - def test_invalid_cloud_cover_raises_error(self): - with self.assertRaises(ValueError): - self._make_solar_radiation(cloud_cover=-10.0) - with self.assertRaises(ValueError): - self._make_solar_radiation(cloud_cover=150.0) - - def test_dynamic_cloud_cover_validation(self): - # Only low provided (should raise) - with self.assertRaises(ValueError): - self._make_solar_radiation(cloud_cover_low=20.0) - # Only high provided (should raise) - with self.assertRaises(ValueError): - self._make_solar_radiation(cloud_cover_high=80.0) - # low > high (should raise) - with self.assertRaises(ValueError): - self._make_solar_radiation(cloud_cover_low=80.0, cloud_cover_high=20.0) - # low < 0 (should raise) - with self.assertRaises(ValueError): - self._make_solar_radiation(cloud_cover_low=-10.0, cloud_cover_high=80.0) - # high > 100 (should raise) - with self.assertRaises(ValueError): - self._make_solar_radiation(cloud_cover_low=20.0, cloud_cover_high=150.0) - - # ---- cloud cover tests ------------------------------------------------- - - def test_get_current_cloud_cover_static(self): - sr = self._make_solar_radiation(cloud_cover=50.0) - self.assertEqual( - sr.get_current_cloud_cover(_DAYTIME_TIMESTAMP_PACIFIC), 50.0 - ) - - def test_get_current_cloud_cover_clearsky(self): - sr = self._make_solar_radiation() - self.assertEqual( - sr.get_current_cloud_cover(_DAYTIME_TIMESTAMP_PACIFIC), 0.0 - ) - - def test_dynamic_cloud_cover(self): - """Sinusoidal pattern: low at midnight, high at noon (US/Pacific).""" - sr = self._make_solar_radiation(cloud_cover_low=20.0, cloud_cover_high=80.0) - midnight = pd.Timestamp('2023-07-01 00:00:00', tz=_TEST_TIMEZONE_PACIFIC) - noon = pd.Timestamp('2023-07-01 12:00:00', tz=_TEST_TIMEZONE_PACIFIC) - morning = pd.Timestamp('2023-07-01 06:00:00', tz=_TEST_TIMEZONE_PACIFIC) - - self.assertAlmostEqual(sr.get_current_cloud_cover(midnight), 20.0, places=1) - self.assertAlmostEqual(sr.get_current_cloud_cover(noon), 80.0, places=1) - self.assertAlmostEqual(sr.get_current_cloud_cover(morning), 50.0, places=1) - - def test_dynamic_cloud_cover_affects_irradiance(self): - """Dynamic cloud cover at noon should reduce irradiance vs clearsky.""" - sr_dynamic = self._make_solar_radiation( - cloud_cover_low=0.0, - cloud_cover_high=80.0, - irradiance_method='campbell_norman', - ) - sr_clearsky = self._make_solar_radiation() - - irrad_dynamic = sr_dynamic.get_current_irradiance( - _DAYTIME_TIMESTAMP_PACIFIC - ) - irrad_clearsky = sr_clearsky.get_current_irradiance( - _DAYTIME_TIMESTAMP_PACIFIC - ) - self.assertLess(irrad_dynamic.ghi, irrad_clearsky.ghi) - - # ---- irradiance tests -------------------------------------------------- - - def test_get_current_irradiance_clearsky(self): - """Clearsky irradiance at noon in summer should be substantial.""" - irrad = self.solar_radiation.get_current_irradiance( - _DAYTIME_TIMESTAMP_PACIFIC - ) - - self.assertGreater(irrad.ghi, 500) - self.assertGreater(irrad.dni, 0) - self.assertGreater(irrad.dhi, 0) - self.assertGreater(irrad.solar_zenith, 0) - self.assertLess(irrad.solar_zenith, 90) - self.assertIsNotNone(irrad.timestamp) - - # Direct pvlib clearsky validation - pvlib_loc = location.Location( - self.latitude, self.longitude, tz=_TEST_TIMEZONE_PACIFIC - ) - clearsky = pvlib_loc.get_clearsky( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]) - ) - self.assertAlmostEqual(irrad.ghi, clearsky['ghi'].iloc[0], places=4) - self.assertAlmostEqual(irrad.dni, clearsky['dni'].iloc[0], places=4) - self.assertAlmostEqual(irrad.dhi, clearsky['dhi'].iloc[0], places=4) - - # Validate solar position against pvlib - self._validate_solar_position_against_pvlib( - irrad, - location.Location( - self.latitude, self.longitude, tz=_TEST_TIMEZONE_PACIFIC - ), - _DAYTIME_TIMESTAMP_PACIFIC, - ) - - def test_get_irradiance_with_solar_position(self): - """Solar position is reasonable at noon; POA calculation is consistent.""" - irrad = self.solar_radiation.get_current_irradiance( - _DAYTIME_TIMESTAMP_PACIFIC - ) - self.assertGreater(irrad.solar_zenith, 0) - self.assertLess(irrad.solar_zenith, 90) - - surface_tilt = 30.0 - surface_azimuth = 180.0 - - poa = solar_radiation.calculate_poa_irradiance( - irradiance_components=irrad, - surface_tilt=surface_tilt, - surface_azimuth=surface_azimuth, - solar_zenith=irrad.solar_zenith, - solar_azimuth=irrad.solar_azimuth, - ) - self.assertGreater(poa, 0) - self.assertLess(poa, 1200) - - # Direct pvlib validation - pvlib_loc = self._make_pvlib_location(timezone=_TEST_TIMEZONE_PACIFIC) - clearsky = pvlib_loc.get_clearsky( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]) - ) - solar_position = pvlib_loc.get_solarposition( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]) - ) - poa_pvlib = irradiance.get_total_irradiance( - surface_tilt=surface_tilt, - surface_azimuth=surface_azimuth, - dni=clearsky['dni'].iloc[0], - ghi=clearsky['ghi'].iloc[0], - dhi=clearsky['dhi'].iloc[0], - solar_zenith=solar_position['apparent_zenith'].iloc[0], - solar_azimuth=solar_position['azimuth'].iloc[0], - ) - self.assertAlmostEqual(poa, float(poa_pvlib['poa_global']), places=4) - - def test_get_current_irradiance_campbell_norman(self): - """Campbell-Norman with 50% cloud cover should be < clearsky.""" - cloud_cover = 50.0 - sr = self._make_solar_radiation( - cloud_cover=cloud_cover, - irradiance_method='campbell_norman', - ) - irrad = sr.get_current_irradiance(_DAYTIME_TIMESTAMP_PACIFIC) - - self._validate_irradiance_components(irrad) - clearsky_irrad = self.solar_radiation.get_current_irradiance( - _DAYTIME_TIMESTAMP_PACIFIC - ) - self.assertLess(irrad.ghi, clearsky_irrad.ghi) - - # Direct pvlib campbell_norman validation - pvlib_loc = self._make_pvlib_location(timezone=_TEST_TIMEZONE_PACIFIC) - solar_position = pvlib_loc.get_solarposition( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]) - ) - dni_extra = irradiance.get_extra_radiation( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]) - ) - transmittance = 0.7 - 0.5 * (cloud_cover / 100.0) - expected = irradiance.campbell_norman( - solar_position['apparent_zenith'].iloc[0], - transmittance, - dni_extra=dni_extra.iloc[0], - ) - self.assertAlmostEqual(irrad.ghi, expected['ghi'], places=4) - self.assertAlmostEqual(irrad.dni, expected['dni'], places=4) - self.assertAlmostEqual(irrad.dhi, expected['dhi'], places=4) - - self._validate_solar_position_against_pvlib( - irrad, pvlib_loc, _DAYTIME_TIMESTAMP_PACIFIC - ) - - def test_get_current_irradiance_linear(self): - """Linear method with 30% cloud cover.""" - cloud_cover = 30.0 - sr = self._make_solar_radiation( - cloud_cover=cloud_cover, - irradiance_method='linear', - ) - irrad = sr.get_current_irradiance(_DAYTIME_TIMESTAMP_PACIFIC) - self._validate_irradiance_components(irrad) - - pvlib_loc = self._make_pvlib_location(timezone=_TEST_TIMEZONE_PACIFIC) - clearsky = pvlib_loc.get_clearsky( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]), model='ineichen' - ) - solar_position = pvlib_loc.get_solarposition( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]) - ) - expected_ghi = float(clearsky['ghi'].iloc[0]) * ( - 1.0 - 0.8 * (cloud_cover / 100.0) - ) - dni_result = irradiance.disc( - pd.Series( - [expected_ghi], - index=pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]), - ), - solar_position['zenith'], - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]), - ) - expected_dni = float(dni_result['dni'].iloc[0]) - zenith_rad = np.radians(solar_position['zenith'].iloc[0]) - expected_dhi = max(0, expected_ghi - expected_dni * np.cos(zenith_rad)) - - self.assertAlmostEqual(irrad.ghi, expected_ghi, places=4) - self.assertAlmostEqual(irrad.dni, expected_dni, places=4) - self.assertAlmostEqual(irrad.dhi, expected_dhi, places=4) - - self._validate_solar_position_against_pvlib( - irrad, pvlib_loc, _DAYTIME_TIMESTAMP_PACIFIC - ) - - # ---- sky temperature tests --------------------------------------------- - - def test_get_current_sky_temperature(self): - """Sky temperature via Clark & Allen formula.""" - dewpoint_depression = 5.0 - sr = self._make_solar_radiation(dewpoint_depression=dewpoint_depression) - - # Use a naive timestamp so WeatherController (which cannot handle - # tz-aware timestamps) and ReplayWeatherController both work. - timestamp = pd.Timestamp('2023-07-01 12:00:00') - temp_sky_k = sr.get_current_sky_temperature(timestamp) - - self.assertGreater(temp_sky_k, 200) - self.assertLess(temp_sky_k, 350) - - temp_k = self.weather_controller.get_current_temp(timestamp) - self.assertLessEqual(temp_sky_k, temp_k) - - sigma = sim_constants.STEFAN_BOLTZMANN_CONSTANT - dp_k = temp_k - dewpoint_depression - epsilon_sky = 0.787 + 0.764 * np.log(dp_k / 273.0) - ir_h = epsilon_sky * sigma * (temp_k**4) - expected = (ir_h / sigma) ** 0.25 - self.assertAlmostEqual(temp_sky_k, expected, places=4) - - def test_get_current_sky_temperature_no_weather_controller_raises(self): - sr = solar_radiation.SolarRadiation( - building_info=self.building_info, - weather_controller=None, - ) - with self.assertRaises(ValueError): - sr.get_current_sky_temperature(_DAYTIME_TIMESTAMP_UTC) - - # ---- POA irradiance tests ---------------------------------------------- - - def test_calculate_poa_irradiance(self): - """POA calculation matches pvlib reference.""" - irrad_components = solar_radiation.IrradianceComponents( - ghi=800.0, - dni=700.0, - dhi=100.0, - solar_zenith=30.0, - solar_azimuth=180.0, - ) - poa = solar_radiation.calculate_poa_irradiance( - irradiance_components=irrad_components, - surface_tilt=30.0, - surface_azimuth=180.0, - solar_zenith=30.0, - solar_azimuth=180.0, - ) - self.assertGreater(poa, 0) - self.assertLess(poa, 1500) - - poa_pvlib = irradiance.get_total_irradiance( - surface_tilt=30.0, - surface_azimuth=180.0, - dni=700.0, - ghi=800.0, - dhi=100.0, - solar_zenith=30.0, - solar_azimuth=180.0, - ) - self.assertAlmostEqual(poa, float(poa_pvlib['poa_global']), places=4) - - def test_calculate_poa_irradiance_building_radiation_utils(self): - """Backward-compat: building_radiation_utils.calculate_poa_irradiance.""" - irrad_components = solar_radiation.IrradianceComponents( - ghi=800.0, - dni=700.0, - dhi=100.0, - solar_zenith=30.0, - solar_azimuth=180.0, - ) - poa_sr = solar_radiation.calculate_poa_irradiance( - irradiance_components=irrad_components, - surface_tilt=30.0, - surface_azimuth=180.0, - solar_zenith=30.0, - solar_azimuth=180.0, - ) - poa_utils = building_radiation_utils.calculate_poa_irradiance( - irradiance_components=irrad_components, - surface_tilt=30.0, - surface_azimuth=180.0, - solar_zenith=30.0, - solar_azimuth=180.0, - ) - self.assertAlmostEqual(poa_sr, poa_utils, places=4) - - def test_poa_with_clearsky_irradiance(self): - """POA from clearsky SolarRadiation output matches pvlib.""" - irrad = self.solar_radiation.get_current_irradiance( - _DAYTIME_TIMESTAMP_PACIFIC - ) - poa = solar_radiation.calculate_poa_irradiance( - irradiance_components=irrad, - surface_tilt=30.0, - surface_azimuth=180.0, - solar_zenith=irrad.solar_zenith, - solar_azimuth=irrad.solar_azimuth, - ) - self.assertGreater(poa, 0) - self.assertLess(poa, 1200) - - pvlib_loc = self._make_pvlib_location(timezone=_TEST_TIMEZONE_PACIFIC) - clearsky = pvlib_loc.get_clearsky( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]) - ) - solar_position = pvlib_loc.get_solarposition( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]) - ) - poa_pvlib = irradiance.get_total_irradiance( - surface_tilt=30.0, - surface_azimuth=180.0, - dni=clearsky['dni'].iloc[0], - ghi=clearsky['ghi'].iloc[0], - dhi=clearsky['dhi'].iloc[0], - solar_zenith=solar_position['apparent_zenith'].iloc[0], - solar_azimuth=solar_position['azimuth'].iloc[0], - ) - self.assertAlmostEqual(poa, float(poa_pvlib['poa_global']), places=4) - - # ---- get_exterior_radiation tests ---------------------------------------- - - def test_get_exterior_radiation_returns_correct_types(self): - """get_exterior_radiation returns ExteriorRadiationData.""" - timestamp = pd.Timestamp('2023-07-01 12:00:00') - ext_rad = self.solar_radiation.get_exterior_radiation(timestamp) - - self.assertIsInstance(ext_rad, solar_radiation.ExteriorRadiationData) - self.assertGreater(ext_rad.ambient_temp_k, 200) - self.assertLess(ext_rad.ambient_temp_k, 400) - self.assertGreater(ext_rad.sky_temp_k, 200) - self.assertLess(ext_rad.sky_temp_k, 400) - # Sky temp should be ≤ ambient dry-bulb - self.assertLessEqual(ext_rad.sky_temp_k, ext_rad.ambient_temp_k) - # Irradiance object should be consistent - self.assertIsInstance( - ext_rad.irradiance, solar_radiation.IrradianceComponents - ) - self.assertGreaterEqual(ext_rad.irradiance.ghi, 0) - self.assertGreaterEqual(ext_rad.irradiance.dni, 0) - self.assertGreaterEqual(ext_rad.irradiance.dhi, 0) - - def test_get_exterior_radiation_no_weather_controller_raises(self): - """get_exterior_radiation raises without a weather controller.""" - sr = solar_radiation.SolarRadiation( - building_info=self.building_info, - weather_controller=None, - ) - with self.assertRaises(ValueError): - sr.get_exterior_radiation(_DAYTIME_TIMESTAMP_PACIFIC) - - def test_get_exterior_radiation_consistent_with_individual_getters(self): - """get_exterior_radiation returns same values as individual getter calls.""" - # Use a naive timestamp (works with both WeatherController variants) - timestamp = pd.Timestamp('2023-07-01 12:00:00') - - ext_rad = self.solar_radiation.get_exterior_radiation(timestamp) - - sky_temp_direct = self.solar_radiation.get_current_sky_temperature( - timestamp - ) - irrad_direct = self.solar_radiation.get_current_irradiance(timestamp) - - self.assertAlmostEqual(ext_rad.sky_temp_k, sky_temp_direct, places=6) - self.assertAlmostEqual(ext_rad.irradiance.ghi, irrad_direct.ghi, places=6) - self.assertAlmostEqual(ext_rad.irradiance.dni, irrad_direct.dni, places=6) - self.assertAlmostEqual(ext_rad.irradiance.dhi, irrad_direct.dhi, places=6) - - -# --------------------------------------------------------------------------- -# ReplaySolarRadiationTest – inherits all tests, swaps the controller -# --------------------------------------------------------------------------- -class ReplaySolarRadiationTest(SolarRadiationTest): - """Re-runs all SolarRadiationTest tests with ReplayWeatherController.""" - - def setUp(self): - # Skip SolarRadiationTest.setUp; call IrradianceTestBase.setUp directly. - super(SolarRadiationTest, self).setUp() # pylint: disable=bad-super-call - - self.weather_controller = weather_controller.ReplayWeatherController( - local_weather_path=_LOCAL_WEATHER_TEST_DATA_PATH, - convection_coefficient=10.0, - ) - self.building_info = solar_radiation.BuildingInfo( - lat=_TEST_LATITUDE, - lon=_TEST_LONGITUDE, - time_zone=_TEST_TIMEZONE_PACIFIC, - ) - self.solar_radiation = solar_radiation.SolarRadiation( - building_info=self.building_info, - weather_controller=self.weather_controller, - ) - - def test_get_current_irradiance_clearsky(self): - """For Replay, 19:00 UTC ≈ noon local, cloud cover varies by CSV.""" - # ReplayWeatherController doesn't have a location for irradiance - # unless we specify it. Use a SolarRadiation with replay controller. - sr = solar_radiation.SolarRadiation( - building_info=self.building_info, - weather_controller=self.weather_controller, - ) - irrad = sr.get_current_irradiance(_DAYTIME_TIMESTAMP_PACIFIC) - - # Basic sanity - self._validate_irradiance_components(irrad) - self.assertGreater(irrad.ghi, 100) - self.assertIsNotNone(irrad.timestamp) - - # Direct pvlib clearsky validation - pvlib_loc = location.Location( - self.latitude, self.longitude, tz=_TEST_TIMEZONE_PACIFIC - ) - clearsky = pvlib_loc.get_clearsky( - pd.DatetimeIndex([_DAYTIME_TIMESTAMP_PACIFIC]) - ) - self.assertAlmostEqual(irrad.ghi, clearsky['ghi'].iloc[0], places=4) - self.assertAlmostEqual(irrad.dni, clearsky['dni'].iloc[0], places=4) - self.assertAlmostEqual(irrad.dhi, clearsky['dhi'].iloc[0], places=4) - - def test_get_current_irradiance_campbell_norman_replay(self): - """Campbell-Norman with cloud cover from CSV for ReplayWeatherController.""" - sr = solar_radiation.SolarRadiation( - building_info=solar_radiation.BuildingInfo( - lat=self.latitude, - lon=self.longitude, - time_zone=_TEST_TIMEZONE_PACIFIC, - ), - weather_controller=self.weather_controller, - cloud_cover=50.0, - irradiance_method='campbell_norman', - ) - - timestamp = pd.Timestamp('2023-07-01 12:00:00', tz=_TEST_TIMEZONE_PACIFIC) - irrad = sr.get_current_irradiance(timestamp) - - self._validate_irradiance_components(irrad) - - pvlib_loc = self._make_pvlib_location(timezone=_TEST_TIMEZONE_PACIFIC) - timestamp_utc = timestamp.tz_convert('UTC') - solar_position = pvlib_loc.get_solarposition( - pd.DatetimeIndex([timestamp_utc]) - ) - cloud_cover = 50.0 - transmittance = 0.7 - 0.5 * (cloud_cover / 100.0) - dni_extra = irradiance.get_extra_radiation( - pd.DatetimeIndex([timestamp_utc]) - ) - expected_irrad = irradiance.campbell_norman( - solar_position['apparent_zenith'].iloc[0], - transmittance, - dni_extra=dni_extra.iloc[0], - ) - self.assertAlmostEqual(irrad.ghi, expected_irrad['ghi'], delta=1.0) - self.assertAlmostEqual(irrad.dni, expected_irrad['dni'], delta=1.0) - self.assertAlmostEqual(irrad.dhi, expected_irrad['dhi'], delta=1.0) - - -# --------------------------------------------------------------------------- -# pvlib validation tests (clearsky, linear, campbell_norman consistency) -# --------------------------------------------------------------------------- -class SolarRadiationPvlibValidationTest(IrradianceTestBase): - """Validate SolarRadiation against direct pvlib calculations.""" - - def setUp(self): - super().setUp() - self.data_path = _LOCAL_WEATHER_TEST_DATA_PATH - - def _make_replay_sr(self, irradiance_method='campbell_norman', **kwargs): - """Factory for SolarRadiation backed by the replay CSV.""" - wc = weather_controller.ReplayWeatherController( - local_weather_path=self.data_path, - convection_coefficient=10.0, - ) - bi = solar_radiation.BuildingInfo( - lat=self.latitude, - lon=self.longitude, - time_zone=_TEST_TIMEZONE_UTC, - ) - return solar_radiation.SolarRadiation( - building_info=bi, - weather_controller=wc, - irradiance_method=irradiance_method, - **kwargs, - ) - - def test_clearsky_irradiance_matches_pvlib(self): - """Clearsky SolarRadiation matches pvlib location.get_clearsky.""" - sr = solar_radiation.SolarRadiation( - building_info=solar_radiation.BuildingInfo( - lat=self.latitude, lon=self.longitude, time_zone=_TEST_TIMEZONE_UTC - ) - ) - timestamp = pd.Timestamp('2023-07-01 19:00:00+00:00') - irrad = sr.get_current_irradiance(timestamp) - - pvlib_loc = self._make_pvlib_location() - clearsky = pvlib_loc.get_clearsky(pd.DatetimeIndex([timestamp])) - - self.assertAlmostEqual(irrad.ghi, clearsky['ghi'].iloc[0], places=4) - self.assertAlmostEqual(irrad.dni, clearsky['dni'].iloc[0], places=4) - self.assertAlmostEqual(irrad.dhi, clearsky['dhi'].iloc[0], places=4) - - def test_campbell_norman_consistency(self): - """Campbell-Norman results match pvlib for given cloud cover.""" - sr = solar_radiation.SolarRadiation( - building_info=solar_radiation.BuildingInfo( - lat=self.latitude, - lon=self.longitude, - time_zone=_TEST_TIMEZONE_UTC, - ), - cloud_cover=50.0, - irradiance_method='campbell_norman', - ) - - timestamp = pd.Timestamp('2023-07-01 19:00:00+00:00') - irrad = sr.get_current_irradiance(timestamp) - - pvlib_loc = self._make_pvlib_location() - solar_position = pvlib_loc.get_solarposition(pd.DatetimeIndex([timestamp])) - dni_extra = irradiance.get_extra_radiation(pd.DatetimeIndex([timestamp])) - transmittance = 0.7 - 0.5 * (50.0 / 100.0) - expected = irradiance.campbell_norman( - solar_position['apparent_zenith'].iloc[0], - transmittance, - dni_extra=dni_extra.iloc[0], - ) - - self.assertAlmostEqual(irrad.ghi, expected['ghi'], places=2) - self.assertAlmostEqual(irrad.dni, expected['dni'], places=2) - self.assertAlmostEqual(irrad.dhi, expected['dhi'], places=2) - - def test_linear_method_consistency(self): - """Linear method results match pvlib for given cloud cover.""" - sr = solar_radiation.SolarRadiation( - building_info=solar_radiation.BuildingInfo( - lat=self.latitude, - lon=self.longitude, - time_zone=_TEST_TIMEZONE_UTC, - ), - cloud_cover=30.0, - irradiance_method='linear', - ) - - timestamp = pd.Timestamp('2023-07-01 19:00:00+00:00') - irrad = sr.get_current_irradiance(timestamp) - - pvlib_loc = self._make_pvlib_location() - clearsky = pvlib_loc.get_clearsky( - pd.DatetimeIndex([timestamp]), model='ineichen' - ) - solar_position = pvlib_loc.get_solarposition(pd.DatetimeIndex([timestamp])) - expected_ghi = float(clearsky['ghi'].iloc[0]) * (1.0 - 0.8 * (30.0 / 100.0)) - dni_result = irradiance.disc( - pd.Series([expected_ghi], index=pd.DatetimeIndex([timestamp])), - solar_position['zenith'], - pd.DatetimeIndex([timestamp]), - ) - expected_dni = float(dni_result['dni'].iloc[0]) - zenith_rad = np.radians(solar_position['zenith'].iloc[0]) - expected_dhi = max(0, expected_ghi - expected_dni * np.cos(zenith_rad)) - - self.assertAlmostEqual(irrad.ghi, expected_ghi, places=2) - self.assertAlmostEqual(irrad.dni, expected_dni, places=2) - self.assertAlmostEqual(irrad.dhi, expected_dhi, places=2) - - def test_irradiance_closure_equation(self): - """GHI ≈ DNI * cos(zenith) + DHI for campbell_norman at multiple times.""" - sr = self._make_replay_sr( - irradiance_method='campbell_norman', cloud_cover=0.0 - ) - pvlib_loc = self._make_pvlib_location() - - for time_str in [ - '2023-07-01 08:00:00+00:00', - '2023-07-01 12:00:00+00:00', - '2023-07-01 19:00:00+00:00', - ]: - timestamp = pd.Timestamp(time_str) - irrad = sr.get_current_irradiance(timestamp) - - solar_position = pvlib_loc.get_solarposition( - pd.DatetimeIndex([timestamp]) - ) - zenith_rad = np.radians(solar_position['apparent_zenith'].iloc[0]) - calculated_ghi = irrad.dni * np.cos(zenith_rad) + irrad.dhi - - if irrad.ghi > 10: - self.assertAlmostEqual( - calculated_ghi, - irrad.ghi, - delta=10.0, - msg=f'Closure equation failed at {time_str}', - ) - - -# --------------------------------------------------------------------------- -# IrradianceDecompositionPvlibValidationTest (TMY3 data) -# --------------------------------------------------------------------------- -class IrradianceDecompositionPvlibValidationTest(parameterized.TestCase): - """Validate pvlib irradiance decomposition methods using TMY3 data. - - Uses sample TMY3 data for Greensboro Piedmont Triad International Airport - (USAF 723170) obtained from the pvlib-python repository: - https://github.com/pvlib/pvlib-python/blob/main/pvlib/data/723170TYA.CSV - - Station metadata:: - - USAF: 723170 - Name: "GREENSBORO PIEDMONT TRIAD INT" - State: NC - TZ: -5.0 (US/Eastern) - Latitude: 36.1 - Longitude: -79.95 - Altitude: 273.0 m - - For details on the TMY3 file format, see: - - > Wilcox, S and Marion, W. "Users Manual for TMY3 Data Sets (Revised).", - > May. 2008. https://doi.org/10.2172/928611 - - The test methods below compare our irradiance calculations against pvlib - reference implementations, following the transposition-gain validation - example in the pvlib documentation: - https://github.com/pvlib/pvlib-python/blob/main/docs/examples/irradiance-transposition/plot_transposition_gain.py - - Attributes: - tmy3_data: A ``pandas.DataFrame`` of TMY3 weather observations read by - ``pvlib.iotools.read_tmy3`` with timestamps coerced to 1990. - metadata: A ``dict`` of station metadata returned by ``read_tmy3`` - (latitude, longitude, altitude, time zone, etc.). - solpos: A ``pandas.DataFrame`` of solar-position angles computed by - ``pvlib.solarposition.get_solarposition`` at the midpoint of each - hourly TMY interval. - """ - - @classmethod - def setUpClass(cls): - """Load TMY3 data and pre-compute solar positions for all tests. - - Reads the ``723170TYA.CSV`` file (Greensboro, NC) with pvlib's - ``read_tmy3``, coercing all timestamps to 1990. Solar positions are - computed at the midpoint of each hourly interval (shifted by −30 min) - following pvlib conventions for TMY data. - """ - from pvlib.iotools import read_tmy3 # pylint: disable=import-outside-toplevel - from pvlib.solarposition import get_solarposition # pylint: disable=import-outside-toplevel - - tmy3_path = os.path.join( - os.path.dirname(__file__), - 'solar_radiation_test_data', - '723170TYA.CSV', - ) - cls.tmy3_data, cls.metadata = read_tmy3( - tmy3_path, coerce_year=1990, map_variables=True - ) - cls.solpos = get_solarposition( - cls.tmy3_data.index.shift(freq='-30min'), - latitude=cls.metadata['latitude'], - longitude=cls.metadata['longitude'], - altitude=cls.metadata['altitude'], - pressure=cls.tmy3_data.pressure * 100, - temperature=cls.tmy3_data.temp_air, - ) - cls.solpos.index = cls.tmy3_data.index - - def test_disc_method_matches_pvlib(self): - out_disc = irradiance.disc( - self.tmy3_data.ghi, - self.solpos.zenith, - self.tmy3_data.index, - self.tmy3_data.pressure * 100, - ) - df_disc = irradiance.complete_irradiance( - solar_zenith=self.solpos.apparent_zenith, - ghi=self.tmy3_data.ghi, - dni=out_disc.dni, - dhi=None, - ) - for time_str in [ - '1990-07-04 12:00:00-05:00', - '1990-07-04 13:00:00-05:00', - ]: - idx = pd.Timestamp(time_str) - if idx in out_disc.index: - zenith_rad = np.radians(self.solpos.apparent_zenith.loc[idx]) - calculated_ghi = ( - out_disc.dni.loc[idx] * np.cos(zenith_rad) + df_disc.dhi.loc[idx] - ) - self.assertAlmostEqual( - calculated_ghi, - self.tmy3_data.ghi.loc[idx], - delta=1.0, - msg=f'DISC closure failed at {time_str}', - ) - self.assertGreaterEqual(out_disc.dni.loc[idx], 0) - - def test_erbs_method_matches_pvlib(self): - out_erbs = irradiance.erbs( - self.tmy3_data.ghi, self.solpos.zenith, self.tmy3_data.index - ) - for time_str in [ - '1990-04-04 12:00:00-05:00', - '1990-01-04 12:00:00-05:00', - ]: - idx = pd.Timestamp(time_str) - if idx in out_erbs.index: - zenith_rad = np.radians(self.solpos.zenith.loc[idx]) - if np.cos(zenith_rad) > 0.1: - calculated_ghi = ( - out_erbs.dni.loc[idx] * np.cos(zenith_rad) + out_erbs.dhi.loc[idx] - ) - self.assertAlmostEqual( - calculated_ghi, - self.tmy3_data.ghi.loc[idx], - delta=5.0, - msg=f'Erbs closure failed at {time_str}', - ) - - def test_campbell_norman_method_matches_pvlib(self): - test_time = pd.Timestamp('1990-07-04 12:00:00-05:00') - for transmittance in [0.7, 0.5, 0.3]: - dni_extra = irradiance.get_extra_radiation(pd.DatetimeIndex([test_time])) - result = irradiance.campbell_norman( - self.solpos.apparent_zenith.loc[test_time], - transmittance, - dni_extra=dni_extra.iloc[0], - ) - self.assertGreaterEqual(result['ghi'], 0) - self.assertGreaterEqual(result['dni'], 0) - self.assertGreaterEqual(result['dhi'], 0) - - zenith_rad = np.radians(self.solpos.apparent_zenith.loc[test_time]) - calculated_ghi = result['dni'] * np.cos(zenith_rad) + result['dhi'] - self.assertAlmostEqual( - calculated_ghi, - result['ghi'], - delta=1.0, - msg=f'Campbell-Norman closure failed for t={transmittance}', - ) - - def test_solar_radiation_campbell_norman_consistency(self): - """SolarRadiation campbell_norman matches pvlib.""" - latitude = self.metadata['latitude'] - longitude = self.metadata['longitude'] - sr = solar_radiation.SolarRadiation( - building_info=solar_radiation.BuildingInfo( - lat=latitude, lon=longitude, time_zone='US/Eastern' - ), - cloud_cover=50.0, - irradiance_method='campbell_norman', - ) - - timestamp = pd.Timestamp('1990-07-04 12:00:00', tz='US/Eastern') - irrad = sr.get_current_irradiance(timestamp) - - pvlib_loc = location.Location(latitude, longitude, tz='US/Eastern') - solar_position = pvlib_loc.get_solarposition(pd.DatetimeIndex([timestamp])) - dni_extra = irradiance.get_extra_radiation(pd.DatetimeIndex([timestamp])) - transmittance = 0.7 - 0.5 * (50.0 / 100.0) - expected = irradiance.campbell_norman( - solar_position['apparent_zenith'].iloc[0], - transmittance, - dni_extra=dni_extra.iloc[0], - ) - self.assertAlmostEqual(irrad.ghi, expected['ghi'], places=2) - self.assertAlmostEqual(irrad.dni, expected['dni'], places=2) - self.assertAlmostEqual(irrad.dhi, expected['dhi'], places=2) - - def test_solar_radiation_linear_consistency(self): - """SolarRadiation linear method matches pvlib.""" - latitude = self.metadata['latitude'] - longitude = self.metadata['longitude'] - sr = solar_radiation.SolarRadiation( - building_info=solar_radiation.BuildingInfo( - lat=latitude, lon=longitude, time_zone='US/Eastern' - ), - cloud_cover=30.0, - irradiance_method='linear', - ) - - timestamp = pd.Timestamp('1990-07-04 12:00:00', tz='US/Eastern') - irrad = sr.get_current_irradiance(timestamp) - - pvlib_loc = location.Location(latitude, longitude, tz='US/Eastern') - clearsky = pvlib_loc.get_clearsky( - pd.DatetimeIndex([timestamp]), model='ineichen' - ) - solar_position = pvlib_loc.get_solarposition(pd.DatetimeIndex([timestamp])) - expected_ghi = float(clearsky['ghi'].iloc[0]) * (1.0 - 0.8 * (30.0 / 100.0)) - dni_result = irradiance.disc( - pd.Series([expected_ghi], index=pd.DatetimeIndex([timestamp])), - solar_position['zenith'], - pd.DatetimeIndex([timestamp]), - ) - expected_dni = float(dni_result['dni'].iloc[0]) - zenith_rad = np.radians(solar_position['zenith'].iloc[0]) - expected_dhi = max(0, expected_ghi - expected_dni * np.cos(zenith_rad)) - - self.assertAlmostEqual(irrad.ghi, expected_ghi, places=2) - self.assertAlmostEqual(irrad.dni, expected_dni, places=2) - self.assertAlmostEqual(irrad.dhi, expected_dhi, places=2) - - def test_solar_radiation_clearsky_matches_pvlib(self): - """SolarRadiation clearsky matches pvlib location.get_clearsky.""" - latitude = self.metadata['latitude'] - longitude = self.metadata['longitude'] - sr = solar_radiation.SolarRadiation( - building_info=solar_radiation.BuildingInfo( - lat=latitude, lon=longitude, time_zone='US/Eastern' - ) - ) - timestamp = pd.Timestamp('1990-07-04 12:00:00', tz='US/Eastern') - irrad = sr.get_current_irradiance(timestamp) - - pvlib_loc = location.Location(latitude, longitude, tz='US/Eastern') - clearsky = pvlib_loc.get_clearsky(pd.DatetimeIndex([timestamp])) - - self.assertAlmostEqual(irrad.ghi, clearsky['ghi'].iloc[0], places=4) - self.assertAlmostEqual(irrad.dni, clearsky['dni'].iloc[0], places=4) - self.assertAlmostEqual(irrad.dhi, clearsky['dhi'].iloc[0], places=4) - - @parameterized.named_parameters( - ('winter_noon', '1990-01-04 12:00:00-05:00'), - ('spring_noon', '1990-04-04 12:00:00-05:00'), - ('summer_noon', '1990-07-04 12:00:00-05:00'), - ) - def test_tmy3_irradiance_closure_equation(self, time_str): - """TMY3 data satisfies closure: GHI = DNI*cos(z) + DHI.""" - idx = pd.Timestamp(time_str) - ghi = self.tmy3_data.ghi.loc[idx] - dni = self.tmy3_data.dni.loc[idx] - dhi = self.tmy3_data.dhi.loc[idx] - zenith = self.solpos.apparent_zenith.loc[idx] - - zenith_rad = np.radians(zenith) - calculated_ghi = dni * np.cos(zenith_rad) + dhi - - self.assertAlmostEqual( - calculated_ghi, - ghi, - delta=50.0, - msg=f'TMY3 closure failed at {time_str}', - ) - - -# --------------------------------------------------------------------------- -# Replay helper function tests -# --------------------------------------------------------------------------- -def _make_observation_response(measurements, timestamp_seconds=1688212800): - """Build a fake ObservationResponse proto for testing.""" - single_responses = [] - for name, value in measurements.items(): - single_request = smart_control_building_pb2.SingleObservationRequest( - device_id='test_device', measurement_name=name - ) - single_response = smart_control_building_pb2.SingleObservationResponse( - single_observation_request=single_request, - continuous_value=value, - ) - single_responses.append(single_response) - request = smart_control_building_pb2.ObservationRequest() - ts_proto = smart_control_building_pb2.ObservationResponse() - ts_proto.timestamp.seconds = timestamp_seconds - return smart_control_building_pb2.ObservationResponse( - timestamp=ts_proto.timestamp, - request=request, - single_observation_responses=single_responses, - ) - - -class GetReplayTemperaturesTest(absltest.TestCase): - """Tests for get_replay_temperatures.""" - - def test_sensor_present(self): - temp_k = utils.celsius_to_kelvin(25.0) - obs = _make_observation_response({'outside_air_temperature_sensor': temp_k}) - result = solar_radiation.get_replay_temperatures([obs]) - self.assertLen(result, 1) - self.assertAlmostEqual(list(result.values())[0], temp_k, places=4) - - def test_sensor_absent_returns_default(self): - obs = _make_observation_response({'some_other_sensor': 300.0}) - result = solar_radiation.get_replay_temperatures([obs]) - self.assertLen(result, 1) - self.assertEqual(list(result.values())[0], -1.0) - - def test_multiple_observations(self): - obs1 = _make_observation_response( - {'outside_air_temperature_sensor': utils.celsius_to_kelvin(20.0)}, - timestamp_seconds=1688212800, - ) - obs2 = _make_observation_response( - {'outside_air_temperature_sensor': utils.celsius_to_kelvin(25.0)}, - timestamp_seconds=1688216400, - ) - result = solar_radiation.get_replay_temperatures([obs1, obs2]) - self.assertLen(result, 2) - values = list(result.values()) - self.assertAlmostEqual(values[0], utils.celsius_to_kelvin(20.0), places=4) - self.assertAlmostEqual(values[1], utils.celsius_to_kelvin(25.0), places=4) - - -class GetReplayCloudCoverTest(absltest.TestCase): - """Tests for get_replay_cloud_cover.""" - - def test_sensor_present(self): - obs = _make_observation_response({'cloud_cover_sensor': 50.0}) - result = solar_radiation.get_replay_cloud_cover([obs]) - self.assertLen(result, 1) - self.assertAlmostEqual(list(result.values())[0], 50.0, places=4) - - def test_sensor_absent_returns_default(self): - obs = _make_observation_response({'some_other_sensor': 100.0}) - result = solar_radiation.get_replay_cloud_cover([obs]) - self.assertLen(result, 1) - self.assertEqual(list(result.values())[0], 0.0) - - -class GetReplaySkyTemperatureTest(absltest.TestCase): - """Tests for get_replay_sky_temperature.""" - - def test_with_both_sensors(self): - temp_k = utils.celsius_to_kelvin(23.0) - dp_k = utils.celsius_to_kelvin(15.0) - obs = _make_observation_response({ - 'outside_air_temperature_sensor': temp_k, - 'dew_point_temperature_sensor': dp_k, - }) - result = solar_radiation.get_replay_sky_temperature([obs]) - self.assertLen(result, 1) - temp_sky_k = list(result.values())[0] - - sigma = sim_constants.STEFAN_BOLTZMANN_CONSTANT - epsilon_sky = 0.787 + 0.764 * np.log(dp_k / 273.0) - ir_h = epsilon_sky * sigma * (temp_k**4) - expected = (ir_h / sigma) ** 0.25 - self.assertAlmostEqual(temp_sky_k, expected, places=4) - self.assertLess(temp_sky_k, temp_k) - - def test_missing_dewpoint_uses_depression(self): - temp_k = utils.celsius_to_kelvin(23.0) - depression = 8.0 - obs = _make_observation_response({'outside_air_temperature_sensor': temp_k}) - result = solar_radiation.get_replay_sky_temperature( - [obs], dewpoint_depression=depression - ) - self.assertLen(result, 1) - temp_sky_k = list(result.values())[0] - - dp_k = temp_k - depression - sigma = sim_constants.STEFAN_BOLTZMANN_CONSTANT - epsilon_sky = 0.787 + 0.764 * np.log(dp_k / 273.0) - ir_h = epsilon_sky * sigma * (temp_k**4) - expected = (ir_h / sigma) ** 0.25 - self.assertAlmostEqual(temp_sky_k, expected, places=4) - - def test_missing_temp_skips_entry(self): - obs_no_temp = _make_observation_response( - {'dew_point_temperature_sensor': utils.celsius_to_kelvin(15.0)} - ) - obs_with_temp = _make_observation_response( - {'outside_air_temperature_sensor': utils.celsius_to_kelvin(23.0)} - ) - result = solar_radiation.get_replay_sky_temperature( - [obs_no_temp, obs_with_temp] - ) - self.assertLen(result, 1) - - -class GetReplayIrradianceTest(absltest.TestCase): - """Tests for get_replay_irradiance.""" - - def test_sensors_present(self): - obs = _make_observation_response({ - 'ghi_sensor': 800.0, - 'dni_sensor': 700.0, - 'dhi_sensor': 100.0, - }) - result = solar_radiation.get_replay_irradiance([obs]) - self.assertLen(result, 1) - irrad = result[0] - self.assertAlmostEqual(irrad.ghi, 800.0, places=4) - self.assertAlmostEqual(irrad.dni, 700.0, places=4) - self.assertAlmostEqual(irrad.dhi, 100.0, places=4) - self.assertIsNotNone(irrad.timestamp) - - def test_sensors_absent_returns_defaults(self): - obs = _make_observation_response({'some_other_sensor': 999.0}) - result = solar_radiation.get_replay_irradiance([obs]) - self.assertLen(result, 1) - irrad = result[0] - self.assertEqual(irrad.ghi, 0.0) - self.assertEqual(irrad.dni, 0.0) - self.assertEqual(irrad.dhi, 0.0) - - def test_multiple_observations(self): - obs1 = _make_observation_response( - {'ghi_sensor': 500.0, 'dni_sensor': 400.0, 'dhi_sensor': 100.0}, - timestamp_seconds=1688212800, - ) - obs2 = _make_observation_response( - {'ghi_sensor': 0.0, 'dni_sensor': 0.0, 'dhi_sensor': 0.0}, - timestamp_seconds=1688216400, - ) - result = solar_radiation.get_replay_irradiance([obs1, obs2]) - self.assertLen(result, 2) - self.assertAlmostEqual(result[0].ghi, 500.0, places=4) - self.assertAlmostEqual(result[1].ghi, 0.0, places=4) - - -class GetObservationValueTest(absltest.TestCase): - """Tests for _get_observation_value helper.""" - - def test_value_found(self): - obs = _make_observation_response({'ghi_sensor': 800.0}) - result = solar_radiation._get_observation_value(obs, 'ghi_sensor') # pylint: disable=protected-access - self.assertEqual(result, 800.0) - - def test_value_not_found_returns_default(self): - obs = _make_observation_response({'ghi_sensor': 800.0}) - result = solar_radiation._get_observation_value( # pylint: disable=protected-access - obs, 'nonexistent_sensor', default=42.0 - ) - self.assertEqual(result, 42.0) - - def test_value_not_found_returns_none(self): - obs = _make_observation_response({'ghi_sensor': 800.0}) - result = solar_radiation._get_observation_value(obs, 'nonexistent_sensor') # pylint: disable=protected-access - self.assertIsNone(result) - - -if __name__ == '__main__': - absltest.main() diff --git a/smart_control/simulator/solar_radiation_test_data/723170TYA.CSV b/smart_control/simulator/solar_radiation_test_data/723170TYA.CSV deleted file mode 100644 index 2f2e03c1..00000000 --- a/smart_control/simulator/solar_radiation_test_data/723170TYA.CSV +++ /dev/null @@ -1,8762 +0,0 @@ -723170,"GREENSBORO PIEDMONT TRIAD INT",NC,-5.0,36.100,-79.950,273 -Date (MM/DD/YYYY),Time (HH:MM),ETR (W/m^2),ETRN (W/m^2),GHI (W/m^2),GHI source,GHI uncert (%),DNI (W/m^2),DNI source,DNI uncert (%),DHI (W/m^2),DHI source,DHI uncert (%),GH illum (lx),GH illum source,Global illum uncert (%),DN illum (lx),DN illum source,DN illum uncert (%),DH illum (lx),DH illum source,DH illum uncert (%),Zenith lum (cd/m^2),Zenith lum source,Zenith lum uncert (%),TotCld (tenths),TotCld source,TotCld uncert (code),OpqCld (tenths),OpqCld source,OpqCld uncert (code),Dry-bulb (C),Dry-bulb source,Dry-bulb uncert (code),Dew-point (C),Dew-point source,Dew-point uncert (code),RHum (%),RHum source,RHum uncert (code),Pressure (mbar),Pressure source,Pressure uncert (code),Wdir (degrees),Wdir source,Wdir uncert (code),Wspd (m/s),Wspd source,Wspd uncert (code),Hvis (m),Hvis source,Hvis uncert (code),CeilHgt (m),CeilHgt source,CeilHgt uncert (code),Pwat (cm),Pwat source,Pwat uncert (code),AOD (unitless),AOD source,AOD uncert (code),Alb (unitless),Alb source,Alb uncert (code),Lprecip depth (mm),Lprecip quantity (hr),Lprecip source,Lprecip uncert (code),PresWth (METAR code),PresWth source,PresWth uncert (code) -01/01/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,6.1,A,7,77,A,7,993,A,7,200,A,7,6.2,A,7,16100,B,7,1370,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/01/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,6.7,A,7,80,A,7,993,A,7,230,A,7,5.2,A,7,16100,B,7,1370,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/01/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,7.2,A,7,83,A,7,993,A,7,220,A,7,5.7,A,7,16100,B,7,1370,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/01/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,7.2,A,7,83,A,7,992,A,7,210,A,7,5.7,A,7,16100,B,7,1370,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/01/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,7.2,A,7,83,A,7,992,A,7,220,A,7,5.2,A,7,16100,B,7,1520,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/01/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,7.8,A,7,86,A,7,992,A,7,220,A,7,4.1,A,7,16100,B,7,1370,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/01/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,8.3,A,7,90,A,7,992,A,7,240,A,7,4.1,A,7,16100,B,7,1370,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/01/1988,08:00,25,649,9,1,13,1,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,10.0,A,7,8.9,A,7,93,A,7,992,A,7,210,A,7,5.2,A,7,8000,B,7,1220,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -01/01/1988,09:00,228,1415,46,1,13,3,1,9,46,1,13,53,1,13,1,1,9,53,1,13,164,1,21,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,993,A,7,220,A,7,5.2,A,7,8000,B,7,1220,A,7,1.9,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -01/01/1988,10:00,439,1415,79,1,9,4,1,9,78,1,13,92,1,9,2,1,9,91,1,13,314,1,18,10,A,7,10,A,7,10.6,A,7,10.0,A,7,96,A,7,993,A,7,220,A,7,5.2,A,7,6400,B,7,1220,A,7,1.9,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -01/01/1988,11:00,598,1415,199,1,9,3,1,9,198,1,13,222,1,9,3,1,9,221,1,13,707,1,18,10,A,7,10,A,7,11.7,A,7,10.6,A,7,93,A,7,993,A,7,210,A,7,6.2,A,7,9700,B,7,1220,A,7,2.0,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -01/01/1988,12:00,696,1415,261,1,9,3,1,9,260,1,13,290,1,9,3,1,9,289,1,13,917,1,18,10,A,7,10,A,7,11.7,A,7,10.6,A,7,93,A,7,992,A,7,230,A,7,5.2,A,7,9700,B,7,1070,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/01/1988,13:00,723,1415,155,1,9,0,1,9,155,1,13,180,1,9,0,1,9,180,1,13,670,1,18,10,A,7,10,A,7,11.7,A,7,10.6,A,7,93,A,7,992,A,7,250,A,7,5.2,A,7,9700,B,7,310,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/01/1988,14:00,680,1415,144,1,9,2,1,9,144,1,13,168,1,9,1,1,9,168,1,13,614,1,18,10,A,7,10,A,7,11.7,A,7,11.1,A,7,96,A,7,992,A,7,270,A,7,3.1,A,7,4000,B,7,240,A,7,2.1,E,8,0.000,F,8,0.00,?,0,3,1,D,9,60,C,8 -01/01/1988,15:00,568,1415,131,1,9,1,1,9,131,1,13,150,1,9,1,1,9,150,1,13,523,1,18,10,A,7,10,A,7,11.1,A,7,10.6,A,7,96,A,7,992,A,7,340,A,7,4.1,A,7,4000,B,7,210,A,7,2.0,E,8,0.000,F,8,0.00,?,0,23,1,D,9,45,C,8 -01/01/1988,16:00,395,1415,81,1,9,1,1,9,81,1,13,93,1,9,1,1,9,93,1,13,310,1,18,10,A,7,10,A,7,7.8,A,7,6.7,A,7,93,A,7,993,A,7,50,A,7,4.1,A,7,4000,B,7,210,A,7,1.6,E,8,0.000,F,8,0.00,?,0,15,1,D,9,45,C,8 -01/01/1988,17:00,175,1415,49,1,13,1,1,9,49,1,13,54,1,13,0,1,9,54,1,13,154,1,21,10,A,7,10,A,7,7.2,A,7,5.6,A,7,89,A,7,993,A,7,30,A,7,2.1,A,7,11300,B,7,700,A,7,1.5,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -01/01/1988,18:00,6,342,4,1,13,0,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,7.2,A,7,5.6,A,7,89,A,7,993,A,7,20,A,7,1.5,A,7,16100,B,7,760,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/01/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,4.4,A,7,83,A,7,994,A,7,40,A,7,3.1,A,7,11300,B,7,760,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/01/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,3.3,A,7,80,A,7,995,A,7,360,A,7,2.1,A,7,11300,B,7,850,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -01/01/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,3.3,A,7,89,A,7,995,A,7,20,A,7,1.5,A,7,12900,B,7,1010,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -01/01/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,3.9,A,7,93,A,7,995,A,7,0,A,7,0.0,A,7,12900,B,7,1010,A,7,1.4,E,8,0.000,?,0,0.00,?,0,10,1,D,9,61,C,8 -01/01/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,3.9,A,7,93,A,7,996,A,7,340,A,7,1.5,A,7,12900,B,7,1070,A,7,1.4,E,8,0.000,?,0,0.00,?,0,3,1,D,9,61,C,8 -01/01/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,2.2,A,7,83,A,7,996,A,7,40,A,7,2.1,A,7,12900,B,7,1070,A,7,1.2,E,8,0.000,?,0,0.00,?,0,5,1,D,9,00,C,8 -01/02/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,0.6,A,7,79,A,7,996,A,7,30,A,7,2.1,A,7,11300,B,7,1370,A,7,1.1,E,8,0.000,?,0,0.00,?,0,3,1,D,9,61,C,8 -01/02/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,0.6,A,7,82,A,7,996,A,7,30,A,7,1.5,A,7,11300,B,7,1370,A,7,1.1,E,8,0.000,?,0,0.00,?,0,5,1,D,9,61,C,8 -01/02/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,0.6,A,7,86,A,7,997,A,7,30,A,7,1.5,A,7,11300,B,7,1370,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -01/02/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,0.6,A,7,82,A,7,997,A,7,20,A,7,1.5,A,7,11300,B,7,1220,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,-3.3,A,7,62,A,7,997,A,7,10,A,7,2.1,A,7,16100,B,7,1220,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-4.4,A,7,59,A,7,998,A,7,50,A,7,4.1,A,7,11300,B,7,310,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,-4.4,A,7,62,A,7,999,A,7,20,A,7,3.6,A,7,11300,B,7,1220,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -01/02/1988,08:00,25,649,15,1,13,0,1,9,15,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,1.7,A,7,-5.6,A,7,59,A,7,999,A,7,30,A,7,3.1,A,7,11300,B,7,2740,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -01/02/1988,09:00,227,1415,84,1,13,1,1,9,84,1,13,91,1,13,0,1,9,91,1,13,235,1,21,10,A,7,10,A,7,1.7,A,7,-5.6,A,7,59,A,7,1000,A,7,40,A,7,2.6,A,7,12900,B,7,6100,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,10:00,439,1415,150,1,9,111,1,9,115,1,13,163,1,9,102,1,9,132,1,13,258,1,18,10,A,7,8,A,7,2.2,A,7,-6.7,A,7,52,A,7,1000,A,7,20,A,7,4.6,A,7,16100,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,11:00,599,1415,318,1,13,426,1,9,136,1,13,335,1,13,414,1,9,159,1,13,269,1,21,9,A,7,7,A,7,3.3,A,7,-6.7,A,7,48,A,7,1001,A,7,40,A,7,3.1,A,7,16100,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,12:00,697,1415,283,1,9,129,1,9,219,1,13,308,1,9,132,1,9,242,1,13,543,1,18,10,A,7,8,A,7,3.3,A,7,-6.1,A,7,50,A,7,1000,A,7,60,A,7,5.2,A,7,16100,B,7,6100,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,13:00,725,1415,175,1,9,8,1,9,170,1,13,201,1,9,6,1,9,198,1,13,719,1,18,10,A,7,10,A,7,3.9,A,7,-5.6,A,7,51,A,7,999,A,7,70,A,7,4.1,A,7,24100,B,7,3050,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,14:00,682,1415,271,1,9,123,1,9,211,1,13,294,1,9,125,1,9,234,1,13,520,1,18,10,A,7,9,A,7,4.4,A,7,-3.3,A,7,57,A,7,999,A,7,120,A,7,4.1,A,7,24100,B,7,3050,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,15:00,570,1415,274,1,13,294,1,9,155,1,13,293,1,13,291,1,9,174,1,13,325,1,21,9,A,7,6,A,7,4.4,A,7,-3.3,A,7,57,A,7,998,A,7,90,A,7,3.1,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,16:00,398,1415,175,1,13,225,1,9,111,1,13,184,1,13,198,1,9,128,1,13,221,1,21,10,A,7,4,A,7,5.0,A,7,-2.8,A,7,58,A,7,999,A,7,80,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,17:00,179,1415,60,1,13,55,1,9,53,1,13,65,1,13,34,1,9,60,1,13,111,1,21,10,A,7,8,A,7,3.3,A,7,-2.2,A,7,67,A,7,999,A,7,110,A,7,2.6,A,7,16100,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,18:00,7,366,8,1,13,2,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,9,A,7,2.2,A,7,-2.2,A,7,73,A,7,999,A,7,90,A,7,2.6,A,7,16100,B,7,3660,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,-1.7,A,7,79,A,7,1000,A,7,140,A,7,1.5,A,7,16100,B,7,3660,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.1,A,7,-1.7,A,7,82,A,7,1000,A,7,110,A,7,2.1,A,7,11300,B,7,3660,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.1,A,7,-1.1,A,7,85,A,7,1000,A,7,120,A,7,3.1,A,7,12900,B,7,3660,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,0.6,A,7,-1.7,A,7,85,A,7,1000,A,7,110,A,7,2.6,A,7,12900,B,7,7620,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,0.0,A,7,-2.2,A,7,85,A,7,1000,A,7,120,A,7,2.6,A,7,12900,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/02/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.0,A,7,-3.9,A,7,75,A,7,999,A,7,80,A,7,2.1,A,7,16100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,0.0,A,7,-5.6,A,7,67,A,7,999,A,7,70,A,7,2.6,A,7,16100,B,7,7620,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,0.0,A,7,-5.6,A,7,67,A,7,999,A,7,60,A,7,2.6,A,7,16100,B,7,7620,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-7.2,A,7,61,A,7,999,A,7,50,A,7,3.1,A,7,16100,B,7,2440,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-6.1,A,7,67,A,7,998,A,7,60,A,7,3.1,A,7,16100,B,7,2440,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-6.7,A,7,64,A,7,998,A,7,50,A,7,4.1,A,7,16100,B,7,2440,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-7.8,A,7,59,A,7,999,A,7,50,A,7,3.6,A,7,16100,B,7,1220,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.1,A,7,-5.6,A,7,72,A,7,999,A,7,40,A,7,4.1,A,7,11300,B,7,910,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,08:00,24,649,5,1,13,7,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,-1.7,A,7,-5.6,A,7,75,A,7,998,A,7,40,A,7,4.1,A,7,11300,B,7,910,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,66,C,8 -01/03/1988,09:00,227,1415,39,1,13,6,1,9,38,1,13,45,1,13,1,1,9,45,1,13,141,1,21,10,A,7,10,A,7,-1.7,A,7,-5.6,A,7,75,A,7,999,A,7,50,A,7,4.6,A,7,11300,B,7,850,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -01/03/1988,10:00,439,1415,81,1,9,9,1,9,78,1,13,94,1,9,5,1,9,92,1,13,314,1,18,10,A,7,10,A,7,-1.7,A,7,-5.0,A,7,78,A,7,999,A,7,40,A,7,3.6,A,7,11300,B,7,850,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -01/03/1988,11:00,600,1415,115,1,9,6,1,9,112,1,13,134,1,9,4,1,9,132,1,13,476,1,18,10,A,7,10,A,7,-1.7,A,7,-4.4,A,7,82,A,7,998,A,7,50,A,7,5.2,A,7,8000,B,7,850,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -01/03/1988,12:00,698,1415,130,1,9,9,1,9,126,1,13,154,1,9,6,1,9,150,1,13,559,1,18,10,A,7,10,A,7,-1.7,A,7,-3.9,A,7,85,A,7,997,A,7,50,A,7,3.1,A,7,6400,B,7,760,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,13:00,727,1415,126,1,9,5,1,9,124,1,13,150,1,9,4,1,9,148,1,13,562,1,18,10,A,7,10,A,7,-1.7,A,7,-3.9,A,7,85,A,7,995,A,7,30,A,7,3.6,A,7,6400,B,7,520,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,14:00,684,1415,132,1,9,7,1,9,129,1,13,155,1,9,5,1,9,153,1,13,565,1,18,10,A,7,10,A,7,-1.7,A,7,-2.8,A,7,92,A,7,994,A,7,50,A,7,4.6,A,7,6400,B,7,240,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,15:00,573,1415,133,1,9,4,1,9,131,1,13,152,1,9,3,1,9,151,1,13,526,1,18,10,A,7,10,A,7,-1.1,A,7,-2.8,A,7,89,A,7,994,A,7,60,A,7,3.6,A,7,6400,B,7,240,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,16:00,402,1415,77,1,9,1,1,9,77,1,13,89,1,9,0,1,9,89,1,13,300,1,18,10,A,7,10,A,7,-1.7,A,7,-2.2,A,7,96,A,7,993,A,7,50,A,7,4.1,A,7,6400,B,7,180,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,17:00,182,1415,32,1,13,1,1,9,32,1,13,37,1,13,0,1,9,37,1,13,115,1,21,10,A,7,10,A,7,-1.7,A,7,-2.8,A,7,92,A,7,991,A,7,50,A,7,4.6,A,7,8000,B,7,430,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,18:00,8,366,3,1,13,0,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,-2.2,A,7,-3.3,A,7,92,A,7,991,A,7,40,A,7,4.1,A,7,6400,B,7,180,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.2,A,7,-3.3,A,7,92,A,7,991,A,7,40,A,7,3.6,A,7,8000,B,7,210,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.2,A,7,-3.3,A,7,92,A,7,990,A,7,50,A,7,4.1,A,7,8000,B,7,210,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.2,A,7,-3.3,A,7,92,A,7,990,A,7,10,A,7,3.1,A,7,11300,B,7,180,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/03/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.2,A,7,-3.9,A,7,89,A,7,989,A,7,20,A,7,3.1,A,7,11300,B,7,240,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.2,A,7,-2.8,A,7,96,A,7,989,A,7,30,A,7,1.5,A,7,6400,B,7,120,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/03/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.2,A,7,-3.3,A,7,92,A,7,988,A,7,360,A,7,2.6,A,7,6400,B,7,120,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.7,A,7,-2.8,A,7,92,A,7,988,A,7,360,A,7,3.1,A,7,6400,B,7,120,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.1,A,7,-2.2,A,7,92,A,7,989,A,7,340,A,7,3.1,A,7,6400,B,7,120,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-1.7,A,7,92,A,7,988,A,7,70,A,7,1.5,A,7,6400,B,7,120,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-1.1,A,7,96,A,7,987,A,7,0,A,7,0.0,A,7,6400,B,7,90,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-1.1,A,7,96,A,7,987,A,7,0,A,7,0.0,A,7,6400,B,7,90,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.0,A,7,-0.6,A,7,96,A,7,987,A,7,320,A,7,2.1,A,7,6400,B,7,90,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.0,A,7,-0.6,A,7,96,A,7,987,A,7,300,A,7,2.1,A,7,6400,B,7,60,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,08:00,24,649,12,1,13,0,1,9,12,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,0.0,A,7,-0.6,A,7,96,A,7,988,A,7,270,A,7,2.1,A,7,4000,B,7,760,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,24,C,8 -01/04/1988,09:00,227,1415,81,1,13,1,1,9,81,1,13,88,1,13,0,1,9,88,1,13,231,1,21,10,A,7,10,A,7,0.6,A,7,-0.6,A,7,92,A,7,988,A,7,280,A,7,2.1,A,7,4000,B,7,850,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,10:00,439,1415,224,1,13,302,1,9,129,1,13,235,1,13,276,1,9,149,1,13,263,1,21,5,A,7,5,A,7,1.1,A,7,0.0,A,7,92,A,7,989,A,7,250,A,7,3.6,A,7,4000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,11:00,601,1415,290,1,13,358,1,9,137,1,13,306,1,13,348,1,9,157,1,13,272,1,21,7,A,7,7,A,7,1.7,A,7,0.0,A,7,89,A,7,989,A,7,300,A,7,3.6,A,7,4800,B,7,90,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,12:00,700,1415,249,1,9,101,1,9,199,1,13,274,1,9,100,1,9,224,1,13,601,1,18,10,A,7,10,A,7,1.7,A,7,0.0,A,7,89,A,7,989,A,7,270,A,7,3.1,A,7,800,B,7,60,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,13:00,729,1415,333,1,9,191,1,9,234,1,13,362,1,9,196,1,9,260,1,13,590,1,18,9,A,7,9,A,7,2.2,A,7,0.0,A,7,85,A,7,988,A,7,280,A,7,3.1,A,7,800,B,7,90,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/04/1988,14:00,687,1415,450,1,9,810,1,9,55,1,13,474,1,9,788,1,9,90,1,13,139,1,18,4,A,7,1,A,7,4.4,A,7,-1.1,A,7,68,A,7,988,A,7,270,A,7,3.6,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,40,C,8 -01/04/1988,15:00,577,1415,367,1,9,614,1,9,117,1,13,378,1,9,579,1,9,142,1,13,224,1,18,10,A,7,2,A,7,5.0,A,7,0.0,A,7,70,A,7,987,A,7,240,A,7,4.1,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/04/1988,16:00,405,1415,151,1,13,220,1,9,88,1,13,163,1,13,196,1,9,107,1,13,167,1,21,10,A,7,5,A,7,3.9,A,7,-1.7,A,7,67,A,7,987,A,7,230,A,7,3.1,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/04/1988,17:00,185,1415,61,1,13,74,1,9,52,1,13,67,1,13,47,1,9,61,1,13,109,1,21,10,A,7,8,A,7,3.9,A,7,-2.2,A,7,65,A,7,987,A,7,240,A,7,4.1,A,7,11300,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/04/1988,18:00,9,389,2,1,13,1,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,8,A,7,3.9,A,7,-2.8,A,7,62,A,7,988,A,7,270,A,7,4.6,A,7,16100,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/04/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,2.2,A,7,-2.8,A,7,70,A,7,989,A,7,250,A,7,3.1,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/04/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,2.2,A,7,-4.4,A,7,62,A,7,989,A,7,290,A,7,4.1,A,7,24100,B,7,4880,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/04/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,1.7,A,7,-5.0,A,7,62,A,7,990,A,7,270,A,7,3.1,A,7,24100,B,7,7620,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/04/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.1,A,7,-8.3,A,7,50,A,7,991,A,7,290,A,7,4.6,A,7,24100,B,7,3660,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/04/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,1.1,A,7,-8.9,A,7,48,A,7,991,A,7,310,A,7,7.7,A,7,24100,B,7,3660,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/04/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,0.6,A,7,-9.4,A,7,48,A,7,992,A,7,290,A,7,5.7,A,7,24100,B,7,3660,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,-0.6,A,7,-11.7,A,7,43,A,7,992,A,7,310,A,7,5.7,A,7,24100,B,7,3660,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,-1.7,A,7,-13.3,A,7,41,A,7,993,A,7,320,A,7,3.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,-1.7,A,7,-15.0,A,7,36,A,7,993,A,7,310,A,7,5.2,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,-2.2,A,7,-15.0,A,7,37,A,7,993,A,7,330,A,7,6.2,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,-2.8,A,7,-14.4,A,7,41,A,7,994,A,7,320,A,7,3.1,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.8,A,7,-14.4,A,7,41,A,7,994,A,7,340,A,7,2.1,A,7,24100,B,7,3660,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,-3.3,A,7,-15.6,A,7,39,A,7,995,A,7,310,A,7,4.6,A,7,24100,B,7,6100,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,08:00,24,649,13,1,13,15,1,9,12,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,5,A,7,-3.3,A,7,-15.6,A,7,39,A,7,996,A,7,310,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,09:00,227,1415,88,1,13,164,1,9,62,1,13,93,1,13,109,1,9,75,1,13,118,1,21,10,A,7,5,A,7,-3.3,A,7,-16.7,A,7,35,A,7,997,A,7,330,A,7,5.2,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,10:00,440,1415,223,1,13,369,1,9,107,1,13,232,1,13,330,1,9,129,1,13,202,1,21,10,A,7,5,A,7,-3.3,A,7,-19.4,A,7,28,A,7,998,A,7,330,A,7,4.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,11:00,602,1415,303,1,13,335,1,9,159,1,13,324,1,13,337,1,9,180,1,13,335,1,21,10,A,7,4,A,7,-2.2,A,7,-20.0,A,7,24,A,7,998,A,7,310,A,7,6.2,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,12:00,702,1415,329,1,13,275,1,9,192,1,13,353,1,13,285,1,9,212,1,13,428,1,21,10,A,7,7,A,7,-2.2,A,7,-20.0,A,7,24,A,7,998,A,7,360,A,7,2.6,A,7,24100,B,7,3660,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,13:00,732,1415,239,1,9,65,1,9,206,1,13,264,1,9,65,1,9,230,1,13,634,1,18,10,A,7,9,A,7,-2.2,A,7,-20.0,A,7,24,A,7,997,A,7,330,A,7,3.6,A,7,24100,B,7,3660,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,14:00,690,1415,294,1,9,227,1,9,183,1,13,317,1,9,235,1,9,202,1,13,403,1,18,10,A,7,9,A,7,-1.1,A,7,-19.4,A,7,24,A,7,997,A,7,300,A,7,5.2,A,7,24100,B,7,3050,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,15:00,580,1415,161,1,9,6,1,9,159,1,13,182,1,9,5,1,9,181,1,13,605,1,18,10,A,7,10,A,7,-1.7,A,7,-19.4,A,7,25,A,7,996,A,7,310,A,7,3.1,A,7,24100,B,7,3050,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,16:00,408,1415,107,1,9,10,1,9,104,1,13,120,1,9,6,1,9,118,1,13,376,1,18,10,A,7,10,A,7,-1.7,A,7,-19.4,A,7,25,A,7,996,A,7,320,A,7,3.1,A,7,24100,B,7,2130,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,17:00,189,1415,71,1,13,233,1,9,41,1,13,76,1,13,142,1,9,57,1,13,73,1,21,5,A,7,5,A,7,-1.7,A,7,-18.9,A,7,26,A,7,997,A,7,290,A,7,3.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,18:00,10,413,8,1,13,15,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,3,A,7,3,A,7,-2.8,A,7,-18.3,A,7,29,A,7,996,A,7,10,A,7,2.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-16.1,A,7,39,A,7,997,A,7,350,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-4.4,A,7,-15.0,A,7,44,A,7,997,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.0,A,7,-16.1,A,7,42,A,7,997,A,7,360,A,7,1.5,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.0,A,7,-16.7,A,7,40,A,7,997,A,7,340,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-16.7,A,7,43,A,7,998,A,7,360,A,7,2.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/05/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.7,A,7,-15.0,A,7,52,A,7,997,A,7,10,A,7,3.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-17.2,A,7,42,A,7,997,A,7,340,A,7,4.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,-5.6,A,7,-17.2,A,7,40,A,7,998,A,7,350,A,7,4.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,-7.2,A,7,-17.2,A,7,45,A,7,998,A,7,40,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,-8.3,A,7,-17.8,A,7,47,A,7,998,A,7,30,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,-8.3,A,7,-17.2,A,7,49,A,7,998,A,7,30,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,-8.3,A,7,-17.2,A,7,49,A,7,999,A,7,30,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,-8.9,A,7,-17.8,A,7,49,A,7,1000,A,7,50,A,7,3.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,08:00,24,648,13,1,13,19,1,9,11,1,13,0,1,13,0,1,9,0,1,13,0,1,21,7,A,7,3,A,7,-8.9,A,7,-18.3,A,7,47,A,7,1001,A,7,20,A,7,3.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,09:00,227,1415,89,1,13,216,1,9,54,1,13,92,1,13,146,1,9,69,1,13,98,1,21,8,A,7,4,A,7,-8.9,A,7,-18.3,A,7,47,A,7,1001,A,7,40,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,10:00,441,1415,260,1,9,598,1,9,72,1,13,269,1,9,535,1,9,102,1,13,137,1,18,6,A,7,2,A,7,-7.2,A,7,-18.3,A,7,41,A,7,1002,A,7,30,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,11:00,603,1415,378,1,13,609,1,9,117,1,13,390,1,13,581,1,9,141,1,13,228,1,21,8,A,7,3,A,7,-6.1,A,7,-18.3,A,7,38,A,7,1002,A,7,40,A,7,5.2,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,12:00,703,1415,487,1,9,848,1,9,64,1,13,511,1,9,826,1,9,99,1,13,150,1,18,3,A,7,1,A,7,-5.0,A,7,-18.3,A,7,35,A,7,1001,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,13:00,734,1415,474,1,9,797,1,9,60,1,13,499,1,9,780,1,9,93,1,13,150,1,18,3,A,7,1,A,7,-3.9,A,7,-19.4,A,7,29,A,7,1000,A,7,20,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,14:00,693,1415,441,1,9,763,1,9,67,1,13,475,1,9,753,1,9,104,1,13,155,1,18,3,A,7,1,A,7,-3.3,A,7,-19.4,A,7,28,A,7,999,A,7,320,A,7,1.5,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,15:00,583,1415,385,1,9,801,1,9,55,1,13,406,1,9,762,1,9,91,1,13,127,1,18,4,A,7,1,A,7,-3.3,A,7,-19.4,A,7,28,A,7,999,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,16:00,412,1415,146,1,13,177,1,9,94,1,13,156,1,13,158,1,9,110,1,13,181,1,21,9,A,7,6,A,7,-3.9,A,7,-19.4,A,7,29,A,7,999,A,7,60,A,7,2.1,A,7,24100,B,7,7620,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,17:00,193,1415,45,1,13,10,1,9,44,1,13,51,1,13,1,1,9,51,1,13,149,1,21,10,A,7,8,A,7,-4.4,A,7,-17.2,A,7,37,A,7,999,A,7,70,A,7,2.6,A,7,24100,B,7,6100,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,18:00,11,436,2,1,13,1,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,-5.6,A,7,-17.2,A,7,40,A,7,999,A,7,70,A,7,2.6,A,7,24100,B,7,6100,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-5.6,A,7,-16.7,A,7,42,A,7,1000,A,7,80,A,7,2.6,A,7,24100,B,7,6100,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,-5.6,A,7,-15.6,A,7,46,A,7,1001,A,7,50,A,7,2.1,A,7,24100,B,7,6100,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,-5.6,A,7,-17.2,A,7,40,A,7,1002,A,7,20,A,7,2.1,A,7,24100,B,7,6100,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-5.6,A,7,-15.6,A,7,46,A,7,1002,A,7,80,A,7,2.1,A,7,24100,B,7,6100,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-5.6,A,7,-16.1,A,7,44,A,7,1002,A,7,60,A,7,3.6,A,7,24100,B,7,3660,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/06/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-6.1,A,7,-17.8,A,7,40,A,7,1001,A,7,60,A,7,4.1,A,7,24100,B,7,3660,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/07/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,-6.7,A,7,-18.3,A,7,39,A,7,1002,A,7,50,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/07/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-18.3,A,7,41,A,7,1002,A,7,60,A,7,5.2,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/07/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-7.2,A,7,-19.4,A,7,37,A,7,1002,A,7,40,A,7,4.1,A,7,24100,B,7,6100,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/07/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-6.7,A,7,-18.9,A,7,38,A,7,1003,A,7,60,A,7,5.2,A,7,24100,B,7,1830,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/07/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-7.2,A,7,-18.9,A,7,39,A,7,1003,A,7,40,A,7,2.6,A,7,24100,B,7,1220,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/07/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-7.2,A,7,-18.3,A,7,41,A,7,1004,A,7,60,A,7,3.6,A,7,24100,B,7,700,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/07/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-8.9,A,7,-11.7,A,7,81,A,7,1004,A,7,50,A,7,4.1,A,7,1600,B,7,120,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/07/1988,08:00,24,648,7,1,13,5,1,9,7,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,-8.9,A,7,-11.7,A,7,81,A,7,1003,A,7,60,A,7,5.2,A,7,1200,B,7,760,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,71,C,8 -01/07/1988,09:00,228,1415,53,1,13,7,1,9,52,1,13,60,1,13,1,1,9,59,1,13,179,1,21,10,A,7,10,A,7,-9.4,A,7,-11.7,A,7,84,A,7,1004,A,7,70,A,7,4.6,A,7,800,B,7,120,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,71,C,8 -01/07/1988,10:00,442,1415,106,1,9,6,1,9,104,1,13,120,1,9,4,1,9,119,1,13,391,1,18,10,A,7,10,A,7,-10.0,A,7,-12.2,A,7,84,A,7,1004,A,7,70,A,7,6.7,A,7,800,B,7,60,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,73,C,8 -01/07/1988,11:00,605,1415,198,1,9,8,1,9,194,1,13,221,1,9,7,1,9,218,1,13,704,1,18,10,A,7,10,A,7,-9.4,A,7,-11.7,A,7,84,A,7,1004,A,7,60,A,7,4.6,A,7,800,B,7,60,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,12:00,705,1415,230,1,9,8,1,9,226,1,13,259,1,9,7,1,9,255,1,13,857,1,18,10,A,7,10,A,7,-9.4,A,7,-12.2,A,7,81,A,7,1003,A,7,60,A,7,5.2,A,7,800,B,7,60,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,13:00,737,1415,227,1,9,1,1,9,227,1,13,257,1,9,1,1,9,257,1,13,885,1,18,10,A,7,10,A,7,-9.4,A,7,-12.2,A,7,81,A,7,1002,A,7,60,A,7,4.6,A,7,800,B,7,60,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,14:00,696,1415,233,1,9,2,1,9,232,1,13,261,1,9,2,1,9,260,1,13,862,1,18,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,1001,A,7,60,A,7,3.6,A,7,800,B,7,60,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,15:00,587,1415,183,1,9,0,1,9,182,1,13,204,1,9,0,1,9,204,1,13,664,1,18,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,1000,A,7,50,A,7,3.1,A,7,400,B,7,30,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,16:00,416,1415,139,1,9,0,1,9,139,1,13,153,1,9,0,1,9,153,1,13,452,1,18,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,999,A,7,40,A,7,4.1,A,7,400,B,7,30,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,17:00,196,1415,57,1,13,0,1,9,57,1,13,63,1,13,0,1,9,63,1,13,178,1,21,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,998,A,7,30,A,7,4.1,A,7,400,B,7,30,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,18:00,12,460,9,1,13,0,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,998,A,7,10,A,7,4.1,A,7,400,B,7,30,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,997,A,7,40,A,7,4.6,A,7,400,B,7,30,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,996,A,7,30,A,7,5.7,A,7,400,B,7,30,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,995,A,7,30,A,7,6.2,A,7,800,B,7,30,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-9.4,A,7,-11.7,A,7,84,A,7,995,A,7,40,A,7,6.7,A,7,800,B,7,30,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-9.4,A,7,-11.7,A,7,84,A,7,993,A,7,20,A,7,5.7,A,7,800,B,7,30,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/07/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,992,A,7,30,A,7,6.7,A,7,3200,B,7,90,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,991,A,7,10,A,7,4.1,A,7,4800,B,7,240,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-9.4,A,7,-11.1,A,7,88,A,7,991,A,7,30,A,7,5.7,A,7,4800,B,7,240,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-8.9,A,7,-11.7,A,7,81,A,7,990,A,7,40,A,7,5.7,A,7,3200,B,7,210,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-8.9,A,7,-10.6,A,7,88,A,7,990,A,7,40,A,7,5.2,A,7,11300,B,7,210,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-8.3,A,7,-10.0,A,7,88,A,7,989,A,7,20,A,7,4.6,A,7,9700,B,7,180,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,71,C,8 -01/08/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-8.3,A,7,-9.4,A,7,92,A,7,989,A,7,10,A,7,4.1,A,7,3200,B,7,150,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-8.3,A,7,-9.4,A,7,92,A,7,988,A,7,30,A,7,4.1,A,7,3200,B,7,150,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,08:00,24,648,15,1,13,0,1,9,15,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,-7.8,A,7,-8.9,A,7,92,A,7,988,A,7,20,A,7,4.1,A,7,3200,B,7,150,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,09:00,228,1415,97,1,13,1,1,9,96,1,13,102,1,13,0,1,9,102,1,13,246,1,21,10,A,7,10,A,7,-6.7,A,7,-7.8,A,7,92,A,7,988,A,7,20,A,7,3.6,A,7,3200,B,7,150,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,10:00,443,1415,191,1,9,1,1,9,190,1,13,205,1,9,1,1,9,205,1,13,543,1,18,10,A,7,10,A,7,-5.6,A,7,-7.2,A,7,88,A,7,988,A,7,350,A,7,3.6,A,7,4800,B,7,150,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,11:00,606,1415,268,1,9,1,1,9,267,1,13,291,1,9,1,1,9,291,1,13,820,1,18,10,A,7,10,A,7,-5.0,A,7,-6.1,A,7,92,A,7,988,A,7,360,A,7,2.6,A,7,4800,B,7,180,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,12:00,708,1415,318,1,9,0,1,9,318,1,13,348,1,9,0,1,9,348,1,13,1015,1,18,10,A,7,10,A,7,-3.9,A,7,-5.6,A,7,88,A,7,987,A,7,10,A,7,2.6,A,7,4800,B,7,210,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,13:00,739,1415,347,1,9,1,1,9,347,1,13,380,1,9,1,1,9,379,1,13,1091,1,18,10,A,7,10,A,7,-2.8,A,7,-4.4,A,7,89,A,7,986,A,7,350,A,7,3.6,A,7,4800,B,7,210,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,14:00,699,1415,308,1,9,1,1,9,308,1,13,338,1,9,1,1,9,338,1,13,992,1,18,10,A,7,10,A,7,-1.7,A,7,-3.9,A,7,85,A,7,985,A,7,350,A,7,2.1,A,7,11300,B,7,240,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/08/1988,15:00,590,1415,274,1,9,0,1,9,274,1,13,297,1,9,0,1,9,297,1,13,804,1,18,10,A,7,10,A,7,-1.1,A,7,-3.3,A,7,85,A,7,984,A,7,330,A,7,1.5,A,7,11300,B,7,270,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/08/1988,16:00,420,1415,190,1,9,0,1,9,190,1,13,204,1,9,0,1,9,204,1,13,515,1,18,10,A,7,10,A,7,-1.1,A,7,-2.8,A,7,89,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,310,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/08/1988,17:00,200,1415,77,1,13,0,1,9,77,1,13,83,1,13,0,1,9,83,1,13,208,1,21,10,A,7,10,A,7,-0.6,A,7,-2.8,A,7,85,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,1160,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/08/1988,18:00,13,483,12,1,13,0,1,9,12,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,-1.1,A,7,-2.8,A,7,89,A,7,987,A,7,230,A,7,2.6,A,7,11300,B,7,1160,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/08/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.1,A,7,-2.8,A,7,89,A,7,987,A,7,230,A,7,2.6,A,7,11300,B,7,1160,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/08/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.1,A,7,-2.8,A,7,89,A,7,987,A,7,240,A,7,3.1,A,7,11300,B,7,1160,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/08/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,-2.8,A,7,-3.9,A,7,92,A,7,987,A,7,230,A,7,3.1,A,7,11300,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/08/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,-3.9,A,7,-4.4,A,7,96,A,7,987,A,7,250,A,7,3.6,A,7,11300,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/08/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,-5.0,A,7,-5.6,A,7,96,A,7,988,A,7,270,A,7,2.6,A,7,11300,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/08/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,-5.0,A,7,-5.6,A,7,96,A,7,988,A,7,280,A,7,2.1,A,7,8000,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,-6.1,A,7,-6.7,A,7,96,A,7,988,A,7,300,A,7,3.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/09/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,-5.6,A,7,-6.7,A,7,92,A,7,988,A,7,290,A,7,3.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,-3.3,A,7,-6.1,A,7,81,A,7,989,A,7,290,A,7,3.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,-3.3,A,7,-6.1,A,7,81,A,7,989,A,7,300,A,7,3.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,-3.3,A,7,-6.1,A,7,81,A,7,989,A,7,330,A,7,2.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,-5.6,A,7,-7.2,A,7,88,A,7,990,A,7,360,A,7,2.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,-5.0,A,7,-7.2,A,7,85,A,7,991,A,7,10,A,7,2.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,08:00,24,648,8,1,13,6,1,9,7,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,7,A,7,-4.4,A,7,-6.7,A,7,85,A,7,991,A,7,350,A,7,2.6,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,09:00,229,1415,66,1,13,21,1,9,62,1,13,72,1,13,16,1,9,69,1,13,150,1,21,10,A,7,9,A,7,-4.4,A,7,-6.7,A,7,85,A,7,991,A,7,50,A,7,2.1,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,10:00,444,1415,193,1,9,91,1,9,164,1,13,211,1,9,85,1,9,184,1,13,403,1,18,10,A,7,9,A,7,-3.3,A,7,-7.2,A,7,75,A,7,991,A,7,40,A,7,2.6,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,11:00,608,1415,272,1,13,155,1,9,205,1,13,294,1,13,154,1,9,227,1,13,489,1,21,10,A,7,7,A,7,-2.2,A,7,-6.7,A,7,72,A,7,992,A,7,30,A,7,2.6,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,12:00,710,1415,358,1,9,57,1,9,329,1,13,391,1,9,58,1,9,362,1,13,870,1,18,10,A,7,9,A,7,-1.1,A,7,-6.7,A,7,66,A,7,992,A,7,10,A,7,2.6,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,13:00,742,1415,290,1,9,38,1,9,270,1,13,318,1,9,38,1,9,298,1,13,788,1,18,10,A,7,9,A,7,-0.6,A,7,-6.7,A,7,64,A,7,991,A,7,60,A,7,2.6,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,14:00,702,1415,307,1,9,1,1,9,307,1,13,337,1,9,1,1,9,337,1,13,995,1,18,10,A,7,10,A,7,-1.1,A,7,-7.2,A,7,64,A,7,991,A,7,70,A,7,2.1,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,15:00,594,1415,237,1,9,8,1,9,234,1,13,261,1,9,7,1,9,257,1,13,765,1,18,10,A,7,10,A,7,-0.6,A,7,-7.2,A,7,61,A,7,991,A,7,30,A,7,1.5,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,16:00,424,1415,213,1,13,179,1,9,160,1,13,228,1,13,162,1,9,180,1,13,358,1,21,10,A,7,7,A,7,-0.6,A,7,-7.2,A,7,61,A,7,991,A,7,70,A,7,1.5,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,17:00,204,1415,74,1,13,37,1,9,69,1,13,81,1,13,28,1,9,77,1,13,155,1,21,10,A,7,9,A,7,-1.1,A,7,-7.2,A,7,64,A,7,991,A,7,0,A,7,0.0,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,18:00,14,507,5,1,13,1,1,9,5,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,9,A,7,-1.7,A,7,-6.7,A,7,69,A,7,991,A,7,10,A,7,2.1,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-3.9,A,7,-7.2,A,7,78,A,7,992,A,7,40,A,7,1.5,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,-3.9,A,7,-6.7,A,7,81,A,7,992,A,7,60,A,7,2.1,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-6.1,A,7,-7.8,A,7,88,A,7,992,A,7,60,A,7,1.5,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,-6.1,A,7,-7.8,A,7,88,A,7,992,A,7,320,A,7,2.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,-8.3,A,7,-9.4,A,7,92,A,7,992,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/09/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,-9.4,A,7,-11.1,A,7,88,A,7,992,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,-9.4,A,7,-11.1,A,7,88,A,7,992,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,-10.6,A,7,-11.7,A,7,92,A,7,992,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,-9.4,A,7,-10.6,A,7,92,A,7,993,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,-8.9,A,7,-10.0,A,7,92,A,7,993,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/10/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,-10.0,A,7,-11.7,A,7,88,A,7,993,A,7,30,A,7,3.1,A,7,9700,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/10/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,-8.9,A,7,-10.6,A,7,88,A,7,994,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/10/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,-8.9,A,7,-10.6,A,7,88,A,7,995,A,7,10,A,7,2.1,A,7,9700,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/10/1988,08:00,25,648,22,1,13,130,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,-8.9,A,7,-10.0,A,7,92,A,7,996,A,7,40,A,7,3.1,A,7,9700,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -01/10/1988,09:00,230,1415,90,1,13,22,1,9,86,1,13,98,1,13,17,1,9,95,1,13,189,1,21,10,A,7,10,A,7,-7.8,A,7,-9.4,A,7,88,A,7,997,A,7,30,A,7,3.6,A,7,6400,B,7,310,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/10/1988,10:00,445,1415,166,1,9,47,1,9,151,1,13,181,1,9,44,1,9,168,1,13,382,1,18,10,A,7,10,A,7,-6.7,A,7,-8.3,A,7,88,A,7,998,A,7,40,A,7,2.6,A,7,6400,B,7,310,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/10/1988,11:00,610,1415,215,1,9,10,1,9,211,1,13,239,1,9,9,1,9,235,1,13,743,1,18,10,A,7,10,A,7,-5.0,A,7,-7.2,A,7,85,A,7,998,A,7,40,A,7,3.1,A,7,6400,B,7,370,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/10/1988,12:00,712,1415,241,1,9,5,1,9,238,1,13,270,1,9,4,1,9,268,1,13,890,1,18,10,A,7,10,A,7,-4.4,A,7,-7.8,A,7,78,A,7,997,A,7,70,A,7,5.2,A,7,6400,B,7,430,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/10/1988,13:00,745,1415,320,1,9,3,1,9,318,1,13,352,1,9,3,1,9,351,1,13,1067,1,18,10,A,7,10,A,7,-3.3,A,7,-7.8,A,7,72,A,7,997,A,7,60,A,7,3.6,A,7,11300,B,7,490,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/10/1988,14:00,706,1415,518,1,9,890,1,9,73,1,13,542,1,9,866,1,9,108,1,13,156,1,18,2,A,7,1,A,7,-2.8,A,7,-7.8,A,7,69,A,7,996,A,7,60,A,7,4.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,15:00,598,1415,405,1,9,828,1,9,55,1,13,427,1,9,791,1,9,92,1,13,129,1,18,0,A,7,0,A,7,-2.2,A,7,-7.8,A,7,66,A,7,996,A,7,50,A,7,3.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,16:00,428,1415,288,1,9,814,1,9,43,1,13,306,1,9,734,1,9,83,1,13,99,1,18,0,A,7,0,A,7,-2.2,A,7,-8.3,A,7,63,A,7,997,A,7,40,A,7,3.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,17:00,208,1415,113,1,13,597,1,9,27,1,13,122,1,13,445,1,9,56,1,13,56,1,21,0,A,7,0,A,7,-2.2,A,7,-8.3,A,7,63,A,7,997,A,7,40,A,7,2.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,18:00,16,507,18,1,13,98,1,9,7,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,-3.9,A,7,-8.3,A,7,72,A,7,997,A,7,10,A,7,2.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-4.4,A,7,-8.9,A,7,72,A,7,998,A,7,360,A,7,2.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-9.4,A,7,78,A,7,998,A,7,20,A,7,2.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-9.4,A,7,84,A,7,998,A,7,50,A,7,2.1,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-9.4,A,7,84,A,7,998,A,7,360,A,7,2.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.8,A,7,-9.4,A,7,88,A,7,998,A,7,20,A,7,2.1,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/10/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.3,A,7,-10.0,A,7,88,A,7,998,A,7,20,A,7,2.6,A,7,19300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,-7.8,A,7,-10.0,A,7,84,A,7,998,A,7,10,A,7,3.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,-8.9,A,7,-11.1,A,7,84,A,7,998,A,7,360,A,7,2.1,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-10.0,A,7,-12.2,A,7,84,A,7,997,A,7,20,A,7,2.1,A,7,11300,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-11.1,A,7,-12.8,A,7,88,A,7,997,A,7,40,A,7,2.1,A,7,8000,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-11.7,A,7,-13.3,A,7,88,A,7,997,A,7,60,A,7,1.5,A,7,8000,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/11/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-11.7,A,7,-13.3,A,7,88,A,7,997,A,7,30,A,7,2.1,A,7,8000,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/11/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-11.1,A,7,-12.8,A,7,88,A,7,998,A,7,50,A,7,2.1,A,7,8000,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/11/1988,08:00,25,648,23,1,13,124,1,9,10,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,-11.7,A,7,-12.8,A,7,92,A,7,997,A,7,40,A,7,2.6,A,7,8000,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -01/11/1988,09:00,231,1414,134,1,13,616,1,9,32,1,13,136,1,13,457,1,9,61,1,13,62,1,21,0,A,7,0,A,7,-9.4,A,7,-11.7,A,7,84,A,7,997,A,7,70,A,7,3.1,A,7,8000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/11/1988,10:00,447,1414,309,1,9,816,1,9,49,1,13,324,1,9,741,1,9,88,1,13,105,1,18,0,A,7,0,A,7,-6.7,A,7,-10.6,A,7,74,A,7,997,A,7,60,A,7,4.1,A,7,8000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/11/1988,11:00,612,1414,456,1,9,904,1,9,63,1,13,478,1,9,866,1,9,102,1,13,136,1,18,0,A,7,0,A,7,-3.9,A,7,-10.0,A,7,63,A,7,998,A,7,40,A,7,2.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/11/1988,12:00,715,1414,548,1,9,940,1,9,71,1,13,573,1,9,916,1,9,108,1,13,156,1,18,0,A,7,0,A,7,-1.7,A,7,-9.4,A,7,56,A,7,997,A,7,70,A,7,3.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,13:00,748,1414,579,1,9,953,1,9,74,1,13,606,1,9,933,1,9,111,1,13,164,1,18,0,A,7,0,A,7,0.6,A,7,-9.4,A,7,48,A,7,996,A,7,40,A,7,3.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,14:00,709,1414,540,1,9,935,1,9,70,1,13,566,1,9,911,1,9,107,1,13,155,1,18,0,A,7,0,A,7,1.7,A,7,-8.9,A,7,46,A,7,996,A,7,330,A,7,3.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,15:00,601,1414,441,1,9,893,1,9,61,1,13,464,1,9,853,1,9,100,1,13,134,1,18,0,A,7,0,A,7,2.8,A,7,-8.3,A,7,44,A,7,995,A,7,40,A,7,2.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,16:00,432,1414,293,1,9,806,1,9,47,1,13,309,1,9,727,1,9,86,1,13,102,1,18,0,A,7,0,A,7,2.8,A,7,-8.9,A,7,42,A,7,995,A,7,10,A,7,2.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,17:00,213,1414,116,1,13,583,1,9,30,1,13,120,1,13,420,1,9,57,1,13,58,1,21,0,A,7,0,A,7,2.2,A,7,-8.9,A,7,44,A,7,995,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,18:00,17,530,18,1,13,89,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,-0.6,A,7,-8.3,A,7,56,A,7,995,A,7,360,A,7,1.5,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.2,A,7,-7.8,A,7,66,A,7,996,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-7.8,A,7,75,A,7,996,A,7,280,A,7,1.5,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-7.8,A,7,75,A,7,996,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-9.4,A,7,74,A,7,996,A,7,270,A,7,1.5,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-10.0,A,7,81,A,7,996,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/11/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-8.9,A,7,78,A,7,995,A,7,310,A,7,2.1,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.3,A,7,-10.0,A,7,88,A,7,995,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-9.4,A,7,-11.1,A,7,88,A,7,994,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-10.0,A,7,92,A,7,994,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-10.0,A,7,-11.7,A,7,88,A,7,995,A,7,240,A,7,2.1,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-12.2,A,7,-13.9,A,7,88,A,7,995,A,7,220,A,7,2.1,A,7,11300,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-11.1,A,7,-12.8,A,7,88,A,7,994,A,7,250,A,7,2.1,A,7,9700,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,-11.7,A,7,-13.3,A,7,88,A,7,994,A,7,240,A,7,1.5,A,7,9700,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/12/1988,08:00,25,648,20,1,13,24,1,9,17,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,3,A,7,-12.8,A,7,-14.4,A,7,88,A,7,995,A,7,220,A,7,2.6,A,7,6400,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/12/1988,09:00,232,1414,123,1,13,295,1,9,74,1,13,123,1,13,199,1,9,90,1,13,140,1,21,9,A,7,2,A,7,-9.4,A,7,-11.1,A,7,88,A,7,995,A,7,240,A,7,2.1,A,7,3200,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/12/1988,10:00,448,1414,271,1,13,439,1,9,131,1,13,277,1,13,394,1,9,151,1,13,254,1,21,8,A,7,3,A,7,-5.6,A,7,-8.3,A,7,81,A,7,996,A,7,210,A,7,3.1,A,7,3200,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/12/1988,11:00,614,1414,424,1,13,597,1,9,163,1,13,441,1,13,582,1,9,187,1,13,331,1,21,10,A,7,3,A,7,-1.1,A,7,-6.7,A,7,66,A,7,996,A,7,220,A,7,2.6,A,7,3200,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/12/1988,12:00,718,1414,478,1,13,522,1,9,213,1,13,495,1,13,522,1,9,229,1,13,465,1,21,10,A,7,4,A,7,2.8,A,7,-7.2,A,7,48,A,7,996,A,7,230,A,7,3.1,A,7,6400,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/12/1988,13:00,751,1414,518,1,13,490,1,9,257,1,13,549,1,13,512,1,9,276,1,13,618,1,21,10,A,7,5,A,7,4.4,A,7,-8.3,A,7,39,A,7,994,A,7,240,A,7,5.2,A,7,8000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/12/1988,14:00,713,1414,429,1,13,283,1,9,286,1,13,460,1,13,288,1,9,314,1,13,716,1,21,10,A,7,7,A,7,5.6,A,7,-8.3,A,7,36,A,7,993,A,7,220,A,7,4.6,A,7,11300,B,7,7620,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/12/1988,15:00,605,1414,403,1,9,346,1,9,255,1,13,417,1,9,346,1,9,268,1,13,603,1,18,10,A,7,8,A,7,5.6,A,7,-8.3,A,7,36,A,7,993,A,7,220,A,7,5.2,A,7,11300,B,7,7620,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,16:00,436,1414,296,1,13,531,1,9,133,1,13,302,1,13,471,1,9,156,1,13,258,1,21,10,A,7,3,A,7,5.6,A,7,-7.8,A,7,38,A,7,992,A,7,220,A,7,4.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,17:00,217,1414,94,1,13,120,1,9,76,1,13,101,1,13,82,1,9,88,1,13,161,1,21,10,A,7,3,A,7,4.4,A,7,-7.8,A,7,41,A,7,992,A,7,220,A,7,3.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,18:00,19,554,16,1,13,20,1,9,13,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,3,A,7,2.2,A,7,-7.8,A,7,48,A,7,992,A,7,200,A,7,3.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,1.1,A,7,-8.9,A,7,48,A,7,992,A,7,200,A,7,3.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,0.0,A,7,-9.4,A,7,50,A,7,992,A,7,220,A,7,2.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,-0.6,A,7,-9.4,A,7,52,A,7,992,A,7,240,A,7,2.6,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,-0.6,A,7,-8.3,A,7,56,A,7,991,A,7,230,A,7,3.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,-0.6,A,7,-8.3,A,7,56,A,7,990,A,7,210,A,7,4.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/12/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,0.0,A,7,-7.8,A,7,56,A,7,990,A,7,210,A,7,4.1,A,7,11300,B,7,7620,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,1.1,A,7,-6.7,A,7,57,A,7,989,A,7,220,A,7,4.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,1.1,A,7,-7.2,A,7,54,A,7,989,A,7,210,A,7,3.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,1.1,A,7,-6.7,A,7,57,A,7,988,A,7,220,A,7,4.1,A,7,11300,B,7,6100,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,0.6,A,7,-6.7,A,7,59,A,7,988,A,7,220,A,7,4.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,0.0,A,7,-6.7,A,7,61,A,7,988,A,7,250,A,7,3.1,A,7,11300,B,7,2130,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,1.1,A,7,-5.6,A,7,62,A,7,987,A,7,230,A,7,3.1,A,7,11300,B,7,1830,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,-5.6,A,7,59,A,7,988,A,7,250,A,7,3.6,A,7,11300,B,7,1220,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,08:00,26,648,14,1,13,2,1,9,13,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,2.2,A,7,-5.0,A,7,59,A,7,988,A,7,260,A,7,3.1,A,7,11300,B,7,1010,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,09:00,233,1414,50,1,13,2,1,9,49,1,13,56,1,13,0,1,9,56,1,13,173,1,21,10,A,7,10,A,7,1.1,A,7,-2.2,A,7,79,A,7,988,A,7,240,A,7,3.6,A,7,6400,B,7,910,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,10:00,450,1414,95,1,9,8,1,9,92,1,13,108,1,9,5,1,9,107,1,13,360,1,18,10,A,7,10,A,7,1.1,A,7,-0.6,A,7,89,A,7,987,A,7,210,A,7,4.1,A,7,4800,B,7,1370,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -01/13/1988,11:00,617,1414,219,1,9,1,1,9,218,1,13,242,1,9,1,1,9,242,1,13,762,1,18,10,A,7,10,A,7,2.8,A,7,-0.6,A,7,79,A,7,988,A,7,250,A,7,5.2,A,7,8000,B,7,2130,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/13/1988,12:00,721,1414,252,1,9,2,1,9,251,1,13,282,1,9,2,1,9,281,1,13,925,1,18,10,A,7,10,A,7,3.9,A,7,0.0,A,7,76,A,7,987,A,7,260,A,7,3.6,A,7,9700,B,7,2130,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/13/1988,13:00,755,1414,524,1,13,689,1,9,156,1,13,543,1,13,677,1,9,180,1,13,330,1,21,5,A,7,4,A,7,6.1,A,7,0.0,A,7,65,A,7,986,A,7,260,A,7,3.6,A,7,9700,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/13/1988,14:00,717,1414,506,1,9,751,1,9,125,1,13,530,1,9,740,1,9,153,1,13,266,1,18,2,A,7,2,A,7,8.3,A,7,-0.6,A,7,54,A,7,985,A,7,290,A,7,3.6,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/13/1988,15:00,610,1414,339,1,13,529,1,9,112,1,13,353,1,13,507,1,9,134,1,13,222,1,21,4,A,7,4,A,7,8.9,A,7,-5.0,A,7,37,A,7,986,A,7,300,A,7,7.7,A,7,11300,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,16:00,440,1414,280,1,9,772,1,9,41,1,13,298,1,9,700,1,9,79,1,13,99,1,18,0,A,7,0,A,7,6.7,A,7,-5.0,A,7,44,A,7,987,A,7,320,A,7,7.7,A,7,11300,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,17:00,221,1414,121,1,13,614,1,9,26,1,13,130,1,13,467,1,9,56,1,13,59,1,21,0,A,7,0,A,7,4.4,A,7,-8.9,A,7,38,A,7,989,A,7,310,A,7,5.2,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,18:00,20,577,21,1,13,114,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,2.8,A,7,-8.3,A,7,44,A,7,990,A,7,310,A,7,6.2,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-9.4,A,7,48,A,7,992,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.1,A,7,-10.0,A,7,51,A,7,993,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.7,A,7,-10.0,A,7,53,A,7,994,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-11.1,A,7,53,A,7,995,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-11.1,A,7,55,A,7,995,A,7,340,A,7,3.6,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/13/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-11.1,A,7,58,A,7,995,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.0,A,7,-12.2,A,7,57,A,7,995,A,7,300,A,7,2.1,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-12.2,A,7,60,A,7,996,A,7,310,A,7,2.1,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-13.3,A,7,55,A,7,997,A,7,350,A,7,2.1,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-13.3,A,7,55,A,7,998,A,7,330,A,7,2.6,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-13.9,A,7,52,A,7,998,A,7,340,A,7,2.6,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-13.9,A,7,55,A,7,999,A,7,350,A,7,3.1,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-13.9,A,7,55,A,7,999,A,7,340,A,7,4.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,08:00,26,672,16,1,13,36,1,9,12,1,13,15,1,13,9,1,9,14,1,13,20,1,21,0,A,7,0,A,7,-6.1,A,7,-14.4,A,7,52,A,7,1000,A,7,350,A,7,4.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,09:00,234,1414,77,1,13,57,1,9,67,1,13,84,1,13,44,1,9,76,1,13,160,1,21,8,A,7,4,A,7,-4.4,A,7,-14.4,A,7,46,A,7,1001,A,7,350,A,7,5.7,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,10:00,452,1414,222,1,13,201,1,9,158,1,13,239,1,13,186,1,9,179,1,13,357,1,21,9,A,7,7,A,7,-3.9,A,7,-13.3,A,7,48,A,7,1002,A,7,340,A,7,5.2,A,7,24100,B,7,3050,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,11:00,619,1414,272,1,13,211,1,9,179,1,13,297,1,13,212,1,9,203,1,13,429,1,21,7,A,7,6,A,7,-3.3,A,7,-13.9,A,7,44,A,7,1002,A,7,350,A,7,5.2,A,7,24100,B,7,3050,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,12:00,724,1414,501,1,9,713,1,9,134,1,13,521,1,9,701,1,9,160,1,13,283,1,18,2,A,7,2,A,7,-2.8,A,7,-13.9,A,7,43,A,7,1001,A,7,50,A,7,5.2,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,13:00,758,1414,513,1,9,637,1,9,171,1,13,528,1,9,623,1,9,192,1,13,357,1,18,5,A,7,2,A,7,-2.2,A,7,-13.9,A,7,41,A,7,1001,A,7,40,A,7,3.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,14:00,721,1414,514,1,13,617,1,9,199,1,13,536,1,13,618,1,9,220,1,13,431,1,21,7,A,7,3,A,7,-1.7,A,7,-13.9,A,7,39,A,7,1000,A,7,70,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,15:00,614,1414,336,1,13,344,1,9,187,1,13,357,1,13,347,1,9,206,1,13,409,1,21,8,A,7,4,A,7,-1.7,A,7,-15.0,A,7,36,A,7,1000,A,7,40,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,16:00,445,1414,238,1,13,336,1,9,133,1,13,252,1,13,308,1,9,154,1,13,273,1,21,8,A,7,5,A,7,-2.2,A,7,-14.4,A,7,39,A,7,1001,A,7,60,A,7,2.1,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,17:00,225,1414,77,1,13,90,1,9,63,1,13,84,1,13,63,1,9,74,1,13,134,1,21,9,A,7,5,A,7,-2.8,A,7,-13.9,A,7,43,A,7,1001,A,7,70,A,7,2.1,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,18:00,22,601,9,1,13,4,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,5,A,7,-3.3,A,7,-13.3,A,7,46,A,7,1001,A,7,80,A,7,3.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,-4.4,A,7,-13.3,A,7,50,A,7,1001,A,7,80,A,7,2.6,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,-4.4,A,7,-13.9,A,7,48,A,7,1002,A,7,110,A,7,2.6,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-4.4,A,7,-12.8,A,7,53,A,7,1002,A,7,120,A,7,3.1,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,-5.0,A,7,-13.3,A,7,53,A,7,1001,A,7,120,A,7,3.6,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,-5.0,A,7,-13.3,A,7,53,A,7,1001,A,7,130,A,7,3.1,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/14/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,-5.0,A,7,-12.8,A,7,55,A,7,1000,A,7,140,A,7,3.1,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,7,A,7,-6.1,A,7,-13.3,A,7,57,A,7,1000,A,7,120,A,7,3.1,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,-6.7,A,7,-13.3,A,7,60,A,7,1000,A,7,110,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-7.2,A,7,-15.6,A,7,52,A,7,1000,A,7,90,A,7,2.6,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-6.7,A,7,-13.3,A,7,60,A,7,999,A,7,60,A,7,2.6,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,-7.8,A,7,-13.3,A,7,65,A,7,999,A,7,40,A,7,3.1,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,6,A,7,-8.3,A,7,-13.3,A,7,68,A,7,999,A,7,40,A,7,2.6,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,-8.9,A,7,-13.9,A,7,68,A,7,999,A,7,20,A,7,2.6,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,08:00,27,672,9,1,13,1,1,9,9,1,13,11,1,13,0,1,9,11,1,13,33,1,21,10,A,7,10,A,7,-8.9,A,7,-13.9,A,7,68,A,7,1000,A,7,60,A,7,3.1,A,7,24100,B,7,2130,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,09:00,236,1414,121,1,13,445,1,9,46,1,13,123,1,13,315,1,9,70,1,13,81,1,21,4,A,7,1,A,7,-8.3,A,7,-13.3,A,7,68,A,7,1000,A,7,60,A,7,3.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,10:00,454,1414,219,1,9,482,1,9,63,1,13,230,1,9,438,1,9,88,1,13,123,1,18,2,A,7,1,A,7,-6.7,A,7,-13.9,A,7,57,A,7,1000,A,7,60,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,11:00,622,1414,445,1,9,856,1,9,68,1,13,471,1,9,829,1,9,105,1,13,148,1,18,0,A,7,0,A,7,-5.0,A,7,-13.9,A,7,50,A,7,999,A,7,60,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,12:00,727,1414,544,1,9,908,1,9,76,1,13,568,1,9,886,1,9,111,1,13,161,1,18,0,A,7,0,A,7,-3.3,A,7,-13.9,A,7,44,A,7,998,A,7,80,A,7,1.5,A,7,19300,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,13:00,762,1414,578,1,9,924,1,9,79,1,13,604,1,9,906,1,9,114,1,13,169,1,18,0,A,7,0,A,7,-1.7,A,7,-13.3,A,7,41,A,7,997,A,7,0,A,7,0.0,A,7,19300,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,14:00,725,1414,545,1,9,914,1,9,76,1,13,570,1,9,892,1,9,111,1,13,160,1,18,0,A,7,0,A,7,-1.1,A,7,-13.3,A,7,39,A,7,996,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,15:00,618,1414,444,1,9,864,1,9,67,1,13,467,1,9,828,1,9,103,1,13,138,1,18,0,A,7,0,A,7,-1.1,A,7,-12.8,A,7,41,A,7,995,A,7,160,A,7,1.5,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,16:00,449,1414,296,1,9,769,1,9,53,1,13,311,1,9,699,1,9,88,1,13,109,1,18,0,A,7,0,A,7,-0.6,A,7,-12.2,A,7,41,A,7,995,A,7,180,A,7,2.6,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,17:00,230,1414,121,1,13,541,1,9,35,1,13,125,1,13,399,1,9,59,1,13,65,1,21,0,A,7,0,A,7,-1.1,A,7,-12.8,A,7,41,A,7,995,A,7,170,A,7,1.5,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,18:00,24,624,19,1,13,79,1,9,10,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,-2.2,A,7,-12.8,A,7,45,A,7,995,A,7,140,A,7,1.5,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-11.7,A,7,55,A,7,996,A,7,40,A,7,1.5,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-11.7,A,7,63,A,7,996,A,7,180,A,7,2.6,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.0,A,7,-10.6,A,7,65,A,7,996,A,7,220,A,7,2.1,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.7,A,7,-11.1,A,7,71,A,7,996,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.7,A,7,-11.1,A,7,71,A,7,997,A,7,240,A,7,2.1,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/15/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.8,A,7,-11.1,A,7,77,A,7,997,A,7,150,A,7,2.1,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.8,A,7,-11.1,A,7,77,A,7,996,A,7,270,A,7,2.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.3,A,7,-11.1,A,7,81,A,7,996,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.3,A,7,-12.2,A,7,74,A,7,996,A,7,240,A,7,2.1,A,7,12900,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-9.4,A,7,-12.2,A,7,81,A,7,997,A,7,230,A,7,2.1,A,7,12900,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-10.0,A,7,-12.8,A,7,80,A,7,997,A,7,250,A,7,2.1,A,7,12900,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,-8.9,A,7,-12.2,A,7,77,A,7,997,A,7,220,A,7,1.5,A,7,12900,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-12.2,A,7,77,A,7,997,A,7,250,A,7,1.5,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,08:00,27,672,26,1,13,147,1,9,10,1,13,17,1,13,59,1,9,15,1,13,19,1,21,0,A,7,0,A,7,-10.0,A,7,-12.8,A,7,80,A,7,998,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,09:00,238,1414,138,1,13,647,1,9,28,1,13,145,1,13,502,1,9,60,1,13,63,1,21,0,A,7,0,A,7,-7.2,A,7,-11.7,A,7,71,A,7,998,A,7,240,A,7,2.1,A,7,12900,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,10:00,456,1414,315,1,9,840,1,9,42,1,13,332,1,9,768,1,9,83,1,13,102,1,18,0,A,7,0,A,7,-1.1,A,7,-10.0,A,7,51,A,7,999,A,7,250,A,7,5.2,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,11:00,624,1414,460,1,9,916,1,9,54,1,13,485,1,9,881,1,9,94,1,13,131,1,18,0,A,7,0,A,7,1.1,A,7,-8.9,A,7,48,A,7,999,A,7,250,A,7,4.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,12:00,730,1414,557,1,9,957,1,9,61,1,13,585,1,9,936,1,9,100,1,13,151,1,18,0,A,7,0,A,7,2.2,A,7,-8.9,A,7,44,A,7,999,A,7,250,A,7,4.1,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,13:00,766,1414,586,1,9,963,1,9,63,1,13,616,1,9,946,1,9,101,1,13,157,1,18,0,A,7,0,A,7,3.9,A,7,-8.3,A,7,41,A,7,997,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,14:00,729,1414,552,1,9,952,1,9,61,1,13,582,1,9,931,1,9,100,1,13,151,1,18,0,A,7,0,A,7,4.4,A,7,-8.3,A,7,39,A,7,997,A,7,190,A,7,4.1,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,15:00,623,1414,455,1,9,915,1,9,54,1,13,483,1,9,879,1,9,94,1,13,131,1,18,0,A,7,0,A,7,5.0,A,7,-7.8,A,7,40,A,7,996,A,7,180,A,7,4.1,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,16:00,454,1414,282,1,9,741,1,9,46,1,13,300,1,9,676,1,9,82,1,13,105,1,18,2,A,7,1,A,7,5.6,A,7,-7.8,A,7,38,A,7,996,A,7,210,A,7,4.1,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,17:00,234,1414,117,1,13,368,1,9,57,1,13,122,1,13,252,1,9,80,1,13,104,1,21,4,A,7,2,A,7,4.4,A,7,-6.7,A,7,45,A,7,996,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,18:00,26,648,20,1,13,74,1,9,12,1,13,16,1,13,23,1,9,15,1,13,21,1,21,3,A,7,2,A,7,2.8,A,7,-7.2,A,7,48,A,7,996,A,7,160,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,2.2,A,7,-7.8,A,7,48,A,7,997,A,7,190,A,7,2.1,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,0.6,A,7,-7.8,A,7,54,A,7,997,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,0.0,A,7,-8.3,A,7,54,A,7,997,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,-1.7,A,7,-7.2,A,7,66,A,7,997,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,-1.7,A,7,-8.9,A,7,58,A,7,998,A,7,180,A,7,2.6,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/16/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,-2.2,A,7,-7.8,A,7,66,A,7,997,A,7,180,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,-2.8,A,7,-8.3,A,7,66,A,7,997,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,1,A,7,-3.3,A,7,-8.3,A,7,69,A,7,996,A,7,220,A,7,2.6,A,7,12900,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,5,A,7,-3.9,A,7,-8.3,A,7,72,A,7,997,A,7,210,A,7,2.6,A,7,12900,B,7,7620,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,-2.8,A,7,-7.8,A,7,69,A,7,996,A,7,230,A,7,2.6,A,7,12900,B,7,7620,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,-2.8,A,7,-7.8,A,7,69,A,7,996,A,7,220,A,7,2.6,A,7,12900,B,7,7620,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-3.3,A,7,-7.8,A,7,72,A,7,996,A,7,220,A,7,3.1,A,7,12900,B,7,2130,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.8,A,7,-7.8,A,7,69,A,7,996,A,7,220,A,7,2.6,A,7,19300,B,7,6100,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,08:00,28,671,9,1,13,1,1,9,9,1,13,11,1,13,0,1,9,11,1,13,33,1,21,10,A,7,10,A,7,-2.8,A,7,-6.7,A,7,75,A,7,996,A,7,200,A,7,2.6,A,7,16100,B,7,6100,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,09:00,240,1414,68,1,13,72,1,9,56,1,13,75,1,13,52,1,9,66,1,13,119,1,21,10,A,7,9,A,7,-0.6,A,7,-6.7,A,7,64,A,7,996,A,7,200,A,7,1.5,A,7,16100,B,7,2740,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,10:00,459,1414,169,1,9,50,1,9,152,1,13,184,1,9,47,1,9,169,1,13,389,1,18,10,A,7,9,A,7,1.1,A,7,-5.6,A,7,62,A,7,996,A,7,240,A,7,2.1,A,7,19300,B,7,2290,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,11:00,627,1414,122,1,9,3,1,9,120,1,13,142,1,9,2,1,9,141,1,13,513,1,18,10,A,7,9,A,7,6.7,A,7,-6.7,A,7,38,A,7,994,A,7,0,A,7,0.0,A,7,24100,B,7,3050,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,12:00,733,1414,244,1,9,20,1,9,233,1,13,275,1,9,18,1,9,266,1,13,897,1,18,10,A,7,10,A,7,5.6,A,7,-5.6,A,7,45,A,7,993,A,7,170,A,7,1.5,A,7,24100,B,7,2290,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,13:00,770,1414,228,1,9,0,1,9,228,1,13,259,1,9,0,1,9,259,1,13,914,1,18,10,A,7,10,A,7,7.2,A,7,-6.7,A,7,37,A,7,993,A,7,260,A,7,1.5,A,7,24100,B,7,2290,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,14:00,733,1414,195,1,9,6,1,9,192,1,13,224,1,9,5,1,9,221,1,13,790,1,18,10,A,7,10,A,7,6.7,A,7,-6.1,A,7,40,A,7,991,A,7,0,A,7,0.0,A,7,16100,B,7,910,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,15:00,627,1414,174,1,9,4,1,9,173,1,13,198,1,9,3,1,9,197,1,13,671,1,18,10,A,7,10,A,7,6.1,A,7,-5.6,A,7,43,A,7,991,A,7,0,A,7,0.0,A,7,16100,B,7,910,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,16:00,458,1414,73,1,9,1,1,9,72,1,13,85,1,9,1,1,9,85,1,13,299,1,18,10,A,7,10,A,7,6.1,A,7,-3.9,A,7,49,A,7,991,A,7,140,A,7,1.5,A,7,11300,B,7,760,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/17/1988,17:00,239,1414,32,1,13,0,1,9,32,1,13,37,1,13,0,1,9,37,1,13,124,1,21,10,A,7,10,A,7,3.9,A,7,-1.1,A,7,70,A,7,990,A,7,130,A,7,2.1,A,7,8000,B,7,760,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -01/17/1988,18:00,28,671,7,1,13,0,1,9,6,1,13,7,1,13,0,1,9,7,1,13,23,1,21,10,A,7,10,A,7,3.3,A,7,-0.6,A,7,76,A,7,990,A,7,20,A,7,2.1,A,7,8000,B,7,460,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/17/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,0.6,A,7,86,A,7,990,A,7,60,A,7,1.5,A,7,8000,B,7,460,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -01/17/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,0.0,A,7,85,A,7,991,A,7,300,A,7,4.6,A,7,8000,B,7,370,A,7,1.1,E,8,0.000,?,0,0.00,?,0,8,1,D,9,05,C,8 -01/17/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,0.0,A,7,85,A,7,990,A,7,40,A,7,2.1,A,7,4800,B,7,310,A,7,1.1,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -01/17/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,0.0,A,7,89,A,7,988,A,7,70,A,7,2.1,A,7,1600,B,7,210,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/17/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,0.0,A,7,89,A,7,988,A,7,330,A,7,3.1,A,7,1600,B,7,60,A,7,1.1,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -01/17/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,0.0,A,7,89,A,7,988,A,7,350,A,7,2.1,A,7,1600,B,7,60,A,7,1.1,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -01/18/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,-0.6,A,7,85,A,7,987,A,7,330,A,7,2.1,A,7,800,B,7,60,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,1.1,A,7,96,A,7,987,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.1,A,7,1.1,A,7,100,A,7,987,A,7,200,A,7,1.5,A,7,400,B,7,30,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,1.7,A,7,100,A,7,985,A,7,320,A,7,2.1,A,7,400,B,7,30,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.1,A,7,1.1,A,7,100,A,7,985,A,7,160,A,7,1.5,A,7,400,B,7,30,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.1,A,7,1.1,A,7,100,A,7,986,A,7,200,A,7,2.6,A,7,400,B,7,30,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.1,A,7,1.1,A,7,100,A,7,986,A,7,200,A,7,2.6,A,7,400,B,7,30,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,08:00,29,695,16,1,13,0,1,9,16,1,13,18,1,13,0,1,9,18,1,13,53,1,21,10,A,7,10,A,7,1.7,A,7,1.7,A,7,100,A,7,986,A,7,220,A,7,4.1,A,7,200,B,7,30,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,12,C,8 -01/18/1988,09:00,242,1413,85,1,13,1,1,9,85,1,13,92,1,13,0,1,9,92,1,13,246,1,21,10,A,7,10,A,7,2.2,A,7,2.2,A,7,100,A,7,986,A,7,260,A,7,3.1,A,7,200,B,7,30,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,10:00,461,1413,173,1,9,1,1,9,173,1,13,189,1,9,1,1,9,189,1,13,543,1,18,10,A,7,10,A,7,2.2,A,7,2.2,A,7,100,A,7,987,A,7,300,A,7,2.6,A,7,200,B,7,30,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,11:00,630,1413,253,1,9,1,1,9,252,1,13,278,1,9,1,1,9,277,1,13,833,1,18,10,A,7,10,A,7,3.3,A,7,3.3,A,7,100,A,7,987,A,7,230,A,7,3.6,A,7,200,B,7,60,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,12:00,737,1413,388,1,13,393,1,9,183,1,13,410,1,13,396,1,9,202,1,13,396,1,21,5,A,7,5,A,7,7.2,A,7,5.0,A,7,86,A,7,986,A,7,260,A,7,2.6,A,7,1600,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/18/1988,13:00,774,1413,552,1,9,882,1,9,68,1,13,579,1,9,867,1,9,103,1,13,164,1,18,3,A,7,1,A,7,9.4,A,7,5.6,A,7,77,A,7,986,A,7,270,A,7,2.6,A,7,8000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/18/1988,14:00,738,1413,515,1,9,873,1,9,60,1,13,544,1,9,855,1,9,96,1,13,151,1,18,2,A,7,1,A,7,12.8,A,7,7.2,A,7,69,A,7,985,A,7,280,A,7,2.1,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/18/1988,15:00,632,1413,416,1,9,793,1,9,62,1,13,438,1,9,763,1,9,96,1,13,139,1,18,2,A,7,1,A,7,15.0,A,7,7.8,A,7,62,A,7,985,A,7,280,A,7,1.5,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/18/1988,16:00,463,1413,274,1,13,604,1,9,78,1,13,287,1,13,547,1,9,107,1,13,148,1,21,6,A,7,3,A,7,15.0,A,7,6.1,A,7,56,A,7,985,A,7,300,A,7,2.1,A,7,11300,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/18/1988,17:00,244,1413,92,1,13,166,1,9,64,1,13,98,1,13,115,1,9,78,1,13,122,1,21,9,A,7,5,A,7,13.9,A,7,6.1,A,7,60,A,7,986,A,7,290,A,7,2.1,A,7,11300,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/18/1988,18:00,30,695,19,1,13,22,1,9,17,1,13,20,1,13,8,1,9,19,1,13,35,1,21,10,A,7,7,A,7,9.4,A,7,5.6,A,7,77,A,7,986,A,7,200,A,7,2.1,A,7,11300,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/18/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,5.6,A,7,89,A,7,987,A,7,210,A,7,2.6,A,7,11300,B,7,6100,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/18/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,5.0,A,7,93,A,7,987,A,7,210,A,7,2.6,A,7,11300,B,7,6100,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/18/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,987,A,7,230,A,7,2.6,A,7,11300,B,7,6100,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/18/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,5.0,A,7,4.4,A,7,96,A,7,988,A,7,280,A,7,2.1,A,7,11300,B,7,6100,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/18/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,3.9,A,7,3.3,A,7,96,A,7,988,A,7,250,A,7,2.6,A,7,11300,B,7,6100,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/18/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,1.1,A,7,1.1,A,7,100,A,7,989,A,7,200,A,7,3.1,A,7,1600,B,7,6100,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/19/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.1,A,7,1.1,A,7,100,A,7,990,A,7,210,A,7,2.1,A,7,100,B,7,0,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/19/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,2.2,A,7,100,A,7,990,A,7,190,A,7,1.5,A,7,1200,B,7,1070,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/19/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,1.7,A,7,100,A,7,990,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/19/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,1.1,A,7,1.1,A,7,100,A,7,990,A,7,0,A,7,0.0,A,7,4800,B,7,1070,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/19/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,2.2,A,7,100,A,7,990,A,7,50,A,7,1.5,A,7,11300,B,7,1160,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/19/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,3.3,A,7,100,A,7,990,A,7,50,A,7,2.6,A,7,11300,B,7,1220,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/19/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,4.4,A,7,3.3,A,7,93,A,7,990,A,7,50,A,7,3.1,A,7,11300,B,7,1830,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/19/1988,08:00,29,695,15,1,13,4,1,9,15,1,13,17,1,13,0,1,9,17,1,13,50,1,21,10,A,7,9,A,7,5.0,A,7,3.3,A,7,89,A,7,991,A,7,60,A,7,4.6,A,7,11300,B,7,3050,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/19/1988,09:00,244,1413,64,1,13,9,1,9,62,1,13,71,1,13,2,1,9,70,1,13,207,1,21,10,A,7,10,A,7,5.6,A,7,2.8,A,7,83,A,7,991,A,7,60,A,7,6.2,A,7,11300,B,7,3050,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/19/1988,10:00,464,1413,146,1,9,2,1,9,145,1,13,162,1,9,1,1,9,161,1,13,498,1,18,10,A,7,10,A,7,5.6,A,7,1.7,A,7,76,A,7,991,A,7,70,A,7,5.2,A,7,12900,B,7,3050,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/19/1988,11:00,634,1413,174,1,9,7,1,9,170,1,13,197,1,9,5,1,9,194,1,13,667,1,18,10,A,7,10,A,7,5.6,A,7,1.1,A,7,73,A,7,991,A,7,60,A,7,5.2,A,7,12900,B,7,3050,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/19/1988,12:00,741,1413,164,1,9,12,1,9,157,1,13,190,1,9,9,1,9,186,1,13,685,1,18,10,A,7,10,A,7,5.0,A,7,1.7,A,7,79,A,7,991,A,7,40,A,7,3.6,A,7,11300,B,7,910,A,7,1.2,E,8,0.000,F,8,0.00,?,0,5,1,D,9,00,C,8 -01/19/1988,13:00,778,1413,162,1,9,4,1,9,160,1,13,190,1,9,3,1,9,188,1,13,711,1,18,10,A,7,10,A,7,4.4,A,7,2.8,A,7,89,A,7,990,A,7,50,A,7,5.2,A,7,8000,B,7,910,A,7,1.3,E,8,0.000,F,8,0.00,?,0,8,1,D,9,61,C,8 -01/19/1988,14:00,742,1413,154,1,9,9,1,9,150,1,13,181,1,9,7,1,9,178,1,13,661,1,18,10,A,7,10,A,7,3.9,A,7,2.8,A,7,93,A,7,989,A,7,60,A,7,5.2,A,7,6400,B,7,150,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/19/1988,15:00,636,1413,111,1,9,1,1,9,110,1,13,130,1,9,1,1,9,130,1,13,482,1,18,10,A,7,10,A,7,3.3,A,7,2.8,A,7,96,A,7,990,A,7,40,A,7,3.1,A,7,1600,B,7,120,A,7,1.3,E,8,0.000,F,8,0.00,?,0,10,1,D,9,45,C,8 -01/19/1988,16:00,468,1413,83,1,9,4,1,9,81,1,13,96,1,9,2,1,9,95,1,13,332,1,18,10,A,7,10,A,7,3.3,A,7,2.8,A,7,96,A,7,990,A,7,70,A,7,5.2,A,7,1600,B,7,120,A,7,1.3,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -01/19/1988,17:00,248,1413,42,1,13,1,1,9,42,1,13,48,1,13,0,1,9,48,1,13,157,1,21,10,A,7,10,A,7,3.3,A,7,2.8,A,7,96,A,7,988,A,7,70,A,7,5.2,A,7,1600,B,7,90,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/19/1988,18:00,32,718,9,1,13,0,1,9,8,1,13,10,1,13,0,1,9,10,1,13,30,1,21,10,A,7,10,A,7,2.8,A,7,2.8,A,7,100,A,7,987,A,7,60,A,7,4.1,A,7,1600,B,7,90,A,7,1.3,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -01/19/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.8,A,7,100,A,7,987,A,7,50,A,7,3.6,A,7,1600,B,7,60,A,7,1.3,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -01/19/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.8,A,7,100,A,7,986,A,7,70,A,7,5.7,A,7,1600,B,7,60,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/19/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.8,A,7,100,A,7,985,A,7,70,A,7,4.1,A,7,1600,B,7,60,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/19/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.8,A,7,100,A,7,985,A,7,60,A,7,3.1,A,7,1600,B,7,60,A,7,1.3,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -01/19/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.8,A,7,100,A,7,984,A,7,40,A,7,2.6,A,7,1600,B,7,60,A,7,1.3,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -01/19/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,984,A,7,60,A,7,3.6,A,7,1600,B,7,60,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,983,A,7,60,A,7,3.1,A,7,800,B,7,30,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,2.2,A,7,100,A,7,982,A,7,30,A,7,3.6,A,7,800,B,7,30,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,981,A,7,60,A,7,4.1,A,7,1200,B,7,30,A,7,1.2,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -01/20/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,981,A,7,40,A,7,3.6,A,7,1200,B,7,30,A,7,1.2,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -01/20/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,981,A,7,320,A,7,4.1,A,7,2400,B,7,30,A,7,1.2,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -01/20/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,981,A,7,60,A,7,3.6,A,7,6400,B,7,90,A,7,1.2,E,8,0.000,?,0,0.00,?,0,46,1,D,9,45,C,8 -01/20/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,979,A,7,110,A,7,4.1,A,7,6400,B,7,90,A,7,1.2,E,8,0.000,?,0,0.00,?,0,18,1,D,9,45,C,8 -01/20/1988,08:00,30,718,11,1,13,0,1,9,11,1,13,13,1,13,0,1,9,13,1,13,39,1,21,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,979,A,7,40,A,7,2.6,A,7,4000,B,7,90,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,09:00,246,1413,79,1,13,0,1,9,79,1,13,86,1,13,0,1,9,86,1,13,241,1,21,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,980,A,7,10,A,7,3.1,A,7,2400,B,7,90,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,10:00,467,1413,157,1,9,0,1,9,157,1,13,173,1,9,0,1,9,173,1,13,523,1,18,10,A,7,10,A,7,3.3,A,7,2.8,A,7,96,A,7,980,A,7,10,A,7,1.5,A,7,1600,B,7,60,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,11:00,637,1413,228,1,9,1,1,9,227,1,13,253,1,9,1,1,9,252,1,13,799,1,18,10,A,7,10,A,7,3.9,A,7,3.3,A,7,96,A,7,979,A,7,0,A,7,0.0,A,7,800,B,7,30,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,12:00,744,1413,257,1,9,1,1,9,256,1,13,288,1,9,1,1,9,287,1,13,959,1,18,10,A,7,10,A,7,3.9,A,7,3.9,A,7,100,A,7,979,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,13:00,782,1413,270,1,9,1,1,9,269,1,13,303,1,9,1,1,9,303,1,13,1023,1,18,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,978,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,14:00,747,1413,274,1,9,1,1,9,274,1,13,307,1,9,1,1,9,306,1,13,998,1,18,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,977,A,7,230,A,7,2.6,A,7,400,B,7,30,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,11,C,8 -01/20/1988,15:00,641,1413,249,1,9,1,1,9,248,1,13,274,1,9,1,1,9,274,1,13,839,1,18,10,A,7,10,A,7,7.8,A,7,7.2,A,7,96,A,7,977,A,7,210,A,7,2.6,A,7,1600,B,7,90,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,16:00,472,1413,180,1,9,0,1,9,180,1,13,196,1,9,0,1,9,196,1,13,564,1,18,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,977,A,7,230,A,7,3.6,A,7,4000,B,7,120,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,17:00,253,1413,83,1,13,1,1,9,83,1,13,91,1,13,0,1,9,91,1,13,251,1,21,10,A,7,10,A,7,8.3,A,7,7.8,A,7,96,A,7,977,A,7,210,A,7,5.2,A,7,4000,B,7,120,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,18:00,34,742,16,1,13,0,1,9,16,1,13,18,1,13,0,1,9,18,1,13,54,1,21,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,977,A,7,210,A,7,3.6,A,7,400,B,7,60,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,977,A,7,210,A,7,6.2,A,7,3200,B,7,120,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,9.4,A,7,8.9,A,7,96,A,7,977,A,7,240,A,7,3.6,A,7,9700,B,7,180,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,12,C,8 -01/20/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,8.9,A,7,8.3,A,7,96,A,7,978,A,7,230,A,7,3.6,A,7,6400,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,978,A,7,230,A,7,4.1,A,7,6400,B,7,90,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.6,A,7,100,A,7,978,A,7,240,A,7,4.1,A,7,6400,B,7,90,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/20/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.6,A,7,100,A,7,977,A,7,240,A,7,3.6,A,7,6400,B,7,210,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.0,A,7,96,A,7,977,A,7,230,A,7,4.1,A,7,3200,B,7,150,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.0,A,7,96,A,7,977,A,7,240,A,7,4.1,A,7,1600,B,7,90,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -01/21/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,977,A,7,260,A,7,2.6,A,7,1600,B,7,30,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,977,A,7,250,A,7,3.6,A,7,400,B,7,30,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,8.3,A,7,100,A,7,977,A,7,260,A,7,3.1,A,7,200,B,7,0,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,7.2,A,7,100,A,7,978,A,7,260,A,7,2.1,A,7,200,B,7,0,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,5.6,A,7,100,A,7,977,A,7,150,A,7,2.6,A,7,200,B,7,0,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,08:00,31,718,13,1,13,0,1,9,13,1,13,15,1,13,0,1,9,15,1,13,45,1,21,10,A,7,10,A,7,5.6,A,7,5.6,A,7,100,A,7,978,A,7,250,A,7,1.5,A,7,200,B,7,3050,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,09:00,248,1413,60,1,13,0,1,9,60,1,13,67,1,13,0,1,9,67,1,13,205,1,21,10,A,7,10,A,7,6.1,A,7,5.6,A,7,96,A,7,978,A,7,320,A,7,2.1,A,7,8000,B,7,2440,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,10:00,470,1413,159,1,9,17,1,9,153,1,13,175,1,9,12,1,9,171,1,13,518,1,18,9,A,7,8,A,7,8.9,A,7,3.9,A,7,71,A,7,979,A,7,340,A,7,3.1,A,7,11300,B,7,3660,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/21/1988,11:00,640,1413,198,1,9,55,1,9,173,1,13,218,1,9,54,1,9,193,1,13,512,1,18,10,A,7,9,A,7,9.4,A,7,3.3,A,7,66,A,7,980,A,7,40,A,7,1.5,A,7,16100,B,7,3660,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,12:00,748,1413,214,1,9,0,1,9,214,1,13,244,1,9,0,1,9,244,1,13,861,1,18,10,A,7,10,A,7,10.0,A,7,2.2,A,7,59,A,7,979,A,7,360,A,7,1.5,A,7,16100,B,7,2440,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,13:00,786,1413,250,1,9,50,1,9,222,1,13,275,1,9,50,1,9,247,1,13,705,1,18,10,A,7,9,A,7,10.6,A,7,1.1,A,7,52,A,7,979,A,7,0,A,7,0.0,A,7,19300,B,7,6100,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,14:00,751,1413,279,1,9,53,1,9,250,1,13,305,1,9,53,1,9,277,1,13,751,1,18,10,A,7,9,A,7,10.6,A,7,1.1,A,7,52,A,7,978,A,7,360,A,7,2.6,A,7,24100,B,7,2740,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,15:00,646,1413,299,1,13,170,1,9,221,1,13,323,1,13,171,1,9,244,1,13,536,1,21,8,A,7,6,A,7,11.7,A,7,1.1,A,7,49,A,7,978,A,7,20,A,7,2.1,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,16:00,477,1413,176,1,13,205,1,9,107,1,13,190,1,13,193,1,9,125,1,13,209,1,21,10,A,7,7,A,7,11.1,A,7,0.6,A,7,49,A,7,978,A,7,350,A,7,3.1,A,7,24100,B,7,2130,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,17:00,258,1413,41,1,13,15,1,9,38,1,13,45,1,13,12,1,9,43,1,13,103,1,21,10,A,7,10,A,7,10.6,A,7,0.6,A,7,50,A,7,978,A,7,350,A,7,2.1,A,7,24100,B,7,2130,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,18:00,36,765,8,1,13,0,1,9,8,1,13,10,1,13,0,1,9,10,1,13,30,1,21,10,A,7,10,A,7,9.4,A,7,1.1,A,7,56,A,7,978,A,7,80,A,7,2.6,A,7,24100,B,7,2130,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,8.9,A,7,2.2,A,7,63,A,7,978,A,7,30,A,7,2.6,A,7,24100,B,7,2130,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,7.8,A,7,2.2,A,7,68,A,7,980,A,7,360,A,7,4.1,A,7,24100,B,7,2130,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,6.1,A,7,-1.1,A,7,60,A,7,980,A,7,20,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-1.7,A,7,65,A,7,981,A,7,20,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-2.2,A,7,65,A,7,981,A,7,30,A,7,5.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/21/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-3.3,A,7,62,A,7,981,A,7,30,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-4.4,A,7,59,A,7,981,A,7,360,A,7,4.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,2.8,A,7,-4.4,A,7,59,A,7,981,A,7,20,A,7,4.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-4.4,A,7,59,A,7,981,A,7,10,A,7,3.6,A,7,24100,B,7,1370,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-4.4,A,7,59,A,7,981,A,7,10,A,7,4.1,A,7,24100,B,7,1370,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,-5.0,A,7,55,A,7,981,A,7,40,A,7,4.6,A,7,24100,B,7,1370,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,-4.4,A,7,57,A,7,982,A,7,10,A,7,4.6,A,7,16100,B,7,850,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-4.4,A,7,59,A,7,983,A,7,40,A,7,3.6,A,7,16100,B,7,760,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,08:00,32,718,9,1,13,1,1,9,9,1,13,11,1,13,0,1,9,11,1,13,33,1,21,10,A,7,10,A,7,2.8,A,7,-4.4,A,7,59,A,7,983,A,7,40,A,7,3.1,A,7,24100,B,7,910,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,09:00,251,1412,49,1,13,1,1,9,49,1,13,56,1,13,0,1,9,56,1,13,178,1,21,10,A,7,10,A,7,2.8,A,7,-3.9,A,7,62,A,7,984,A,7,50,A,7,3.1,A,7,24100,B,7,1370,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,10:00,473,1412,177,1,9,136,1,9,131,1,13,193,1,9,128,1,9,149,1,13,297,1,18,8,A,7,8,A,7,3.3,A,7,-4.4,A,7,57,A,7,985,A,7,50,A,7,3.6,A,7,24100,B,7,1520,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,11:00,644,1412,181,1,9,3,1,9,180,1,13,206,1,9,2,1,9,204,1,13,700,1,18,10,A,7,10,A,7,4.4,A,7,-4.4,A,7,53,A,7,986,A,7,10,A,7,2.1,A,7,24100,B,7,1070,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,12:00,752,1412,456,1,9,352,1,9,268,1,13,482,1,9,367,1,9,285,1,13,651,1,18,8,A,7,8,A,7,5.6,A,7,-5.0,A,7,47,A,7,985,A,7,300,A,7,3.6,A,7,24100,B,7,1370,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,13:00,791,1412,381,1,9,256,1,9,237,1,13,408,1,9,270,1,9,257,1,13,569,1,18,8,A,7,8,A,7,6.7,A,7,-4.4,A,7,45,A,7,983,A,7,310,A,7,3.1,A,7,24100,B,7,1520,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,14:00,756,1412,426,1,13,446,1,9,187,1,13,450,1,13,451,1,9,208,1,13,410,1,21,5,A,7,5,A,7,7.2,A,7,-4.4,A,7,44,A,7,983,A,7,330,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,15:00,651,1412,191,1,9,91,1,9,149,1,13,212,1,9,93,1,9,169,1,13,362,1,18,9,A,7,9,A,7,6.7,A,7,-3.9,A,7,47,A,7,983,A,7,300,A,7,3.6,A,7,24100,B,7,1220,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,16:00,482,1412,136,1,9,78,1,9,109,1,13,150,1,9,74,1,9,124,1,13,248,1,18,9,A,7,9,A,7,6.7,A,7,-4.4,A,7,45,A,7,983,A,7,250,A,7,4.1,A,7,24100,B,7,1220,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,17:00,263,1412,79,1,13,28,1,9,73,1,13,86,1,13,22,1,9,81,1,13,178,1,21,10,A,7,9,A,7,5.6,A,7,-4.4,A,7,49,A,7,983,A,7,270,A,7,3.1,A,7,24100,B,7,1220,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,18:00,39,789,11,1,13,4,1,9,10,1,13,11,1,13,2,1,9,11,1,13,26,1,21,10,A,7,10,A,7,5.0,A,7,-5.6,A,7,47,A,7,984,A,7,320,A,7,3.6,A,7,16100,B,7,1370,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,-5.6,A,7,49,A,7,984,A,7,310,A,7,2.1,A,7,16100,B,7,1520,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,3.3,A,7,-4.4,A,7,57,A,7,985,A,7,300,A,7,2.1,A,7,16100,B,7,1520,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-4.4,A,7,59,A,7,985,A,7,300,A,7,3.6,A,7,16100,B,7,1220,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,2.8,A,7,-5.6,A,7,55,A,7,985,A,7,310,A,7,2.6,A,7,16100,B,7,1370,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,2.8,A,7,-6.7,A,7,50,A,7,985,A,7,310,A,7,1.5,A,7,16100,B,7,1370,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/22/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,2.2,A,7,-6.1,A,7,55,A,7,985,A,7,290,A,7,1.5,A,7,16100,B,7,1370,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,2.2,A,7,-5.6,A,7,57,A,7,984,A,7,270,A,7,2.1,A,7,16100,B,7,1160,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,0.6,A,7,-6.1,A,7,61,A,7,984,A,7,270,A,7,2.1,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,1.1,A,7,-5.0,A,7,64,A,7,984,A,7,280,A,7,2.1,A,7,16100,B,7,1160,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,0.6,A,7,-5.6,A,7,64,A,7,984,A,7,270,A,7,2.6,A,7,16100,B,7,1160,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,-0.6,A,7,-6.1,A,7,67,A,7,983,A,7,280,A,7,2.6,A,7,16100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,0.0,A,7,-5.0,A,7,69,A,7,983,A,7,300,A,7,3.1,A,7,16100,B,7,1160,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.6,A,7,-5.6,A,7,64,A,7,984,A,7,280,A,7,3.1,A,7,16100,B,7,1220,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,08:00,34,741,16,1,13,48,1,9,12,1,13,16,1,13,13,1,9,15,1,13,20,1,21,1,A,7,1,A,7,-1.7,A,7,-6.7,A,7,69,A,7,984,A,7,280,A,7,2.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,09:00,254,1412,115,1,13,391,1,9,44,1,13,118,1,13,287,1,9,66,1,13,80,1,21,0,A,7,0,A,7,1.1,A,7,-5.6,A,7,62,A,7,984,A,7,200,A,7,2.1,A,7,11300,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,10:00,476,1412,300,1,9,693,1,9,65,1,13,308,1,9,634,1,9,93,1,13,125,1,18,0,A,7,0,A,7,2.8,A,7,-6.7,A,7,50,A,7,984,A,7,200,A,7,3.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,11:00,648,1412,449,1,9,799,1,9,81,1,13,468,1,9,774,1,9,112,1,13,168,1,18,0,A,7,0,A,7,5.0,A,7,-7.2,A,7,41,A,7,984,A,7,250,A,7,4.1,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,12:00,756,1412,547,1,9,850,1,9,91,1,13,576,1,9,840,1,9,124,1,13,201,1,18,0,A,7,0,A,7,6.1,A,7,-7.8,A,7,37,A,7,984,A,7,260,A,7,5.2,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,13:00,795,1412,579,1,9,860,1,9,95,1,13,612,1,9,854,1,9,129,1,13,215,1,18,0,A,7,0,A,7,6.7,A,7,-7.8,A,7,35,A,7,983,A,7,260,A,7,6.2,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,14:00,761,1412,511,1,9,798,1,9,81,1,13,546,1,9,793,1,9,117,1,13,187,1,18,1,A,7,1,A,7,6.7,A,7,-7.8,A,7,35,A,7,982,A,7,300,A,7,8.2,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,15:00,656,1412,407,1,9,665,1,9,99,1,13,431,1,9,651,1,9,127,1,13,207,1,18,1,A,7,1,A,7,7.2,A,7,-7.8,A,7,34,A,7,982,A,7,250,A,7,7.2,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,16:00,487,1412,306,1,9,700,1,9,66,1,13,317,1,9,644,1,9,94,1,13,128,1,18,0,A,7,0,A,7,7.2,A,7,-7.8,A,7,34,A,7,982,A,7,260,A,7,5.7,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,17:00,268,1412,134,1,13,478,1,9,45,1,13,140,1,13,360,1,9,72,1,13,82,1,21,0,A,7,0,A,7,6.1,A,7,-7.8,A,7,37,A,7,982,A,7,280,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,18:00,42,812,22,1,13,65,1,9,15,1,13,20,1,13,20,1,9,19,1,13,26,1,21,0,A,7,0,A,7,3.9,A,7,-7.2,A,7,45,A,7,983,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-7.2,A,7,48,A,7,983,A,7,170,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-6.7,A,7,57,A,7,984,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-7.2,A,7,54,A,7,984,A,7,180,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-6.7,A,7,59,A,7,984,A,7,190,A,7,3.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-6.7,A,7,61,A,7,984,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/23/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-6.7,A,7,64,A,7,984,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.1,A,7,-6.7,A,7,66,A,7,984,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.2,A,7,-6.7,A,7,72,A,7,984,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.1,A,7,-6.1,A,7,69,A,7,985,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-6.1,A,7,78,A,7,984,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-6.1,A,7,81,A,7,985,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-6.7,A,7,81,A,7,985,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-6.1,A,7,81,A,7,985,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,08:00,35,765,19,1,13,52,1,9,14,1,13,18,1,13,15,1,9,17,1,13,24,1,21,0,A,7,0,A,7,-3.9,A,7,-6.1,A,7,85,A,7,986,A,7,220,A,7,3.1,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,09:00,257,1412,118,1,13,386,1,9,47,1,13,120,1,13,284,1,9,68,1,13,84,1,21,3,A,7,1,A,7,0.0,A,7,-4.4,A,7,72,A,7,987,A,7,220,A,7,3.1,A,7,12900,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,10:00,479,1412,167,1,13,106,1,9,131,1,13,182,1,13,100,1,9,148,1,13,298,1,21,9,A,7,6,A,7,3.9,A,7,-3.3,A,7,60,A,7,987,A,7,220,A,7,4.1,A,7,16100,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,11:00,651,1412,225,1,9,54,1,9,200,1,13,247,1,9,53,1,9,222,1,13,579,1,18,9,A,7,9,A,7,4.4,A,7,-4.4,A,7,53,A,7,987,A,7,220,A,7,3.6,A,7,16100,B,7,7620,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,12:00,761,1412,544,1,9,833,1,9,94,1,13,571,1,9,823,1,9,125,1,13,206,1,18,0,A,7,0,A,7,7.2,A,7,-3.9,A,7,46,A,7,987,A,7,220,A,7,5.2,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,13:00,800,1412,552,1,9,799,1,9,100,1,13,581,1,9,792,1,9,130,1,13,224,1,18,1,A,7,1,A,7,8.9,A,7,-3.9,A,7,41,A,7,985,A,7,230,A,7,4.1,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,14:00,766,1412,536,1,9,771,1,9,118,1,13,568,1,9,770,1,9,149,1,13,265,1,18,6,A,7,1,A,7,10.0,A,7,-3.3,A,7,39,A,7,984,A,7,240,A,7,5.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,15:00,661,1412,407,1,9,540,1,9,155,1,13,432,1,9,535,1,9,180,1,13,318,1,18,9,A,7,2,A,7,10.6,A,7,-3.9,A,7,36,A,7,984,A,7,240,A,7,6.7,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,16:00,492,1412,276,1,13,454,1,9,119,1,13,291,1,13,420,1,9,143,1,13,228,1,21,10,A,7,4,A,7,10.0,A,7,-3.3,A,7,39,A,7,984,A,7,210,A,7,5.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,17:00,273,1412,113,1,13,150,1,9,84,1,13,122,1,13,115,1,9,100,1,13,180,1,21,10,A,7,5,A,7,10.0,A,7,-4.4,A,7,36,A,7,984,A,7,230,A,7,6.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,18:00,44,859,15,1,13,4,1,9,14,1,13,16,1,13,0,1,9,16,1,13,49,1,21,10,A,7,6,A,7,8.3,A,7,-3.9,A,7,42,A,7,985,A,7,220,A,7,3.6,A,7,24100,B,7,7620,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,-3.9,A,7,47,A,7,985,A,7,180,A,7,2.6,A,7,24100,B,7,7620,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,6.1,A,7,-4.4,A,7,47,A,7,985,A,7,190,A,7,2.6,A,7,24100,B,7,7620,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,6.1,A,7,-3.9,A,7,49,A,7,985,A,7,190,A,7,4.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,-3.3,A,7,51,A,7,984,A,7,190,A,7,4.6,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,6.7,A,7,-3.3,A,7,49,A,7,984,A,7,200,A,7,5.2,A,7,24100,B,7,1680,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/24/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,-3.3,A,7,51,A,7,984,A,7,190,A,7,3.6,A,7,24100,B,7,1370,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/25/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,-2.8,A,7,55,A,7,983,A,7,180,A,7,2.6,A,7,16100,B,7,1370,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/25/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,-2.8,A,7,55,A,7,983,A,7,190,A,7,3.1,A,7,16100,B,7,1220,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/25/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,-2.2,A,7,60,A,7,982,A,7,210,A,7,2.1,A,7,16100,B,7,1220,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/25/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,-0.6,A,7,70,A,7,982,A,7,190,A,7,2.1,A,7,16100,B,7,910,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/25/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,0.6,A,7,76,A,7,982,A,7,180,A,7,2.6,A,7,11300,B,7,760,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/25/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,2.2,A,7,89,A,7,982,A,7,180,A,7,2.6,A,7,11300,B,7,610,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -01/25/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,2.8,A,7,93,A,7,982,A,7,240,A,7,1.5,A,7,9700,B,7,550,A,7,1.3,E,8,0.000,?,0,0.00,?,0,5,1,D,9,61,C,8 -01/25/1988,08:00,36,765,7,1,13,3,1,9,7,1,13,8,1,13,2,1,9,8,1,13,18,1,21,10,A,7,10,A,7,3.9,A,7,2.8,A,7,93,A,7,981,A,7,320,A,7,1.5,A,7,4800,B,7,850,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/25/1988,09:00,260,1411,39,1,13,3,1,9,38,1,13,45,1,13,1,1,9,45,1,13,147,1,21,10,A,7,10,A,7,3.3,A,7,2.8,A,7,96,A,7,980,A,7,20,A,7,2.1,A,7,3200,B,7,520,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/25/1988,10:00,483,1411,102,1,9,3,1,9,101,1,13,117,1,9,2,1,9,116,1,13,399,1,18,10,A,7,10,A,7,3.3,A,7,2.8,A,7,96,A,7,980,A,7,350,A,7,2.1,A,7,3200,B,7,180,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/25/1988,11:00,655,1411,148,1,9,3,1,9,146,1,13,170,1,9,2,1,9,169,1,13,610,1,18,10,A,7,10,A,7,3.3,A,7,2.2,A,7,93,A,7,978,A,7,90,A,7,2.1,A,7,2400,B,7,150,A,7,1.2,E,8,0.000,F,8,0.00,?,0,8,1,D,9,45,C,8 -01/25/1988,12:00,765,1411,136,1,9,4,1,9,133,1,13,160,1,9,3,1,9,159,1,13,609,1,18,10,A,7,10,A,7,3.3,A,7,2.2,A,7,93,A,7,978,A,7,90,A,7,2.1,A,7,3200,B,7,150,A,7,1.2,E,8,0.000,F,8,0.00,?,0,13,1,D,9,45,C,8 -01/25/1988,13:00,804,1411,137,1,9,1,1,9,137,1,13,164,1,9,1,1,9,164,1,13,638,1,18,10,A,7,10,A,7,3.3,A,7,2.2,A,7,93,A,7,976,A,7,70,A,7,1.5,A,7,4000,B,7,210,A,7,1.2,E,8,0.000,F,8,0.00,?,0,10,1,D,9,45,C,8 -01/25/1988,14:00,770,1411,161,1,9,6,1,9,157,1,13,188,1,9,5,1,9,185,1,13,698,1,18,10,A,7,10,A,7,3.3,A,7,2.2,A,7,93,A,7,974,A,7,20,A,7,2.1,A,7,4000,B,7,210,A,7,1.2,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -01/25/1988,15:00,666,1411,121,1,9,4,1,9,120,1,13,143,1,9,3,1,9,142,1,13,527,1,18,10,A,7,10,A,7,3.3,A,7,2.2,A,7,93,A,7,974,A,7,360,A,7,1.5,A,7,4000,B,7,210,A,7,1.2,E,8,0.000,F,8,0.00,?,0,8,1,D,9,45,C,8 -01/25/1988,16:00,498,1411,108,1,9,1,1,9,108,1,13,124,1,9,1,1,9,124,1,13,426,1,18,10,A,7,10,A,7,2.8,A,7,1.7,A,7,93,A,7,974,A,7,330,A,7,2.1,A,7,4000,B,7,210,A,7,1.2,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -01/25/1988,17:00,278,1411,49,1,13,0,1,9,49,1,13,56,1,13,0,1,9,56,1,13,184,1,21,10,A,7,10,A,7,2.8,A,7,1.7,A,7,93,A,7,973,A,7,310,A,7,2.6,A,7,6400,B,7,120,A,7,1.2,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -01/25/1988,18:00,47,882,12,1,13,0,1,9,12,1,13,14,1,13,0,1,9,14,1,13,44,1,21,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,974,A,7,280,A,7,2.1,A,7,3200,B,7,90,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/25/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,974,A,7,290,A,7,2.6,A,7,3200,B,7,120,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/25/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,2.2,A,7,96,A,7,974,A,7,290,A,7,3.6,A,7,3200,B,7,610,A,7,1.2,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -01/25/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,2.2,A,7,1.1,A,7,93,A,7,974,A,7,310,A,7,3.6,A,7,11300,B,7,1370,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/25/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,1.1,A,7,0.0,A,7,92,A,7,975,A,7,260,A,7,3.1,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/25/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.6,A,7,0.0,A,7,96,A,7,975,A,7,250,A,7,4.1,A,7,400,B,7,30,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/25/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-1.1,A,7,96,A,7,976,A,7,240,A,7,4.1,A,7,6400,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/26/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-2.2,A,7,85,A,7,976,A,7,260,A,7,3.6,A,7,11300,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -01/26/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-3.3,A,7,82,A,7,976,A,7,250,A,7,5.2,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -01/26/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,0.6,A,7,-5.0,A,7,67,A,7,977,A,7,310,A,7,5.7,A,7,16100,B,7,1070,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,-1.1,A,7,-9.4,A,7,54,A,7,979,A,7,300,A,7,7.2,A,7,16100,B,7,1070,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,-3.3,A,7,-12.2,A,7,51,A,7,981,A,7,300,A,7,7.2,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,-5.0,A,7,-15.6,A,7,44,A,7,982,A,7,310,A,7,8.2,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,-6.1,A,7,-16.7,A,7,43,A,7,983,A,7,320,A,7,8.2,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,08:00,38,788,23,1,13,87,1,9,14,1,13,20,1,13,30,1,9,18,1,13,24,1,21,2,A,7,1,A,7,-6.7,A,7,-15.6,A,7,50,A,7,984,A,7,300,A,7,7.7,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,09:00,263,1411,141,1,13,556,1,9,37,1,13,144,1,13,431,1,9,63,1,13,71,1,21,0,A,7,0,A,7,-6.1,A,7,-16.1,A,7,46,A,7,985,A,7,300,A,7,7.2,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,10:00,486,1411,323,1,9,777,1,9,53,1,13,339,1,9,721,1,9,89,1,13,113,1,18,0,A,7,0,A,7,-5.0,A,7,-15.0,A,7,46,A,7,986,A,7,290,A,7,7.2,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,11:00,659,1411,469,1,9,877,1,9,58,1,13,494,1,9,849,1,9,95,1,13,139,1,18,1,A,7,1,A,7,-4.4,A,7,-14.4,A,7,46,A,7,987,A,7,300,A,7,6.7,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,12:00,770,1411,484,1,13,629,1,9,140,1,13,506,1,13,624,1,9,164,1,13,307,1,21,3,A,7,3,A,7,-3.3,A,7,-13.9,A,7,44,A,7,987,A,7,300,A,7,7.7,A,7,16100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,13:00,809,1411,394,1,13,380,1,9,175,1,13,422,1,13,388,1,9,199,1,13,396,1,21,6,A,7,6,A,7,-1.7,A,7,-12.8,A,7,43,A,7,987,A,7,250,A,7,6.7,A,7,16100,B,7,1160,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,14:00,776,1411,499,1,13,605,1,9,166,1,13,516,1,13,595,1,9,187,1,13,356,1,21,5,A,7,5,A,7,-2.8,A,7,-13.9,A,7,43,A,7,987,A,7,300,A,7,6.2,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,15:00,671,1411,332,1,13,460,1,9,114,1,13,364,1,13,459,1,9,145,1,13,228,1,21,5,A,7,5,A,7,-1.7,A,7,-13.9,A,7,39,A,7,987,A,7,260,A,7,7.2,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,16:00,503,1411,272,1,13,498,1,9,96,1,13,282,1,13,458,1,9,119,1,13,180,1,21,4,A,7,4,A,7,-2.2,A,7,-15.0,A,7,37,A,7,987,A,7,290,A,7,7.2,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,17:00,283,1411,145,1,13,486,1,9,49,1,13,151,1,13,373,1,9,76,1,13,89,1,21,2,A,7,2,A,7,-2.8,A,7,-16.7,A,7,34,A,7,989,A,7,310,A,7,6.7,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,18:00,50,905,29,1,13,131,1,9,16,1,13,26,1,13,50,1,9,23,1,13,28,1,21,0,A,7,0,A,7,-3.9,A,7,-17.2,A,7,35,A,7,990,A,7,310,A,7,5.2,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.0,A,7,-16.7,A,7,40,A,7,991,A,7,300,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-15.6,A,7,46,A,7,992,A,7,330,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-15.0,A,7,50,A,7,992,A,7,310,A,7,3.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-14.4,A,7,52,A,7,992,A,7,300,A,7,3.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.7,A,7,-13.9,A,7,57,A,7,993,A,7,340,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/26/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-13.9,A,7,59,A,7,994,A,7,300,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.8,A,7,-13.3,A,7,65,A,7,994,A,7,280,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.3,A,7,-12.8,A,7,71,A,7,994,A,7,320,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-13.3,A,7,71,A,7,994,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-13.3,A,7,71,A,7,994,A,7,300,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.3,A,7,-12.8,A,7,71,A,7,994,A,7,300,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-13.3,A,7,71,A,7,995,A,7,300,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-9.4,A,7,-13.3,A,7,74,A,7,996,A,7,270,A,7,1.5,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,08:00,39,788,19,1,13,37,1,9,15,1,13,18,1,13,11,1,9,18,1,13,26,1,21,0,A,7,0,A,7,-9.4,A,7,-12.8,A,7,77,A,7,997,A,7,340,A,7,2.1,A,7,11300,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,09:00,266,1411,129,1,13,402,1,9,52,1,13,131,1,13,299,1,9,74,1,13,92,1,21,0,A,7,0,A,7,-5.6,A,7,-11.7,A,7,63,A,7,998,A,7,310,A,7,2.6,A,7,12900,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,10:00,490,1411,305,1,9,648,1,9,79,1,13,318,1,9,597,1,9,110,1,13,152,1,18,0,A,7,0,A,7,-3.9,A,7,-12.2,A,7,53,A,7,999,A,7,320,A,7,3.1,A,7,12900,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,11:00,664,1411,452,1,9,749,1,9,99,1,13,478,1,9,735,1,9,130,1,13,209,1,18,0,A,7,0,A,7,-2.2,A,7,-11.7,A,7,49,A,7,999,A,7,320,A,7,4.1,A,7,12900,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,12:00,774,1411,553,1,9,804,1,9,111,1,13,571,1,9,790,1,9,136,1,13,230,1,18,0,A,7,0,A,7,-0.6,A,7,-11.1,A,7,45,A,7,999,A,7,290,A,7,3.1,A,7,11300,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,13:00,814,1411,591,1,9,823,1,9,116,1,13,613,1,9,813,1,9,142,1,13,248,1,18,0,A,7,0,A,7,-0.6,A,7,-12.2,A,7,41,A,7,998,A,7,310,A,7,2.6,A,7,11300,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,14:00,781,1411,507,1,9,601,1,9,174,1,13,542,1,9,611,1,9,203,1,13,385,1,18,2,A,7,2,A,7,1.1,A,7,-11.7,A,7,38,A,7,998,A,7,300,A,7,5.2,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,15:00,676,1411,439,1,9,651,1,9,127,1,13,457,1,9,634,1,9,152,1,13,260,1,18,2,A,7,2,A,7,0.6,A,7,-12.8,A,7,37,A,7,997,A,7,260,A,7,3.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,16:00,508,1411,315,1,9,656,1,9,81,1,13,332,1,9,610,1,9,112,1,13,158,1,18,0,A,7,0,A,7,1.1,A,7,-13.9,A,7,32,A,7,998,A,7,280,A,7,4.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,17:00,288,1411,140,1,13,428,1,9,54,1,13,145,1,13,329,1,9,77,1,13,97,1,21,0,A,7,0,A,7,0.6,A,7,-15.0,A,7,30,A,7,998,A,7,300,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,18:00,53,929,25,1,13,54,1,9,19,1,13,24,1,13,18,1,9,23,1,13,33,1,21,0,A,7,0,A,7,-1.7,A,7,-13.3,A,7,41,A,7,999,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-12.2,A,7,49,A,7,999,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-11.1,A,7,53,A,7,1000,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-11.7,A,7,53,A,7,1000,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-11.1,A,7,65,A,7,1001,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.7,A,7,-10.0,A,7,78,A,7,1001,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/27/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.7,A,7,-10.6,A,7,74,A,7,1001,A,7,260,A,7,1.5,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.7,A,7,-11.1,A,7,71,A,7,1001,A,7,190,A,7,1.5,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-11.1,A,7,74,A,7,1001,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.8,A,7,-10.6,A,7,81,A,7,1001,A,7,230,A,7,1.5,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.3,A,7,-10.6,A,7,84,A,7,1001,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.8,A,7,-11.1,A,7,77,A,7,1001,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,-9.4,A,7,-11.7,A,7,84,A,7,1001,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,-6.7,A,7,-10.6,A,7,74,A,7,1002,A,7,230,A,7,1.5,A,7,12900,B,7,1160,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,08:00,41,811,23,1,13,73,1,9,16,1,13,21,1,13,26,1,9,20,1,13,28,1,21,3,A,7,3,A,7,-6.1,A,7,-10.0,A,7,74,A,7,1003,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,09:00,270,1410,104,1,13,87,1,9,87,1,13,111,1,13,66,1,9,99,1,13,187,1,21,7,A,7,7,A,7,-3.3,A,7,-7.2,A,7,75,A,7,1004,A,7,230,A,7,1.5,A,7,9700,B,7,1160,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/28/1988,10:00,494,1410,313,1,9,758,1,9,47,1,13,331,1,9,703,1,9,83,1,13,111,1,18,1,A,7,1,A,7,-0.6,A,7,-8.3,A,7,56,A,7,1004,A,7,210,A,7,2.6,A,7,9700,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/28/1988,11:00,668,1410,480,1,9,884,1,9,60,1,13,505,1,9,857,1,9,97,1,13,142,1,18,0,A,7,0,A,7,3.3,A,7,-8.9,A,7,41,A,7,1004,A,7,220,A,7,3.6,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -01/28/1988,12:00,779,1410,561,1,9,892,1,9,67,1,13,588,1,9,878,1,9,102,1,13,164,1,18,0,A,7,0,A,7,3.9,A,7,-8.9,A,7,39,A,7,1003,A,7,260,A,7,4.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,13:00,819,1410,614,1,9,935,1,9,70,1,13,644,1,9,923,1,9,106,1,13,173,1,18,0,A,7,0,A,7,5.0,A,7,-8.3,A,7,38,A,7,1002,A,7,280,A,7,5.2,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,14:00,786,1410,586,1,9,932,1,9,68,1,13,617,1,9,918,1,9,104,1,13,166,1,18,0,A,7,0,A,7,6.1,A,7,-8.3,A,7,35,A,7,1001,A,7,240,A,7,6.7,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,15:00,681,1410,492,1,9,894,1,9,61,1,13,519,1,9,868,1,9,98,1,13,145,1,18,0,A,7,0,A,7,6.1,A,7,-7.8,A,7,37,A,7,1001,A,7,250,A,7,6.2,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,16:00,513,1410,345,1,9,815,1,9,49,1,13,365,1,9,761,1,9,87,1,13,115,1,18,0,A,7,0,A,7,6.7,A,7,-7.8,A,7,35,A,7,1000,A,7,250,A,7,5.2,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,17:00,293,1410,164,1,13,633,1,9,35,1,13,173,1,13,512,1,9,66,1,13,72,1,21,0,A,7,0,A,7,5.6,A,7,-7.2,A,7,40,A,7,1000,A,7,230,A,7,4.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,18:00,56,952,33,1,13,171,1,9,16,1,13,28,1,13,79,1,9,23,1,13,29,1,21,0,A,7,0,A,7,3.9,A,7,-7.8,A,7,43,A,7,1001,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-7.2,A,7,52,A,7,1001,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-7.2,A,7,56,A,7,1002,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-6.7,A,7,64,A,7,1002,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.7,A,7,-6.7,A,7,69,A,7,1003,A,7,230,A,7,2.1,A,7,19300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.2,A,7,-6.7,A,7,72,A,7,1003,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/28/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-7.2,A,7,72,A,7,1003,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-7.2,A,7,75,A,7,1003,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-6.7,A,7,81,A,7,1003,A,7,60,A,7,1.5,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,-3.9,A,7,-6.7,A,7,81,A,7,1003,A,7,60,A,7,1.5,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,-4.4,A,7,-6.7,A,7,85,A,7,1003,A,7,70,A,7,1.5,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,-3.3,A,7,-6.7,A,7,78,A,7,1003,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,-5.0,A,7,-7.2,A,7,85,A,7,1004,A,7,360,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-7.2,A,7,78,A,7,1004,A,7,60,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,08:00,43,834,33,1,13,204,1,9,12,1,13,24,1,13,105,1,9,18,1,13,25,1,21,0,A,7,0,A,7,-3.9,A,7,-6.7,A,7,81,A,7,1005,A,7,50,A,7,2.6,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,09:00,273,1410,161,1,13,690,1,9,26,1,13,170,1,13,558,1,9,62,1,13,67,1,21,0,A,7,0,A,7,-2.2,A,7,-6.1,A,7,75,A,7,1005,A,7,30,A,7,3.1,A,7,16100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,10:00,498,1410,343,1,9,859,1,9,38,1,13,364,1,9,799,1,9,80,1,13,101,1,18,0,A,7,0,A,7,0.6,A,7,-5.6,A,7,64,A,7,1005,A,7,80,A,7,3.1,A,7,16100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,11:00,672,1410,494,1,9,934,1,9,48,1,13,524,1,9,907,1,9,89,1,13,129,1,18,0,A,7,0,A,7,3.9,A,7,-5.6,A,7,51,A,7,1005,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,12:00,784,1410,592,1,9,967,1,9,54,1,13,626,1,9,953,1,9,94,1,13,148,1,18,0,A,7,0,A,7,7.8,A,7,-5.6,A,7,39,A,7,1005,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,13:00,824,1410,628,1,9,977,1,9,56,1,13,663,1,9,967,1,9,96,1,13,155,1,18,0,A,7,0,A,7,8.9,A,7,-5.6,A,7,36,A,7,1004,A,7,170,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,14:00,791,1410,598,1,9,969,1,9,54,1,13,633,1,9,956,1,9,94,1,13,148,1,18,0,A,7,0,A,7,11.1,A,7,-5.0,A,7,32,A,7,1002,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,15:00,687,1410,502,1,9,934,1,9,48,1,13,534,1,9,910,1,9,89,1,13,130,1,18,0,A,7,0,A,7,11.7,A,7,-3.9,A,7,34,A,7,1001,A,7,170,A,7,4.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,16:00,518,1410,353,1,9,852,1,9,41,1,13,377,1,9,798,1,9,82,1,13,107,1,18,1,A,7,0,A,7,11.7,A,7,-3.9,A,7,34,A,7,1001,A,7,190,A,7,5.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,17:00,298,1410,173,1,13,692,1,9,28,1,13,186,1,13,573,1,9,64,1,13,71,1,21,1,A,7,0,A,7,11.1,A,7,-3.9,A,7,35,A,7,1001,A,7,180,A,7,4.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,18:00,59,975,36,1,13,183,1,9,16,1,13,29,1,13,85,1,9,23,1,13,29,1,21,1,A,7,1,A,7,7.2,A,7,-3.9,A,7,46,A,7,1001,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,-3.9,A,7,46,A,7,1001,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-3.3,A,7,57,A,7,1001,A,7,220,A,7,2.1,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-3.3,A,7,67,A,7,1001,A,7,210,A,7,2.1,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,0,A,7,0.6,A,7,-3.9,A,7,73,A,7,1001,A,7,210,A,7,3.1,A,7,19300,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,0,A,7,1.1,A,7,-3.9,A,7,70,A,7,1001,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/29/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,0,A,7,1.1,A,7,-3.9,A,7,70,A,7,1000,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,1,A,7,2.2,A,7,-3.9,A,7,64,A,7,1001,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,1,A,7,1.1,A,7,-3.9,A,7,70,A,7,1000,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,2,A,7,0.6,A,7,-4.4,A,7,70,A,7,1000,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,2,A,7,1.7,A,7,-3.3,A,7,70,A,7,1000,A,7,210,A,7,4.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,2,A,7,3.3,A,7,-3.3,A,7,62,A,7,1000,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,2.8,A,7,-3.3,A,7,65,A,7,1000,A,7,220,A,7,5.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,1.7,A,7,-3.9,A,7,67,A,7,1000,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,08:00,45,834,28,1,13,55,1,9,22,1,13,26,1,13,17,1,9,26,1,13,40,1,21,6,A,7,2,A,7,1.1,A,7,-3.9,A,7,70,A,7,1001,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,09:00,277,1410,118,1,13,242,1,9,70,1,13,125,1,13,180,1,9,89,1,13,133,1,21,8,A,7,3,A,7,4.4,A,7,-2.2,A,7,62,A,7,1001,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,10:00,502,1410,292,1,13,535,1,9,101,1,13,300,1,13,490,1,9,125,1,13,188,1,21,7,A,7,3,A,7,8.3,A,7,-2.8,A,7,46,A,7,1001,A,7,220,A,7,5.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,11:00,677,1410,457,1,13,705,1,9,118,1,13,478,1,13,690,1,9,145,1,13,245,1,21,7,A,7,3,A,7,11.7,A,7,-2.2,A,7,38,A,7,1001,A,7,220,A,7,6.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,12:00,788,1410,401,1,13,384,1,9,186,1,13,427,1,13,391,1,9,207,1,13,417,1,21,8,A,7,4,A,7,13.9,A,7,-0.6,A,7,37,A,7,1001,A,7,220,A,7,7.7,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,13:00,829,1410,541,1,13,643,1,9,162,1,13,564,1,13,641,1,9,186,1,13,370,1,21,8,A,7,4,A,7,14.4,A,7,-0.6,A,7,36,A,7,1000,A,7,230,A,7,8.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,14:00,796,1410,507,1,13,586,1,9,176,1,13,544,1,13,598,1,9,205,1,13,395,1,21,9,A,7,4,A,7,15.0,A,7,-0.6,A,7,35,A,7,999,A,7,220,A,7,7.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,15:00,692,1410,391,1,13,426,1,9,182,1,13,410,1,13,425,1,9,201,1,13,385,1,21,9,A,7,4,A,7,15.6,A,7,0.0,A,7,35,A,7,998,A,7,240,A,7,9.3,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,16:00,524,1410,230,1,13,240,1,9,141,1,13,246,1,13,233,1,9,159,1,13,290,1,21,10,A,7,5,A,7,16.1,A,7,-0.6,A,7,32,A,7,998,A,7,210,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,17:00,303,1410,133,1,13,299,1,9,69,1,13,139,1,13,232,1,9,89,1,13,126,1,21,10,A,7,4,A,7,14.4,A,7,0.0,A,7,38,A,7,998,A,7,230,A,7,5.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,18:00,62,999,31,1,13,50,1,9,25,1,13,31,1,13,22,1,9,29,1,13,52,1,21,10,A,7,4,A,7,13.3,A,7,0.0,A,7,40,A,7,998,A,7,210,A,7,6.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,10.6,A,7,0.0,A,7,48,A,7,998,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,9.4,A,7,0.0,A,7,52,A,7,998,A,7,190,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,10.0,A,7,-0.6,A,7,48,A,7,999,A,7,190,A,7,2.6,A,7,24100,B,7,7620,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,7.8,A,7,-0.6,A,7,56,A,7,999,A,7,180,A,7,3.1,A,7,24100,B,7,7620,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,7.8,A,7,-1.1,A,7,54,A,7,999,A,7,180,A,7,3.1,A,7,24100,B,7,7620,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/30/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,8.9,A,7,-1.1,A,7,50,A,7,998,A,7,190,A,7,4.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,2,A,7,7.8,A,7,-1.7,A,7,52,A,7,999,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,7.2,A,7,-2.2,A,7,52,A,7,998,A,7,190,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,6.1,A,7,0.0,A,7,65,A,7,999,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,6.1,A,7,3.3,A,7,83,A,7,999,A,7,200,A,7,2.6,A,7,24100,B,7,1220,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,6.7,A,7,5.6,A,7,93,A,7,999,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,7.2,A,7,6.1,A,7,93,A,7,998,A,7,180,A,7,2.6,A,7,24100,B,7,1220,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,5.6,A,7,5.0,A,7,96,A,7,998,A,7,220,A,7,2.6,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,08:00,47,857,18,1,13,11,1,9,17,1,13,19,1,13,6,1,9,19,1,13,41,1,21,8,A,7,7,A,7,6.1,A,7,6.1,A,7,100,A,7,999,A,7,160,A,7,2.1,A,7,9700,B,7,1220,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,09:00,281,1409,98,1,13,169,1,9,64,1,13,104,1,13,127,1,9,79,1,13,119,1,21,7,A,7,7,A,7,8.9,A,7,7.2,A,7,89,A,7,999,A,7,240,A,7,2.1,A,7,11300,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -01/31/1988,10:00,506,1409,117,1,9,2,1,9,116,1,13,133,1,9,1,1,9,133,1,13,453,1,18,10,A,7,10,A,7,10.0,A,7,7.8,A,7,86,A,7,1000,A,7,240,A,7,2.6,A,7,11300,B,7,1220,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,11:00,682,1409,212,1,9,11,1,9,206,1,13,239,1,9,9,1,9,234,1,13,793,1,18,10,A,7,10,A,7,12.2,A,7,8.3,A,7,77,A,7,1000,A,7,200,A,7,3.1,A,7,11300,B,7,1370,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,12:00,793,1409,266,1,9,80,1,9,220,1,13,292,1,9,80,1,9,246,1,13,705,1,18,10,A,7,9,A,7,14.4,A,7,8.9,A,7,70,A,7,999,A,7,210,A,7,3.6,A,7,11300,B,7,1370,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,13:00,834,1409,418,1,13,358,1,9,206,1,13,457,1,13,381,1,9,231,1,13,493,1,21,7,A,7,6,A,7,17.2,A,7,10.0,A,7,63,A,7,998,A,7,220,A,7,5.7,A,7,11300,B,7,2440,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,14:00,802,1409,430,1,13,429,1,9,187,1,13,460,1,13,437,1,9,210,1,13,424,1,21,9,A,7,7,A,7,18.3,A,7,8.9,A,7,54,A,7,997,A,7,220,A,7,6.2,A,7,16100,B,7,3050,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,15:00,698,1409,249,1,9,79,1,9,210,1,13,274,1,9,79,1,9,235,1,13,627,1,18,10,A,7,9,A,7,17.8,A,7,7.8,A,7,52,A,7,996,A,7,220,A,7,6.7,A,7,16100,B,7,1220,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,16:00,529,1409,207,1,9,56,1,9,185,1,13,226,1,9,54,1,9,205,1,13,485,1,18,10,A,7,8,A,7,17.8,A,7,7.8,A,7,52,A,7,996,A,7,200,A,7,6.2,A,7,16100,B,7,3050,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,17:00,308,1409,117,1,13,52,1,9,106,1,13,128,1,13,44,1,9,119,1,13,249,1,21,10,A,7,8,A,7,16.7,A,7,7.8,A,7,56,A,7,996,A,7,190,A,7,4.6,A,7,24100,B,7,7620,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,18:00,66,1022,18,1,13,6,1,9,18,1,13,20,1,13,3,1,9,20,1,13,45,1,21,10,A,7,8,A,7,15.6,A,7,8.3,A,7,62,A,7,996,A,7,180,A,7,4.6,A,7,24100,B,7,7620,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,14.4,A,7,7.8,A,7,65,A,7,996,A,7,190,A,7,3.1,A,7,24100,B,7,1220,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,7.8,A,7,67,A,7,996,A,7,180,A,7,3.1,A,7,24100,B,7,1220,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,8.3,A,7,67,A,7,996,A,7,210,A,7,3.1,A,7,24100,B,7,1220,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.1,A,7,5.6,A,7,80,A,7,996,A,7,200,A,7,3.2,A,7,16100,B,7,910,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -01/31/1988,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.8,A,7,2.9,A,7,93,A,7,996,A,7,190,A,7,3.2,A,7,16100,B,7,400,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -01/31/1988,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.5,A,7,0.2,A,7,93,A,7,996,A,7,190,A,7,3.3,A,7,16100,B,7,610,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -02/01/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,5.2,A,7,-2.4,A,7,49,A,7,987,A,7,60,A,7,3.4,A,7,16000,B,7,1402,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,2.9,A,7,-5.1,A,7,42,A,7,987,A,7,60,A,7,3.5,A,7,16000,B,7,1402,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,0.6,A,7,-7.8,A,7,42,A,7,987,A,7,60,A,7,3.5,A,7,16000,B,7,1402,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-10.6,A,7,46,A,7,987,A,7,60,A,7,3.6,A,7,16000,B,7,1341,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-9.4,A,7,52,A,7,988,A,7,70,A,7,4.1,A,7,16000,B,7,1341,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-7.8,A,7,59,A,7,988,A,7,90,A,7,3.6,A,7,16000,B,7,945,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-6.7,A,7,65,A,7,989,A,7,90,A,7,2.6,A,7,16000,B,7,610,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,08:00,49,881,6,1,10,0,1,16,6,1,10,7,1,10,0,1,16,7,1,10,24,1,21,10,E,9,10,E,9,-1.7,A,7,-7.2,A,7,63,A,7,989,A,7,90,A,7,3.6,A,7,16000,B,7,610,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,09:00,285,1409,53,1,24,0,1,27,53,1,24,61,1,24,0,1,27,61,1,24,198,1,43,10,E,9,10,A,7,-1.7,A,7,-7.8,A,7,59,A,7,989,A,7,100,A,7,4.1,A,7,16000,B,7,671,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,10:00,511,1409,106,1,24,0,1,27,106,1,24,122,1,24,0,1,27,122,1,24,425,1,43,10,E,9,10,A,7,-1.7,A,7,-8.3,A,7,57,A,7,990,A,7,90,A,7,4.6,A,7,16000,B,7,792,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,11:00,687,1409,149,1,24,0,1,27,149,1,24,173,1,24,0,1,27,173,1,24,634,1,43,10,E,9,10,A,7,-1.7,A,7,-8.3,A,7,57,A,7,990,A,7,80,A,7,2.6,A,7,16000,B,7,1402,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,12:00,799,1409,177,1,24,0,1,27,177,1,24,207,1,24,0,1,27,207,1,24,780,1,43,10,E,9,10,A,7,-1.7,A,7,-8.9,A,7,54,A,7,990,A,7,100,A,7,2.6,A,7,16000,B,7,1006,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,13:00,840,1409,187,1,24,0,1,27,187,1,24,219,1,24,0,1,27,219,1,24,835,1,43,10,E,9,10,A,7,-1.1,A,7,-8.9,A,7,51,A,7,989,A,7,90,A,7,3.1,A,7,16000,B,7,1006,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,14:00,807,1409,179,1,10,0,1,16,179,1,10,209,1,10,0,1,16,209,1,10,791,1,21,10,E,9,10,E,9,-1.1,A,7,-8.9,A,7,51,A,7,988,A,7,110,A,7,2.6,A,7,16000,B,7,1006,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,15:00,703,1409,153,1,10,0,1,16,153,1,10,178,1,10,0,1,16,178,1,10,655,1,21,10,E,9,10,E,9,-1.1,A,7,-8.9,A,7,51,A,7,988,A,7,130,A,7,3.1,A,7,16000,B,7,701,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,16:00,535,1409,112,1,11,0,1,16,112,1,11,129,1,11,0,1,16,129,1,11,453,1,22,10,B,8,10,B,8,-1.1,A,7,-7.8,A,7,57,A,7,988,A,7,150,A,7,3.1,A,7,16000,B,7,701,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,17:00,314,1409,59,1,10,0,1,16,59,1,10,68,1,10,0,1,16,68,1,10,222,1,21,10,E,9,10,E,9,-1.1,A,7,-7.8,A,7,57,A,7,988,A,7,100,A,7,1.5,A,7,16000,B,7,701,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,18:00,69,1045,9,1,10,0,1,16,9,1,10,11,1,10,0,1,16,11,1,10,35,1,21,10,E,9,10,E,9,-1.1,A,7,-7.8,A,7,57,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,762,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.1,A,7,-7.8,A,7,57,A,7,989,A,7,130,A,7,1.5,A,7,16000,B,7,701,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-1.1,A,7,-7.8,A,7,57,A,7,989,A,7,120,A,7,2.6,A,7,16000,B,7,701,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-7.2,A,7,63,A,7,989,A,7,120,A,7,2.6,A,7,16000,B,7,640,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-7.2,A,7,63,A,7,988,A,7,130,A,7,4.1,A,7,16000,B,7,579,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-7.2,A,7,63,A,7,988,A,7,110,A,7,3.6,A,7,16000,B,7,579,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/01/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-7.2,A,7,63,A,7,989,A,7,150,A,7,2.1,A,7,16000,B,7,579,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/02/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-2.8,A,7,-5.6,A,7,79,A,7,989,A,7,10,A,7,1.5,A,7,8000,B,7,579,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/02/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-3.3,A,7,-4.4,A,7,91,A,7,988,A,7,50,A,7,3.1,A,7,8000,B,7,823,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-3.3,A,7,-4.4,A,7,91,A,7,987,A,7,50,A,7,2.1,A,7,16000,B,7,762,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/02/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-2.8,A,7,-3.3,A,7,96,A,7,987,A,7,50,A,7,3.1,A,7,4800,B,7,213,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-2.8,A,7,-3.3,A,7,96,A,7,988,A,7,50,A,7,2.1,A,7,6400,B,7,152,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-1.7,A,7,-2.2,A,7,96,A,7,987,A,7,50,A,7,2.1,A,7,5600,B,7,152,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-1.1,A,7,-1.7,A,7,95,A,7,987,A,7,60,A,7,4.6,A,7,8000,B,7,366,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,08:00,51,904,6,1,24,0,1,27,6,1,24,7,1,24,0,1,27,7,1,24,24,1,43,10,E,9,10,A,7,-0.6,A,7,-1.1,A,7,96,A,7,988,A,7,80,A,7,5.2,A,7,4000,B,7,213,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,09:00,289,1408,57,1,24,0,1,27,57,1,24,65,1,24,0,1,27,65,1,24,210,1,43,10,E,9,10,A,7,-0.6,A,7,-1.7,A,7,91,A,7,988,A,7,60,A,7,4.6,A,7,4000,B,7,518,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,10:00,516,1408,92,1,24,0,1,27,92,1,24,107,1,24,0,1,27,107,1,24,382,1,43,10,E,9,10,A,7,-0.6,A,7,-1.1,A,7,96,A,7,988,A,7,80,A,7,4.6,A,7,4000,B,7,213,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,11:00,691,1408,128,1,24,0,1,27,128,1,24,150,1,24,0,1,27,150,1,24,565,1,43,10,E,9,10,A,7,-0.6,A,7,-1.1,A,7,96,A,7,989,A,7,0,A,7,0.0,A,7,4000,B,7,396,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,12:00,804,1408,152,1,24,0,1,27,152,1,24,180,1,24,0,1,27,180,1,24,695,1,43,10,E,9,10,A,7,0.0,A,7,-0.6,A,7,95,A,7,988,A,7,0,A,7,0.0,A,7,800,B,7,213,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,13:00,845,1408,134,1,24,0,1,27,134,1,24,161,1,24,0,1,27,161,1,24,639,1,43,10,E,9,10,A,7,0.0,A,7,-1.1,A,7,91,A,7,985,A,7,30,A,7,4.1,A,7,3200,B,7,152,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,14:00,813,1408,128,1,10,0,1,16,128,1,10,154,1,10,0,1,16,154,1,10,606,1,21,10,E,9,10,E,9,0.0,A,7,-0.6,A,7,95,A,7,984,A,7,80,A,7,3.1,A,7,3200,B,7,183,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,15:00,709,1408,110,1,10,0,1,16,110,1,10,131,1,10,0,1,16,131,1,10,504,1,21,10,E,9,10,E,9,0.0,A,7,-0.6,A,7,95,A,7,984,A,7,60,A,7,5.2,A,7,3200,B,7,183,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,16:00,540,1408,97,1,24,0,1,27,97,1,24,113,1,24,0,1,27,113,1,24,407,1,43,10,E,9,10,A,7,0.0,A,7,-1.1,A,7,91,A,7,984,A,7,50,A,7,5.2,A,7,1600,B,7,244,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,17:00,319,1408,44,1,10,0,1,16,44,1,10,52,1,10,0,1,16,52,1,10,176,1,21,10,E,9,10,E,9,-1.1,A,7,-1.7,A,7,95,A,7,985,A,7,50,A,7,6.2,A,7,800,B,7,183,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,18:00,73,1068,11,1,10,0,1,16,11,1,10,13,1,10,0,1,16,13,1,10,42,1,21,10,E,9,10,E,9,-1.7,A,7,-2.2,A,7,96,A,7,984,A,7,50,A,7,5.2,A,7,1600,B,7,671,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-2.2,A,7,-2.8,A,7,95,A,7,983,A,7,50,A,7,6.2,A,7,1600,B,7,366,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/02/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-2.8,A,7,-3.9,A,7,91,A,7,983,A,7,60,A,7,7.2,A,7,8000,B,7,457,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/02/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-3.9,A,7,-5.0,A,7,91,A,7,983,A,7,60,A,7,8.2,A,7,2800,B,7,701,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/02/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-4.4,A,7,-16.7,A,7,33,A,7,983,A,7,50,A,7,7.7,A,7,4800,B,7,975,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/02/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-5.0,A,7,-11.6,B,8,56,A,7,983,A,7,40,A,7,7.7,A,7,4000,B,7,762,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/02/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-5.0,A,7,-6.7,A,7,86,A,7,982,A,7,40,A,7,7.7,A,7,5600,B,7,1067,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-5.6,A,7,-6.7,A,7,91,A,7,983,A,7,50,A,7,7.7,A,7,6400,B,7,762,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/03/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-5.6,A,7,-6.7,A,7,91,A,7,983,A,7,30,A,7,4.6,A,7,16000,B,7,1067,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-5.6,A,7,-6.7,A,7,91,A,7,983,A,7,30,A,7,5.7,A,7,11200,B,7,274,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-6.1,A,7,-6.7,A,7,95,A,7,982,A,7,50,A,7,5.2,A,7,8000,B,7,274,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/03/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-6.1,A,7,-7.8,A,7,86,A,7,984,A,7,30,A,7,6.2,A,7,11200,B,7,427,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-6.7,A,7,-7.8,A,7,91,A,7,984,A,7,60,A,7,6.7,A,7,16000,B,7,335,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-6.7,A,7,-7.8,A,7,91,A,7,985,A,7,50,A,7,5.7,A,7,16000,B,7,335,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,08:00,53,927,7,1,10,0,1,16,7,1,10,9,1,10,0,1,16,9,1,10,27,1,21,10,E,9,10,E,9,-6.7,A,7,-8.3,A,7,87,A,7,986,A,7,30,A,7,4.6,A,7,16000,B,7,1676,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,09:00,293,1408,53,1,24,0,1,27,53,1,24,61,1,24,0,1,27,61,1,24,200,1,43,10,E,9,10,A,7,-6.1,A,7,-8.3,A,7,83,A,7,987,A,7,30,A,7,5.2,A,7,16000,B,7,1311,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,10:00,520,1408,107,1,10,0,1,16,107,1,10,123,1,10,0,1,16,123,1,10,432,1,21,10,E,9,10,E,9,-5.6,A,7,-7.8,A,7,83,A,7,988,A,7,50,A,7,5.2,A,7,16000,B,7,1311,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,11:00,696,1408,150,1,24,0,1,27,150,1,24,174,1,24,0,1,27,174,1,24,642,1,43,10,E,9,10,A,7,-5.6,A,7,-7.8,A,7,83,A,7,988,A,7,10,A,7,4.6,A,7,16000,B,7,518,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,12:00,809,1408,178,1,10,0,1,16,178,1,10,208,1,10,0,1,16,208,1,10,789,1,21,10,E,9,10,E,9,-5.6,A,7,-7.8,A,7,83,A,7,987,A,7,30,A,7,5.2,A,7,16000,B,7,488,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,13:00,851,1408,189,1,24,0,1,27,189,1,24,221,1,24,0,1,27,221,1,24,847,1,43,10,E,9,10,A,7,-5.6,A,7,-8.3,A,7,79,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,1128,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,14:00,818,1408,181,1,25,0,1,28,181,1,25,212,1,25,0,1,28,212,1,25,804,1,45,10,B,8,10,B,8,-5.6,A,7,-7.8,A,7,83,A,7,987,A,7,30,A,7,4.6,A,7,16000,B,7,1067,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/03/1996,15:00,714,1408,155,1,25,0,1,28,155,1,25,180,1,25,0,1,28,180,1,25,667,1,45,10,B,8,10,B,8,-5.6,A,7,-7.2,A,7,87,A,7,987,A,7,40,A,7,5.2,A,7,8000,B,7,457,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/03/1996,16:00,546,1408,113,1,25,0,1,28,113,1,25,130,1,25,0,1,28,130,1,25,460,1,45,10,B,8,10,B,8,-5.6,A,7,-7.8,A,7,83,A,7,987,A,7,40,A,7,4.1,A,7,16000,B,7,1189,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/03/1996,17:00,324,1408,60,1,25,0,1,28,60,1,25,69,1,25,0,1,28,69,1,25,228,1,45,10,B,8,10,B,8,-5.6,A,7,-7.8,A,7,83,A,7,988,A,7,50,A,7,4.1,A,7,16000,B,7,1067,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/03/1996,18:00,77,1091,10,1,10,0,1,16,10,1,10,12,1,10,0,1,16,12,1,10,39,1,21,10,E,9,10,E,9,-5.6,A,7,-7.2,A,7,87,A,7,989,A,7,50,A,7,4.1,A,7,11200,B,7,1128,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/03/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-5.6,A,7,-7.2,A,7,87,A,7,990,A,7,360,A,7,2.6,A,7,11200,B,7,579,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/03/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-6.7,A,7,-8.3,A,7,87,A,7,990,A,7,10,A,7,2.6,A,7,11200,B,7,1372,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-7.2,A,7,-9.4,A,7,82,A,7,990,A,7,30,A,7,3.1,A,7,11200,B,7,1676,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-7.2,A,7,-9.4,A,7,82,A,7,990,A,7,20,A,7,2.6,A,7,16000,B,7,2134,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-7.8,A,7,-10.6,A,7,78,A,7,991,A,7,360,A,7,4.1,A,7,16000,B,7,1372,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/03/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-8.3,A,7,-11.1,A,7,78,A,7,990,A,7,20,A,7,3.6,A,7,16000,B,7,1981,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-8.9,A,7,-11.7,A,7,78,A,7,991,A,7,350,A,7,3.1,A,7,16000,B,7,1524,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/04/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-9.4,A,7,-12.2,A,7,78,A,7,991,A,7,360,A,7,3.1,A,7,4800,B,7,1341,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/04/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-10.0,A,7,-12.8,A,7,78,A,7,992,A,7,360,A,7,3.1,A,7,5600,B,7,1128,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/04/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-10.6,A,7,-12.8,A,7,82,A,7,993,A,7,10,A,7,3.6,A,7,4000,B,7,1311,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/04/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-11.7,A,7,-13.3,A,7,87,A,7,993,A,7,350,A,7,2.6,A,7,16000,B,7,1372,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-12.2,A,7,-15.0,A,7,77,A,7,994,A,7,10,A,7,4.1,A,7,16000,B,7,1402,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,E,9,4,E,9,-12.8,A,7,-15.6,A,7,77,A,7,995,A,7,340,A,7,2.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,08:00,56,927,21,1,11,156,1,16,11,1,11,22,1,11,74,1,16,17,1,11,21,1,22,4,B,8,4,B,8,-12.8,A,7,-16.1,A,7,74,A,7,995,A,7,360,A,7,2.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,09:00,298,1408,152,1,11,370,1,16,74,1,11,158,1,11,285,1,16,97,1,11,136,1,22,5,B,8,5,B,8,-11.7,A,7,-16.1,A,7,67,A,7,996,A,7,10,A,7,3.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,10:00,525,1408,250,1,11,322,1,16,130,1,11,269,1,11,313,1,16,152,1,11,263,1,22,6,B,8,6,B,8,-10.6,A,7,-15.0,A,7,67,A,7,997,A,7,20,A,7,3.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,11:00,701,1408,294,1,11,313,1,16,137,1,11,317,1,11,314,1,16,160,1,11,283,1,22,6,B,8,6,B,8,-10.0,A,7,-15.0,A,7,64,A,7,997,A,7,10,A,7,3.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,12:00,814,1408,477,1,11,440,1,16,222,1,11,501,1,11,448,1,16,240,1,11,517,1,22,7,B,8,7,B,8,-8.9,A,7,-14.4,A,7,61,A,7,997,A,7,10,A,7,4.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,13:00,856,1408,515,1,10,536,1,16,188,1,10,553,1,10,551,1,16,217,1,10,446,1,21,8,E,9,8,E,9,-8.9,A,7,-13.9,A,7,64,A,7,996,A,7,340,A,7,4.6,A,7,16000,B,7,792,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,14:00,824,1408,188,1,10,0,1,16,188,1,10,219,1,10,0,1,16,219,1,10,830,1,21,10,E,9,10,E,9,-7.8,A,7,-12.2,A,7,68,A,7,996,A,7,320,A,7,6.2,A,7,16000,B,7,732,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,15:00,720,1408,163,1,10,0,1,16,163,1,10,189,1,10,0,1,16,189,1,10,696,1,21,10,E,9,10,E,9,-8.9,A,7,-11.7,A,7,78,A,7,996,A,7,330,A,7,3.6,A,7,3200,B,7,792,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/04/1996,16:00,551,1408,122,1,10,0,1,16,122,1,10,140,1,10,0,1,16,140,1,10,490,1,21,10,E,9,10,E,9,-7.8,A,7,-12.8,A,7,64,A,7,997,A,7,300,A,7,4.1,A,7,16000,B,7,945,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,17:00,329,1408,68,1,10,0,1,16,68,1,10,77,1,10,0,1,16,77,1,10,252,1,21,10,E,9,10,E,9,-8.3,A,7,-11.7,A,7,74,A,7,997,A,7,300,A,7,4.6,A,7,11200,B,7,975,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,18:00,80,1114,13,1,10,0,1,16,13,1,10,15,1,10,0,1,16,15,1,10,49,1,21,10,E,9,10,E,9,-8.3,A,7,-11.1,A,7,78,A,7,998,A,7,350,A,7,3.6,A,7,8000,B,7,823,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/04/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,-10.0,A,7,-13.3,A,7,74,A,7,999,A,7,330,A,7,2.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-11.1,A,7,-15.0,A,7,70,A,7,1000,A,7,310,A,7,2.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-11.7,A,7,-16.7,A,7,63,A,7,1001,A,7,320,A,7,4.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-12.2,A,7,-17.2,A,7,63,A,7,1001,A,7,310,A,7,5.2,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-13.3,A,7,-17.2,A,7,70,A,7,1002,A,7,310,A,7,3.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/04/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-13.9,A,7,-17.2,A,7,74,A,7,1002,A,7,320,A,7,3.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,-14.4,A,7,-17.8,A,7,73,A,7,1002,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-14.4,A,7,-18.3,A,7,70,A,7,1002,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-15.0,A,7,-18.3,A,7,73,A,7,1002,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-15.6,A,7,-18.3,A,7,78,A,7,1002,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-16.7,A,7,-18.3,A,7,86,A,7,1002,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-16.7,A,7,-18.9,A,7,81,A,7,1003,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,-16.7,A,7,-18.9,A,7,81,A,7,1004,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,08:00,59,950,20,1,11,136,1,16,11,1,11,21,1,11,65,1,16,17,1,11,21,1,22,0,B,8,0,B,8,-16.1,A,7,-18.3,A,7,81,A,7,1004,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,09:00,302,1407,166,1,11,576,1,16,42,1,11,170,1,11,467,1,16,69,1,11,81,1,22,0,B,8,0,B,8,-13.3,A,7,-17.2,A,7,70,A,7,1004,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,10:00,530,1407,350,1,11,767,1,16,61,1,11,368,1,11,723,1,16,95,1,11,128,1,22,0,B,8,0,B,8,-11.7,A,7,-16.1,A,7,67,A,7,1004,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,11:00,707,1407,499,1,11,842,1,16,76,1,11,532,1,11,830,1,16,113,1,11,171,1,22,0,B,8,0,B,8,-10.6,A,7,-15.0,A,7,67,A,7,1004,A,7,230,A,7,2.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,12:00,820,1407,572,1,11,837,1,16,84,1,11,597,1,11,826,1,16,114,1,11,184,1,22,0,B,8,0,B,8,-8.9,A,7,-13.9,A,7,64,A,7,1003,A,7,260,A,7,3.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,13:00,862,1407,634,1,10,892,1,16,88,1,10,662,1,10,883,1,16,119,1,10,196,1,21,0,E,9,0,E,9,-7.8,A,7,-12.2,A,7,68,A,7,1002,A,7,260,A,7,3.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,14:00,830,1407,473,1,10,234,1,16,335,1,10,509,1,10,243,1,16,365,1,10,898,1,21,7,E,9,7,E,9,-6.7,A,7,-10.6,A,7,71,A,7,1001,A,7,250,A,7,3.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,15:00,726,1407,343,1,10,336,1,16,169,1,10,374,1,10,351,1,16,192,1,10,371,1,21,8,E,9,7,E,9,-6.1,A,7,-9.4,A,7,75,A,7,1000,A,7,260,A,7,3.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,16:00,557,1407,320,1,24,530,1,27,110,1,24,330,1,24,498,1,27,132,1,24,210,1,43,3,E,9,3,A,7,-6.1,A,7,-8.9,A,7,78,A,7,999,A,7,260,A,7,3.1,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,17:00,335,1407,183,1,24,579,1,27,45,1,24,188,1,24,485,1,27,72,1,24,88,1,43,2,E,9,2,A,7,-5.6,A,7,-8.3,A,7,79,A,7,999,A,7,250,A,7,3.6,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,18:00,84,1137,30,1,25,191,1,28,16,1,25,32,1,25,98,1,28,25,1,25,30,1,45,1,B,8,1,B,8,-6.1,A,7,-8.3,A,7,83,A,7,999,A,7,240,A,7,3.1,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,-6.7,A,7,-8.3,A,7,87,A,7,999,A,7,240,A,7,4.1,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-7.8,A,7,-8.9,A,7,91,A,7,999,A,7,250,A,7,2.1,A,7,11200,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-7.8,A,7,-8.9,A,7,91,A,7,999,A,7,230,A,7,2.1,A,7,11200,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-8.3,A,7,-9.4,A,7,91,A,7,999,A,7,240,A,7,2.6,A,7,11200,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-8.3,A,7,-9.4,A,7,91,A,7,999,A,7,220,A,7,1.5,A,7,11200,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/05/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-8.3,A,7,-10.0,A,7,86,A,7,998,A,7,250,A,7,2.1,A,7,11200,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,-9.4,A,7,-10.0,A,7,95,A,7,998,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-8.9,A,7,-10.0,A,7,91,A,7,998,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-8.3,A,7,-10.0,A,7,86,A,7,998,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-9.4,A,7,-10.6,A,7,90,A,7,999,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-10.6,A,7,-11.7,A,7,91,A,7,999,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-8.9,A,7,-10.0,A,7,91,A,7,1000,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,-9.4,A,7,-11.1,A,7,86,A,7,1000,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/06/1996,08:00,61,973,23,1,25,209,1,28,10,1,25,25,1,25,116,1,28,18,1,25,23,1,45,0,B,8,0,B,8,-9.4,A,7,-11.1,A,7,86,A,7,1001,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/06/1996,09:00,307,1407,177,1,25,653,1,28,35,1,25,188,1,25,544,1,28,69,1,25,77,1,45,0,B,8,0,B,8,-6.1,A,7,-10.0,A,7,71,A,7,1002,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,10:00,535,1407,364,1,25,825,1,28,50,1,25,384,1,25,776,1,28,88,1,25,118,1,45,0,B,8,0,B,8,-3.3,A,7,-8.3,A,7,65,A,7,1002,A,7,250,A,7,1.5,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,11:00,712,1407,519,1,25,901,1,28,62,1,25,546,1,25,879,1,28,99,1,25,150,1,45,0,B,8,0,B,8,-2.2,A,7,-9.4,A,7,54,A,7,1002,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,12:00,825,1407,620,1,25,937,1,28,70,1,25,651,1,25,926,1,28,106,1,25,174,1,45,0,B,8,0,B,8,-1.1,A,7,-8.3,A,7,54,A,7,1002,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,13:00,867,1407,658,1,24,948,1,27,73,1,24,690,1,24,940,1,27,108,1,24,185,1,43,0,E,9,0,A,7,-1.1,A,7,-6.7,A,7,62,A,7,1001,A,7,270,A,7,1.5,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,14:00,835,1407,628,1,25,939,1,28,70,1,25,659,1,25,929,1,28,106,1,25,176,1,45,0,B,8,0,B,8,-0.6,A,7,-6.7,A,7,60,A,7,1000,A,7,120,A,7,1.5,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,15:00,731,1407,535,1,25,907,1,28,64,1,25,564,1,25,888,1,28,101,1,25,154,1,45,0,B,8,0,B,8,0.6,A,7,-6.1,A,7,57,A,7,1000,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,16:00,562,1407,387,1,25,837,1,28,52,1,25,408,1,25,793,1,28,90,1,25,123,1,45,0,B,8,0,B,8,0.6,A,7,-5.0,A,7,63,A,7,999,A,7,230,A,7,2.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,17:00,340,1407,203,1,25,684,1,28,37,1,25,214,1,25,585,1,28,72,1,25,84,1,45,0,B,8,0,B,8,0.6,A,7,-4.4,A,7,66,A,7,1000,A,7,260,A,7,2.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,18:00,88,1161,36,1,25,280,1,28,15,1,25,39,1,25,163,1,28,26,1,25,31,1,45,0,B,8,0,B,8,0.0,A,7,-3.9,A,7,72,A,7,1000,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,-1.7,A,7,-2.8,A,7,91,A,7,1000,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,B,8,1,B,8,-2.2,A,7,-3.9,A,7,87,A,7,999,A,7,160,A,7,1.5,A,7,11200,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,B,8,2,B,8,-2.2,A,7,-3.3,A,7,91,A,7,1000,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/06/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,B,8,2,B,8,-3.9,A,7,-4.4,A,7,96,A,7,1000,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/06/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,B,8,3,B,8,-5.0,A,7,-5.6,A,7,95,A,7,999,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/06/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,E,9,4,E,9,-3.9,A,7,-4.4,A,7,96,A,7,999,A,7,180,A,7,1.5,A,7,5600,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/07/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,E,9,3,E,9,-3.9,A,7,-5.0,A,7,91,A,7,998,A,7,190,A,7,2.6,A,7,8000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/07/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,B,8,4,B,8,-3.9,A,7,-6.1,A,7,83,A,7,997,A,7,180,A,7,3.6,A,7,8000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/07/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,6,B,8,-3.9,A,7,-6.1,A,7,83,A,7,997,A,7,200,A,7,3.6,A,7,11200,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,B,8,7,B,8,-4.4,A,7,-6.7,A,7,82,A,7,997,A,7,210,A,7,3.1,A,7,8000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/07/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,B,8,9,B,8,-5.6,A,7,-6.7,A,7,91,A,7,997,A,7,180,A,7,2.1,A,7,8000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/07/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-4.4,A,7,-6.1,A,7,86,A,7,997,A,7,0,A,7,0.0,A,7,8000,B,7,1341,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/07/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-4.4,A,7,-6.1,A,7,86,A,7,997,A,7,0,A,7,0.0,A,7,8000,B,7,1280,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/07/1996,08:00,64,996,9,1,10,0,1,16,9,1,10,11,1,10,0,1,16,11,1,10,35,1,21,10,E,9,10,E,9,-3.9,A,7,-5.6,A,7,86,A,7,997,A,7,0,A,7,0.0,A,7,4800,B,7,1402,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/07/1996,09:00,311,1406,122,1,24,47,1,27,111,1,24,133,1,24,40,1,27,124,1,24,258,1,43,9,E,9,9,A,7,-2.8,A,7,-5.6,A,7,79,A,7,998,A,7,220,A,7,2.6,A,7,6400,B,7,1189,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/07/1996,10:00,540,1406,220,1,25,155,1,28,161,1,25,240,1,25,151,1,28,182,1,25,374,1,45,8,B,8,8,B,8,-1.1,A,7,-3.9,A,7,79,A,7,998,A,7,220,A,7,3.6,A,7,8000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/07/1996,11:00,717,1406,401,1,25,287,1,28,255,1,25,424,1,25,298,1,28,271,1,25,608,1,45,7,B,8,7,B,8,0.6,A,7,-3.9,A,7,69,A,7,997,A,7,210,A,7,5.2,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,12:00,831,1406,426,1,25,280,1,28,261,1,25,457,1,25,297,1,28,281,1,25,652,1,45,7,B,8,6,B,8,1.7,A,7,-2.8,A,7,70,A,7,995,A,7,200,A,7,4.1,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,13:00,873,1406,437,1,10,526,1,16,110,1,10,471,1,10,537,1,16,137,1,10,279,1,21,6,E,9,5,E,9,2.8,A,7,-2.2,A,7,68,A,7,994,A,7,220,A,7,3.6,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,14:00,841,1406,450,1,11,442,1,16,185,1,11,483,1,11,454,1,16,211,1,11,433,1,22,6,B,8,6,B,8,4.4,A,7,-1.1,A,7,67,A,7,993,A,7,260,A,7,3.1,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,15:00,737,1406,387,1,10,276,1,16,242,1,10,411,1,10,288,1,16,260,1,10,573,1,21,7,E,9,6,E,9,5.6,A,7,-0.6,A,7,64,A,7,992,A,7,240,A,7,3.6,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,16:00,568,1406,113,1,24,0,1,27,113,1,24,131,1,24,0,1,27,131,1,24,469,1,43,10,E,9,10,A,7,5.6,A,7,-1.1,A,7,61,A,7,992,A,7,240,A,7,3.6,A,7,16000,B,7,1524,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,17:00,345,1406,60,1,10,0,1,16,60,1,10,69,1,10,0,1,16,69,1,10,233,1,21,10,E,9,10,E,9,5.0,A,7,-0.6,A,7,67,A,7,991,A,7,320,A,7,2.6,A,7,16000,B,7,1829,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,18:00,92,1184,13,1,10,0,1,16,13,1,10,15,1,10,0,1,16,15,1,10,49,1,21,10,E,9,10,E,9,2.8,A,7,-0.6,A,7,78,A,7,991,A,7,310,A,7,2.6,A,7,16000,B,7,1676,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,3.3,A,7,-0.6,A,7,75,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,1829,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,9,A,7,3.3,A,7,0.0,A,7,79,A,7,991,A,7,180,A,7,1.5,A,7,16000,B,7,2286,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,2.2,A,7,0.0,A,7,85,A,7,991,A,7,240,A,7,2.1,A,7,11200,B,7,2134,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/07/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,3.9,A,7,-1.1,A,7,69,A,7,991,A,7,250,A,7,4.1,A,7,16000,B,7,1524,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/07/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,2.8,A,7,0.6,A,7,85,A,7,991,A,7,240,A,7,4.1,A,7,11200,B,7,1463,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/07/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,2.8,A,7,1.1,A,7,89,A,7,990,A,7,240,A,7,4.6,A,7,11200,B,7,1676,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/08/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,2.8,A,7,1.1,A,7,89,A,7,989,A,7,240,A,7,4.6,A,7,16000,B,7,2438,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/08/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,2.8,A,7,1.1,A,7,89,A,7,989,A,7,240,A,7,4.1,A,7,16000,B,7,2896,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,2.8,A,7,1.1,A,7,89,A,7,988,A,7,230,A,7,4.6,A,7,16000,B,7,1524,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,2.8,A,7,1.1,A,7,89,A,7,988,A,7,240,A,7,4.6,A,7,16000,B,7,1402,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,9,A,7,3.3,A,7,0.6,A,7,82,A,7,987,A,7,240,A,7,5.2,A,7,16000,B,7,3048,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,3.3,A,7,0.6,A,7,82,A,7,987,A,7,240,A,7,4.1,A,7,16000,B,7,2438,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,3.3,A,7,0.6,A,7,82,A,7,987,A,7,240,A,7,5.2,A,7,16000,B,7,1981,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,08:00,67,1019,16,1,25,40,1,28,14,1,25,19,1,25,15,1,28,18,1,25,23,1,45,7,B,8,7,B,8,3.9,A,7,0.0,A,7,76,A,7,986,A,7,240,A,7,5.2,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,09:00,316,1406,126,1,24,234,1,27,73,1,24,134,1,24,187,1,27,92,1,24,137,1,43,3,E,9,3,A,7,4.4,A,7,0.0,A,7,73,A,7,986,A,7,240,A,7,5.2,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,10:00,545,1406,254,1,25,220,1,28,169,1,25,276,1,25,215,1,28,193,1,25,394,1,45,6,B,8,6,B,8,6.7,A,7,0.6,A,7,65,A,7,985,A,7,240,A,7,6.2,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,11:00,722,1406,274,1,24,167,1,27,188,1,24,302,1,24,173,1,27,213,1,24,473,1,43,9,E,9,9,A,7,6.7,A,7,0.0,A,7,62,A,7,985,A,7,240,A,7,5.7,A,7,16000,B,7,2743,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,12:00,836,1406,338,1,24,76,1,27,292,1,24,371,1,24,77,1,27,324,1,24,916,1,43,9,E,9,9,A,7,8.3,A,7,0.6,A,7,58,A,7,984,A,7,250,A,7,5.7,A,7,16000,B,7,2743,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,13:00,879,1406,357,1,24,153,1,27,261,1,24,392,1,24,161,1,27,291,1,24,724,1,43,8,E,9,8,A,7,8.9,A,7,1.1,A,7,58,A,7,983,A,7,250,A,7,6.2,A,7,16000,B,7,2591,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,14:00,847,1406,176,1,24,0,1,27,176,1,24,207,1,24,0,1,27,207,1,24,800,1,43,10,E,9,10,A,7,9.4,A,7,1.7,A,7,59,A,7,982,A,7,240,A,7,6.2,A,7,16000,B,7,2438,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,15:00,742,1406,458,1,24,620,1,27,131,1,24,481,1,24,614,1,27,155,1,24,284,1,43,3,E,9,3,A,7,9.4,A,7,2.2,A,7,61,A,7,981,A,7,230,A,7,5.2,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,16:00,573,1406,238,1,25,268,1,28,129,1,25,259,1,25,267,1,28,149,1,25,261,1,45,3,B,8,3,B,8,9.4,A,7,3.3,A,7,66,A,7,980,A,7,270,A,7,3.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,17:00,350,1406,199,1,25,448,1,28,87,1,25,206,1,25,370,1,28,114,1,25,161,1,45,4,B,8,4,B,8,11.1,A,7,5.0,A,7,66,A,7,979,A,7,240,A,7,7.7,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,18:00,96,1207,23,1,25,36,1,28,20,1,25,26,1,25,18,1,28,24,1,25,41,1,45,4,B,8,4,B,8,11.1,A,7,6.1,A,7,71,A,7,979,A,7,240,A,7,6.7,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,E,9,4,A,7,10.6,A,7,6.7,A,7,77,A,7,978,A,7,240,A,7,6.7,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,B,8,7,B,8,11.1,A,7,7.2,A,7,77,A,7,977,A,7,240,A,7,7.2,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,11.1,A,7,7.2,A,7,77,A,7,977,A,7,240,A,7,6.7,A,7,16000,B,7,2134,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/08/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,11.7,A,7,7.2,A,7,74,A,7,978,A,7,250,A,7,6.7,A,7,16000,B,7,945,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/08/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,10.6,A,7,7.8,A,7,83,A,7,977,A,7,260,A,7,4.6,A,7,16000,B,7,1524,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/08/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,11.1,A,7,7.8,A,7,80,A,7,976,A,7,250,A,7,5.2,A,7,16000,B,7,1829,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/09/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,10.6,A,7,9.4,A,7,92,A,7,977,A,7,260,A,7,7.2,A,7,8000,B,7,1433,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/09/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,9.4,A,7,8.9,A,7,97,A,7,976,A,7,260,A,7,3.6,A,7,8000,B,7,3048,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/09/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,9.4,A,7,8.9,A,7,97,A,7,976,A,7,260,A,7,4.1,A,7,8000,B,7,3353,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/09/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,9,A,7,9.4,A,7,8.9,A,7,97,A,7,976,A,7,260,A,7,4.6,A,7,8000,B,7,3353,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/09/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,E,9,2,A,7,8.3,A,7,7.8,A,7,97,A,7,976,A,7,270,A,7,4.1,A,7,8000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/09/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,B,8,1,B,8,6.7,A,7,5.6,A,7,93,A,7,976,A,7,300,A,7,3.1,A,7,11200,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,5.6,A,7,5.0,A,7,96,A,7,976,A,7,260,A,7,2.6,A,7,8000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/09/1996,08:00,71,1042,22,1,25,91,1,28,15,1,25,24,1,25,39,1,28,21,1,25,26,1,45,0,B,8,0,B,8,6.7,A,7,5.0,A,7,89,A,7,977,A,7,270,A,7,4.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,09:00,321,1405,166,1,25,480,1,28,56,1,25,171,1,25,387,1,28,82,1,25,102,1,45,0,B,8,0,B,8,8.9,A,7,5.6,A,7,80,A,7,977,A,7,280,A,7,4.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,10:00,550,1405,346,1,25,674,1,28,82,1,25,364,1,25,640,1,28,113,1,25,164,1,45,0,B,8,0,B,8,10.6,A,7,3.3,A,7,61,A,7,978,A,7,290,A,7,8.2,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,11:00,728,1405,503,1,25,774,1,28,102,1,25,521,1,25,757,1,28,127,1,25,209,1,45,0,B,8,0,B,8,12.2,A,7,1.7,A,7,49,A,7,978,A,7,290,A,7,8.2,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,12:00,842,1405,590,1,25,795,1,28,113,1,25,616,1,25,790,1,28,141,1,25,254,1,45,0,B,8,0,B,8,12.2,A,7,0.6,A,7,45,A,7,979,A,7,300,A,7,11.3,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,13:00,884,1405,620,1,10,799,1,16,117,1,10,650,1,10,797,1,16,146,1,10,275,1,21,0,E,9,0,E,9,12.8,A,7,-0.6,A,7,39,A,7,979,A,7,300,A,7,11.8,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,14:00,852,1405,605,1,11,809,1,16,114,1,11,632,1,11,804,1,16,143,1,11,259,1,22,0,B,8,0,B,8,12.8,A,7,-1.7,A,7,36,A,7,979,A,7,320,A,7,8.2,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,15:00,748,1405,514,1,11,770,1,16,104,1,11,533,1,11,756,1,16,129,1,11,216,1,22,0,B,8,0,B,8,12.8,A,7,-1.1,A,7,38,A,7,979,A,7,310,A,7,8.8,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,16:00,579,1405,349,1,11,640,1,16,85,1,11,368,1,11,615,1,16,114,1,11,172,1,22,0,B,8,0,B,8,12.8,A,7,-2.8,A,7,33,A,7,980,A,7,330,A,7,7.2,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,17:00,356,1405,191,1,11,517,1,16,60,1,11,198,1,11,433,1,16,88,1,11,111,1,22,0,B,8,0,B,8,11.7,A,7,-2.8,A,7,35,A,7,980,A,7,310,A,7,5.2,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,18:00,101,1230,34,1,11,137,1,16,22,1,11,36,1,11,65,1,16,31,1,11,38,1,22,0,B,8,0,B,8,10.6,A,7,-3.9,A,7,35,A,7,981,A,7,320,A,7,4.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,7.8,A,7,-3.9,A,7,42,A,7,982,A,7,290,A,7,2.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,6.1,A,7,-2.8,A,7,51,A,7,982,A,7,300,A,7,3.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,2.8,A,7,-1.7,A,7,71,A,7,982,A,7,200,A,7,2.6,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,4.4,A,7,-2.8,A,7,58,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,2.8,A,7,-2.2,A,7,68,A,7,982,A,7,250,A,7,1.5,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/09/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,2.2,A,7,-2.8,A,7,68,A,7,982,A,7,240,A,7,2.1,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,1.1,A,7,-2.2,A,7,77,A,7,982,A,7,280,A,7,2.6,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,2.2,A,7,-2.8,A,7,68,A,7,982,A,7,250,A,7,3.1,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,1.7,A,7,-2.8,A,7,70,A,7,983,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,2.8,A,7,-3.3,A,7,62,A,7,983,A,7,250,A,7,2.1,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-0.6,A,7,-2.8,A,7,83,A,7,983,A,7,230,A,7,2.6,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,1.1,A,7,-2.8,A,7,73,A,7,983,A,7,270,A,7,2.1,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,3.3,A,7,-2.8,A,7,63,A,7,983,A,7,270,A,7,2.6,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,08:00,74,1065,29,1,11,239,1,16,12,1,11,31,1,11,136,1,16,21,1,11,27,1,22,0,B,8,0,B,8,2.8,A,7,-2.8,A,7,65,A,7,984,A,7,230,A,7,2.1,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,09:00,326,1405,185,1,11,643,1,16,35,1,11,195,1,11,545,1,16,68,1,11,81,1,22,0,B,8,0,B,8,3.9,A,7,-0.6,A,7,72,A,7,985,A,7,230,A,7,2.6,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,10:00,555,1405,342,1,11,737,1,16,50,1,11,361,1,11,698,1,16,84,1,11,120,1,22,0,B,8,0,B,8,9.4,A,7,0.0,A,7,52,A,7,984,A,7,250,A,7,3.6,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,11:00,733,1405,514,1,11,865,1,16,62,1,11,541,1,11,847,1,16,97,1,11,153,1,22,1,B,8,0,B,8,11.7,A,7,0.0,A,7,44,A,7,984,A,7,220,A,7,4.6,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,12:00,848,1405,588,1,11,861,1,16,68,1,11,618,1,11,853,1,16,101,1,11,176,1,22,1,B,8,1,B,8,13.3,A,7,-0.6,A,7,38,A,7,983,A,7,210,A,7,6.2,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,13:00,890,1405,632,1,10,886,1,16,70,1,10,664,1,10,880,1,16,104,1,10,186,1,21,1,E,9,1,E,9,14.4,A,7,0.0,A,7,37,A,7,982,A,7,220,A,7,7.7,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,14:00,858,1405,606,1,11,879,1,16,68,1,11,636,1,11,871,1,16,102,1,11,178,1,22,1,B,8,1,B,8,16.1,A,7,0.0,A,7,33,A,7,981,A,7,240,A,7,5.7,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,15:00,754,1405,530,1,11,870,1,16,63,1,11,558,1,11,854,1,16,98,1,11,156,1,22,1,B,8,0,B,8,16.7,A,7,0.0,A,7,32,A,7,980,A,7,240,A,7,6.2,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,16:00,584,1405,390,1,11,813,1,16,52,1,11,412,1,11,775,1,16,89,1,11,125,1,22,0,B,8,0,B,8,16.7,A,7,0.0,A,7,32,A,7,980,A,7,230,A,7,4.1,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,17:00,361,1405,214,1,11,686,1,16,37,1,11,226,1,11,596,1,16,72,1,11,87,1,22,0,B,8,0,B,8,16.1,A,7,0.0,A,7,33,A,7,979,A,7,220,A,7,5.2,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,18:00,105,1253,43,1,11,314,1,16,17,1,11,46,1,11,188,1,16,29,1,11,35,1,22,0,B,8,0,B,8,13.3,A,7,0.0,A,7,40,A,7,979,A,7,210,A,7,4.6,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,11.7,A,7,0.0,A,7,44,A,7,979,A,7,210,A,7,3.6,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,10.6,A,7,0.0,A,7,48,A,7,978,A,7,220,A,7,3.6,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,10.0,A,7,0.0,A,7,50,A,7,978,A,7,220,A,7,4.1,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,10.0,A,7,0.0,A,7,50,A,7,977,A,7,220,A,7,4.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,11.7,A,7,3.3,A,7,56,A,7,977,A,7,240,A,7,5.7,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/10/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,11.7,A,7,5.6,A,7,66,A,7,976,A,7,230,A,7,5.7,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,11.7,A,7,6.7,A,7,71,A,7,976,A,7,250,A,7,4.6,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,9,A,7,10.6,A,7,7.8,A,7,83,A,7,975,A,7,250,A,7,4.1,A,7,16000,B,7,1829,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,B,8,8,B,8,9.4,A,7,7.8,A,7,90,A,7,974,A,7,230,A,7,4.1,A,7,11200,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,B,8,7,B,8,10.0,A,7,8.3,A,7,89,A,7,973,A,7,240,A,7,2.6,A,7,8000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/11/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,6,B,8,9.4,A,7,8.9,A,7,97,A,7,972,A,7,230,A,7,4.1,A,7,6400,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/11/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,B,8,5,B,8,10.0,A,7,8.9,A,7,93,A,7,972,A,7,240,A,7,4.1,A,7,6400,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/11/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,E,9,4,E,9,8.9,A,7,8.3,A,7,96,A,7,971,A,7,220,A,7,4.1,A,7,4800,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/11/1996,08:00,78,1088,21,1,10,55,1,16,17,1,10,23,1,10,22,1,16,22,1,10,29,1,21,3,E,9,3,E,9,10.6,A,7,9.4,A,7,92,A,7,971,A,7,240,A,7,4.1,A,7,4000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/11/1996,09:00,331,1404,40,1,10,0,1,16,40,1,10,47,1,10,0,1,16,47,1,10,164,1,21,10,E,9,10,E,9,12.2,A,7,11.1,A,7,93,A,7,971,A,7,250,A,7,4.6,A,7,5600,B,7,305,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/11/1996,10:00,561,1404,307,1,10,466,1,16,121,1,10,327,1,10,448,1,16,147,1,10,235,1,21,3,E,9,3,E,9,15.0,A,7,10.6,A,7,75,A,7,972,A,7,270,A,7,7.7,A,7,11200,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,11:00,739,1404,435,1,10,462,1,16,192,1,10,458,1,10,466,1,16,212,1,10,419,1,21,3,E,9,3,E,9,15.6,A,7,3.9,A,7,46,A,7,972,A,7,280,A,7,11.8,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,12:00,853,1404,580,1,11,704,1,16,152,1,11,611,1,11,707,1,16,179,1,11,362,1,22,1,B,8,1,B,8,16.1,A,7,0.6,A,7,35,A,7,972,A,7,280,A,7,11.8,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,13:00,896,1404,649,1,10,802,1,16,137,1,10,692,1,10,814,1,16,171,1,10,349,1,21,0,E,9,0,E,9,15.6,A,7,-1.7,A,7,30,A,7,971,A,7,270,A,7,10.3,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,14:00,864,1404,613,1,11,780,1,16,133,1,11,652,1,11,789,1,16,165,1,11,327,1,22,0,B,8,0,B,8,15.6,A,7,-3.3,A,7,26,A,7,971,A,7,280,A,7,7.2,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,15:00,759,1404,517,1,11,732,1,16,121,1,11,547,1,11,730,1,16,150,1,11,270,1,22,0,B,8,0,B,8,15.0,A,7,-4.4,A,7,25,A,7,971,A,7,280,A,7,9.8,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,16:00,590,1404,371,1,11,647,1,16,99,1,11,388,1,11,620,1,16,126,1,11,198,1,22,0,B,8,0,B,8,13.3,A,7,-4.4,A,7,28,A,7,972,A,7,310,A,7,8.8,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,17:00,366,1404,185,1,11,445,1,16,69,1,11,190,1,11,374,1,16,92,1,11,125,1,22,0,B,8,0,B,8,11.1,A,7,-5.6,A,7,29,A,7,973,A,7,310,A,7,9.8,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,18:00,109,1299,34,1,11,105,1,16,26,1,11,38,1,11,47,1,16,34,1,11,46,1,22,0,B,8,0,B,8,7.8,A,7,-6.1,A,7,35,A,7,974,A,7,310,A,7,9.3,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,6.1,A,7,-6.7,A,7,37,A,7,976,A,7,310,A,7,7.7,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,B,8,1,B,8,5.0,A,7,-6.1,A,7,42,A,7,976,A,7,310,A,7,7.7,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,E,9,2,A,7,4.4,A,7,-5.6,A,7,46,A,7,976,A,7,290,A,7,8.2,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,3,B,8,2.8,A,7,-5.6,A,7,51,A,7,977,A,7,290,A,7,8.2,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,3,B,8,1.7,A,7,-5.6,A,7,55,A,7,978,A,7,290,A,7,6.2,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/11/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,B,8,4,B,8,1.7,A,7,-5.6,A,7,55,A,7,978,A,7,300,A,7,8.2,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,E,9,4,E,9,1.7,A,7,-5.6,A,7,55,A,7,978,A,7,290,A,7,6.7,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,9,E,9,1.1,A,7,-6.1,A,7,55,A,7,978,A,7,290,A,7,5.2,A,7,16000,B,7,1981,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,E,9,8,E,9,1.1,A,7,-6.7,A,7,52,A,7,978,A,7,290,A,7,5.7,A,7,16000,B,7,1981,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,1.1,A,7,-6.7,A,7,52,A,7,978,A,7,310,A,7,5.2,A,7,16000,B,7,1829,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,B,8,9,B,8,0.6,A,7,-7.2,A,7,52,A,7,978,A,7,310,A,7,6.7,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,B,8,7,B,8,0.6,A,7,-7.8,A,7,49,A,7,978,A,7,310,A,7,4.1,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,E,9,6,E,9,-0.6,A,7,-7.2,A,7,57,A,7,979,A,7,300,A,7,5.2,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,08:00,81,1111,24,1,10,103,1,16,16,1,10,26,1,10,46,1,16,23,1,10,27,1,21,7,E,9,6,E,9,0.0,A,7,-7.8,A,7,52,A,7,980,A,7,290,A,7,5.2,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,09:00,336,1404,146,1,11,281,1,16,79,1,11,153,1,11,228,1,16,98,1,11,145,1,22,7,B,8,6,B,8,0.6,A,7,-8.3,A,7,47,A,7,980,A,7,300,A,7,7.7,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,10:00,566,1404,339,1,11,234,1,16,245,1,11,361,1,11,228,1,16,269,1,11,576,1,22,7,B,8,6,B,8,1.1,A,7,-8.3,A,7,46,A,7,981,A,7,300,A,7,5.7,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,11:00,745,1404,314,1,11,195,1,16,210,1,11,344,1,11,202,1,16,237,1,11,535,1,22,7,B,8,6,B,8,2.8,A,7,-10.0,A,7,35,A,7,981,A,7,310,A,7,8.8,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,12:00,859,1404,362,1,11,299,1,16,179,1,11,402,1,11,320,1,16,205,1,11,427,1,22,7,B,8,6,B,8,3.9,A,7,-10.6,A,7,31,A,7,980,A,7,310,A,7,7.7,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,13:00,902,1404,377,1,10,267,1,16,205,1,10,416,1,10,287,1,16,231,1,10,516,1,21,7,E,9,7,E,9,3.3,A,7,-10.0,A,7,34,A,7,980,A,7,300,A,7,7.2,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,14:00,870,1404,193,1,10,0,1,16,193,1,10,227,1,10,0,1,16,227,1,10,872,1,21,10,E,9,10,E,9,3.9,A,7,-10.0,A,7,32,A,7,980,A,7,330,A,7,6.2,A,7,16000,B,7,1829,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,15:00,765,1404,277,1,10,156,1,16,192,1,10,307,1,10,163,1,16,218,1,10,495,1,21,9,E,9,8,E,9,4.4,A,7,-10.0,A,7,31,A,7,980,A,7,310,A,7,8.2,A,7,16000,B,7,1981,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,16:00,595,1404,331,1,10,493,1,16,122,1,10,355,1,10,480,1,16,150,1,10,239,1,21,4,E,9,3,E,9,3.9,A,7,-11.1,A,7,29,A,7,980,A,7,340,A,7,7.2,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,17:00,372,1404,142,1,11,345,1,16,51,1,11,150,1,11,296,1,16,71,1,11,98,1,22,5,B,8,4,B,8,2.8,A,7,-12.2,A,7,29,A,7,981,A,7,310,A,7,7.2,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,18:00,114,1322,32,1,11,106,1,16,23,1,11,35,1,11,52,1,16,30,1,11,40,1,22,6,B,8,5,B,8,1.7,A,7,-12.2,A,7,31,A,7,982,A,7,310,A,7,6.2,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,E,9,7,E,9,0.6,A,7,-11.7,A,7,35,A,7,983,A,7,320,A,7,4.6,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,9,A,7,-0.6,A,7,-12.2,A,7,37,A,7,984,A,7,300,A,7,5.2,A,7,16000,B,7,1676,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,E,9,8,E,9,-1.1,A,7,-11.7,A,7,40,A,7,985,A,7,300,A,7,5.2,A,7,16000,B,7,1829,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,E,9,8,E,9,-1.7,A,7,-12.8,A,7,38,A,7,985,A,7,320,A,7,5.7,A,7,16000,B,7,1676,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-12.2,A,7,40,A,7,986,A,7,300,A,7,5.2,A,7,16000,B,7,1829,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/12/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,E,9,8,E,9,-1.7,A,7,-11.7,A,7,42,A,7,986,A,7,310,A,7,4.1,A,7,16000,B,7,1676,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-2.2,A,7,-10.6,A,7,48,A,7,987,A,7,310,A,7,3.6,A,7,16000,B,7,1524,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,B,8,8,B,8,-3.3,A,7,-10.6,A,7,53,A,7,986,A,7,320,A,7,3.1,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,B,8,7,B,8,-3.9,A,7,-10.6,A,7,56,A,7,986,A,7,300,A,7,4.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,B,8,5,B,8,-5.0,A,7,-10.6,A,7,61,A,7,986,A,7,270,A,7,4.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,B,8,3,B,8,-5.0,A,7,-11.1,A,7,59,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,B,8,2,B,8,-5.0,A,7,-11.1,A,7,59,A,7,987,A,7,270,A,7,1.5,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,-5.6,A,7,-11.1,A,7,62,A,7,988,A,7,270,A,7,2.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,08:00,85,1134,34,1,11,267,1,16,14,1,11,36,1,11,155,1,16,24,1,11,30,1,22,0,B,8,0,B,8,-5.0,A,7,-9.4,A,7,68,A,7,989,A,7,260,A,7,2.6,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,09:00,342,1403,204,1,11,683,1,16,38,1,11,216,1,11,586,1,16,73,1,11,84,1,22,0,B,8,0,B,8,-2.2,A,7,-13.3,A,7,38,A,7,989,A,7,320,A,7,4.6,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,10:00,572,1403,395,1,11,838,1,16,54,1,11,417,1,11,796,1,16,92,1,11,126,1,22,0,B,8,0,B,8,-0.6,A,7,-13.3,A,7,33,A,7,989,A,7,310,A,7,5.2,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,11:00,750,1403,552,1,11,909,1,16,66,1,11,581,1,11,892,1,16,102,1,11,159,1,22,0,B,8,0,B,8,0.6,A,7,-12.2,A,7,33,A,7,989,A,7,260,A,7,4.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,12:00,865,1403,654,1,11,942,1,16,73,1,11,686,1,11,934,1,16,108,1,11,185,1,22,0,B,8,0,B,8,2.2,A,7,-11.1,A,7,33,A,7,988,A,7,220,A,7,4.6,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,13:00,908,1403,693,1,10,953,1,16,76,1,10,726,1,10,948,1,16,111,1,10,197,1,21,0,E,9,0,E,9,2.8,A,7,-11.7,A,7,30,A,7,987,A,7,240,A,7,3.1,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,14:00,876,1403,638,1,11,904,1,16,73,1,11,669,1,11,897,1,16,107,1,11,187,1,22,1,B,8,0,B,8,3.9,A,7,-11.7,A,7,28,A,7,986,A,7,270,A,7,5.7,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,15:00,771,1403,533,1,11,850,1,16,66,1,11,561,1,11,836,1,16,100,1,11,162,1,22,1,B,8,1,B,8,4.4,A,7,-11.1,A,7,28,A,7,984,A,7,210,A,7,5.7,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,16:00,601,1403,361,1,11,662,1,16,77,1,11,385,1,11,644,1,16,108,1,11,161,1,22,2,B,8,1,B,8,5.0,A,7,-11.1,A,7,27,A,7,984,A,7,230,A,7,5.2,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,17:00,377,1403,211,1,11,591,1,16,52,1,11,222,1,11,510,1,16,84,1,11,100,1,22,2,B,8,2,B,8,5.0,A,7,-10.0,A,7,30,A,7,983,A,7,220,A,7,6.2,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,18:00,118,1345,47,1,11,279,1,16,23,1,11,50,1,11,153,1,16,36,1,11,42,1,22,3,B,8,2,B,8,3.9,A,7,-8.9,A,7,35,A,7,982,A,7,220,A,7,4.1,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,E,9,2,E,9,3.9,A,7,-8.3,A,7,37,A,7,982,A,7,210,A,7,4.6,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,B,8,2,B,8,3.3,A,7,-8.3,A,7,39,A,7,981,A,7,200,A,7,5.2,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,E,9,2,A,7,2.8,A,7,-7.8,A,7,42,A,7,980,A,7,220,A,7,5.7,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,6,B,8,2.8,A,7,-7.2,A,7,44,A,7,979,A,7,220,A,7,6.2,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,3.3,A,7,-7.2,A,7,43,A,7,978,A,7,220,A,7,5.7,A,7,16000,B,7,3658,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/13/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,B,8,9,B,8,4.4,A,7,-6.1,A,7,44,A,7,977,A,7,240,A,7,7.2,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,E,9,8,A,7,3.9,A,7,-5.6,A,7,47,A,7,976,A,7,230,A,7,6.2,A,7,16000,B,7,3658,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,B,8,7,B,8,3.9,A,7,-5.6,A,7,47,A,7,974,A,7,220,A,7,6.2,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,6,B,8,4.4,A,7,-5.6,A,7,46,A,7,972,A,7,220,A,7,7.2,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,4,B,8,5.6,A,7,-5.6,A,7,42,A,7,971,A,7,230,A,7,7.7,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,B,8,3,B,8,5.0,A,7,-5.6,A,7,44,A,7,971,A,7,250,A,7,6.2,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,E,9,2,A,7,5.0,A,7,-5.0,A,7,46,A,7,972,A,7,250,A,7,5.2,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,3.3,A,7,-5.0,A,7,52,A,7,972,A,7,240,A,7,4.1,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,08:00,89,1157,34,1,25,234,1,28,16,1,25,36,1,25,122,1,28,27,1,25,30,1,45,1,B,8,1,B,8,3.9,A,7,-5.0,A,7,50,A,7,972,A,7,240,A,7,4.6,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,09:00,347,1403,189,1,25,594,1,28,42,1,25,197,1,25,506,1,28,71,1,25,86,1,45,3,B,8,1,B,8,5.0,A,7,-4.4,A,7,48,A,7,972,A,7,250,A,7,6.2,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,10:00,577,1403,366,1,25,650,1,28,98,1,25,382,1,25,620,1,28,126,1,25,194,1,45,4,B,8,2,B,8,7.8,A,7,-3.9,A,7,42,A,7,971,A,7,250,A,7,8.2,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,11:00,756,1403,385,1,25,506,1,28,112,1,25,409,1,25,506,1,28,135,1,25,252,1,45,5,B,8,3,B,8,8.3,A,7,-3.3,A,7,42,A,7,971,A,7,240,A,7,7.2,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,12:00,871,1403,503,1,25,564,1,28,153,1,25,531,1,25,568,1,28,177,1,25,373,1,45,7,B,8,3,B,8,11.1,A,7,-2.2,A,7,39,A,7,970,A,7,230,A,7,8.2,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,13:00,914,1403,482,1,24,341,1,27,260,1,24,524,1,24,366,1,27,285,1,24,686,1,43,8,E,9,4,A,7,12.2,A,7,-2.8,A,7,34,A,7,969,A,7,260,A,7,7.2,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,14:00,881,1403,358,1,24,77,1,27,310,1,24,394,1,24,79,1,27,344,1,24,1002,1,43,10,E,9,9,A,7,12.2,A,7,-1.7,A,7,37,A,7,969,A,7,240,A,7,6.2,A,7,16000,B,7,2286,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,15:00,777,1403,170,1,24,0,1,27,170,1,24,198,1,24,0,1,27,198,1,24,748,1,43,10,E,9,10,A,7,12.8,A,7,-1.7,A,7,36,A,7,969,A,7,260,A,7,6.7,A,7,16000,B,7,2286,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,16:00,606,1403,128,1,10,0,1,16,128,1,10,148,1,10,0,1,16,148,1,10,533,1,21,10,E,9,10,E,9,11.7,A,7,-1.1,A,7,41,A,7,970,A,7,280,A,7,8.2,A,7,16000,B,7,2134,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,17:00,382,1403,74,1,10,0,1,16,74,1,10,85,1,10,0,1,16,85,1,10,286,1,21,10,E,9,10,E,9,11.1,A,7,-0.6,A,7,44,A,7,970,A,7,270,A,7,5.2,A,7,16000,B,7,1829,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,18:00,123,1367,18,1,10,0,1,16,18,1,10,21,1,10,0,1,16,21,1,10,67,1,21,10,E,9,10,E,9,10.0,A,7,0.0,A,7,50,A,7,971,A,7,260,A,7,5.2,A,7,16000,B,7,1829,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,9.4,A,7,0.0,A,7,52,A,7,972,A,7,260,A,7,3.1,A,7,16000,B,7,1829,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,B,8,9,B,8,7.8,A,7,0.0,A,7,58,A,7,972,A,7,310,A,7,2.1,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,B,8,9,B,8,6.7,A,7,0.0,A,7,62,A,7,972,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,E,9,8,E,9,4.4,A,7,0.0,A,7,73,A,7,972,A,7,190,A,7,2.1,A,7,16000,B,7,1981,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,5.6,A,7,0.0,A,7,67,A,7,972,A,7,220,A,7,2.1,A,7,16000,B,7,2134,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/14/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,6.7,A,7,0.0,A,7,62,A,7,972,A,7,0,A,7,0.0,A,7,16000,B,7,2134,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,6.1,A,7,0.0,A,7,65,A,7,971,A,7,0,A,7,0.0,A,7,16000,B,7,2286,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/15/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,6.1,A,7,0.0,A,7,65,A,7,971,A,7,40,A,7,4.1,A,7,16000,B,7,2286,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/15/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,5.0,A,7,0.0,A,7,70,A,7,971,A,7,190,A,7,1.5,A,7,16000,B,7,1402,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/15/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,5.0,A,7,0.0,A,7,70,A,7,971,A,7,330,A,7,1.5,A,7,8000,B,7,1219,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/15/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,5.0,A,7,0.0,A,7,70,A,7,971,A,7,300,A,7,1.5,A,7,8000,B,7,1341,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/15/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,5.0,A,7,0.0,A,7,70,A,7,971,A,7,230,A,7,2.6,A,7,8000,B,7,1402,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/15/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,5.0,A,7,0.0,A,7,70,A,7,972,A,7,310,A,7,2.6,A,7,8000,B,7,2286,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/15/1996,08:00,93,1180,28,1,10,42,1,16,25,1,10,31,1,10,21,1,16,30,1,10,52,1,21,9,E,9,9,E,9,4.4,A,7,-0.6,A,7,70,A,7,973,A,7,260,A,7,1.5,A,7,5600,B,7,2286,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/15/1996,09:00,353,1402,134,1,11,113,1,16,105,1,11,145,1,11,97,1,16,120,1,11,230,1,22,7,B,8,7,B,8,7.8,A,7,-0.6,A,7,55,A,7,974,A,7,10,A,7,2.1,A,7,11200,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,10:00,583,1402,265,1,11,334,1,16,126,1,11,282,1,11,324,1,16,147,1,11,247,1,22,6,B,8,6,B,8,8.3,A,7,-0.6,A,7,53,A,7,974,A,7,340,A,7,5.2,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,11:00,762,1402,384,1,11,461,1,16,133,1,11,421,1,11,469,1,16,165,1,11,285,1,22,5,B,8,5,B,8,9.4,A,7,-1.7,A,7,45,A,7,975,A,7,320,A,7,4.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,12:00,877,1402,608,1,10,777,1,16,121,1,10,633,1,10,773,1,16,148,1,10,278,1,21,3,E,9,3,E,9,10.0,A,7,-1.1,A,7,45,A,7,975,A,7,320,A,7,4.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,13:00,920,1402,270,1,10,122,1,16,190,1,10,304,1,10,130,1,16,218,1,10,545,1,21,8,E,9,8,E,9,11.1,A,7,-2.8,A,7,37,A,7,974,A,7,340,A,7,4.1,A,7,16000,B,7,1494,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,14:00,887,1402,441,1,10,393,1,16,193,1,10,477,1,10,405,1,16,219,1,10,475,1,21,3,E,9,3,E,9,11.7,A,7,-2.2,A,7,37,A,7,973,A,7,340,A,7,2.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,15:00,782,1402,420,1,10,548,1,16,114,1,10,447,1,10,551,1,16,139,1,10,262,1,21,3,E,9,3,E,9,12.2,A,7,-1.1,A,7,39,A,7,973,A,7,200,A,7,2.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,16:00,612,1402,363,1,10,524,1,16,134,1,10,386,1,10,513,1,16,162,1,10,266,1,21,3,E,9,3,E,9,12.8,A,7,-3.9,A,7,30,A,7,973,A,7,240,A,7,2.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,17:00,387,1402,226,1,11,614,1,16,57,1,11,238,1,11,533,1,16,90,1,11,109,1,22,3,B,8,3,B,8,12.2,A,7,-2.8,A,7,34,A,7,974,A,7,290,A,7,3.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,18:00,127,1390,53,1,11,294,1,16,26,1,11,56,1,11,163,1,16,40,1,11,46,1,22,3,B,8,3,B,8,11.1,A,7,-3.9,A,7,33,A,7,974,A,7,50,A,7,1.5,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,E,9,4,E,9,7.8,A,7,-2.2,A,7,48,A,7,974,A,7,50,A,7,2.6,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,9,A,7,7.8,A,7,-4.4,A,7,40,A,7,974,A,7,50,A,7,6.2,A,7,16000,B,7,2743,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,6.1,A,7,-5.6,A,7,41,A,7,975,A,7,60,A,7,6.2,A,7,16000,B,7,1829,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,4.4,A,7,-5.0,A,7,48,A,7,975,A,7,50,A,7,7.2,A,7,16000,B,7,1829,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,3.9,A,7,-5.6,A,7,47,A,7,975,A,7,70,A,7,7.2,A,7,16000,B,7,1524,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/15/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,3.3,A,7,-5.6,A,7,49,A,7,975,A,7,60,A,7,7.2,A,7,16000,B,7,1676,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/16/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,2.8,A,7,-4.4,A,7,57,A,7,974,A,7,50,A,7,8.2,A,7,16000,B,7,1402,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/16/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,1.7,A,7,-2.2,A,7,74,A,7,973,A,7,50,A,7,7.2,A,7,16000,B,7,579,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/16/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,1.1,A,7,-1.1,A,7,84,A,7,973,A,7,60,A,7,7.2,A,7,11200,B,7,335,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/16/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,0.6,A,7,-1.1,A,7,87,A,7,972,A,7,70,A,7,7.2,A,7,11200,B,7,274,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/16/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,0.0,A,7,-1.7,A,7,87,A,7,972,A,7,70,A,7,9.3,A,7,5600,B,7,396,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-0.6,A,7,-2.2,A,7,88,A,7,972,A,7,60,A,7,7.2,A,7,5600,B,7,396,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.1,A,7,-2.8,A,7,87,A,7,973,A,7,50,A,7,5.2,A,7,5600,B,7,305,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,08:00,98,1203,14,1,10,0,1,16,14,1,10,17,1,10,0,1,16,17,1,10,53,1,21,10,E,9,10,E,9,-1.7,A,7,-2.8,A,7,91,A,7,973,A,7,50,A,7,6.7,A,7,800,B,7,366,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,09:00,358,1401,46,1,10,0,1,16,46,1,10,54,1,10,0,1,16,54,1,10,190,1,21,10,E,9,10,E,9,-2.2,A,7,-3.9,A,7,87,A,7,973,A,7,40,A,7,7.2,A,7,800,B,7,396,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,10:00,589,1401,110,1,10,0,1,16,110,1,10,128,1,10,0,1,16,128,1,10,467,1,21,10,E,9,10,E,9,-2.2,A,7,-3.3,A,7,91,A,7,973,A,7,10,A,7,4.6,A,7,800,B,7,427,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,11:00,768,1401,130,1,10,0,1,16,130,1,10,155,1,10,0,1,16,155,1,10,600,1,21,10,E,9,10,E,9,-2.2,A,7,-3.3,A,7,91,A,7,974,A,7,30,A,7,3.6,A,7,800,B,7,305,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,12:00,883,1401,129,1,24,0,1,27,129,1,24,157,1,24,0,1,27,157,1,24,631,1,43,10,E,9,10,A,7,-2.2,A,7,-3.9,A,7,87,A,7,974,A,7,20,A,7,5.2,A,7,400,B,7,122,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,13:00,926,1401,196,1,10,0,1,16,196,1,10,232,1,10,0,1,16,232,1,10,909,1,21,10,E,9,10,E,9,-1.7,A,7,-4.4,A,7,80,A,7,974,A,7,350,A,7,4.1,A,7,1200,B,7,610,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,71,C,8 -02/16/1996,14:00,893,1401,131,1,24,0,1,27,131,1,24,159,1,24,0,1,27,159,1,24,642,1,43,10,E,9,10,A,7,-2.2,A,7,-3.9,A,7,87,A,7,974,A,7,350,A,7,5.2,A,7,800,B,7,183,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,15:00,788,1401,134,1,10,0,1,16,134,1,10,160,1,10,0,1,16,160,1,10,622,1,21,10,E,9,10,E,9,-1.1,A,7,-3.3,A,7,83,A,7,974,A,7,10,A,7,4.1,A,7,1200,B,7,244,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,16:00,617,1401,98,1,10,0,1,16,98,1,10,116,1,10,0,1,16,116,1,10,434,1,21,10,E,9,10,E,9,-1.1,A,7,-2.8,A,7,87,A,7,975,A,7,320,A,7,2.6,A,7,800,B,7,305,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,17:00,392,1401,63,1,10,0,1,16,63,1,10,73,1,10,0,1,16,73,1,10,254,1,21,10,E,9,10,E,9,-1.1,A,7,-3.3,A,7,83,A,7,975,A,7,330,A,7,3.6,A,7,2400,B,7,884,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/16/1996,18:00,132,1401,22,1,24,0,1,27,22,1,24,25,1,24,0,1,27,25,1,24,79,1,43,10,E,9,10,A,7,-1.1,A,7,-7.8,A,7,57,A,7,976,A,7,10,A,7,3.1,A,7,16000,B,7,1311,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/16/1996,19:00,0,12,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,10,E,9,10,A,7,-1.1,A,7,-10.6,A,7,44,A,7,977,A,7,340,A,7,4.1,A,7,16000,B,7,2134,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/16/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-1.7,A,7,-11.1,A,7,44,A,7,978,A,7,330,A,7,4.1,A,7,16000,B,7,2438,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/16/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,E,9,3,E,9,-2.2,A,7,-12.8,A,7,40,A,7,979,A,7,340,A,7,4.6,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/16/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,E,9,3,E,9,-3.3,A,7,-12.8,A,7,44,A,7,979,A,7,340,A,7,4.6,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/16/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,B,8,2,B,8,-3.9,A,7,-12.8,A,7,46,A,7,980,A,7,310,A,7,4.1,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/16/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,B,8,1,B,8,-4.4,A,7,-12.8,A,7,48,A,7,980,A,7,320,A,7,5.7,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,-5.0,A,7,-13.9,A,7,46,A,7,980,A,7,310,A,7,8.8,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,B,8,3,B,8,-5.6,A,7,-14.4,A,7,46,A,7,980,A,7,310,A,7,4.6,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,6,B,8,-6.1,A,7,-15.6,A,7,43,A,7,980,A,7,310,A,7,4.6,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,B,8,6,B,8,-6.1,A,7,-15.6,A,7,43,A,7,980,A,7,300,A,7,5.7,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,B,8,6,B,8,-7.2,A,7,-15.0,A,7,50,A,7,980,A,7,270,A,7,3.6,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,B,8,6,B,8,-6.7,A,7,-15.6,A,7,45,A,7,981,A,7,300,A,7,6.7,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,B,8,2,B,8,-7.2,A,7,-15.6,A,7,47,A,7,981,A,7,300,A,7,5.7,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,08:00,102,1226,39,1,11,191,1,16,23,1,11,40,1,11,100,1,16,32,1,11,41,1,22,4,B,8,3,B,8,-6.7,A,7,-15.0,A,7,48,A,7,982,A,7,300,A,7,4.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,09:00,364,1401,153,1,11,167,1,16,109,1,11,165,1,11,145,1,16,127,1,11,240,1,22,5,B,8,4,B,8,-5.0,A,7,-15.0,A,7,41,A,7,982,A,7,340,A,7,4.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,10:00,595,1401,381,1,11,548,1,16,148,1,11,400,1,11,533,1,16,173,1,11,296,1,22,6,B,8,5,B,8,-4.4,A,7,-15.0,A,7,39,A,7,982,A,7,300,A,7,4.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,11:00,774,1401,392,1,11,348,1,16,199,1,11,425,1,11,367,1,16,222,1,11,460,1,22,7,B,8,5,B,8,-3.3,A,7,-14.4,A,7,38,A,7,981,A,7,290,A,7,3.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,12:00,889,1401,384,1,11,165,1,16,280,1,11,421,1,11,174,1,16,311,1,11,784,1,22,9,B,8,6,B,8,-2.8,A,7,-14.4,A,7,36,A,7,981,A,7,260,A,7,3.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,13:00,932,1401,471,1,10,272,1,16,290,1,10,508,1,10,292,1,16,314,1,10,792,1,21,10,E,9,7,E,9,-2.2,A,7,-13.9,A,7,36,A,7,979,A,7,270,A,7,3.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,14:00,899,1401,289,1,10,47,1,16,259,1,10,319,1,10,48,1,16,288,1,10,884,1,21,10,E,9,10,E,9,-1.1,A,7,-12.8,A,7,36,A,7,978,A,7,260,A,7,4.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,15:00,794,1401,435,1,11,167,1,16,340,1,11,465,1,11,172,1,16,368,1,11,893,1,22,9,B,8,9,B,8,-0.6,A,7,-12.2,A,7,37,A,7,977,A,7,240,A,7,4.6,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,16:00,623,1401,270,1,10,100,1,16,226,1,10,296,1,10,99,1,16,252,1,10,620,1,21,8,E,9,8,E,9,0.0,A,7,-11.7,A,7,37,A,7,976,A,7,250,A,7,3.1,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,17:00,398,1401,105,1,10,20,1,16,100,1,10,119,1,10,11,1,16,116,1,10,363,1,21,10,E,9,10,E,9,0.6,A,7,-10.0,A,7,41,A,7,975,A,7,210,A,7,1.5,A,7,16000,B,7,2743,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,18:00,137,1401,55,1,10,160,1,16,40,1,10,58,1,10,75,1,16,51,1,10,76,1,21,9,E,9,9,E,9,0.0,A,7,-10.0,A,7,43,A,7,975,A,7,230,A,7,1.5,A,7,16000,B,7,3353,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,19:00,0,35,0,1,10,2,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,5,E,9,5,E,9,0.0,A,7,-11.1,A,7,39,A,7,975,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,-1.1,A,7,-11.1,A,7,42,A,7,975,A,7,0,A,7,0.0,A,7,16000,B,7,3048,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-8.3,A,7,57,A,7,975,A,7,180,A,7,1.5,A,7,16000,B,7,2591,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-8.3,A,7,57,A,7,975,A,7,240,A,7,1.5,A,7,16000,B,7,3048,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.1,A,7,-8.9,A,7,51,A,7,975,A,7,250,A,7,3.1,A,7,16000,B,7,3048,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/17/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,E,9,8,E,9,-1.7,A,7,-10.6,A,7,46,A,7,975,A,7,270,A,7,2.6,A,7,16000,B,7,2896,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,-2.2,A,7,-10.6,A,7,48,A,7,975,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,B,8,5,B,8,-2.8,A,7,-10.0,A,7,54,A,7,975,A,7,290,A,7,3.6,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.7,A,7,-9.4,A,7,52,A,7,976,A,7,280,A,7,1.5,A,7,16000,B,7,1524,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,-1.1,A,7,-7.2,A,7,60,A,7,976,A,7,230,A,7,2.6,A,7,16000,B,7,1524,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,0.0,A,7,-7.2,A,7,54,A,7,977,A,7,270,A,7,3.6,A,7,16000,B,7,1524,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,E,9,8,E,9,0.0,A,7,-7.8,A,7,52,A,7,977,A,7,290,A,7,2.6,A,7,16000,B,7,1524,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,-2.8,A,7,-8.3,A,7,62,A,7,978,A,7,260,A,7,1.5,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,08:00,107,1272,41,1,11,252,1,16,20,1,11,44,1,11,136,1,16,32,1,11,37,1,22,1,B,8,1,B,8,-1.1,A,7,-8.9,A,7,51,A,7,980,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,09:00,370,1400,227,1,11,614,1,16,65,1,11,235,1,11,520,1,16,97,1,11,120,1,22,2,B,8,2,B,8,1.1,A,7,-9.4,A,7,41,A,7,981,A,7,360,A,7,4.6,A,7,16000,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,10:00,601,1400,378,1,11,680,1,16,86,1,11,400,1,11,659,1,16,116,1,11,177,1,22,4,B,8,3,B,8,2.2,A,7,-9.4,A,7,38,A,7,982,A,7,320,A,7,5.7,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,11:00,780,1400,418,1,11,420,1,16,183,1,11,444,1,11,427,1,16,206,1,11,409,1,22,5,B,8,4,B,8,2.8,A,7,-8.3,A,7,40,A,7,982,A,7,340,A,7,2.6,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,12:00,895,1400,535,1,11,471,1,16,233,1,11,566,1,11,485,1,16,255,1,11,588,1,22,6,B,8,5,B,8,3.3,A,7,-7.8,A,7,41,A,7,982,A,7,310,A,7,2.6,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,13:00,937,1400,578,1,10,502,1,16,241,1,10,614,1,10,519,1,16,265,1,10,640,1,21,7,E,9,6,E,9,3.9,A,7,-7.8,A,7,39,A,7,982,A,7,320,A,7,1.5,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,14:00,905,1400,525,1,11,482,1,16,213,1,11,562,1,11,498,1,16,239,1,11,539,1,22,6,B,8,5,B,8,5.0,A,7,-7.8,A,7,36,A,7,981,A,7,310,A,7,4.1,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,15:00,799,1400,395,1,11,454,1,16,136,1,11,436,1,11,465,1,16,169,1,11,301,1,22,5,B,8,4,B,8,5.6,A,7,-8.3,A,7,33,A,7,981,A,7,300,A,7,2.6,A,7,16000,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,16:00,628,1400,324,1,11,334,1,16,174,1,11,347,1,11,339,1,16,194,1,11,375,1,22,4,B,8,3,B,8,5.0,A,7,-8.9,A,7,33,A,7,981,A,7,80,A,7,2.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,17:00,403,1400,243,1,11,645,1,16,57,1,11,249,1,11,568,1,16,85,1,11,108,1,22,2,B,8,2,B,8,5.6,A,7,-8.9,A,7,31,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,18:00,142,1400,58,1,11,307,1,16,27,1,11,59,1,11,173,1,16,42,1,11,48,1,22,1,B,8,1,B,8,3.3,A,7,-8.3,A,7,39,A,7,982,A,7,100,A,7,1.5,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,19:00,0,58,0,1,10,4,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,E,9,0,E,9,2.2,A,7,-8.3,A,7,42,A,7,983,A,7,110,A,7,2.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,1.7,A,7,-8.9,A,7,41,A,7,983,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,1.1,A,7,-8.3,A,7,46,A,7,983,A,7,150,A,7,2.1,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,0.0,A,7,-8.9,A,7,47,A,7,984,A,7,140,A,7,2.1,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,0.0,A,7,-8.3,A,7,49,A,7,985,A,7,150,A,7,3.6,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/18/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,-0.6,A,7,-8.9,A,7,49,A,7,985,A,7,160,A,7,2.6,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,E,9,-1.1,A,7,-8.9,A,7,51,A,7,985,A,7,160,A,7,1.5,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,B,8,1,B,8,-1.7,A,7,-8.3,A,7,57,A,7,985,A,7,160,A,7,3.1,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,B,8,2,B,8,-1.7,A,7,-8.9,A,7,54,A,7,986,A,7,160,A,7,1.5,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,B,8,3,B,8,-1.1,A,7,-8.9,A,7,51,A,7,986,A,7,100,A,7,1.5,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,B,8,4,B,8,-1.7,A,7,-8.9,A,7,54,A,7,987,A,7,80,A,7,2.1,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,5,B,8,-2.8,A,7,-8.3,A,7,62,A,7,987,A,7,50,A,7,2.1,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,E,9,6,E,9,-2.8,A,7,-7.8,A,7,65,A,7,988,A,7,90,A,7,2.1,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,08:00,112,1295,26,1,10,6,1,16,26,1,10,30,1,10,0,1,16,30,1,10,89,1,21,9,E,9,8,E,9,-1.7,A,7,-7.2,A,7,63,A,7,988,A,7,30,A,7,2.1,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,09:00,375,1400,201,1,10,123,1,16,168,1,10,219,1,10,112,1,16,189,1,10,372,1,21,10,E,9,8,E,9,-1.1,A,7,-6.1,A,7,66,A,7,989,A,7,50,A,7,2.1,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,10:00,607,1400,257,1,11,395,1,16,85,1,11,272,1,11,384,1,16,105,1,11,176,1,22,8,B,8,6,B,8,1.1,A,7,-4.4,A,7,64,A,7,989,A,7,90,A,7,1.5,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,11:00,786,1400,346,1,11,200,1,16,233,1,11,379,1,11,208,1,16,261,1,11,609,1,22,7,B,8,5,B,8,3.9,A,7,-2.8,A,7,60,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,12:00,901,1400,648,1,11,776,1,16,148,1,11,687,1,11,786,1,16,180,1,11,377,1,22,5,B,8,3,B,8,8.3,A,7,-0.6,A,7,53,A,7,988,A,7,190,A,7,4.6,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,13:00,943,1400,623,1,10,737,1,16,126,1,10,654,1,10,738,1,16,155,1,10,316,1,21,4,E,9,2,E,9,10.6,A,7,0.0,A,7,48,A,7,987,A,7,190,A,7,4.1,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,14:00,911,1400,582,1,11,647,1,16,161,1,11,615,1,11,653,1,16,188,1,11,411,1,22,4,B,8,2,B,8,12.2,A,7,0.0,A,7,43,A,7,987,A,7,170,A,7,5.2,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,15:00,805,1400,495,1,11,574,1,16,164,1,11,514,1,11,570,1,16,185,1,11,366,1,22,5,B,8,3,B,8,13.3,A,7,-0.6,A,7,38,A,7,986,A,7,180,A,7,5.7,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,16:00,633,1400,394,1,11,614,1,16,116,1,11,410,1,11,594,1,16,141,1,11,234,1,22,6,B,8,3,B,8,13.9,A,7,0.0,A,7,38,A,7,986,A,7,190,A,7,4.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,17:00,408,1400,201,1,11,234,1,16,132,1,11,209,1,11,208,1,16,148,1,11,273,1,22,6,B,8,4,B,8,12.8,A,7,-0.6,A,7,39,A,7,986,A,7,160,A,7,3.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,18:00,146,1400,60,1,10,163,1,16,43,1,10,63,1,10,81,1,16,54,1,10,82,1,21,7,E,9,5,E,9,12.2,A,7,0.0,A,7,43,A,7,986,A,7,160,A,7,5.7,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,19:00,0,82,0,1,10,6,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,3,E,9,3,E,9,11.1,A,7,0.0,A,7,46,A,7,986,A,7,150,A,7,4.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,E,9,3,A,7,10.6,A,7,0.0,A,7,48,A,7,986,A,7,140,A,7,4.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,6,B,8,10.0,A,7,0.0,A,7,50,A,7,986,A,7,150,A,7,4.6,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,9,A,7,8.9,A,7,0.0,A,7,54,A,7,987,A,7,170,A,7,3.1,A,7,16000,B,7,1219,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,9,A,7,8.9,A,7,2.2,A,7,63,A,7,987,A,7,140,A,7,2.6,A,7,16000,B,7,1311,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/19/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,9.4,A,7,1.7,A,7,59,A,7,987,A,7,150,A,7,3.1,A,7,16000,B,7,1128,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/20/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,8.9,A,7,1.7,A,7,61,A,7,987,A,7,150,A,7,3.6,A,7,16000,B,7,2896,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/20/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,8.9,A,7,1.7,A,7,61,A,7,986,A,7,140,A,7,2.6,A,7,16000,B,7,2743,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/20/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,3,A,7,8.3,A,7,2.2,A,7,65,A,7,986,A,7,150,A,7,3.1,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/20/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,8.9,A,7,2.8,A,7,66,A,7,985,A,7,120,A,7,1.5,A,7,16000,B,7,1158,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/20/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,8.3,A,7,3.3,A,7,71,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,975,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/20/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,6.7,A,7,3.9,A,7,82,A,7,985,A,7,50,A,7,2.1,A,7,11200,B,7,945,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -02/20/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,6.7,A,7,5.0,A,7,89,A,7,985,A,7,80,A,7,3.6,A,7,8000,B,7,457,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,08:00,117,1317,13,1,24,0,1,27,13,1,24,16,1,24,0,1,27,16,1,24,50,1,43,10,E,9,10,A,7,6.1,A,7,5.6,A,7,97,A,7,986,A,7,30,A,7,2.1,A,7,2400,B,7,335,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,09:00,381,1399,50,1,24,0,1,27,50,1,24,59,1,24,0,1,27,59,1,24,208,1,43,10,E,9,10,A,7,6.7,A,7,6.1,A,7,96,A,7,985,A,7,90,A,7,4.1,A,7,2000,B,7,152,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,10:00,613,1399,90,1,24,0,1,27,90,1,24,107,1,24,0,1,27,107,1,24,403,1,43,10,E,9,10,A,7,7.8,A,7,7.8,A,7,100,A,7,985,A,7,100,A,7,3.1,A,7,800,B,7,91,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,11:00,792,1399,121,1,24,0,1,27,121,1,24,145,1,24,0,1,27,145,1,24,573,1,43,10,E,9,10,A,7,10.6,A,7,10.0,A,7,96,A,7,984,A,7,180,A,7,4.1,A,7,800,B,7,152,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,12:00,907,1399,141,1,24,0,1,27,141,1,24,171,1,24,0,1,27,171,1,24,688,1,43,10,E,9,10,A,7,11.7,A,7,11.1,A,7,96,A,7,984,A,7,190,A,7,4.6,A,7,3200,B,7,152,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,13:00,949,1399,148,1,24,0,1,27,148,1,24,180,1,24,0,1,27,180,1,24,730,1,43,10,E,9,10,A,7,11.7,A,7,11.1,A,7,96,A,7,983,A,7,190,A,7,4.1,A,7,3200,B,7,152,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,14:00,917,1399,171,1,24,0,1,27,171,1,24,204,1,24,0,1,27,204,1,24,812,1,43,10,E,9,10,A,7,12.2,A,7,11.7,A,7,97,A,7,982,A,7,200,A,7,3.1,A,7,3200,B,7,213,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,15:00,811,1399,149,1,10,0,1,16,149,1,10,177,1,10,0,1,16,177,1,10,688,1,21,10,E,9,10,E,9,12.2,A,7,11.7,A,7,97,A,7,982,A,7,210,A,7,2.6,A,7,3200,B,7,396,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,16:00,639,1399,135,1,24,0,1,27,135,1,24,157,1,24,0,1,27,157,1,24,570,1,43,10,E,9,10,A,7,12.2,A,7,11.7,A,7,97,A,7,983,A,7,220,A,7,1.5,A,7,3200,B,7,549,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,17:00,413,1399,79,1,24,0,1,27,79,1,24,91,1,24,0,1,27,91,1,24,311,1,43,10,E,9,10,A,7,12.2,A,7,11.7,A,7,97,A,7,983,A,7,190,A,7,1.5,A,7,4800,B,7,884,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,18:00,151,1399,22,1,10,0,1,16,22,1,10,26,1,10,0,1,16,26,1,10,82,1,21,10,E,9,10,E,9,11.7,A,7,11.7,A,7,100,A,7,984,A,7,190,A,7,2.1,A,7,3200,B,7,701,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,19:00,1,105,0,1,10,2,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,6,E,9,6,E,9,10.6,A,7,10.6,A,7,100,A,7,983,A,7,170,A,7,2.1,A,7,2000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,9.4,A,7,9.4,A,7,100,A,7,984,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,9.4,A,7,9.4,A,7,100,A,7,985,A,7,320,A,7,2.1,A,7,300,B,7,30,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,8.9,A,7,8.9,A,7,100,A,7,985,A,7,0,A,7,0.0,A,7,300,B,7,244,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,7.8,A,7,7.8,A,7,100,A,7,985,A,7,310,A,7,2.6,A,7,800,B,7,30,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/20/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,7.8,A,7,7.8,A,7,100,A,7,985,A,7,0,A,7,0.0,A,7,300,B,7,61,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,8.3,A,7,8.3,A,7,100,A,7,985,A,7,320,A,7,2.6,A,7,1200,B,7,30,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,8.3,A,7,8.3,A,7,100,A,7,985,A,7,310,A,7,1.5,A,7,4800,B,7,152,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,8.3,A,7,8.3,A,7,100,A,7,985,A,7,300,A,7,3.1,A,7,4800,B,7,91,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,8.3,A,7,8.3,A,7,100,A,7,985,A,7,300,A,7,3.6,A,7,1600,B,7,30,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,7.8,A,7,7.8,A,7,100,A,7,985,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,7.8,A,7,7.8,A,7,100,A,7,985,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,7.2,A,7,7.2,A,7,100,A,7,986,A,7,0,A,7,0.0,A,7,300,B,7,30,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,08:00,123,1340,13,1,24,0,1,27,13,1,24,16,1,24,0,1,27,16,1,24,51,1,43,10,E,9,10,A,7,7.2,A,7,7.2,A,7,100,A,7,986,A,7,0,A,7,0.0,A,7,300,B,7,30,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,09:00,387,1398,54,1,24,0,1,27,54,1,24,64,1,24,0,1,27,64,1,24,223,1,43,10,E,9,10,A,7,7.2,A,7,7.2,A,7,100,A,7,987,A,7,0,A,7,0.0,A,7,300,B,7,30,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,10:00,619,1398,94,1,24,0,1,27,94,1,24,112,1,24,0,1,27,112,1,24,420,1,43,10,E,9,10,A,7,7.8,A,7,7.8,A,7,100,A,7,988,A,7,230,A,7,1.5,A,7,300,B,7,30,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,11:00,798,1398,125,1,24,0,1,27,125,1,24,150,1,24,0,1,27,150,1,24,591,1,43,10,E,9,10,A,7,8.3,A,7,8.3,A,7,100,A,7,987,A,7,200,A,7,3.1,A,7,800,B,7,30,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,12:00,913,1398,144,1,10,0,1,16,144,1,10,174,1,10,0,1,16,174,1,10,703,1,21,10,E,9,10,E,9,8.9,A,7,8.9,A,7,100,A,7,987,A,7,90,A,7,1.5,A,7,1200,B,7,30,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,13:00,955,1398,151,1,10,0,1,16,151,1,10,183,1,10,0,1,16,183,1,10,744,1,21,10,E,9,10,E,9,11.1,A,7,9.4,A,7,89,A,7,986,A,7,220,A,7,2.1,A,7,6400,B,7,152,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,14:00,922,1398,441,1,10,308,1,16,237,1,10,482,1,10,331,1,16,263,1,10,622,1,21,6,E,9,6,E,9,12.8,A,7,10.0,A,7,83,A,7,985,A,7,260,A,7,2.6,A,7,11200,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/21/1996,15:00,816,1398,532,1,11,716,1,16,114,1,11,569,1,11,724,1,16,145,1,11,272,1,22,5,B,8,5,B,8,14.4,A,7,10.0,A,7,75,A,7,984,A,7,220,A,7,2.6,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/21/1996,16:00,644,1398,435,1,11,788,1,16,72,1,11,461,1,11,768,1,16,106,1,11,157,1,22,5,B,8,4,B,8,15.0,A,7,10.0,A,7,72,A,7,984,A,7,220,A,7,2.6,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/21/1996,17:00,418,1398,257,1,11,589,1,16,81,1,11,264,1,11,516,1,16,110,1,11,148,1,22,4,B,8,4,B,8,14.4,A,7,10.0,A,7,75,A,7,983,A,7,200,A,7,2.6,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/21/1996,18:00,156,1398,48,1,11,190,1,16,27,1,11,52,1,11,105,1,16,40,1,11,47,1,22,3,B,8,3,B,8,13.3,A,7,10.0,A,7,80,A,7,984,A,7,210,A,7,3.1,A,7,11200,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/21/1996,19:00,1,128,0,1,10,15,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,3,E,9,2,E,9,11.1,A,7,9.4,A,7,89,A,7,984,A,7,250,A,7,2.1,A,7,11200,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,B,8,3,B,8,10.6,A,7,9.4,A,7,92,A,7,984,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,B,8,3,B,8,8.9,A,7,8.3,A,7,96,A,7,985,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,B,8,3,B,8,8.3,A,7,8.3,A,7,100,A,7,985,A,7,0,A,7,0.0,A,7,4000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,B,8,4,B,8,7.2,A,7,7.2,A,7,100,A,7,985,A,7,0,A,7,0.0,A,7,1600,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/21/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,B,8,4,B,8,7.8,A,7,7.8,A,7,100,A,7,984,A,7,240,A,7,1.5,A,7,2000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,4,E,9,8.3,A,7,7.8,A,7,97,A,7,983,A,7,230,A,7,2.1,A,7,2800,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,B,8,6,B,8,8.9,A,7,8.9,A,7,100,A,7,983,A,7,210,A,7,2.1,A,7,2000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,B,8,8,B,8,8.9,A,7,8.3,A,7,96,A,7,983,A,7,280,A,7,1.5,A,7,1600,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,8.9,A,7,8.9,A,7,100,A,7,982,A,7,0,A,7,0.0,A,7,400,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,7.2,A,7,7.2,A,7,100,A,7,982,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,E,9,8.3,A,7,8.3,A,7,100,A,7,983,A,7,0,A,7,0.0,A,7,400,B,7,3353,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,9,E,9,8.3,A,7,8.3,A,7,100,A,7,983,A,7,60,A,7,1.5,A,7,400,B,7,152,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,08:00,128,1363,26,1,24,26,1,27,24,1,24,30,1,24,14,1,27,28,1,24,50,1,43,9,E,9,9,A,7,8.9,A,7,8.9,A,7,100,A,7,984,A,7,0,A,7,0.0,A,7,400,B,7,518,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,09:00,393,1398,150,1,25,309,1,28,63,1,25,163,1,25,269,1,28,87,1,25,113,1,45,9,B,8,8,B,8,10.6,A,7,10.6,A,7,100,A,7,983,A,7,200,A,7,2.1,A,7,1200,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,10:00,625,1398,359,1,25,300,1,28,224,1,25,376,1,25,303,1,28,240,1,25,511,1,45,9,B,8,6,B,8,12.2,A,7,11.1,A,7,93,A,7,983,A,7,250,A,7,1.5,A,7,1200,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,11:00,804,1398,339,1,10,300,1,16,166,1,10,375,1,10,319,1,16,191,1,10,379,1,21,8,E,9,5,E,9,13.9,A,7,11.7,A,7,87,A,7,983,A,7,230,A,7,2.1,A,7,4000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,12:00,919,1398,624,1,24,784,1,27,108,1,24,663,1,24,788,1,27,143,1,24,276,1,43,2,E,9,2,A,7,13.9,A,7,11.7,A,7,87,A,7,983,A,7,0,A,7,0.0,A,7,4000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,13:00,961,1398,310,1,10,1,1,16,309,1,10,356,1,10,1,1,16,355,1,10,1291,1,21,10,E,9,9,E,9,13.9,A,7,11.7,A,7,87,A,7,982,A,7,0,A,7,0.0,A,7,4000,B,7,2743,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,14:00,928,1398,340,1,10,35,1,16,317,1,10,374,1,10,36,1,16,350,1,10,1068,1,21,10,E,9,9,E,9,13.9,A,7,12.2,A,7,89,A,7,981,A,7,190,A,7,2.6,A,7,4800,B,7,2896,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,15:00,822,1398,217,1,10,112,1,16,151,1,10,245,1,10,118,1,16,175,1,10,403,1,21,9,E,9,9,E,9,15.0,A,7,12.8,A,7,87,A,7,980,A,7,200,A,7,2.1,A,7,4800,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,16:00,649,1398,136,1,24,0,1,27,136,1,24,158,1,24,0,1,27,158,1,24,578,1,43,10,E,9,10,A,7,15.6,A,7,12.2,A,7,80,A,7,980,A,7,170,A,7,2.1,A,7,4800,B,7,1219,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/22/1996,17:00,423,1398,224,1,24,478,1,27,79,1,24,231,1,24,421,1,27,103,1,24,146,1,43,3,E,9,3,A,7,15.6,A,7,12.2,A,7,80,A,7,980,A,7,190,A,7,2.1,A,7,8000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/22/1996,18:00,160,1398,37,1,24,38,1,27,33,1,24,41,1,24,23,1,27,39,1,24,69,1,43,9,E,9,9,A,7,15.6,A,7,12.2,A,7,80,A,7,981,A,7,0,A,7,0.0,A,7,6400,B,7,1433,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/22/1996,19:00,1,151,0,1,24,0,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,10,E,9,10,A,7,14.4,A,7,12.2,A,7,87,A,7,981,A,7,70,A,7,1.5,A,7,8000,B,7,2896,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,13.9,A,7,12.2,A,7,89,A,7,981,A,7,50,A,7,2.1,A,7,8000,B,7,1097,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,E,9,3,A,7,13.3,A,7,11.7,A,7,90,A,7,982,A,7,30,A,7,2.1,A,7,6400,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,13.3,A,7,12.2,A,7,93,A,7,982,A,7,0,A,7,0.0,A,7,5600,B,7,1006,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,9,A,7,12.2,A,7,11.7,A,7,97,A,7,981,A,7,0,A,7,0.0,A,7,4000,B,7,762,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/22/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,E,9,9,A,7,12.2,A,7,12.2,A,7,100,A,7,981,A,7,70,A,7,2.1,A,7,2400,B,7,1372,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,11.7,A,7,11.7,A,7,100,A,7,981,A,7,10,A,7,2.1,A,7,300,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,11.7,A,7,11.7,A,7,100,A,7,980,A,7,50,A,7,3.1,A,7,300,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,11.7,A,7,11.7,A,7,100,A,7,980,A,7,50,A,7,2.1,A,7,300,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,11.7,A,7,11.7,A,7,100,A,7,980,A,7,40,A,7,1.5,A,7,300,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,11.1,A,7,11.1,A,7,100,A,7,981,A,7,40,A,7,2.1,A,7,300,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,11.1,A,7,11.1,A,7,100,A,7,981,A,7,80,A,7,3.6,A,7,800,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,07:00,0,12,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,10,E,9,10,A,7,10.6,A,7,10.6,A,7,100,A,7,981,A,7,80,A,7,2.6,A,7,400,B,7,30,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,08:00,134,1397,16,1,24,0,1,27,16,1,24,19,1,24,0,1,27,19,1,24,61,1,43,10,E,9,10,A,7,11.1,A,7,11.1,A,7,100,A,7,982,A,7,70,A,7,2.0,A,7,0,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,09:00,399,1397,43,1,24,0,1,27,43,1,24,52,1,24,0,1,27,52,1,24,185,1,43,10,E,9,10,A,7,11.1,A,7,11.1,A,7,100,A,7,982,A,7,100,A,7,2.5,A,7,0,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,10:00,631,1397,82,1,24,0,1,27,82,1,24,99,1,24,0,1,27,99,1,24,376,1,43,10,E,9,10,A,7,11.1,A,7,11.1,A,7,100,A,7,982,A,7,70,A,7,2.5,A,7,2400,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,11:00,811,1397,114,1,24,0,1,27,114,1,24,138,1,24,0,1,27,138,1,24,550,1,43,10,E,9,10,A,7,12.7,A,7,11.6,A,7,93,A,7,982,A,7,50,A,7,3.0,A,7,6400,B,7,90,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,12:00,925,1397,135,1,24,0,1,27,135,1,24,164,1,24,0,1,27,164,1,24,669,1,43,10,E,9,10,A,7,13.8,A,7,11.6,A,7,87,A,7,982,A,7,70,A,7,2.0,A,7,6400,B,7,90,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,13:00,967,1397,171,1,24,0,1,27,171,1,24,206,1,24,0,1,27,206,1,24,831,1,43,10,E,9,10,A,7,13.9,A,7,11.7,A,7,87,A,7,981,A,7,170,A,7,1.5,A,7,6400,B,7,274,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,14:00,934,1397,164,1,24,0,1,27,164,1,24,197,1,24,0,1,27,197,1,24,791,1,43,10,E,9,10,A,7,15.0,A,7,12.2,A,7,83,A,7,980,A,7,180,A,7,3.1,A,7,8000,B,7,335,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/23/1996,15:00,827,1397,141,1,24,0,1,27,141,1,24,169,1,24,0,1,27,169,1,24,664,1,43,10,E,9,10,A,7,15.0,A,7,12.2,A,7,83,A,7,979,A,7,170,A,7,4.1,A,7,6400,B,7,305,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/23/1996,16:00,655,1397,123,1,24,0,1,27,123,1,24,144,1,24,0,1,27,144,1,24,536,1,43,10,E,9,10,A,7,15.6,A,7,12.2,A,7,80,A,7,979,A,7,0,A,7,0.0,A,7,6400,B,7,792,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/23/1996,17:00,428,1397,125,1,24,34,1,27,115,1,24,138,1,24,31,1,27,128,1,24,307,1,43,10,E,9,9,A,7,16.1,A,7,12.2,A,7,78,A,7,979,A,7,140,A,7,1.5,A,7,6400,B,7,853,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/23/1996,18:00,165,1397,44,1,25,60,1,28,36,1,25,47,1,25,36,1,28,43,1,25,75,1,45,5,B,8,5,B,8,15.0,A,7,12.2,A,7,83,A,7,979,A,7,0,A,7,0.0,A,7,800,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/23/1996,19:00,2,175,0,1,24,1,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,0,E,9,0,A,7,13.9,A,7,12.2,A,7,89,A,7,978,A,7,40,A,7,2.1,A,7,6400,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,B,8,5,B,8,13.3,A,7,11.7,A,7,90,A,7,978,A,7,0,A,7,0.0,A,7,800,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,9,A,7,12.2,A,7,11.1,A,7,93,A,7,978,A,7,80,A,7,1.5,A,7,4800,B,7,1158,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,9,A,7,11.1,A,7,10.6,A,7,97,A,7,978,A,7,0,A,7,0.0,A,7,4800,B,7,1158,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,B,8,9,B,8,11.1,A,7,10.6,A,7,97,A,7,977,A,7,210,A,7,3.1,A,7,800,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/23/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,9,A,7,13.3,A,7,12.2,A,7,93,A,7,977,A,7,240,A,7,6.2,A,7,4800,B,7,427,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/24/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,14.4,A,7,13.3,A,7,93,A,7,977,A,7,240,A,7,3.6,A,7,800,B,7,427,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/24/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,9,A,7,15.0,A,7,13.9,A,7,93,A,7,975,A,7,240,A,7,6.7,A,7,800,B,7,457,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/24/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,E,9,3,A,7,14.4,A,7,13.9,A,7,97,A,7,975,A,7,240,A,7,5.2,A,7,800,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/24/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,14.4,A,7,13.8,A,7,96,A,7,975,A,7,240,A,7,4.6,A,7,3200,B,7,91,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/24/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,15.0,A,7,14.4,A,7,96,A,7,975,A,7,250,A,7,6.2,A,7,800,B,7,91,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/24/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,15.0,A,7,14.4,A,7,96,A,7,976,A,7,260,A,7,5.2,A,7,4800,B,7,152,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/24/1996,07:00,0,35,0,1,24,0,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,0,E,9,0,A,7,15.0,A,7,11.7,A,7,81,A,7,979,A,7,320,A,7,6.2,A,7,8000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -02/24/1996,08:00,140,1396,53,1,25,231,1,28,30,1,25,56,1,25,119,1,28,44,1,25,53,1,45,0,B,8,0,B,8,14.4,A,7,1.1,A,7,40,A,7,981,A,7,310,A,7,6.7,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,09:00,406,1396,234,1,25,592,1,28,62,1,25,245,1,25,521,1,28,93,1,25,118,1,45,0,B,8,0,B,8,13.3,A,7,-4.4,A,7,28,A,7,982,A,7,350,A,7,4.6,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,10:00,637,1396,428,1,25,749,1,28,86,1,25,444,1,25,723,1,28,113,1,25,173,1,45,0,B,8,0,B,8,14.4,A,7,-2.8,A,7,30,A,7,983,A,7,330,A,7,5.2,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,11:00,817,1396,587,1,25,826,1,28,103,1,25,617,1,25,821,1,28,134,1,25,235,1,45,0,B,8,0,B,8,15.0,A,7,-2.8,A,7,28,A,7,984,A,7,290,A,7,7.7,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,12:00,931,1396,690,1,25,864,1,28,114,1,25,731,1,25,868,1,28,150,1,25,292,1,45,0,B,8,0,B,8,15.0,A,7,-5.0,A,7,24,A,7,984,A,7,280,A,7,7.2,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,13:00,973,1396,728,1,24,876,1,27,117,1,24,773,1,24,882,1,27,156,1,24,317,1,43,0,E,9,0,A,7,16.1,A,7,-6.7,A,7,19,A,7,984,A,7,310,A,7,7.7,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,14:00,940,1396,698,1,25,866,1,28,114,1,25,739,1,25,871,1,28,151,1,25,295,1,45,0,B,8,0,B,8,17.2,A,7,-7.2,A,7,17,A,7,983,A,7,320,A,7,7.7,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,15:00,833,1396,602,1,25,833,1,28,105,1,25,633,1,25,830,1,28,137,1,25,242,1,45,0,B,8,0,B,8,18.3,A,7,-7.2,A,7,16,A,7,983,A,7,310,A,7,7.7,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,16:00,660,1396,448,1,25,762,1,28,88,1,25,466,1,25,739,1,28,115,1,25,180,1,45,0,B,8,0,B,8,18.9,A,7,-6.7,A,7,16,A,7,983,A,7,310,A,7,5.7,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,17:00,433,1396,256,1,25,618,1,28,65,1,25,269,1,25,555,1,28,97,1,25,125,1,45,0,B,8,0,B,8,18.3,A,7,-7.2,A,7,16,A,7,984,A,7,300,A,7,6.7,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,18:00,170,1396,70,1,25,287,1,28,35,1,25,71,1,25,175,1,28,50,1,25,61,1,45,0,B,8,0,B,8,15.6,A,7,-6.7,A,7,20,A,7,985,A,7,320,A,7,2.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,19:00,2,198,0,1,24,4,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,0,E,9,0,A,7,13.3,A,7,-6.1,A,7,24,A,7,987,A,7,300,A,7,3.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,11.7,A,7,-6.7,A,7,25,A,7,987,A,7,310,A,7,2.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,10.0,A,7,-6.1,A,7,30,A,7,988,A,7,300,A,7,2.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,8.3,A,7,-5.0,A,7,37,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,8.3,A,7,-5.0,A,7,37,A,7,988,A,7,300,A,7,4.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/24/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,8.3,A,7,-6.1,A,7,33,A,7,989,A,7,310,A,7,2.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,7.2,A,7,-6.1,A,7,36,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,7.2,A,7,-5.6,A,7,38,A,7,989,A,7,280,A,7,2.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,7.2,A,7,-6.1,A,7,36,A,7,989,A,7,300,A,7,3.1,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,6.1,A,7,-4.4,A,7,45,A,7,989,A,7,290,A,7,2.6,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,6.7,A,7,-5.6,A,7,39,A,7,989,A,7,250,A,7,1.5,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,6.1,A,7,-5.0,A,7,43,A,7,989,A,7,310,A,7,2.1,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,07:00,0,58,0,1,24,5,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,0,E,9,0,A,7,6.7,A,7,-3.3,A,7,47,A,7,990,A,7,300,A,7,2.1,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,08:00,146,1396,63,1,25,360,1,28,25,1,25,64,1,25,208,1,28,43,1,25,45,1,45,0,B,8,0,B,8,8.9,A,7,-3.3,A,7,41,A,7,990,A,7,300,A,7,2.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,09:00,412,1396,253,1,25,695,1,28,47,1,25,265,1,25,622,1,28,80,1,25,98,1,45,0,B,8,0,B,8,12.8,A,7,-3.3,A,7,31,A,7,991,A,7,280,A,7,3.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,10:00,644,1396,448,1,25,829,1,28,65,1,25,470,1,25,800,1,28,100,1,25,143,1,45,0,B,8,0,B,8,16.7,A,7,-5.6,A,7,20,A,7,990,A,7,270,A,7,4.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,11:00,823,1396,605,1,25,892,1,28,78,1,25,632,1,25,881,1,28,111,1,25,182,1,45,0,B,8,0,B,8,17.8,A,7,-6.1,A,7,18,A,7,990,A,7,290,A,7,4.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,12:00,938,1396,706,1,25,923,1,28,86,1,25,737,1,25,919,1,28,118,1,25,217,1,45,0,B,8,0,B,8,19.4,A,7,-4.4,A,7,19,A,7,990,A,7,260,A,7,3.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,13:00,979,1396,743,1,24,932,1,27,89,1,24,775,1,24,929,1,27,121,1,24,233,1,43,0,E,9,0,A,7,20.6,A,7,-5.0,A,7,17,A,7,989,A,7,260,A,7,4.1,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,14:00,945,1396,712,1,25,923,1,28,87,1,25,743,1,25,919,1,28,119,1,25,220,1,45,0,B,8,0,B,8,21.7,A,7,-5.6,A,7,15,A,7,988,A,7,250,A,7,5.7,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,15:00,838,1396,616,1,25,893,1,28,79,1,25,644,1,25,883,1,28,112,1,25,186,1,45,0,B,8,0,B,8,22.2,A,7,-4.4,A,7,16,A,7,987,A,7,220,A,7,5.2,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,16:00,665,1396,464,1,25,833,1,28,67,1,25,487,1,25,807,1,28,101,1,25,148,1,45,0,B,8,0,B,8,22.2,A,7,-4.4,A,7,16,A,7,986,A,7,240,A,7,5.7,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,17:00,438,1396,272,1,25,709,1,28,49,1,25,286,1,25,645,1,28,83,1,25,103,1,45,0,B,8,0,B,8,20.0,A,7,-4.4,A,7,18,A,7,986,A,7,230,A,7,5.2,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,18:00,175,1396,80,1,25,409,1,28,28,1,25,80,1,25,274,1,28,45,1,25,52,1,45,0,B,8,0,B,8,17.8,A,7,-4.4,A,7,21,A,7,986,A,7,230,A,7,3.1,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,19:00,3,198,0,1,24,16,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,0,E,9,0,A,7,17.2,A,7,-5.0,A,7,20,A,7,987,A,7,210,A,7,2.1,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,15.0,A,7,-3.9,A,7,26,A,7,986,A,7,210,A,7,1.5,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,14.4,A,7,-2.8,A,7,30,A,7,986,A,7,230,A,7,4.1,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,14.4,A,7,-2.2,A,7,31,A,7,985,A,7,240,A,7,4.1,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,13.9,A,7,-2.2,A,7,32,A,7,985,A,7,240,A,7,4.6,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/25/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,12.8,A,7,-2.2,A,7,34,A,7,985,A,7,240,A,7,3.1,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,11.7,A,7,-1.7,A,7,39,A,7,985,A,7,230,A,7,2.1,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,11.1,A,7,-1.7,A,7,40,A,7,984,A,7,240,A,7,2.1,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,10.6,A,7,-1.7,A,7,42,A,7,984,A,7,220,A,7,1.5,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,10.0,A,7,-1.7,A,7,43,A,7,984,A,7,230,A,7,3.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,8.9,A,7,-1.1,A,7,49,A,7,984,A,7,240,A,7,3.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,8.3,A,7,-0.6,A,7,53,A,7,984,A,7,250,A,7,3.6,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,07:00,1,81,0,1,24,10,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,0,E,9,0,A,7,7.2,A,7,-0.6,A,7,57,A,7,984,A,7,230,A,7,2.6,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,08:00,152,1395,68,1,25,407,1,28,23,1,25,68,1,25,260,1,28,40,1,25,44,1,45,0,B,8,0,B,8,10.0,A,7,0.0,A,7,50,A,7,984,A,7,240,A,7,3.1,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,09:00,418,1395,257,1,25,717,1,28,42,1,25,272,1,25,645,1,28,78,1,25,98,1,45,0,B,8,0,B,8,13.3,A,7,1.1,A,7,43,A,7,984,A,7,220,A,7,2.6,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,10:00,650,1395,450,1,25,840,1,28,58,1,25,474,1,25,813,1,28,94,1,25,139,1,45,0,B,8,0,B,8,17.2,A,7,0.6,A,7,33,A,7,984,A,7,240,A,7,4.1,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,11:00,829,1395,605,1,25,899,1,28,70,1,25,635,1,25,889,1,28,104,1,25,176,1,45,0,B,8,0,B,8,21.1,A,7,2.8,A,7,30,A,7,983,A,7,230,A,7,3.6,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,12:00,944,1395,705,1,25,928,1,28,77,1,25,738,1,25,925,1,28,111,1,25,208,1,45,0,B,8,0,B,8,23.3,A,7,4.4,A,7,29,A,7,983,A,7,260,A,7,6.7,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,13:00,985,1395,742,1,24,938,1,27,80,1,24,777,1,24,936,1,27,113,1,24,224,1,43,0,E,9,0,A,7,24.4,A,7,7.2,A,7,33,A,7,982,A,7,250,A,7,8.2,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,14:00,951,1395,712,1,25,930,1,28,78,1,25,746,1,25,927,1,28,112,1,25,211,1,45,0,B,8,0,B,8,24.4,A,7,6.7,A,7,32,A,7,981,A,7,240,A,7,6.2,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,15:00,844,1395,618,1,25,904,1,28,71,1,25,649,1,25,895,1,28,105,1,25,180,1,45,0,B,8,0,B,8,24.4,A,7,7.8,A,7,35,A,7,980,A,7,240,A,7,5.7,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,16:00,671,1395,468,1,25,849,1,28,60,1,25,493,1,25,824,1,28,96,1,25,143,1,45,0,B,8,0,B,8,24.4,A,7,8.9,A,7,37,A,7,980,A,7,250,A,7,5.2,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,17:00,443,1395,278,1,25,736,1,28,44,1,25,294,1,25,670,1,28,80,1,25,103,1,45,0,B,8,0,B,8,23.3,A,7,8.9,A,7,40,A,7,980,A,7,250,A,7,3.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,18:00,179,1395,85,1,25,456,1,28,26,1,25,86,1,25,310,1,28,46,1,25,51,1,45,0,B,8,0,B,8,21.7,A,7,9.4,A,7,45,A,7,981,A,7,220,A,7,2.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,19:00,3,221,0,1,24,27,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,0,E,9,0,A,7,18.9,A,7,9.4,A,7,54,A,7,981,A,7,240,A,7,2.6,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,19.4,A,7,9.4,A,7,52,A,7,982,A,7,270,A,7,2.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,16.7,A,7,8.9,A,7,60,A,7,982,A,7,240,A,7,1.5,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,16.7,A,7,8.9,A,7,60,A,7,982,A,7,290,A,7,2.1,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,14.4,A,7,8.9,A,7,70,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/26/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,15.6,A,7,8.9,A,7,64,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,13.3,A,7,8.9,A,7,75,A,7,982,A,7,100,A,7,4.1,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,12.2,A,7,5.6,A,7,64,A,7,982,A,7,70,A,7,3.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,11.1,A,7,3.3,A,7,59,A,7,982,A,7,80,A,7,2.1,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,11.1,A,7,3.9,A,7,61,A,7,982,A,7,50,A,7,3.1,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,11.1,A,7,3.3,A,7,59,A,7,982,A,7,60,A,7,2.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,9.4,A,7,4.4,A,7,71,A,7,983,A,7,90,A,7,2.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,07:00,1,128,0,1,24,22,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,0,E,9,0,A,7,9.4,A,7,4.4,A,7,71,A,7,983,A,7,100,A,7,2.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,08:00,158,1394,74,1,25,462,1,28,21,1,25,77,1,25,318,1,28,41,1,25,45,1,45,1,B,8,1,B,8,10.6,A,7,5.0,A,7,68,A,7,984,A,7,90,A,7,2.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,09:00,424,1394,250,1,25,696,1,28,37,1,25,264,1,25,629,1,28,72,1,25,94,1,45,1,B,8,1,B,8,12.2,A,7,4.4,A,7,59,A,7,984,A,7,100,A,7,2.1,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,10:00,656,1394,427,1,25,753,1,28,72,1,25,453,1,25,737,1,28,105,1,25,159,1,45,2,B,8,2,B,8,15.0,A,7,3.9,A,7,47,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,11:00,836,1394,564,1,25,742,1,28,118,1,25,602,1,25,752,1,28,150,1,25,287,1,45,2,B,8,2,B,8,17.2,A,7,5.0,A,7,44,A,7,984,A,7,190,A,7,2.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,12:00,950,1394,698,1,24,818,1,27,140,1,24,724,1,24,815,1,27,167,1,24,342,1,43,3,E,9,3,A,7,19.4,A,7,6.7,A,7,44,A,7,983,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,13:00,991,1394,752,1,24,956,1,27,72,1,24,789,1,24,955,1,27,108,1,24,213,1,43,0,E,9,0,A,7,20.0,A,7,7.8,A,7,45,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,14:00,957,1394,722,1,25,949,1,28,70,1,25,758,1,25,947,1,28,106,1,25,201,1,45,0,B,8,0,B,8,21.7,A,7,8.9,A,7,44,A,7,981,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,15:00,849,1394,627,1,25,924,1,28,64,1,25,660,1,25,916,1,28,100,1,25,172,1,45,0,B,8,0,B,8,22.8,A,7,9.4,A,7,42,A,7,980,A,7,160,A,7,2.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,16:00,676,1394,477,1,25,872,1,28,54,1,25,504,1,25,848,1,28,91,1,25,138,1,45,0,B,8,0,B,8,24.4,A,7,10.6,A,7,42,A,7,979,A,7,230,A,7,4.1,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,17:00,448,1394,286,1,25,766,1,28,40,1,25,304,1,25,700,1,28,78,1,25,100,1,45,0,B,8,0,B,8,23.3,A,7,11.1,A,7,46,A,7,979,A,7,220,A,7,2.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,18:00,184,1394,90,1,25,504,1,28,23,1,25,95,1,25,364,1,28,47,1,25,51,1,45,0,B,8,0,B,8,22.2,A,7,11.1,A,7,49,A,7,979,A,7,220,A,7,2.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,19:00,4,244,1,1,24,40,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,0,E,9,0,A,7,21.7,A,7,12.2,A,7,55,A,7,978,A,7,210,A,7,3.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,20.0,A,7,12.2,A,7,61,A,7,978,A,7,190,A,7,3.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,18.9,A,7,12.2,A,7,65,A,7,978,A,7,200,A,7,3.6,A,7,11200,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,19.4,A,7,12.8,A,7,66,A,7,978,A,7,230,A,7,4.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,18.9,A,7,13.3,A,7,70,A,7,977,A,7,240,A,7,6.2,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/27/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,18.3,A,7,13.3,A,7,73,A,7,976,A,7,240,A,7,4.6,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,E,9,0,A,7,18.3,A,7,13.9,A,7,76,A,7,975,A,7,230,A,7,4.1,A,7,11200,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,B,8,2,B,8,18.3,A,7,13.9,A,7,76,A,7,975,A,7,240,A,7,7.7,A,7,11200,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,E,9,3,A,7,17.8,A,7,13.9,A,7,78,A,7,975,A,7,250,A,7,6.2,A,7,11200,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,E,9,2,A,7,17.2,A,7,13.8,A,7,80,A,7,975,A,7,260,A,7,5.2,A,7,11200,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,10,A,7,17.2,A,7,13.9,A,7,81,A,7,975,A,7,350,A,7,3.1,A,7,11200,B,7,2286,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,E,9,9,A,7,16.7,A,7,13.9,A,7,84,A,7,974,A,7,230,A,7,2.6,A,7,11200,B,7,3048,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,07:00,1,151,0,1,24,0,1,27,0,1,24,0,1,24,0,1,27,0,1,24,0,1,43,8,E,9,8,A,7,16.1,A,7,13.9,A,7,87,A,7,975,A,7,250,A,7,4.1,A,7,11200,B,7,2743,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/28/1996,08:00,164,1394,63,1,24,286,1,27,30,1,24,65,1,24,174,1,27,45,1,24,54,1,43,2,E,9,2,A,7,16.1,A,7,14.4,A,7,90,A,7,975,A,7,240,A,7,4.6,A,7,6400,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/28/1996,09:00,431,1394,156,1,25,289,1,28,66,1,25,170,1,25,260,1,28,90,1,25,119,1,45,5,B,8,4,B,8,16.7,A,7,14.4,A,7,86,A,7,975,A,7,250,A,7,4.1,A,7,8000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -02/28/1996,10:00,663,1394,384,1,25,432,1,28,178,1,25,401,1,25,428,1,28,196,1,25,372,1,45,7,B,8,7,B,8,17.8,A,7,13.8,A,7,77,A,7,976,A,7,250,A,7,5.7,A,7,11200,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,11:00,842,1394,251,1,24,43,1,27,225,1,24,277,1,24,43,1,27,250,1,24,753,1,43,10,E,9,9,A,7,18.9,A,7,13.3,A,7,70,A,7,976,A,7,260,A,7,6.2,A,7,16000,B,7,1829,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,12:00,956,1394,615,1,24,698,1,27,136,1,24,661,1,24,714,1,27,170,1,24,379,1,43,2,E,9,2,A,7,19.4,A,7,13.3,A,7,68,A,7,976,A,7,260,A,7,6.2,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,13:00,997,1394,629,1,24,486,1,27,281,1,24,665,1,24,504,1,27,303,1,24,824,1,43,6,E,9,4,A,7,19.4,A,7,8.9,A,7,51,A,7,976,A,7,330,A,7,7.2,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,14:00,963,1394,645,1,24,656,1,27,192,1,24,677,1,24,661,1,27,219,1,24,518,1,43,2,E,9,2,A,7,17.8,A,7,6.1,A,7,46,A,7,976,A,7,320,A,7,7.7,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,15:00,855,1394,603,1,25,840,1,28,87,1,25,628,1,25,831,1,28,117,1,25,196,1,45,2,B,8,2,B,8,18.3,A,7,0.6,A,7,30,A,7,976,A,7,310,A,7,8.2,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,16:00,681,1394,444,1,25,738,1,28,83,1,25,466,1,25,722,1,28,112,1,25,178,1,45,2,B,8,2,B,8,17.8,A,7,-2.2,A,7,25,A,7,976,A,7,290,A,7,7.7,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,17:00,453,1394,258,1,25,551,1,28,79,1,25,268,1,25,497,1,28,106,1,25,149,1,45,2,B,8,2,B,8,17.8,A,7,-1.1,A,7,27,A,7,977,A,7,290,A,7,5.2,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,18:00,188,1394,81,1,25,338,1,28,36,1,25,83,1,25,218,1,28,54,1,25,64,1,45,1,B,8,1,B,8,15.6,A,7,-6.1,A,7,21,A,7,977,A,7,300,A,7,3.1,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,19:00,5,267,0,1,25,13,1,28,0,1,25,0,1,25,0,1,28,0,1,25,0,1,45,1,B,8,1,B,8,13.9,A,7,-4.4,A,7,27,A,7,978,A,7,280,A,7,5.2,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,B,8,1,B,8,13.9,A,7,-5.0,A,7,25,A,7,979,A,7,290,A,7,7.7,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,B,8,1,B,8,12.8,A,7,-5.6,A,7,26,A,7,980,A,7,290,A,7,7.7,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,B,8,1,B,8,11.6,A,7,-4.6,A,7,31,A,7,981,A,7,290,A,7,7.0,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,10.4,A,7,-3.7,A,7,34,A,7,981,A,7,310,A,7,6.4,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -02/28/1996,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,B,8,0,B,8,9.2,A,7,-2.8,A,7,35,A,7,982,A,7,340,A,7,5.7,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -03/01/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.0,A,7,-2.0,A,7,46,A,7,996,A,7,350,A,7,5.1,A,7,24100,B,7,1680,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.8,A,7,-1.1,A,7,50,A,7,996,A,7,360,A,7,4.4,A,7,24100,B,7,1830,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,-0.2,A,7,49,A,7,996,A,7,360,A,7,3.8,A,7,24100,B,7,1830,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,0.6,A,7,76,A,7,997,A,7,10,A,7,3.1,A,7,11300,B,7,1830,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,1.1,A,7,82,A,7,996,A,7,0,A,7,0.0,A,7,24100,B,7,1830,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -03/01/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,3.3,A,7,1.7,A,7,89,A,7,997,A,7,360,A,7,2.1,A,7,24100,B,7,3050,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,07:00,2,197,3,1,13,3,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,8,A,7,4,A,7,2.8,A,7,0.6,A,7,86,A,7,997,A,7,100,A,7,3.1,A,7,19300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,08:00,173,1393,68,1,13,164,1,9,48,1,13,72,1,13,92,1,9,60,1,13,91,1,21,7,A,7,2,A,7,3.9,A,7,-2.8,A,7,62,A,7,998,A,7,60,A,7,5.2,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -03/01/1990,09:00,440,1393,224,1,13,424,1,9,92,1,13,240,1,13,382,1,9,119,1,13,171,1,21,7,A,7,3,A,7,3.9,A,7,-3.3,A,7,60,A,7,999,A,7,60,A,7,6.2,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,10:00,672,1393,354,1,13,449,1,9,139,1,13,382,1,13,448,1,9,165,1,13,284,1,21,8,A,7,4,A,7,6.7,A,7,-3.3,A,7,49,A,7,999,A,7,90,A,7,5.2,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,11:00,851,1393,484,1,13,339,1,9,277,1,13,519,1,13,361,1,9,298,1,13,711,1,21,9,A,7,7,A,7,7.2,A,7,-3.9,A,7,46,A,7,999,A,7,60,A,7,4.6,A,7,24100,B,7,3660,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,12:00,965,1393,729,1,9,878,1,9,122,1,13,772,1,9,882,1,9,159,1,13,323,1,18,5,A,7,0,A,7,9.4,A,7,-3.9,A,7,39,A,7,998,A,7,70,A,7,1.5,A,7,19300,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,13:00,1006,1393,544,1,13,271,1,9,349,1,13,586,1,13,292,1,9,375,1,13,1064,1,21,6,A,7,5,A,7,9.4,A,7,-4.4,A,7,38,A,7,998,A,7,60,A,7,4.1,A,7,19300,B,7,7620,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,14:00,971,1393,555,1,13,388,1,9,285,1,13,604,1,13,418,1,9,312,1,13,809,1,21,7,A,7,7,A,7,9.4,A,7,-6.1,A,7,33,A,7,997,A,7,140,A,7,3.6,A,7,16100,B,7,2130,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,15:00,863,1393,324,1,9,8,1,9,319,1,13,365,1,9,8,1,9,360,1,13,1224,1,18,10,A,7,10,A,7,10.0,A,7,-5.0,A,7,35,A,7,996,A,7,120,A,7,3.1,A,7,11300,B,7,1830,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,16:00,688,1393,144,1,9,1,1,9,143,1,13,167,1,9,1,1,9,167,1,13,619,1,18,10,A,7,10,A,7,9.4,A,7,-4.4,A,7,38,A,7,996,A,7,160,A,7,2.6,A,7,11300,B,7,1680,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,17:00,460,1393,109,1,9,4,1,9,108,1,13,124,1,9,2,1,9,123,1,13,413,1,18,10,A,7,10,A,7,9.4,A,7,-4.4,A,7,38,A,7,995,A,7,190,A,7,2.6,A,7,11300,B,7,1520,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,18:00,195,1393,37,1,13,6,1,9,37,1,13,43,1,13,0,1,9,43,1,13,132,1,21,10,A,7,10,A,7,8.9,A,7,-4.4,A,7,39,A,7,995,A,7,180,A,7,2.6,A,7,16100,B,7,1460,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,19:00,6,313,4,1,13,0,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,8.3,A,7,-3.9,A,7,42,A,7,995,A,7,180,A,7,2.1,A,7,24100,B,7,1430,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,-3.9,A,7,42,A,7,995,A,7,170,A,7,2.6,A,7,16100,B,7,1680,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,-1.7,A,7,54,A,7,995,A,7,180,A,7,2.1,A,7,16100,B,7,2740,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,-1.1,A,7,60,A,7,995,A,7,210,A,7,2.1,A,7,16100,B,7,3050,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,6.1,A,7,-2.2,A,7,56,A,7,994,A,7,200,A,7,2.1,A,7,16100,B,7,3050,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/01/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,5.0,A,7,-1.7,A,7,62,A,7,994,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/02/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,4.4,A,7,-0.6,A,7,70,A,7,993,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/02/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,0.0,A,7,73,A,7,992,A,7,220,A,7,2.6,A,7,24100,B,7,2290,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/02/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,5.0,A,7,-0.6,A,7,68,A,7,991,A,7,140,A,7,1.5,A,7,24100,B,7,3350,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/02/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,3.9,A,7,0.0,A,7,76,A,7,991,A,7,250,A,7,2.6,A,7,16100,B,7,3660,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/02/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,1.1,A,7,79,A,7,991,A,7,220,A,7,2.6,A,7,12900,B,7,2900,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/02/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,1.7,A,7,79,A,7,990,A,7,230,A,7,2.6,A,7,11300,B,7,2900,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/02/1990,07:00,3,220,2,1,13,0,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,5.0,A,7,1.7,A,7,79,A,7,990,A,7,230,A,7,3.1,A,7,6400,B,7,3050,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/02/1990,08:00,179,1392,40,1,13,2,1,9,40,1,13,45,1,13,0,1,9,45,1,13,136,1,21,10,A,7,10,A,7,6.1,A,7,2.8,A,7,80,A,7,990,A,7,210,A,7,3.6,A,7,6400,B,7,1980,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/02/1990,09:00,447,1392,80,1,9,4,1,9,78,1,13,92,1,9,2,1,9,91,1,13,318,1,18,10,A,7,10,A,7,7.2,A,7,3.3,A,7,77,A,7,990,A,7,240,A,7,3.6,A,7,6400,B,7,2290,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/02/1990,10:00,679,1392,139,1,9,3,1,9,137,1,13,162,1,9,2,1,9,161,1,13,594,1,18,10,A,7,10,A,7,8.3,A,7,4.4,A,7,77,A,7,990,A,7,220,A,7,4.6,A,7,6400,B,7,1830,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/02/1990,11:00,857,1392,178,1,9,1,1,9,177,1,13,210,1,9,1,1,9,209,1,13,812,1,18,10,A,7,10,A,7,8.9,A,7,5.0,A,7,77,A,7,990,A,7,230,A,7,3.6,A,7,6400,B,7,640,A,7,1.4,E,8,0.000,F,8,0.00,?,0,3,1,D,9,05,C,8 -03/02/1990,12:00,971,1392,207,1,9,1,1,9,206,1,13,245,1,9,1,1,9,245,1,13,969,1,18,10,A,7,10,A,7,8.3,A,7,6.1,A,7,86,A,7,989,A,7,240,A,7,3.6,A,7,6400,B,7,640,A,7,1.5,E,8,0.000,F,8,0.00,?,0,3,1,D,9,05,C,8 -03/02/1990,13:00,1012,1392,211,1,9,2,1,9,210,1,13,252,1,9,2,1,9,251,1,13,1001,1,18,10,A,7,10,A,7,8.3,A,7,6.7,A,7,89,A,7,988,A,7,240,A,7,3.1,A,7,3200,B,7,910,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/02/1990,14:00,977,1392,232,1,9,1,1,9,231,1,13,273,1,9,1,1,9,272,1,13,1062,1,18,10,A,7,10,A,7,8.3,A,7,7.2,A,7,93,A,7,986,A,7,240,A,7,2.6,A,7,2400,B,7,400,A,7,1.6,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -03/02/1990,15:00,868,1392,185,1,9,2,1,9,184,1,13,218,1,9,2,1,9,217,1,13,842,1,18,10,A,7,10,A,7,8.9,A,7,7.8,A,7,93,A,7,985,A,7,280,A,7,2.6,A,7,2400,B,7,150,A,7,1.7,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -03/02/1990,16:00,694,1392,143,1,9,1,1,9,143,1,13,168,1,9,1,1,9,167,1,13,621,1,18,10,A,7,10,A,7,8.9,A,7,7.8,A,7,93,A,7,984,A,7,240,A,7,1.5,A,7,2400,B,7,150,A,7,1.7,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -03/02/1990,17:00,465,1392,100,1,9,1,1,9,99,1,13,114,1,9,1,1,9,114,1,13,389,1,18,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,984,A,7,300,A,7,1.5,A,7,2400,B,7,150,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/02/1990,18:00,200,1392,36,1,13,1,1,9,36,1,13,41,1,13,0,1,9,41,1,13,131,1,21,10,A,7,10,A,7,9.4,A,7,8.3,A,7,93,A,7,984,A,7,160,A,7,2.1,A,7,1600,B,7,150,A,7,1.7,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -03/02/1990,19:00,7,336,4,1,13,0,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,983,A,7,150,A,7,2.1,A,7,1600,B,7,120,A,7,1.8,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -03/02/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,983,A,7,150,A,7,2.1,A,7,1600,B,7,120,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/02/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,8.9,A,7,96,A,7,983,A,7,30,A,7,1.5,A,7,1600,B,7,120,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/02/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,982,A,7,90,A,7,2.6,A,7,400,B,7,120,A,7,1.8,E,8,0.000,?,0,0.00,?,0,10,1,D,9,45,C,8 -03/02/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,981,A,7,140,A,7,3.6,A,7,800,B,7,90,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/02/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,980,A,7,110,A,7,2.6,A,7,800,B,7,90,A,7,1.8,E,8,0.000,?,0,0.00,?,0,18,1,D,9,45,C,8 -03/03/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,979,A,7,180,A,7,2.1,A,7,2400,B,7,90,A,7,1.8,E,8,0.000,?,0,0.00,?,0,25,1,D,9,45,C,8 -03/03/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,978,A,7,0,A,7,0.0,A,7,2400,B,7,90,A,7,1.9,E,8,0.000,?,0,0.00,?,0,10,1,D,9,45,C,8 -03/03/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,977,A,7,40,A,7,1.5,A,7,400,B,7,90,A,7,1.8,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -03/03/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,976,A,7,30,A,7,2.1,A,7,400,B,7,60,A,7,1.8,E,8,0.000,?,0,0.00,?,0,20,1,D,9,45,C,8 -03/03/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,8.3,A,7,100,A,7,976,A,7,340,A,7,3.6,A,7,1600,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,15,1,D,9,45,C,8 -03/03/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,8.3,A,7,100,A,7,976,A,7,10,A,7,3.1,A,7,1600,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/03/1990,07:00,4,267,3,1,13,0,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,977,A,7,30,A,7,3.1,A,7,800,B,7,90,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/03/1990,08:00,186,1392,32,1,13,0,1,9,32,1,13,37,1,13,0,1,9,37,1,13,117,1,21,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,977,A,7,30,A,7,4.1,A,7,2000,B,7,90,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,40,C,8 -03/03/1990,09:00,453,1392,152,1,9,0,1,9,152,1,13,168,1,9,0,1,9,168,1,13,509,1,18,10,A,7,10,A,7,9.4,A,7,8.9,A,7,96,A,7,977,A,7,40,A,7,4.1,A,7,9700,B,7,210,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/03/1990,10:00,685,1392,143,1,9,0,1,9,143,1,13,167,1,9,0,1,9,167,1,13,617,1,18,10,A,7,10,A,7,9.4,A,7,8.3,A,7,93,A,7,977,A,7,40,A,7,3.6,A,7,6400,B,7,730,A,7,1.7,E,8,0.000,F,8,0.00,?,0,20,1,D,9,45,C,8 -03/03/1990,11:00,864,1392,185,1,9,2,1,9,184,1,13,218,1,9,2,1,9,217,1,13,840,1,18,10,A,7,10,A,7,9.4,A,7,8.9,A,7,96,A,7,977,A,7,10,A,7,3.6,A,7,9700,B,7,240,A,7,1.8,E,8,0.000,F,8,0.00,?,0,25,1,D,9,45,C,8 -03/03/1990,12:00,977,1392,202,1,9,1,1,9,202,1,13,241,1,9,1,1,9,241,1,13,957,1,18,10,A,7,10,A,7,10.0,A,7,8.9,A,7,93,A,7,978,A,7,360,A,7,3.1,A,7,9700,B,7,240,A,7,1.8,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -03/03/1990,13:00,1018,1392,218,1,9,1,1,9,218,1,13,260,1,9,1,1,9,260,1,13,1034,1,18,10,A,7,10,A,7,10.6,A,7,9.4,A,7,93,A,7,978,A,7,340,A,7,5.7,A,7,9700,B,7,270,A,7,1.9,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -03/03/1990,14:00,982,1392,461,1,9,280,1,9,264,1,13,506,1,9,302,1,9,292,1,13,750,1,18,10,A,7,9,A,7,10.0,A,7,7.2,A,7,83,A,7,977,A,7,40,A,7,2.6,A,7,11300,B,7,1220,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/03/1990,15:00,873,1392,461,1,13,449,1,9,180,1,13,501,1,13,463,1,9,210,1,13,437,1,21,6,A,7,4,A,7,13.3,A,7,7.2,A,7,67,A,7,977,A,7,360,A,7,4.1,A,7,16100,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/03/1990,16:00,699,1392,355,1,13,432,1,9,139,1,13,385,1,13,434,1,9,166,1,13,288,1,21,5,A,7,4,A,7,13.9,A,7,3.3,A,7,49,A,7,977,A,7,350,A,7,3.6,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/03/1990,17:00,470,1392,287,1,9,702,1,9,52,1,13,305,1,9,649,1,9,85,1,13,110,1,18,3,A,7,1,A,7,13.9,A,7,0.0,A,7,39,A,7,978,A,7,350,A,7,3.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/03/1990,18:00,204,1392,77,1,13,248,1,9,42,1,13,83,1,13,159,1,9,59,1,13,75,1,21,6,A,7,3,A,7,12.8,A,7,0.6,A,7,44,A,7,978,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/03/1990,19:00,8,359,10,1,13,32,1,9,5,1,13,0,1,13,0,1,9,0,1,13,0,1,21,3,A,7,1,A,7,10.6,A,7,0.6,A,7,50,A,7,979,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/03/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,6.1,A,7,3.3,A,7,83,A,7,979,A,7,270,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -03/03/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,5.6,A,7,2.2,A,7,79,A,7,980,A,7,290,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/03/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,6.7,A,7,1.7,A,7,71,A,7,981,A,7,290,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/03/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,8.3,A,7,-0.6,A,7,54,A,7,982,A,7,330,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/03/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,7.2,A,7,-1.1,A,7,56,A,7,982,A,7,350,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-1.1,A,7,58,A,7,982,A,7,340,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-1.1,A,7,60,A,7,982,A,7,350,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-3.3,A,7,55,A,7,983,A,7,350,A,7,4.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-4.4,A,7,53,A,7,984,A,7,10,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-5.0,A,7,55,A,7,984,A,7,20,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-5.6,A,7,57,A,7,986,A,7,30,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,07:00,5,290,7,1,13,27,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,2.2,A,7,-6.1,A,7,55,A,7,987,A,7,350,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,08:00,192,1391,93,1,13,501,1,9,26,1,13,98,1,13,351,1,9,49,1,13,52,1,21,0,A,7,0,A,7,3.9,A,7,-7.2,A,7,45,A,7,988,A,7,20,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,09:00,460,1391,298,1,9,782,1,9,43,1,13,319,1,9,718,1,9,81,1,13,104,1,18,0,A,7,0,A,7,5.6,A,7,-7.2,A,7,40,A,7,989,A,7,30,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,10:00,691,1391,496,1,9,886,1,9,58,1,13,526,1,9,864,1,9,95,1,13,144,1,18,0,A,7,0,A,7,6.1,A,7,-4.4,A,7,47,A,7,989,A,7,60,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,11:00,870,1391,658,1,9,946,1,9,69,1,13,694,1,9,939,1,9,105,1,13,182,1,18,0,A,7,0,A,7,7.2,A,7,-4.4,A,7,44,A,7,989,A,7,90,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,12:00,983,1391,760,1,9,972,1,9,76,1,13,800,1,9,971,1,9,111,1,13,218,1,18,0,A,7,0,A,7,8.9,A,7,-5.0,A,7,37,A,7,989,A,7,60,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,13:00,1023,1391,799,1,9,984,1,9,78,1,13,840,1,9,984,1,9,113,1,13,234,1,18,0,A,7,0,A,7,10.6,A,7,-6.7,A,7,30,A,7,989,A,7,60,A,7,4.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,14:00,988,1391,767,1,9,977,1,9,76,1,13,807,1,9,976,1,9,111,1,13,219,1,18,0,A,7,0,A,7,11.1,A,7,-4.4,A,7,34,A,7,988,A,7,40,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,15:00,879,1391,669,1,9,952,1,9,70,1,13,705,1,9,946,1,9,106,1,13,185,1,18,0,A,7,0,A,7,11.1,A,7,-5.6,A,7,31,A,7,988,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,16:00,703,1391,512,1,9,900,1,9,59,1,13,542,1,9,879,1,9,96,1,13,147,1,18,0,A,7,0,A,7,12.2,A,7,-5.6,A,7,29,A,7,988,A,7,170,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,17:00,475,1391,314,1,9,794,1,9,44,1,13,334,1,9,733,1,9,82,1,13,107,1,18,0,A,7,0,A,7,12.2,A,7,-5.0,A,7,30,A,7,988,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,18:00,209,1391,105,1,13,530,1,9,27,1,13,110,1,13,384,1,9,52,1,13,55,1,21,0,A,7,0,A,7,10.0,A,7,-3.3,A,7,39,A,7,989,A,7,150,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,19:00,9,359,11,1,13,42,1,9,5,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,8.3,A,7,-3.3,A,7,44,A,7,989,A,7,130,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,-2.8,A,7,49,A,7,990,A,7,120,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-2.2,A,7,56,A,7,990,A,7,130,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-1.1,A,7,65,A,7,990,A,7,150,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-1.1,A,7,65,A,7,990,A,7,150,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/04/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-1.7,A,7,67,A,7,991,A,7,150,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-1.7,A,7,70,A,7,991,A,7,170,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-1.7,A,7,73,A,7,992,A,7,170,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-1.7,A,7,76,A,7,992,A,7,180,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,1.7,A,7,-1.7,A,7,79,A,7,992,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,0.6,A,7,-1.7,A,7,85,A,7,993,A,7,70,A,7,1.5,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,0.6,A,7,-1.7,A,7,85,A,7,994,A,7,130,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,07:00,7,313,5,1,13,15,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,5,A,7,2,A,7,0.0,A,7,-1.7,A,7,89,A,7,994,A,7,130,A,7,1.5,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,08:00,199,1390,86,1,13,328,1,9,40,1,13,88,1,13,216,1,9,57,1,13,70,1,21,5,A,7,2,A,7,2.2,A,7,-0.6,A,7,82,A,7,995,A,7,70,A,7,1.5,A,7,6400,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,09:00,466,1390,224,1,9,370,1,9,102,1,13,239,1,9,339,1,9,125,1,13,192,1,18,5,A,7,2,A,7,5.6,A,7,0.0,A,7,68,A,7,995,A,7,180,A,7,2.6,A,7,9700,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/05/1990,10:00,698,1390,401,1,13,478,1,9,162,1,13,428,1,13,479,1,9,186,1,13,341,1,21,7,A,7,3,A,7,7.8,A,7,1.1,A,7,63,A,7,996,A,7,190,A,7,2.6,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/05/1990,11:00,876,1390,586,1,13,696,1,9,149,1,13,622,1,13,703,1,9,178,1,13,370,1,21,6,A,7,3,A,7,10.0,A,7,1.7,A,7,57,A,7,996,A,7,200,A,7,2.1,A,7,11300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,12:00,989,1390,705,1,9,772,1,9,157,1,13,755,1,9,788,1,9,192,1,13,455,1,18,5,A,7,2,A,7,12.2,A,7,3.3,A,7,55,A,7,995,A,7,200,A,7,3.6,A,7,11300,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,13:00,1029,1390,696,1,13,708,1,9,174,1,13,744,1,13,722,1,9,208,1,13,534,1,21,8,A,7,4,A,7,13.9,A,7,3.3,A,7,49,A,7,994,A,7,190,A,7,3.6,A,7,12900,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,14:00,993,1390,335,1,9,63,1,9,290,1,13,370,1,9,64,1,9,324,1,13,1062,1,18,10,A,7,9,A,7,14.4,A,7,3.3,A,7,48,A,7,994,A,7,190,A,7,3.6,A,7,11300,B,7,7620,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,15:00,884,1390,587,1,13,728,1,9,125,1,13,630,1,13,741,1,9,158,1,13,320,1,21,7,A,7,3,A,7,15.6,A,7,3.3,A,7,44,A,7,993,A,7,140,A,7,4.1,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,16:00,708,1390,453,1,9,691,1,9,102,1,13,483,1,9,688,1,9,132,1,13,224,1,18,6,A,7,2,A,7,15.6,A,7,2.8,A,7,43,A,7,993,A,7,170,A,7,5.2,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,17:00,479,1390,288,1,9,690,1,9,51,1,13,306,1,9,641,1,9,84,1,13,110,1,18,1,A,7,1,A,7,15.6,A,7,2.2,A,7,41,A,7,993,A,7,220,A,7,3.1,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,18:00,213,1390,104,1,13,492,1,9,30,1,13,108,1,13,357,1,9,53,1,13,59,1,21,0,A,7,0,A,7,13.3,A,7,3.3,A,7,51,A,7,993,A,7,190,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,19:00,10,382,11,1,13,37,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,10.6,A,7,2.2,A,7,57,A,7,993,A,7,160,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,2.2,A,7,61,A,7,993,A,7,160,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,2.2,A,7,59,A,7,994,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,2.2,A,7,68,A,7,994,A,7,180,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,2.2,A,7,68,A,7,994,A,7,180,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/05/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,1.7,A,7,68,A,7,994,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,1.7,A,7,76,A,7,994,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,1.1,A,7,71,A,7,994,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,0.0,A,7,68,A,7,994,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-0.6,A,7,63,A,7,994,A,7,310,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,0.0,A,7,82,A,7,994,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,0.0,A,7,85,A,7,995,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,07:00,8,359,2,1,13,0,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,6,A,7,3,A,7,2.8,A,7,0.0,A,7,82,A,7,995,A,7,260,A,7,1.5,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,08:00,205,1389,62,1,13,99,1,9,48,1,13,67,1,13,62,1,9,57,1,13,88,1,21,7,A,7,3,A,7,5.6,A,7,2.2,A,7,79,A,7,996,A,7,220,A,7,2.1,A,7,11300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,09:00,473,1389,222,1,9,308,1,9,118,1,13,239,1,9,291,1,9,140,1,13,235,1,18,5,A,7,2,A,7,11.1,A,7,4.4,A,7,64,A,7,996,A,7,250,A,7,2.1,A,7,11300,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,10:00,704,1389,465,1,9,676,1,9,124,1,13,489,1,9,666,1,9,150,1,13,264,1,18,1,A,7,0,A,7,15.0,A,7,1.7,A,7,41,A,7,996,A,7,270,A,7,3.6,A,7,11300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,11:00,883,1389,601,1,9,717,1,9,148,1,13,639,1,9,725,1,9,178,1,13,371,1,18,1,A,7,0,A,7,17.2,A,7,2.2,A,7,37,A,7,996,A,7,250,A,7,3.6,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,12:00,995,1389,728,1,9,797,1,9,158,1,13,779,1,9,813,1,9,194,1,13,463,1,18,0,A,7,0,A,7,18.3,A,7,2.2,A,7,34,A,7,995,A,7,260,A,7,3.1,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,13:00,1035,1389,759,1,9,798,1,9,167,1,13,814,1,9,815,1,9,205,1,13,521,1,18,1,A,7,0,A,7,19.4,A,7,2.2,A,7,32,A,7,995,A,7,280,A,7,2.1,A,7,19300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,14:00,999,1389,681,1,9,722,1,9,164,1,13,728,1,9,736,1,9,198,1,13,481,1,18,1,A,7,1,A,7,20.6,A,7,2.8,A,7,31,A,7,994,A,7,160,A,7,1.5,A,7,19300,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,15:00,889,1389,628,1,9,756,1,9,146,1,13,668,1,9,765,1,9,177,1,13,370,1,18,0,A,7,0,A,7,20.6,A,7,2.8,A,7,31,A,7,993,A,7,210,A,7,3.1,A,7,19300,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,16:00,713,1389,474,1,9,679,1,9,126,1,13,497,1,9,670,1,9,152,1,13,269,1,18,1,A,7,0,A,7,20.6,A,7,1.1,A,7,28,A,7,993,A,7,120,A,7,2.6,A,7,19300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,17:00,484,1389,275,1,9,533,1,9,91,1,13,286,1,9,488,1,9,116,1,13,171,1,18,0,A,7,0,A,7,20.0,A,7,1.7,A,7,30,A,7,993,A,7,200,A,7,2.1,A,7,19300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,18:00,218,1389,86,1,13,233,1,9,50,1,13,90,1,13,155,1,9,66,1,13,90,1,21,0,A,7,0,A,7,17.2,A,7,2.2,A,7,37,A,7,994,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,19:00,11,405,6,1,13,3,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,16.7,A,7,1.1,A,7,35,A,7,994,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,2.2,A,7,46,A,7,994,A,7,180,A,7,1.5,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,3.3,A,7,57,A,7,995,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,3.3,A,7,57,A,7,997,A,7,50,A,7,4.6,A,7,24100,B,7,2440,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,2.8,A,7,51,A,7,998,A,7,60,A,7,7.7,A,7,24100,B,7,2740,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/06/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,7,A,7,10.6,A,7,1.7,A,7,55,A,7,999,A,7,40,A,7,6.7,A,7,19300,B,7,2590,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,8.9,A,7,1.1,A,7,59,A,7,999,A,7,60,A,7,7.7,A,7,19300,B,7,2440,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,6.7,A,7,1.1,A,7,68,A,7,1000,A,7,50,A,7,6.7,A,7,19300,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,0.0,A,7,70,A,7,1001,A,7,60,A,7,7.7,A,7,16100,B,7,760,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,-0.6,A,7,70,A,7,1001,A,7,50,A,7,8.2,A,7,11300,B,7,760,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,-1.1,A,7,70,A,7,1003,A,7,50,A,7,6.7,A,7,11300,B,7,760,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-1.7,A,7,73,A,7,1004,A,7,40,A,7,6.7,A,7,11300,B,7,670,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,07:00,10,382,7,1,13,3,1,9,7,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,8,A,7,2.2,A,7,-2.2,A,7,73,A,7,1004,A,7,60,A,7,7.7,A,7,11300,B,7,3050,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,08:00,212,1389,81,1,13,90,1,9,67,1,13,87,1,13,62,1,9,77,1,13,142,1,21,10,A,7,5,A,7,2.2,A,7,-3.3,A,7,67,A,7,1006,A,7,60,A,7,8.8,A,7,8000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,09:00,480,1389,219,1,13,245,1,9,136,1,13,234,1,13,232,1,9,154,1,13,278,1,21,10,A,7,5,A,7,2.8,A,7,-3.9,A,7,62,A,7,1006,A,7,50,A,7,7.7,A,7,8000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/07/1990,10:00,711,1389,262,1,13,193,1,9,164,1,13,287,1,13,201,1,9,184,1,13,358,1,21,10,A,7,5,A,7,3.3,A,7,-6.7,A,7,48,A,7,1007,A,7,50,A,7,7.7,A,7,9700,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/07/1990,11:00,889,1389,616,1,13,708,1,9,165,1,13,650,1,13,713,1,9,193,1,13,411,1,21,10,A,7,4,A,7,4.4,A,7,-6.7,A,7,45,A,7,1007,A,7,60,A,7,8.2,A,7,11300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/07/1990,12:00,1001,1389,646,1,13,553,1,9,248,1,13,693,1,13,575,1,9,278,1,13,728,1,21,10,A,7,3,A,7,5.6,A,7,-6.7,A,7,41,A,7,1007,A,7,50,A,7,6.2,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,13:00,1041,1389,727,1,13,716,1,9,192,1,13,772,1,13,727,1,9,225,1,13,597,1,21,10,A,7,3,A,7,6.7,A,7,-7.2,A,7,37,A,7,1006,A,7,80,A,7,6.2,A,7,16100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,14:00,1004,1389,691,1,13,703,1,9,184,1,13,732,1,13,713,1,9,215,1,13,538,1,21,8,A,7,3,A,7,7.8,A,7,-8.3,A,7,31,A,7,1006,A,7,40,A,7,5.2,A,7,19300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,15:00,894,1389,583,1,13,611,1,9,191,1,13,608,1,13,611,1,9,214,1,13,468,1,21,10,A,7,4,A,7,7.8,A,7,-8.3,A,7,31,A,7,1005,A,7,50,A,7,5.2,A,7,19300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,16:00,718,1389,444,1,13,527,1,9,173,1,13,473,1,13,531,1,9,197,1,13,371,1,21,10,A,7,4,A,7,7.8,A,7,-8.3,A,7,31,A,7,1005,A,7,60,A,7,6.2,A,7,19300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,17:00,489,1389,277,1,13,580,1,9,74,1,13,292,1,13,538,1,9,102,1,13,145,1,21,10,A,7,4,A,7,7.2,A,7,-7.8,A,7,34,A,7,1005,A,7,80,A,7,4.6,A,7,19300,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,18:00,222,1389,81,1,13,110,1,9,63,1,13,87,1,13,77,1,9,75,1,13,134,1,21,10,A,7,5,A,7,6.1,A,7,-8.3,A,7,35,A,7,1006,A,7,80,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,19:00,13,428,11,1,13,14,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,5,A,7,5.0,A,7,-7.8,A,7,40,A,7,1006,A,7,70,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,4.4,A,7,-7.8,A,7,41,A,7,1006,A,7,70,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,3.9,A,7,-7.8,A,7,43,A,7,1007,A,7,60,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,2.8,A,7,-8.3,A,7,44,A,7,1006,A,7,70,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,2.2,A,7,-9.4,A,7,42,A,7,1006,A,7,70,A,7,3.6,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/07/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,1.7,A,7,-9.4,A,7,44,A,7,1006,A,7,70,A,7,3.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,0.0,A,7,-8.3,A,7,54,A,7,1006,A,7,110,A,7,2.6,A,7,19300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,-0.6,A,7,-8.3,A,7,56,A,7,1006,A,7,110,A,7,3.1,A,7,19300,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,-0.6,A,7,-7.8,A,7,59,A,7,1005,A,7,90,A,7,2.1,A,7,19300,B,7,7620,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-6.7,A,7,64,A,7,1005,A,7,120,A,7,2.6,A,7,19300,B,7,3660,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-7.2,A,7,61,A,7,1005,A,7,110,A,7,2.6,A,7,19300,B,7,3660,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-6.7,A,7,64,A,7,1005,A,7,90,A,7,2.6,A,7,19300,B,7,3660,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,07:00,11,405,6,1,13,2,1,9,5,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,8,A,7,-0.6,A,7,-6.7,A,7,64,A,7,1005,A,7,20,A,7,2.1,A,7,12900,B,7,7620,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,08:00,218,1388,46,1,13,9,1,9,45,1,13,53,1,13,1,1,9,52,1,13,160,1,21,10,A,7,9,A,7,-0.6,A,7,-7.2,A,7,61,A,7,1005,A,7,90,A,7,3.6,A,7,12900,B,7,7620,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,09:00,486,1388,184,1,9,146,1,9,134,1,13,202,1,9,139,1,9,153,1,13,306,1,18,10,A,7,8,A,7,0.0,A,7,-7.2,A,7,59,A,7,1006,A,7,80,A,7,2.6,A,7,16100,B,7,7620,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,10:00,717,1388,212,1,9,75,1,9,174,1,13,234,1,9,74,1,9,196,1,13,552,1,18,10,A,7,9,A,7,1.1,A,7,-7.8,A,7,52,A,7,1006,A,7,60,A,7,2.6,A,7,16100,B,7,3660,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,11:00,895,1388,459,1,9,294,1,9,270,1,13,497,1,9,315,1,9,293,1,13,712,1,18,10,A,7,9,A,7,2.8,A,7,-7.8,A,7,46,A,7,1005,A,7,0,A,7,0.0,A,7,16100,B,7,3350,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,12:00,1007,1388,428,1,9,122,1,9,340,1,13,469,1,9,129,1,9,375,1,13,1070,1,18,10,A,7,8,A,7,4.4,A,7,-9.4,A,7,36,A,7,1004,A,7,20,A,7,2.1,A,7,16100,B,7,3350,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,13:00,1046,1388,341,1,9,12,1,9,332,1,13,395,1,9,11,1,9,386,1,13,1426,1,18,10,A,7,10,A,7,5.6,A,7,-9.4,A,7,33,A,7,1004,A,7,80,A,7,1.5,A,7,16100,B,7,3350,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,14:00,1009,1388,303,1,9,6,1,9,299,1,13,352,1,9,5,1,9,348,1,13,1304,1,18,10,A,7,10,A,7,5.6,A,7,-10.0,A,7,32,A,7,1003,A,7,250,A,7,2.6,A,7,19300,B,7,3660,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,15:00,899,1388,260,1,9,10,1,9,253,1,13,300,1,9,9,1,9,294,1,13,1089,1,18,10,A,7,10,A,7,5.6,A,7,-10.0,A,7,32,A,7,1002,A,7,200,A,7,2.6,A,7,19300,B,7,3350,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,16:00,723,1388,232,1,9,3,1,9,231,1,13,263,1,9,3,1,9,261,1,13,895,1,18,10,A,7,10,A,7,6.1,A,7,-8.3,A,7,35,A,7,1002,A,7,160,A,7,3.1,A,7,19300,B,7,3350,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,17:00,493,1388,148,1,9,6,1,9,146,1,13,166,1,9,4,1,9,164,1,13,526,1,18,10,A,7,10,A,7,5.6,A,7,-8.3,A,7,36,A,7,1001,A,7,150,A,7,2.1,A,7,19300,B,7,3050,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,18:00,226,1388,65,1,13,3,1,9,65,1,13,72,1,13,1,1,9,72,1,13,208,1,21,10,A,7,10,A,7,5.6,A,7,-7.2,A,7,40,A,7,1001,A,7,160,A,7,2.6,A,7,16100,B,7,940,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,19:00,14,451,5,1,13,0,1,9,5,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,5.6,A,7,-6.1,A,7,43,A,7,1001,A,7,170,A,7,2.6,A,7,11300,B,7,850,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,-5.6,A,7,45,A,7,1001,A,7,170,A,7,1.5,A,7,11300,B,7,700,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,-3.9,A,7,51,A,7,1001,A,7,170,A,7,1.5,A,7,11300,B,7,2130,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,-2.8,A,7,58,A,7,1001,A,7,200,A,7,2.6,A,7,11300,B,7,2290,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -03/08/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,-1.7,A,7,62,A,7,1000,A,7,210,A,7,3.1,A,7,11300,B,7,1830,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/08/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,-3.9,A,7,55,A,7,999,A,7,240,A,7,3.1,A,7,11300,B,7,610,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,-1.1,A,7,73,A,7,998,A,7,240,A,7,3.1,A,7,11300,B,7,460,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,1.1,A,7,93,A,7,998,A,7,230,A,7,4.6,A,7,9700,B,7,460,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -03/09/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,0.6,A,7,89,A,7,997,A,7,250,A,7,2.1,A,7,8000,B,7,150,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,51,C,8 -03/09/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,1.7,A,7,93,A,7,996,A,7,250,A,7,3.1,A,7,6400,B,7,150,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,51,C,8 -03/09/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,1.7,A,7,93,A,7,996,A,7,220,A,7,3.6,A,7,6400,B,7,240,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,2.2,A,7,93,A,7,996,A,7,260,A,7,2.6,A,7,6400,B,7,240,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,07:00,13,451,3,1,13,0,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,3.3,A,7,2.8,A,7,96,A,7,996,A,7,230,A,7,3.1,A,7,2400,B,7,150,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,08:00,225,1387,33,1,13,2,1,9,33,1,13,39,1,13,0,1,9,39,1,13,126,1,21,10,A,7,10,A,7,3.9,A,7,3.3,A,7,96,A,7,996,A,7,210,A,7,4.1,A,7,2400,B,7,150,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,09:00,493,1387,167,1,9,1,1,9,166,1,13,184,1,9,1,1,9,184,1,13,567,1,18,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,995,A,7,230,A,7,5.2,A,7,2400,B,7,460,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,10:00,724,1387,237,1,9,0,1,9,237,1,13,267,1,9,0,1,9,267,1,13,910,1,18,10,A,7,10,A,7,8.3,A,7,6.7,A,7,89,A,7,996,A,7,230,A,7,4.6,A,7,4400,B,7,1520,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,11:00,901,1387,312,1,9,0,1,9,312,1,13,355,1,9,0,1,9,355,1,13,1251,1,18,10,A,7,10,A,7,8.3,A,7,6.7,A,7,89,A,7,995,A,7,260,A,7,4.6,A,7,4400,B,7,240,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,12:00,1013,1387,355,1,9,2,1,9,354,1,13,407,1,9,2,1,9,406,1,13,1459,1,18,10,A,7,10,A,7,11.1,A,7,7.8,A,7,80,A,7,995,A,7,260,A,7,5.7,A,7,11300,B,7,310,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,13:00,1052,1387,411,1,9,1,1,9,410,1,13,468,1,9,1,1,9,467,1,13,1626,1,18,10,A,7,10,A,7,11.7,A,7,7.8,A,7,77,A,7,994,A,7,240,A,7,7.7,A,7,11300,B,7,1830,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,14:00,1015,1387,563,1,9,360,1,9,301,1,13,615,1,9,389,1,9,330,1,13,908,1,18,10,A,7,9,A,7,12.8,A,7,8.3,A,7,75,A,7,993,A,7,260,A,7,6.7,A,7,11300,B,7,400,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -03/09/1990,15:00,904,1387,553,1,13,590,1,9,169,1,13,582,1,13,594,1,9,194,1,13,429,1,21,4,A,7,4,A,7,14.4,A,7,9.4,A,7,72,A,7,992,A,7,240,A,7,6.7,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,16:00,728,1387,459,1,9,650,1,9,118,1,13,484,1,9,646,1,9,145,1,13,258,1,18,3,A,7,1,A,7,14.4,A,7,10.0,A,7,75,A,7,991,A,7,240,A,7,7.2,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,17:00,498,1387,285,1,9,560,1,9,85,1,13,298,1,9,519,1,9,111,1,13,164,1,18,2,A,7,2,A,7,13.9,A,7,10.0,A,7,78,A,7,991,A,7,230,A,7,5.7,A,7,12900,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,18:00,231,1387,104,1,13,391,1,9,40,1,13,108,1,13,278,1,9,62,1,13,73,1,21,1,A,7,1,A,7,12.8,A,7,10.0,A,7,83,A,7,991,A,7,220,A,7,5.7,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,19:00,15,474,11,1,13,25,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,3,A,7,2,A,7,11.1,A,7,9.4,A,7,90,A,7,992,A,7,230,A,7,4.6,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,10.0,A,7,8.9,A,7,93,A,7,992,A,7,220,A,7,3.6,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,10.0,A,7,9.4,A,7,96,A,7,992,A,7,230,A,7,5.2,A,7,8000,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/09/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,10.0,A,7,9.4,A,7,96,A,7,992,A,7,220,A,7,4.6,A,7,8000,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,10.0,A,7,8.9,A,7,93,A,7,992,A,7,240,A,7,4.6,A,7,8000,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/09/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,8.9,A,7,96,A,7,992,A,7,270,A,7,2.6,A,7,8000,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/10/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,8.3,A,7,96,A,7,992,A,7,260,A,7,3.1,A,7,4800,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/10/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,8.9,A,7,96,A,7,992,A,7,310,A,7,3.1,A,7,4800,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -03/10/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,7.8,A,7,7.2,A,7,96,A,7,992,A,7,310,A,7,2.6,A,7,800,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/10/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,8.3,A,7,90,A,7,992,A,7,320,A,7,4.1,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/10/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,11.1,A,7,7.8,A,7,80,A,7,993,A,7,340,A,7,3.1,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,10.0,A,7,7.2,A,7,83,A,7,994,A,7,310,A,7,3.6,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,07:00,15,474,9,1,13,27,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,1,A,7,1,A,7,8.3,A,7,6.1,A,7,86,A,7,994,A,7,300,A,7,4.1,A,7,19300,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,08:00,232,1386,100,1,13,332,1,9,47,1,13,104,1,13,234,1,9,65,1,13,83,1,21,1,A,7,1,A,7,12.8,A,7,8.3,A,7,75,A,7,995,A,7,310,A,7,3.6,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,09:00,499,1386,291,1,9,664,1,9,55,1,13,311,1,9,622,1,9,86,1,13,117,1,18,0,A,7,0,A,7,15.6,A,7,8.9,A,7,65,A,7,995,A,7,320,A,7,3.6,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,10:00,730,1386,510,1,9,828,1,9,77,1,13,549,1,9,822,1,9,115,1,13,178,1,18,0,A,7,0,A,7,18.9,A,7,8.9,A,7,53,A,7,996,A,7,350,A,7,3.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,11:00,907,1386,661,1,9,877,1,9,90,1,13,692,1,9,871,1,9,120,1,13,213,1,18,0,A,7,0,A,7,20.0,A,7,8.3,A,7,47,A,7,995,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,12:00,1019,1386,722,1,9,797,1,9,138,1,13,761,1,9,801,1,9,171,1,13,389,1,18,3,A,7,1,A,7,21.1,A,7,8.9,A,7,46,A,7,995,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,13:00,1057,1386,740,1,9,794,1,9,136,1,13,785,1,9,800,1,9,173,1,13,416,1,18,3,A,7,2,A,7,21.7,A,7,8.3,A,7,43,A,7,994,A,7,270,A,7,2.6,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,14:00,1020,1386,763,1,9,891,1,9,109,1,13,792,1,9,889,1,9,136,1,13,271,1,18,2,A,7,0,A,7,22.8,A,7,7.2,A,7,37,A,7,993,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,15:00,909,1386,639,1,9,803,1,9,113,1,13,676,1,9,805,1,9,146,1,13,283,1,18,4,A,7,0,A,7,23.9,A,7,8.3,A,7,37,A,7,992,A,7,230,A,7,4.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,16:00,732,1386,481,1,9,740,1,9,91,1,13,507,1,9,730,1,9,120,1,13,199,1,18,4,A,7,1,A,7,23.3,A,7,8.3,A,7,38,A,7,992,A,7,280,A,7,3.6,A,7,19300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,17:00,502,1386,291,1,9,573,1,9,85,1,13,305,1,9,532,1,9,112,1,13,164,1,18,4,A,7,2,A,7,22.8,A,7,8.9,A,7,41,A,7,991,A,7,230,A,7,2.6,A,7,19300,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,18:00,235,1386,104,1,13,379,1,9,40,1,13,108,1,13,272,1,9,61,1,13,73,1,21,3,A,7,1,A,7,20.6,A,7,8.9,A,7,47,A,7,992,A,7,200,A,7,3.1,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,19:00,17,497,10,1,13,33,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,1,A,7,1,A,7,18.9,A,7,8.9,A,7,53,A,7,992,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,16.7,A,7,9.4,A,7,63,A,7,993,A,7,230,A,7,3.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,16.7,A,7,8.9,A,7,60,A,7,993,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,14.4,A,7,9.4,A,7,72,A,7,993,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,9.4,A,7,72,A,7,993,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/10/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,13.3,A,7,9.4,A,7,78,A,7,993,A,7,220,A,7,3.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,14.4,A,7,10.0,A,7,75,A,7,992,A,7,200,A,7,2.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,12.8,A,7,9.4,A,7,80,A,7,992,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,13.3,A,7,10.0,A,7,80,A,7,992,A,7,250,A,7,3.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,12.2,A,7,10.0,A,7,86,A,7,992,A,7,230,A,7,3.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,11.7,A,7,9.4,A,7,86,A,7,992,A,7,230,A,7,2.6,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,10.6,A,7,9.4,A,7,93,A,7,993,A,7,200,A,7,3.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,07:00,18,520,13,1,13,42,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,9.4,A,7,8.9,A,7,96,A,7,993,A,7,200,A,7,3.1,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,08:00,239,1386,114,1,13,477,1,9,35,1,13,119,1,13,359,1,9,57,1,13,67,1,21,0,A,7,0,A,7,13.9,A,7,11.7,A,7,87,A,7,993,A,7,220,A,7,4.1,A,7,12900,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,09:00,506,1386,318,1,9,730,1,9,55,1,13,341,1,9,686,1,9,89,1,13,118,1,18,0,A,7,0,A,7,17.8,A,7,13.3,A,7,75,A,7,994,A,7,210,A,7,3.1,A,7,12900,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,10:00,737,1386,468,1,9,675,1,9,112,1,13,499,1,9,674,1,9,140,1,13,249,1,18,6,A,7,2,A,7,20.0,A,7,13.3,A,7,66,A,7,994,A,7,210,A,7,4.1,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,11:00,914,1386,555,1,13,621,1,9,148,1,13,593,1,13,630,1,9,176,1,13,388,1,21,4,A,7,3,A,7,22.8,A,7,14.4,A,7,60,A,7,994,A,7,230,A,7,4.6,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,12:00,1025,1386,669,1,9,777,1,9,96,1,13,698,1,9,776,1,9,122,1,13,262,1,18,1,A,7,1,A,7,25.0,A,7,14.4,A,7,52,A,7,994,A,7,250,A,7,3.1,A,7,19300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,13:00,1063,1386,757,1,9,888,1,9,78,1,13,795,1,9,890,1,9,110,1,13,250,1,18,1,A,7,1,A,7,25.6,A,7,13.9,A,7,49,A,7,993,A,7,240,A,7,5.2,A,7,19300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,14:00,1025,1386,588,1,13,540,1,9,189,1,13,623,1,13,548,1,9,216,1,13,574,1,21,4,A,7,3,A,7,27.2,A,7,13.3,A,7,42,A,7,992,A,7,240,A,7,5.2,A,7,19300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,15:00,914,1386,581,1,13,673,1,9,139,1,13,623,1,13,685,1,9,170,1,13,367,1,21,7,A,7,3,A,7,27.2,A,7,13.3,A,7,42,A,7,991,A,7,260,A,7,4.1,A,7,19300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,16:00,737,1386,487,1,9,679,1,9,127,1,13,513,1,9,674,1,9,154,1,13,278,1,18,7,A,7,1,A,7,27.2,A,7,13.3,A,7,42,A,7,991,A,7,230,A,7,4.1,A,7,19300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,17:00,507,1386,291,1,9,526,1,9,100,1,13,301,1,9,486,1,9,123,1,13,188,1,18,9,A,7,2,A,7,26.7,A,7,13.3,A,7,44,A,7,991,A,7,220,A,7,4.1,A,7,19300,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,18:00,239,1386,87,1,13,108,1,9,68,1,13,94,1,13,79,1,9,80,1,13,145,1,21,7,A,7,4,A,7,23.9,A,7,12.8,A,7,50,A,7,991,A,7,240,A,7,3.6,A,7,16100,B,7,7620,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,19:00,18,520,14,1,13,16,1,9,12,1,13,0,1,13,0,1,9,0,1,13,0,1,21,6,A,7,4,A,7,22.2,A,7,12.8,A,7,55,A,7,992,A,7,200,A,7,2.1,A,7,16100,B,7,7620,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,20.6,A,7,12.8,A,7,61,A,7,992,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,18.9,A,7,12.8,A,7,68,A,7,992,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,12.8,A,7,73,A,7,992,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,12.8,A,7,73,A,7,992,A,7,230,A,7,3.6,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/11/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,17.8,A,7,12.2,A,7,70,A,7,992,A,7,240,A,7,3.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,17.2,A,7,12.2,A,7,73,A,7,992,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,16.7,A,7,12.2,A,7,75,A,7,992,A,7,210,A,7,2.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,15.6,A,7,11.7,A,7,78,A,7,992,A,7,230,A,7,3.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,11.7,A,7,81,A,7,992,A,7,240,A,7,3.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,15.0,A,7,11.7,A,7,81,A,7,992,A,7,230,A,7,3.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,14.4,A,7,11.7,A,7,84,A,7,992,A,7,240,A,7,2.6,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,07:00,20,542,11,1,13,3,1,9,11,1,13,0,1,13,0,1,9,0,1,13,0,1,21,9,A,7,4,A,7,14.4,A,7,11.7,A,7,84,A,7,993,A,7,230,A,7,4.1,A,7,19300,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,08:00,245,1385,87,1,13,138,1,9,63,1,13,92,1,13,97,1,9,75,1,13,119,1,21,10,A,7,5,A,7,16.7,A,7,12.8,A,7,78,A,7,994,A,7,250,A,7,3.1,A,7,19300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,09:00,513,1385,284,1,9,460,1,9,116,1,13,303,1,9,433,1,9,142,1,13,222,1,18,5,A,7,2,A,7,20.0,A,7,13.3,A,7,66,A,7,994,A,7,280,A,7,3.1,A,7,14500,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,10:00,743,1385,473,1,13,515,1,9,199,1,13,499,1,13,520,1,9,219,1,13,440,1,21,10,A,7,3,A,7,23.9,A,7,13.3,A,7,52,A,7,994,A,7,260,A,7,4.1,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,11:00,920,1385,571,1,13,483,1,9,251,1,13,605,1,13,499,1,9,273,1,13,663,1,21,10,A,7,5,A,7,26.1,A,7,12.8,A,7,44,A,7,994,A,7,330,A,7,2.6,A,7,19300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,12:00,1031,1385,669,1,13,582,1,9,237,1,13,725,1,13,606,1,9,273,1,13,730,1,21,10,A,7,5,A,7,27.2,A,7,11.7,A,7,38,A,7,994,A,7,270,A,7,4.1,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,13:00,1068,1385,551,1,13,316,1,9,308,1,13,605,1,13,342,1,9,340,1,13,1006,1,21,10,A,7,5,A,7,28.3,A,7,11.1,A,7,34,A,7,993,A,7,290,A,7,4.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,14:00,1030,1385,718,1,13,644,1,9,241,1,13,749,1,13,645,1,9,268,1,13,716,1,21,10,A,7,4,A,7,28.9,A,7,11.1,A,7,33,A,7,992,A,7,230,A,7,3.6,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,15:00,919,1385,562,1,13,481,1,9,243,1,13,596,1,13,497,1,9,266,1,13,639,1,21,10,A,7,3,A,7,29.4,A,7,10.6,A,7,31,A,7,991,A,7,240,A,7,4.6,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,16:00,742,1385,424,1,13,384,1,9,219,1,13,456,1,13,402,1,9,240,1,13,510,1,21,10,A,7,5,A,7,28.9,A,7,10.0,A,7,31,A,7,991,A,7,270,A,7,3.1,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,17:00,511,1385,208,1,13,192,1,9,137,1,13,222,1,13,186,1,9,153,1,13,280,1,21,10,A,7,6,A,7,28.3,A,7,10.0,A,7,32,A,7,990,A,7,260,A,7,3.1,A,7,24100,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,18:00,244,1385,82,1,13,67,1,9,71,1,13,90,1,13,49,1,9,81,1,13,152,1,21,10,A,7,6,A,7,25.6,A,7,11.1,A,7,41,A,7,991,A,7,220,A,7,3.6,A,7,16100,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,19:00,19,542,2,1,13,1,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,7,A,7,24.4,A,7,10.6,A,7,42,A,7,991,A,7,210,A,7,2.6,A,7,16100,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,21.1,A,7,11.1,A,7,53,A,7,991,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,17.8,A,7,11.7,A,7,68,A,7,991,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,4,A,7,18.3,A,7,11.7,A,7,65,A,7,991,A,7,260,A,7,2.6,A,7,16100,B,7,7620,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,4,A,7,19.4,A,7,11.1,A,7,59,A,7,991,A,7,230,A,7,3.6,A,7,16100,B,7,7620,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/12/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,18.3,A,7,11.1,A,7,63,A,7,991,A,7,230,A,7,2.6,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,0,A,7,16.1,A,7,10.6,A,7,70,A,7,991,A,7,240,A,7,3.1,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,0,A,7,16.7,A,7,11.1,A,7,70,A,7,991,A,7,240,A,7,2.6,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,0,A,7,13.9,A,7,10.6,A,7,81,A,7,991,A,7,220,A,7,4.1,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,2,A,7,14.4,A,7,11.1,A,7,81,A,7,990,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,16.1,A,7,10.6,A,7,70,A,7,991,A,7,180,A,7,2.1,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,15.6,A,7,10.6,A,7,72,A,7,991,A,7,340,A,7,2.1,A,7,24100,B,7,7620,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,07:00,23,565,10,1,13,5,1,9,10,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,6,A,7,16.7,A,7,10.6,A,7,67,A,7,992,A,7,300,A,7,3.1,A,7,24100,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,08:00,252,1384,77,1,13,50,1,9,68,1,13,84,1,13,40,1,9,77,1,13,167,1,21,10,A,7,5,A,7,15.6,A,7,11.7,A,7,78,A,7,993,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,09:00,519,1384,239,1,13,291,1,9,131,1,13,258,1,13,283,1,9,151,1,13,265,1,21,10,A,7,4,A,7,21.1,A,7,12.2,A,7,57,A,7,993,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,10:00,749,1384,511,1,13,728,1,9,120,1,13,544,1,13,727,1,9,149,1,13,268,1,21,5,A,7,3,A,7,26.1,A,7,10.6,A,7,38,A,7,993,A,7,350,A,7,2.1,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,11:00,926,1384,636,1,9,781,1,9,116,1,13,675,1,9,784,1,9,149,1,13,296,1,18,3,A,7,2,A,7,27.8,A,7,10.6,A,7,34,A,7,992,A,7,320,A,7,2.1,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,12:00,1036,1384,735,1,13,727,1,9,192,1,13,780,1,13,738,1,9,225,1,13,596,1,21,9,A,7,4,A,7,28.3,A,7,10.0,A,7,32,A,7,991,A,7,180,A,7,2.1,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,13:00,1074,1384,734,1,13,670,1,9,215,1,13,775,1,13,679,1,9,247,1,13,710,1,21,9,A,7,3,A,7,28.3,A,7,9.4,A,7,31,A,7,990,A,7,300,A,7,3.1,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,14:00,1035,1384,717,1,9,711,1,9,187,1,13,762,1,9,723,1,9,220,1,13,581,1,18,7,A,7,2,A,7,29.4,A,7,10.0,A,7,30,A,7,990,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,15:00,923,1384,441,1,13,420,1,9,161,1,13,488,1,13,436,1,9,197,1,13,413,1,21,6,A,7,3,A,7,28.9,A,7,9.4,A,7,30,A,7,989,A,7,270,A,7,2.6,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,16:00,746,1384,390,1,13,345,1,9,205,1,13,423,1,13,362,1,9,227,1,13,472,1,21,8,A,7,5,A,7,28.3,A,7,9.4,A,7,31,A,7,989,A,7,260,A,7,2.6,A,7,24100,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,17:00,515,1384,244,1,13,248,1,9,152,1,13,259,1,13,240,1,9,169,1,13,317,1,21,9,A,7,6,A,7,27.2,A,7,9.4,A,7,33,A,7,988,A,7,270,A,7,3.1,A,7,24100,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,18:00,248,1384,70,1,13,3,1,9,70,1,13,78,1,13,1,1,9,78,1,13,228,1,21,10,A,7,8,A,7,26.1,A,7,9.4,A,7,35,A,7,988,A,7,280,A,7,2.1,A,7,11300,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,19:00,21,565,10,1,13,2,1,9,10,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,9,A,7,24.4,A,7,9.4,A,7,39,A,7,988,A,7,270,A,7,1.5,A,7,11300,B,7,2740,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,5,A,7,20.6,A,7,12.2,A,7,59,A,7,989,A,7,200,A,7,3.1,A,7,11300,B,7,7620,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,22.2,A,7,10.6,A,7,48,A,7,989,A,7,200,A,7,2.6,A,7,11300,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,5,A,7,20.0,A,7,10.6,A,7,55,A,7,989,A,7,190,A,7,2.6,A,7,11300,B,7,7620,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,17.8,A,7,11.7,A,7,68,A,7,989,A,7,200,A,7,2.6,A,7,11300,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/13/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,17.8,A,7,10.6,A,7,63,A,7,988,A,7,240,A,7,3.6,A,7,11300,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,17.8,A,7,10.0,A,7,61,A,7,988,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,16.1,A,7,10.0,A,7,67,A,7,988,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,10.0,A,7,70,A,7,988,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,15.0,A,7,10.0,A,7,72,A,7,987,A,7,220,A,7,2.6,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,1,A,7,13.9,A,7,10.0,A,7,78,A,7,988,A,7,220,A,7,2.6,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,14.4,A,7,10.6,A,7,78,A,7,988,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,07:00,25,611,8,1,13,2,1,9,8,1,13,10,1,13,0,1,9,10,1,13,30,1,21,10,A,7,9,A,7,13.9,A,7,10.6,A,7,81,A,7,988,A,7,200,A,7,3.1,A,7,12900,B,7,4570,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,08:00,259,1383,81,1,13,96,1,9,63,1,13,89,1,13,73,1,9,75,1,13,135,1,21,10,A,7,6,A,7,15.0,A,7,12.2,A,7,84,A,7,989,A,7,210,A,7,3.1,A,7,11300,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,09:00,526,1383,240,1,13,325,1,9,118,1,13,256,1,13,308,1,9,138,1,13,227,1,21,10,A,7,5,A,7,20.0,A,7,13.3,A,7,66,A,7,990,A,7,230,A,7,4.1,A,7,12900,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,10:00,756,1383,428,1,13,473,1,9,171,1,13,459,1,13,480,1,9,196,1,13,375,1,21,9,A,7,4,A,7,22.8,A,7,12.8,A,7,53,A,7,989,A,7,260,A,7,4.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,11:00,932,1383,650,1,9,859,1,9,74,1,13,684,1,9,856,1,9,106,1,13,203,1,18,1,A,7,1,A,7,25.6,A,7,13.3,A,7,47,A,7,989,A,7,260,A,7,5.2,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,12:00,1042,1383,729,1,9,883,1,9,66,1,13,769,1,9,885,1,9,101,1,13,218,1,18,1,A,7,1,A,7,26.7,A,7,12.2,A,7,41,A,7,989,A,7,230,A,7,4.1,A,7,19300,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,13:00,1079,1383,723,1,9,681,1,9,193,1,13,770,1,9,694,1,9,227,1,13,653,1,18,8,A,7,2,A,7,27.2,A,7,12.2,A,7,39,A,7,988,A,7,200,A,7,6.2,A,7,22500,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,14:00,1040,1383,676,1,13,589,1,9,234,1,13,707,1,13,592,1,9,260,1,13,714,1,21,10,A,7,5,A,7,26.7,A,7,12.2,A,7,41,A,7,987,A,7,240,A,7,5.2,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,15:00,928,1383,469,1,13,266,1,9,291,1,13,507,1,13,285,1,9,315,1,13,801,1,21,10,A,7,7,A,7,27.2,A,7,10.6,A,7,35,A,7,987,A,7,220,A,7,7.7,A,7,24100,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,16:00,751,1383,323,1,13,245,1,9,190,1,13,351,1,13,258,1,9,211,1,13,433,1,21,10,A,7,6,A,7,26.1,A,7,11.1,A,7,39,A,7,986,A,7,200,A,7,6.2,A,7,24100,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,17:00,520,1383,249,1,13,193,1,9,177,1,13,269,1,13,187,1,9,199,1,13,410,1,21,10,A,7,6,A,7,25.0,A,7,11.1,A,7,42,A,7,986,A,7,210,A,7,5.2,A,7,24100,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,18:00,252,1383,59,1,13,7,1,9,58,1,13,67,1,13,2,1,9,66,1,13,203,1,21,10,A,7,10,A,7,23.9,A,7,11.1,A,7,45,A,7,986,A,7,210,A,7,5.2,A,7,19300,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,19:00,23,565,7,1,13,1,1,9,7,1,13,8,1,13,0,1,9,8,1,13,26,1,21,10,A,7,10,A,7,21.7,A,7,11.7,A,7,53,A,7,987,A,7,180,A,7,4.1,A,7,19300,B,7,3050,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,5,A,7,21.1,A,7,11.7,A,7,55,A,7,988,A,7,190,A,7,4.1,A,7,19300,B,7,7620,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,20.6,A,7,11.7,A,7,57,A,7,988,A,7,190,A,7,3.6,A,7,19300,B,7,7620,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,11.7,A,7,61,A,7,988,A,7,190,A,7,4.1,A,7,19300,B,7,2740,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,13.3,A,7,66,A,7,989,A,7,200,A,7,5.2,A,7,19300,B,7,7620,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/14/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,13.9,A,7,70,A,7,989,A,7,200,A,7,6.2,A,7,19300,B,7,7620,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,18.3,A,7,13.9,A,7,76,A,7,988,A,7,180,A,7,5.2,A,7,24100,B,7,7620,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,17.2,A,7,13.9,A,7,81,A,7,988,A,7,200,A,7,4.6,A,7,24100,B,7,7620,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,16.1,A,7,13.9,A,7,87,A,7,988,A,7,200,A,7,4.1,A,7,16100,B,7,7620,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,13.9,A,7,93,A,7,988,A,7,200,A,7,3.6,A,7,16100,B,7,850,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,15.6,A,7,14.4,A,7,93,A,7,988,A,7,200,A,7,3.6,A,7,16100,B,7,760,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,15.6,A,7,14.4,A,7,93,A,7,989,A,7,180,A,7,3.6,A,7,16100,B,7,610,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,07:00,28,634,7,1,13,0,1,9,7,1,13,8,1,13,0,1,9,8,1,13,27,1,21,10,A,7,10,A,7,15.6,A,7,14.4,A,7,93,A,7,990,A,7,210,A,7,3.1,A,7,16100,B,7,610,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,08:00,266,1383,65,1,13,4,1,9,65,1,13,74,1,13,1,1,9,73,1,13,224,1,21,10,A,7,10,A,7,17.2,A,7,15.6,A,7,90,A,7,990,A,7,190,A,7,4.1,A,7,16100,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,09:00,533,1383,180,1,9,70,1,9,153,1,13,198,1,9,67,1,9,172,1,13,427,1,18,9,A,7,8,A,7,19.4,A,7,15.6,A,7,78,A,7,990,A,7,220,A,7,5.7,A,7,16100,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,10:00,762,1383,341,1,13,135,1,9,267,1,13,370,1,13,140,1,9,293,1,13,692,1,21,8,A,7,6,A,7,21.7,A,7,16.1,A,7,71,A,7,990,A,7,220,A,7,6.2,A,7,16100,B,7,910,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,11:00,938,1383,226,1,9,12,1,9,217,1,13,265,1,9,10,1,9,259,1,13,996,1,18,10,A,7,10,A,7,21.7,A,7,15.0,A,7,66,A,7,990,A,7,200,A,7,6.7,A,7,24100,B,7,910,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,12:00,1048,1383,505,1,9,275,1,9,297,1,13,554,1,9,298,1,9,328,1,13,939,1,18,8,A,7,8,A,7,21.7,A,7,14.4,A,7,64,A,7,990,A,7,230,A,7,6.2,A,7,16100,B,7,910,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,13:00,1084,1383,627,1,9,376,1,9,333,1,13,686,1,9,407,1,9,365,1,13,1130,1,18,9,A,7,8,A,7,23.3,A,7,15.0,A,7,60,A,7,989,A,7,230,A,7,4.1,A,7,16100,B,7,1980,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,14:00,1045,1383,155,1,9,4,1,9,151,1,13,189,1,9,3,1,9,187,1,13,770,1,18,10,A,7,10,A,7,20.6,A,7,16.7,A,7,79,A,7,989,A,7,210,A,7,5.2,A,7,6400,B,7,1520,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -03/15/1990,15:00,933,1383,279,1,9,2,1,9,277,1,13,321,1,9,2,1,9,320,1,13,1187,1,18,10,A,7,10,A,7,20.6,A,7,17.8,A,7,84,A,7,988,A,7,180,A,7,2.6,A,7,11300,B,7,2130,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/15/1990,16:00,755,1383,188,1,9,7,1,9,184,1,13,218,1,9,6,1,9,214,1,13,788,1,18,10,A,7,10,A,7,21.1,A,7,16.7,A,7,76,A,7,988,A,7,230,A,7,4.1,A,7,11300,B,7,1370,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,17:00,524,1383,136,1,9,7,1,9,133,1,13,154,1,9,5,1,9,152,1,13,513,1,18,10,A,7,10,A,7,20.0,A,7,17.2,A,7,84,A,7,987,A,7,150,A,7,3.1,A,7,16100,B,7,2290,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,18:00,256,1383,44,1,13,3,1,9,43,1,13,50,1,13,1,1,9,50,1,13,163,1,21,10,A,7,10,A,7,20.0,A,7,16.7,A,7,81,A,7,988,A,7,150,A,7,2.6,A,7,16100,B,7,2740,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,19:00,24,588,8,1,13,0,1,9,8,1,13,9,1,13,0,1,9,9,1,13,30,1,21,10,A,7,10,A,7,18.9,A,7,16.7,A,7,87,A,7,987,A,7,100,A,7,2.6,A,7,19300,B,7,2740,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.2,A,7,90,A,7,989,A,7,180,A,7,4.6,A,7,4800,B,7,1250,A,7,3.0,E,8,0.000,?,0,0.00,?,0,18,1,D,9,02,C,8 -03/15/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,988,A,7,180,A,7,3.6,A,7,19300,B,7,2740,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/15/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,18.3,A,7,17.2,A,7,93,A,7,988,A,7,170,A,7,4.6,A,7,19300,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,6,A,7,18.3,A,7,17.2,A,7,93,A,7,989,A,7,180,A,7,4.1,A,7,16100,B,7,700,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/15/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,989,A,7,170,A,7,5.2,A,7,16100,B,7,610,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,988,A,7,180,A,7,5.2,A,7,11300,B,7,490,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,988,A,7,180,A,7,4.6,A,7,11300,B,7,370,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -03/16/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,987,A,7,170,A,7,4.1,A,7,11300,B,7,340,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,987,A,7,180,A,7,5.2,A,7,11300,B,7,400,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,987,A,7,180,A,7,5.2,A,7,11300,B,7,340,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.2,A,7,90,A,7,987,A,7,200,A,7,5.7,A,7,16100,B,7,370,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,07:00,31,679,9,1,13,0,1,9,9,1,13,11,1,13,0,1,9,11,1,13,33,1,21,10,A,7,10,A,7,18.9,A,7,17.2,A,7,90,A,7,987,A,7,200,A,7,6.7,A,7,11300,B,7,370,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,08:00,272,1382,81,1,13,2,1,9,81,1,13,90,1,13,1,1,9,90,1,13,262,1,21,10,A,7,10,A,7,18.9,A,7,17.2,A,7,90,A,7,988,A,7,210,A,7,7.2,A,7,11300,B,7,370,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -03/16/1990,09:00,539,1382,158,1,9,1,1,9,158,1,13,178,1,9,1,1,9,178,1,13,585,1,18,10,A,7,10,A,7,20.6,A,7,17.8,A,7,84,A,7,988,A,7,190,A,7,7.7,A,7,12900,B,7,430,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,10:00,768,1382,252,1,9,1,1,9,251,1,13,285,1,9,1,1,9,284,1,13,984,1,18,10,A,7,10,A,7,22.2,A,7,18.3,A,7,79,A,7,988,A,7,190,A,7,7.2,A,7,12900,B,7,430,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,11:00,944,1382,347,1,9,0,1,9,347,1,13,394,1,9,0,1,9,394,1,13,1379,1,18,10,A,7,10,A,7,20.6,A,7,18.3,A,7,87,A,7,988,A,7,200,A,7,6.2,A,7,11300,B,7,520,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,12:00,1053,1382,231,1,9,2,1,9,229,1,13,275,1,9,2,1,9,274,1,13,1093,1,18,10,A,7,10,A,7,20.0,A,7,18.3,A,7,90,A,7,988,A,7,180,A,7,6.2,A,7,4800,B,7,520,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,13:00,1090,1382,375,1,9,1,1,9,374,1,13,433,1,9,1,1,9,432,1,13,1576,1,18,10,A,7,10,A,7,21.7,A,7,18.9,A,7,84,A,7,987,A,7,200,A,7,6.7,A,7,6400,B,7,430,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/16/1990,14:00,1050,1382,374,1,9,1,1,9,373,1,13,429,1,9,1,1,9,428,1,13,1542,1,18,10,A,7,10,A,7,22.2,A,7,17.8,A,7,76,A,7,986,A,7,180,A,7,7.7,A,7,11300,B,7,610,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,25,C,8 -03/16/1990,15:00,937,1382,333,1,9,0,1,9,333,1,13,379,1,9,0,1,9,379,1,13,1339,1,18,10,A,7,10,A,7,21.1,A,7,18.3,A,7,84,A,7,985,A,7,230,A,7,2.6,A,7,11300,B,7,1830,A,7,3.2,E,8,0.000,F,8,0.00,?,0,8,1,D,9,00,C,8 -03/16/1990,16:00,759,1382,269,1,9,0,1,9,269,1,13,302,1,9,0,1,9,302,1,13,1017,1,18,10,A,7,10,A,7,22.8,A,7,17.8,A,7,74,A,7,984,A,7,170,A,7,6.2,A,7,11300,B,7,3050,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,17:00,528,1382,177,1,9,1,1,9,177,1,13,197,1,9,1,1,9,197,1,13,618,1,18,10,A,7,10,A,7,22.2,A,7,17.2,A,7,73,A,7,984,A,7,190,A,7,5.2,A,7,16100,B,7,2440,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,18:00,260,1382,73,1,13,0,1,9,73,1,13,81,1,13,0,1,9,81,1,13,240,1,21,10,A,7,10,A,7,21.7,A,7,17.2,A,7,76,A,7,983,A,7,190,A,7,3.6,A,7,19300,B,7,1830,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,19:00,26,610,14,1,13,0,1,9,14,1,13,16,1,13,0,1,9,16,1,13,48,1,21,10,A,7,10,A,7,20.6,A,7,17.8,A,7,84,A,7,983,A,7,160,A,7,3.1,A,7,19300,B,7,1370,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.7,A,7,16.7,A,7,73,A,7,983,A,7,170,A,7,5.7,A,7,19300,B,7,1460,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.7,A,7,16.7,A,7,73,A,7,983,A,7,180,A,7,6.2,A,7,24100,B,7,1830,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,20.6,A,7,16.1,A,7,76,A,7,983,A,7,180,A,7,6.2,A,7,24100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,20.0,A,7,15.6,A,7,76,A,7,983,A,7,180,A,7,4.6,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/16/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,19.4,A,7,16.1,A,7,81,A,7,983,A,7,170,A,7,6.7,A,7,24100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,20.0,A,7,16.7,A,7,81,A,7,982,A,7,180,A,7,8.2,A,7,24100,B,7,610,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,16.1,A,7,81,A,7,982,A,7,200,A,7,7.2,A,7,24100,B,7,610,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,15.6,A,7,78,A,7,981,A,7,200,A,7,6.2,A,7,24100,B,7,2440,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,16.1,A,7,87,A,7,980,A,7,190,A,7,4.6,A,7,9700,B,7,760,A,7,2.8,E,8,0.000,?,0,0.00,?,0,3,1,D,9,00,C,8 -03/17/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,16.7,A,7,93,A,7,980,A,7,190,A,7,3.6,A,7,9700,B,7,490,A,7,2.8,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -03/17/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,979,A,7,180,A,7,6.7,A,7,11300,B,7,400,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/17/1990,07:00,35,702,15,1,13,0,1,9,15,1,13,17,1,13,0,1,9,17,1,13,52,1,21,10,A,7,10,A,7,20.0,A,7,17.8,A,7,87,A,7,979,A,7,190,A,7,7.7,A,7,11300,B,7,400,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,08:00,279,1381,71,1,13,0,1,9,71,1,13,79,1,13,0,1,9,79,1,13,244,1,21,10,A,7,10,A,7,20.0,A,7,17.8,A,7,87,A,7,979,A,7,180,A,7,6.7,A,7,11300,B,7,370,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -03/17/1990,09:00,546,1381,178,1,9,1,1,9,177,1,13,198,1,9,1,1,9,197,1,13,632,1,18,10,A,7,10,A,7,20.6,A,7,17.8,A,7,84,A,7,978,A,7,220,A,7,6.7,A,7,11300,B,7,460,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,10:00,775,1381,267,1,9,0,1,9,267,1,13,301,1,9,0,1,9,301,1,13,1028,1,18,10,A,7,10,A,7,21.1,A,7,17.8,A,7,81,A,7,978,A,7,200,A,7,8.8,A,7,11300,B,7,460,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,11:00,950,1381,332,1,9,0,1,9,332,1,13,379,1,9,0,1,9,379,1,13,1349,1,18,10,A,7,10,A,7,21.1,A,7,17.8,A,7,81,A,7,978,A,7,210,A,7,6.7,A,7,11300,B,7,460,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,12:00,1059,1381,214,1,9,1,1,9,213,1,13,257,1,9,1,1,9,256,1,13,1033,1,18,10,A,7,10,A,7,19.4,A,7,17.8,A,7,90,A,7,977,A,7,190,A,7,7.7,A,7,2400,B,7,370,A,7,3.0,E,8,0.000,F,8,0.00,?,0,18,1,D,9,00,C,8 -03/17/1990,13:00,1095,1381,427,1,9,0,1,9,427,1,13,488,1,9,0,1,9,488,1,13,1709,1,18,10,A,7,10,A,7,19.4,A,7,17.2,A,7,87,A,7,977,A,7,220,A,7,6.2,A,7,9700,B,7,370,A,7,2.9,E,8,0.000,F,8,0.00,?,0,10,1,D,9,45,C,8 -03/17/1990,14:00,1055,1381,392,1,9,2,1,9,391,1,13,449,1,9,2,1,9,448,1,13,1590,1,18,10,A,7,10,A,7,18.9,A,7,16.7,A,7,87,A,7,977,A,7,210,A,7,5.2,A,7,11300,B,7,610,A,7,2.8,E,8,0.000,F,8,0.00,?,0,3,1,D,9,25,C,8 -03/17/1990,15:00,942,1381,210,1,9,2,1,9,209,1,13,249,1,9,2,1,9,248,1,13,970,1,18,10,A,7,10,A,7,17.8,A,7,16.7,A,7,93,A,7,977,A,7,230,A,7,5.7,A,7,8000,B,7,400,A,7,2.8,E,8,0.000,F,8,0.00,?,0,8,1,D,9,00,C,8 -03/17/1990,16:00,764,1381,149,1,9,1,1,9,149,1,13,176,1,9,1,1,9,176,1,13,673,1,18,10,A,7,10,A,7,16.1,A,7,15.0,A,7,93,A,7,976,A,7,200,A,7,5.2,A,7,8000,B,7,520,A,7,2.6,E,8,0.000,F,8,0.00,?,0,25,1,D,9,45,C,8 -03/17/1990,17:00,532,1381,96,1,9,1,1,9,96,1,13,113,1,9,1,1,9,112,1,13,404,1,18,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,976,A,7,230,A,7,5.7,A,7,4800,B,7,240,A,7,2.7,E,8,0.000,F,8,0.00,?,0,28,1,D,9,45,C,8 -03/17/1990,18:00,265,1381,47,1,13,0,1,9,47,1,13,54,1,13,0,1,9,54,1,13,176,1,21,10,A,7,10,A,7,15.6,A,7,15.0,A,7,97,A,7,977,A,7,250,A,7,8.8,A,7,9700,B,7,240,A,7,2.6,E,8,0.000,F,8,0.00,?,0,18,1,D,9,45,C,8 -03/17/1990,19:00,28,633,12,1,13,0,1,9,12,1,13,14,1,13,0,1,9,14,1,13,43,1,21,10,A,7,10,A,7,14.4,A,7,13.3,A,7,93,A,7,977,A,7,260,A,7,4.6,A,7,24100,B,7,1980,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/17/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,9.4,A,7,78,A,7,979,A,7,300,A,7,3.1,A,7,24100,B,7,760,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,21,C,8 -03/17/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,11.1,A,7,90,A,7,979,A,7,30,A,7,2.1,A,7,24100,B,7,1100,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,11.7,A,7,93,A,7,978,A,7,330,A,7,3.1,A,7,24100,B,7,1680,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,9.4,A,7,83,A,7,979,A,7,290,A,7,2.6,A,7,24100,B,7,3660,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/17/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,8.9,A,7,83,A,7,979,A,7,290,A,7,2.6,A,7,24100,B,7,3660,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,7.8,A,7,77,A,7,980,A,7,300,A,7,5.7,A,7,24100,B,7,3660,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,7.2,A,7,74,A,7,980,A,7,310,A,7,4.6,A,7,24100,B,7,3050,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -03/18/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,6.7,A,7,74,A,7,980,A,7,310,A,7,3.1,A,7,24100,B,7,3050,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,4.4,A,7,69,A,7,981,A,7,300,A,7,3.6,A,7,24100,B,7,3050,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,8.3,A,7,2.2,A,7,66,A,7,982,A,7,300,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,2.2,A,7,76,A,7,983,A,7,250,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,07:00,38,748,18,1,13,25,1,9,15,1,13,18,1,13,10,1,9,18,1,13,31,1,21,0,A,7,0,A,7,6.7,A,7,1.7,A,7,71,A,7,983,A,7,300,A,7,3.1,A,7,19300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,08:00,286,1380,131,1,13,376,1,9,55,1,13,136,1,13,291,1,9,76,1,13,99,1,21,0,A,7,0,A,7,10.0,A,7,2.8,A,7,61,A,7,985,A,7,290,A,7,3.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,09:00,552,1380,340,1,9,633,1,9,89,1,13,359,1,9,602,1,9,117,1,13,177,1,18,0,A,7,0,A,7,12.2,A,7,2.8,A,7,53,A,7,986,A,7,290,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,10:00,781,1380,541,1,9,754,1,9,117,1,13,579,1,9,758,1,9,148,1,13,271,1,18,0,A,7,0,A,7,13.3,A,7,1.7,A,7,45,A,7,987,A,7,290,A,7,5.7,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,11:00,956,1380,665,1,9,736,1,9,157,1,13,710,1,9,749,1,9,190,1,13,436,1,18,2,A,7,2,A,7,14.4,A,7,1.7,A,7,42,A,7,987,A,7,290,A,7,5.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,12:00,1064,1380,761,1,13,688,1,9,232,1,13,799,1,13,694,1,9,263,1,13,749,1,21,4,A,7,3,A,7,15.0,A,7,0.6,A,7,38,A,7,987,A,7,260,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,13:00,1100,1380,802,1,9,779,1,9,182,1,13,860,1,9,797,1,9,222,1,13,652,1,18,3,A,7,2,A,7,16.1,A,7,0.6,A,7,35,A,7,987,A,7,280,A,7,5.7,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,14:00,1060,1380,727,1,9,720,1,9,174,1,13,777,1,9,736,1,9,210,1,13,574,1,18,2,A,7,0,A,7,16.7,A,7,-2.2,A,7,28,A,7,986,A,7,280,A,7,6.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,15:00,946,1380,656,1,9,729,1,9,157,1,13,699,1,9,741,1,9,189,1,13,430,1,18,6,A,7,1,A,7,17.2,A,7,-0.6,A,7,30,A,7,986,A,7,270,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,16:00,768,1380,501,1,9,580,1,9,179,1,13,536,1,9,590,1,9,206,1,13,398,1,18,8,A,7,2,A,7,16.7,A,7,0.0,A,7,33,A,7,986,A,7,280,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,17:00,536,1380,307,1,9,442,1,9,136,1,13,322,1,9,421,1,9,158,1,13,266,1,18,8,A,7,2,A,7,16.7,A,7,-1.1,A,7,30,A,7,986,A,7,290,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,18:00,269,1380,113,1,13,207,1,9,73,1,13,119,1,13,153,1,9,90,1,13,140,1,21,9,A,7,3,A,7,16.1,A,7,-2.8,A,7,28,A,7,987,A,7,290,A,7,4.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,19:00,30,656,13,1,13,3,1,9,12,1,13,14,1,13,0,1,9,14,1,13,43,1,21,10,A,7,5,A,7,13.9,A,7,-1.7,A,7,34,A,7,988,A,7,300,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,11.7,A,7,-1.1,A,7,42,A,7,989,A,7,280,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,7,A,7,11.1,A,7,0.6,A,7,49,A,7,990,A,7,270,A,7,2.6,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,9.4,A,7,1.7,A,7,59,A,7,990,A,7,250,A,7,2.1,A,7,24100,B,7,7620,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,2.8,A,7,64,A,7,990,A,7,190,A,7,2.1,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/18/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,3.3,A,7,66,A,7,990,A,7,260,A,7,2.1,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,8.9,A,7,3.3,A,7,69,A,7,990,A,7,190,A,7,2.1,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,4.4,A,7,71,A,7,990,A,7,240,A,7,1.5,A,7,24100,B,7,5490,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,3.9,A,7,71,A,7,990,A,7,240,A,7,1.5,A,7,24100,B,7,4570,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,4.4,A,7,71,A,7,990,A,7,160,A,7,1.5,A,7,24100,B,7,4570,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,3.9,A,7,74,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,4570,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,8.3,A,7,4.4,A,7,77,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,07:00,41,770,22,1,13,32,1,9,19,1,13,23,1,13,13,1,9,22,1,13,39,1,21,7,A,7,3,A,7,7.2,A,7,3.9,A,7,80,A,7,989,A,7,100,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,08:00,293,1379,110,1,13,124,1,9,84,1,13,120,1,13,99,1,9,99,1,13,182,1,21,10,A,7,6,A,7,11.1,A,7,4.4,A,7,64,A,7,990,A,7,150,A,7,3.1,A,7,19300,B,7,7620,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,09:00,559,1379,245,1,9,223,1,9,156,1,13,263,1,9,221,1,9,173,1,13,327,1,18,10,A,7,8,A,7,15.6,A,7,2.2,A,7,41,A,7,990,A,7,170,A,7,4.1,A,7,19300,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,10:00,787,1379,303,1,9,67,1,9,265,1,13,333,1,9,68,1,9,294,1,13,824,1,18,10,A,7,8,A,7,15.6,A,7,3.3,A,7,44,A,7,990,A,7,210,A,7,5.2,A,7,16100,B,7,7620,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,11:00,961,1379,253,1,9,13,1,9,244,1,13,297,1,9,11,1,9,289,1,13,1103,1,18,10,A,7,10,A,7,16.7,A,7,4.4,A,7,45,A,7,989,A,7,200,A,7,6.2,A,7,16100,B,7,6100,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,12:00,1070,1379,415,1,9,89,1,9,346,1,13,458,1,9,91,1,9,387,1,13,1341,1,18,9,A,7,9,A,7,17.8,A,7,5.0,A,7,43,A,7,988,A,7,190,A,7,7.2,A,7,16100,B,7,7620,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,13:00,1105,1379,583,1,9,437,1,9,233,1,13,639,1,9,457,1,9,272,1,13,837,1,18,9,A,7,8,A,7,19.4,A,7,5.0,A,7,39,A,7,988,A,7,200,A,7,7.7,A,7,16100,B,7,7620,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,14:00,1064,1379,731,1,13,674,1,9,212,1,13,772,1,13,683,1,9,244,1,13,693,1,21,8,A,7,3,A,7,20.0,A,7,4.4,A,7,36,A,7,986,A,7,200,A,7,7.2,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,15:00,951,1379,635,1,13,617,1,9,211,1,13,663,1,13,618,1,9,235,1,13,559,1,21,8,A,7,4,A,7,19.4,A,7,3.3,A,7,35,A,7,985,A,7,220,A,7,8.8,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,16:00,772,1379,495,1,13,637,1,9,139,1,13,520,1,13,635,1,9,164,1,13,312,1,21,7,A,7,3,A,7,19.4,A,7,3.9,A,7,36,A,7,984,A,7,190,A,7,6.7,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,17:00,541,1379,280,1,13,358,1,9,140,1,13,293,1,13,341,1,9,159,1,13,275,1,21,9,A,7,3,A,7,19.4,A,7,3.3,A,7,35,A,7,984,A,7,210,A,7,7.2,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,18:00,273,1379,102,1,13,111,1,9,80,1,13,110,1,13,86,1,9,93,1,13,172,1,21,10,A,7,7,A,7,18.3,A,7,2.8,A,7,36,A,7,983,A,7,200,A,7,7.2,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,19:00,31,678,18,1,13,4,1,9,18,1,13,20,1,13,0,1,9,20,1,13,59,1,21,10,A,7,9,A,7,16.1,A,7,3.9,A,7,44,A,7,984,A,7,180,A,7,4.6,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,15.0,A,7,2.2,A,7,42,A,7,984,A,7,190,A,7,3.6,A,7,24100,B,7,7620,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,3.9,A,7,48,A,7,984,A,7,320,A,7,6.2,A,7,24100,B,7,2290,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,2.2,A,7,59,A,7,986,A,7,330,A,7,6.2,A,7,24100,B,7,2290,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,1.1,A,7,61,A,7,986,A,7,340,A,7,5.7,A,7,24100,B,7,2440,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/19/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,1.1,A,7,73,A,7,986,A,7,10,A,7,4.6,A,7,24100,B,7,1980,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,0.0,A,7,79,A,7,987,A,7,360,A,7,4.1,A,7,24100,B,7,2130,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -03/20/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,1.7,A,7,-0.6,A,7,85,A,7,987,A,7,20,A,7,5.2,A,7,16100,B,7,1220,A,7,1.0,E,8,0.000,?,0,0.00,?,0,3,1,D,9,61,C,8 -03/20/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.0,A,7,-0.6,A,7,96,A,7,987,A,7,360,A,7,4.1,A,7,4000,B,7,180,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -03/20/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.0,A,7,-0.6,A,7,96,A,7,987,A,7,30,A,7,5.2,A,7,4000,B,7,210,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/20/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-2.2,A,7,89,A,7,988,A,7,20,A,7,5.7,A,7,1600,B,7,340,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/20/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-2.2,A,7,89,A,7,988,A,7,360,A,7,4.6,A,7,16100,B,7,1370,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/20/1990,07:00,45,793,17,1,13,7,1,9,16,1,13,18,1,13,4,1,9,18,1,13,39,1,21,8,A,7,8,A,7,-0.6,A,7,-2.8,A,7,85,A,7,989,A,7,10,A,7,5.2,A,7,16100,B,7,1980,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,71,C,8 -03/20/1990,08:00,300,1379,124,1,13,166,1,9,89,1,13,131,1,13,130,1,9,103,1,13,175,1,21,4,A,7,4,A,7,0.0,A,7,-4.4,A,7,72,A,7,990,A,7,360,A,7,4.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,22,C,8 -03/20/1990,09:00,565,1379,350,1,9,582,1,9,114,1,13,364,1,9,550,1,9,138,1,13,219,1,18,2,A,7,2,A,7,1.7,A,7,-4.4,A,7,64,A,7,990,A,7,350,A,7,5.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,10:00,793,1379,481,1,9,611,1,9,131,1,13,510,1,9,613,1,9,156,1,13,303,1,18,2,A,7,2,A,7,2.8,A,7,-4.4,A,7,59,A,7,990,A,7,360,A,7,7.7,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,11:00,967,1379,674,1,13,724,1,9,168,1,13,717,1,13,735,1,9,200,1,13,473,1,21,3,A,7,3,A,7,4.4,A,7,-5.0,A,7,51,A,7,990,A,7,340,A,7,7.7,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,12:00,1075,1379,534,1,13,318,1,9,287,1,13,590,1,13,345,1,9,320,1,13,945,1,21,6,A,7,6,A,7,4.4,A,7,-5.6,A,7,49,A,7,990,A,7,350,A,7,5.2,A,7,24100,B,7,1370,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,13:00,1110,1379,865,1,13,739,1,9,271,1,13,902,1,13,741,1,9,304,1,13,954,1,21,6,A,7,6,A,7,5.6,A,7,-6.1,A,7,43,A,7,990,A,7,340,A,7,4.6,A,7,24100,B,7,1070,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,14:00,1069,1379,694,1,13,525,1,9,288,1,13,742,1,13,547,1,9,317,1,13,974,1,21,7,A,7,7,A,7,5.0,A,7,-6.7,A,7,43,A,7,989,A,7,340,A,7,7.2,A,7,24100,B,7,1520,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,15:00,955,1379,571,1,13,573,1,9,175,1,13,604,1,13,580,1,9,201,1,13,480,1,21,3,A,7,3,A,7,6.1,A,7,-7.8,A,7,37,A,7,989,A,7,340,A,7,6.7,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,16:00,776,1379,530,1,9,783,1,9,90,1,13,563,1,9,779,1,9,123,1,13,208,1,18,1,A,7,1,A,7,6.1,A,7,-7.2,A,7,38,A,7,989,A,7,350,A,7,6.7,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,17:00,545,1379,342,1,9,685,1,9,72,1,13,356,1,9,648,1,9,99,1,13,144,1,18,0,A,7,0,A,7,5.6,A,7,-9.4,A,7,33,A,7,989,A,7,340,A,7,7.7,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,18:00,277,1379,142,1,13,486,1,9,45,1,13,148,1,13,375,1,9,72,1,13,83,1,21,0,A,7,0,A,7,4.4,A,7,-10.0,A,7,35,A,7,990,A,7,320,A,7,6.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,19:00,33,701,21,1,13,53,1,9,14,1,13,18,1,13,16,1,9,17,1,13,24,1,21,0,A,7,0,A,7,2.2,A,7,-9.4,A,7,42,A,7,990,A,7,320,A,7,5.7,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-8.9,A,7,46,A,7,991,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-8.3,A,7,50,A,7,992,A,7,320,A,7,6.2,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-7.8,A,7,56,A,7,992,A,7,310,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-7.8,A,7,56,A,7,992,A,7,310,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/20/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-7.2,A,7,61,A,7,992,A,7,330,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.7,A,7,-7.2,A,7,66,A,7,992,A,7,300,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.1,A,7,-7.2,A,7,64,A,7,992,A,7,310,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-7.8,A,7,59,A,7,992,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.1,A,7,-7.2,A,7,64,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-6.1,A,7,78,A,7,993,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-6.7,A,7,78,A,7,993,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,07:00,49,838,31,1,13,140,1,9,15,1,13,25,1,13,64,1,9,21,1,13,28,1,21,0,A,7,0,A,7,-3.3,A,7,-5.6,A,7,85,A,7,994,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,08:00,306,1378,172,1,13,627,1,9,36,1,13,183,1,13,519,1,9,68,1,13,75,1,21,0,A,7,0,A,7,1.1,A,7,-5.0,A,7,64,A,7,994,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,09:00,572,1378,389,1,9,811,1,9,56,1,13,414,1,9,773,1,9,92,1,13,129,1,18,1,A,7,0,A,7,3.9,A,7,-5.6,A,7,51,A,7,995,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,10:00,799,1378,591,1,9,898,1,9,73,1,13,623,1,9,886,1,9,107,1,13,176,1,18,1,A,7,0,A,7,6.7,A,7,-6.1,A,7,40,A,7,995,A,7,160,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,11:00,973,1378,750,1,9,953,1,9,80,1,13,788,1,9,951,1,9,114,1,13,224,1,18,0,A,7,0,A,7,8.9,A,7,-6.1,A,7,34,A,7,995,A,7,270,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,12:00,1081,1378,852,1,9,978,1,9,86,1,13,890,1,9,980,1,9,120,1,13,276,1,18,0,A,7,0,A,7,10.6,A,7,-5.0,A,7,34,A,7,995,A,7,270,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,13:00,1115,1378,883,1,9,984,1,9,88,1,13,922,1,9,987,1,9,121,1,13,300,1,18,0,A,7,0,A,7,11.7,A,7,-4.4,A,7,32,A,7,994,A,7,270,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,14:00,1073,1378,847,1,9,978,1,9,86,1,13,885,1,9,980,1,9,120,1,13,273,1,18,0,A,7,0,A,7,13.3,A,7,-3.9,A,7,30,A,7,993,A,7,310,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,15:00,959,1378,740,1,9,950,1,9,79,1,13,775,1,9,948,1,9,113,1,13,218,1,18,0,A,7,0,A,7,15.0,A,7,-3.3,A,7,28,A,7,992,A,7,220,A,7,4.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,16:00,780,1378,578,1,9,902,1,9,68,1,13,608,1,9,889,1,9,103,1,13,168,1,18,0,A,7,0,A,7,15.6,A,7,-3.9,A,7,26,A,7,992,A,7,250,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,17:00,549,1378,374,1,9,810,1,9,53,1,13,396,1,9,767,1,9,90,1,13,123,1,18,0,A,7,0,A,7,15.0,A,7,-3.9,A,7,27,A,7,992,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,18:00,281,1378,156,1,13,603,1,9,34,1,13,163,1,13,485,1,9,64,1,13,70,1,21,0,A,7,0,A,7,13.3,A,7,-3.9,A,7,30,A,7,992,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,19:00,35,700,27,1,13,109,1,9,14,1,13,21,1,13,39,1,9,19,1,13,24,1,21,0,A,7,0,A,7,11.7,A,7,-3.3,A,7,35,A,7,992,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,-3.3,A,7,41,A,7,993,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,-1.7,A,7,52,A,7,994,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-1.1,A,7,58,A,7,994,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-2.2,A,7,56,A,7,994,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/21/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-2.2,A,7,60,A,7,994,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-2.8,A,7,53,A,7,994,A,7,190,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-2.8,A,7,60,A,7,993,A,7,190,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-2.8,A,7,65,A,7,993,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-3.3,A,7,62,A,7,993,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-2.8,A,7,73,A,7,994,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-3.3,A,7,67,A,7,995,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,07:00,53,861,29,1,13,107,1,9,17,1,13,26,1,13,43,1,9,23,1,13,30,1,21,0,A,7,0,A,7,1.1,A,7,-2.2,A,7,79,A,7,995,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,08:00,313,1377,170,1,13,566,1,9,44,1,13,177,1,13,467,1,9,70,1,13,85,1,21,0,A,7,0,A,7,6.7,A,7,-0.6,A,7,60,A,7,995,A,7,210,A,7,3.6,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,09:00,578,1377,353,1,9,625,1,9,93,1,13,373,1,9,600,1,9,120,1,13,188,1,18,8,A,7,1,A,7,11.1,A,7,-1.1,A,7,43,A,7,995,A,7,210,A,7,4.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,10:00,806,1377,532,1,9,666,1,9,145,1,13,562,1,9,667,1,9,171,1,13,335,1,18,10,A,7,1,A,7,13.9,A,7,-1.1,A,7,36,A,7,996,A,7,240,A,7,5.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,11:00,979,1377,689,1,9,746,1,9,161,1,13,737,1,9,760,1,9,195,1,13,464,1,18,10,A,7,1,A,7,16.7,A,7,-1.1,A,7,30,A,7,995,A,7,200,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,12:00,1086,1377,788,1,9,794,1,9,164,1,13,823,1,9,795,1,9,194,1,13,512,1,18,9,A,7,1,A,7,17.8,A,7,-1.1,A,7,28,A,7,994,A,7,210,A,7,7.7,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,13:00,1120,1377,874,1,9,899,1,9,143,1,13,929,1,9,908,1,9,188,1,13,506,1,18,5,A,7,0,A,7,18.9,A,7,-0.6,A,7,27,A,7,993,A,7,210,A,7,7.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,14:00,1078,1377,831,1,9,931,1,9,103,1,13,863,1,9,931,1,9,132,1,13,303,1,18,0,A,7,0,A,7,19.4,A,7,-1.1,A,7,25,A,7,992,A,7,240,A,7,7.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,15:00,964,1377,727,1,9,903,1,9,96,1,13,757,1,9,900,1,9,126,1,13,239,1,18,0,A,7,0,A,7,19.4,A,7,-1.1,A,7,25,A,7,991,A,7,210,A,7,8.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,16:00,784,1377,568,1,9,848,1,9,86,1,13,608,1,9,847,1,9,124,1,13,204,1,18,1,A,7,0,A,7,19.4,A,7,-0.6,A,7,26,A,7,990,A,7,200,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,17:00,553,1377,328,1,9,580,1,9,96,1,13,343,1,9,550,1,9,121,1,13,189,1,18,7,A,7,1,A,7,18.9,A,7,-0.6,A,7,27,A,7,990,A,7,200,A,7,8.8,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,18:00,285,1377,132,1,13,337,1,9,64,1,13,140,1,13,257,1,9,87,1,13,116,1,21,6,A,7,2,A,7,18.3,A,7,-0.6,A,7,28,A,7,990,A,7,200,A,7,9.3,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,19:00,37,723,20,1,13,40,1,9,16,1,13,20,1,13,12,1,9,19,1,13,27,1,21,5,A,7,2,A,7,16.1,A,7,-0.6,A,7,32,A,7,990,A,7,210,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,15.0,A,7,0.6,A,7,38,A,7,990,A,7,200,A,7,5.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,4,A,7,15.0,A,7,0.6,A,7,38,A,7,990,A,7,190,A,7,3.6,A,7,24100,B,7,6100,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,13.3,A,7,1.1,A,7,44,A,7,990,A,7,190,A,7,5.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,11.7,A,7,1.7,A,7,51,A,7,990,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/22/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,11.7,A,7,1.1,A,7,49,A,7,990,A,7,240,A,7,5.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,11.7,A,7,1.7,A,7,51,A,7,990,A,7,220,A,7,5.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,12.2,A,7,1.1,A,7,47,A,7,990,A,7,220,A,7,5.2,A,7,24100,B,7,3050,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,11.1,A,7,2.2,A,7,55,A,7,989,A,7,210,A,7,5.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,10.0,A,7,2.8,A,7,61,A,7,989,A,7,220,A,7,4.6,A,7,22500,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,8.9,A,7,3.3,A,7,69,A,7,990,A,7,220,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,2.8,A,7,68,A,7,991,A,7,240,A,7,4.1,A,7,19300,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,07:00,57,906,30,1,13,115,1,9,17,1,13,27,1,13,47,1,9,23,1,13,29,1,21,0,A,7,0,A,7,8.3,A,7,1.7,A,7,63,A,7,991,A,7,240,A,7,4.1,A,7,19300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,08:00,320,1376,173,1,13,570,1,9,43,1,13,181,1,13,475,1,9,70,1,13,85,1,21,0,A,7,0,A,7,12.2,A,7,0.0,A,7,43,A,7,992,A,7,270,A,7,2.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,09:00,585,1376,389,1,9,766,1,9,67,1,13,415,1,9,738,1,9,100,1,13,144,1,18,1,A,7,0,A,7,15.6,A,7,0.0,A,7,35,A,7,992,A,7,230,A,7,2.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,10:00,812,1376,589,1,9,863,1,9,83,1,13,618,1,9,852,1,9,114,1,13,186,1,18,0,A,7,0,A,7,17.8,A,7,0.0,A,7,30,A,7,993,A,7,270,A,7,4.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,11:00,984,1376,748,1,9,915,1,9,95,1,13,780,1,9,913,1,9,125,1,13,246,1,18,0,A,7,0,A,7,20.0,A,7,0.0,A,7,26,A,7,992,A,7,300,A,7,7.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,12:00,1091,1376,806,1,9,895,1,9,98,1,13,839,1,9,896,1,9,127,1,13,304,1,18,1,A,7,1,A,7,21.1,A,7,0.0,A,7,25,A,7,992,A,7,290,A,7,6.7,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,13:00,1124,1376,871,1,9,941,1,9,104,1,13,906,1,9,943,1,9,133,1,13,339,1,18,0,A,7,0,A,7,21.7,A,7,0.0,A,7,24,A,7,991,A,7,300,A,7,6.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,14:00,1082,1376,824,1,9,919,1,9,101,1,13,856,1,9,920,1,9,130,1,13,303,1,18,0,A,7,0,A,7,22.8,A,7,0.0,A,7,22,A,7,990,A,7,280,A,7,7.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,15:00,968,1376,732,1,9,893,1,9,104,1,13,760,1,9,889,1,9,132,1,13,247,1,18,2,A,7,0,A,7,23.3,A,7,-1.1,A,7,20,A,7,990,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,16:00,788,1376,569,1,9,839,1,9,90,1,13,607,1,9,837,1,9,126,1,13,211,1,18,2,A,7,0,A,7,23.3,A,7,-0.6,A,7,21,A,7,989,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,17:00,557,1376,335,1,9,673,1,9,64,1,13,355,1,9,643,1,9,94,1,13,136,1,18,4,A,7,1,A,7,22.8,A,7,-0.6,A,7,21,A,7,990,A,7,300,A,7,4.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,18:00,289,1376,140,1,13,369,1,9,63,1,13,148,1,13,283,1,9,88,1,13,114,1,21,6,A,7,2,A,7,21.7,A,7,-0.6,A,7,23,A,7,989,A,7,260,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,19:00,39,745,23,1,13,70,1,9,14,1,13,19,1,13,26,1,9,18,1,13,24,1,21,3,A,7,1,A,7,19.4,A,7,-1.1,A,7,25,A,7,990,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,16.7,A,7,3.3,A,7,41,A,7,990,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,15.0,A,7,4.4,A,7,50,A,7,990,A,7,360,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,12.8,A,7,3.9,A,7,55,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,3.9,A,7,57,A,7,991,A,7,60,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/23/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,3.9,A,7,59,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,3.3,A,7,64,A,7,991,A,7,60,A,7,2.6,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,10.6,A,7,2.8,A,7,59,A,7,991,A,7,50,A,7,3.1,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,10.6,A,7,2.2,A,7,57,A,7,991,A,7,40,A,7,3.1,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,1.7,A,7,51,A,7,991,A,7,50,A,7,4.6,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,2.8,A,7,64,A,7,992,A,7,60,A,7,5.7,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,6,A,7,8.3,A,7,2.8,A,7,68,A,7,992,A,7,60,A,7,6.7,A,7,16100,B,7,2440,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,07:00,62,928,21,1,13,10,1,9,19,1,13,22,1,13,6,1,9,21,1,13,47,1,21,7,A,7,6,A,7,7.8,A,7,2.8,A,7,71,A,7,993,A,7,60,A,7,6.2,A,7,16100,B,7,2440,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,08:00,326,1375,130,1,13,29,1,9,123,1,13,142,1,13,25,1,9,136,1,13,286,1,21,7,A,7,6,A,7,8.3,A,7,2.8,A,7,68,A,7,993,A,7,60,A,7,7.2,A,7,16100,B,7,2440,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,09:00,591,1375,186,1,9,10,1,9,182,1,13,209,1,9,8,1,9,206,1,13,679,1,18,10,A,7,10,A,7,8.9,A,7,2.8,A,7,66,A,7,994,A,7,80,A,7,5.7,A,7,16100,B,7,3050,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,10:00,818,1375,554,1,13,582,1,9,210,1,13,589,1,13,596,1,9,234,1,13,495,1,21,10,A,7,6,A,7,9.4,A,7,2.8,A,7,64,A,7,994,A,7,60,A,7,5.2,A,7,16100,B,7,3660,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,11:00,990,1375,675,1,9,731,1,9,151,1,13,726,1,9,748,1,9,186,1,13,447,1,18,4,A,7,2,A,7,11.7,A,7,2.8,A,7,55,A,7,994,A,7,50,A,7,4.6,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,12:00,1096,1375,626,1,13,410,1,9,300,1,13,669,1,13,427,1,9,327,1,13,1081,1,21,8,A,7,7,A,7,12.2,A,7,2.8,A,7,53,A,7,993,A,7,70,A,7,4.6,A,7,16100,B,7,3050,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,13:00,1129,1375,293,1,9,1,1,9,293,1,13,348,1,9,1,1,9,347,1,13,1353,1,18,10,A,7,10,A,7,12.8,A,7,2.2,A,7,49,A,7,993,A,7,30,A,7,2.1,A,7,16100,B,7,2740,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,14:00,1087,1375,296,1,9,4,1,9,292,1,13,348,1,9,4,1,9,345,1,13,1332,1,18,10,A,7,10,A,7,13.3,A,7,2.8,A,7,49,A,7,992,A,7,50,A,7,3.1,A,7,16100,B,7,2440,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,15:00,972,1375,269,1,9,7,1,9,264,1,13,314,1,9,6,1,9,310,1,13,1177,1,18,10,A,7,10,A,7,11.7,A,7,1.1,A,7,49,A,7,991,A,7,350,A,7,5.2,A,7,16100,B,7,2440,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,16:00,792,1375,236,1,9,1,1,9,236,1,13,271,1,9,1,1,9,270,1,13,968,1,18,10,A,7,10,A,7,9.4,A,7,0.6,A,7,54,A,7,991,A,7,50,A,7,5.2,A,7,16100,B,7,2440,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,17:00,560,1375,176,1,9,1,1,9,175,1,13,196,1,9,1,1,9,196,1,13,641,1,18,10,A,7,10,A,7,8.3,A,7,0.6,A,7,58,A,7,992,A,7,360,A,7,5.2,A,7,12900,B,7,1980,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,18:00,293,1375,71,1,13,1,1,9,71,1,13,80,1,13,0,1,9,80,1,13,250,1,21,10,A,7,10,A,7,7.2,A,7,1.1,A,7,66,A,7,991,A,7,40,A,7,5.2,A,7,12900,B,7,1830,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,19:00,41,768,14,1,13,0,1,9,13,1,13,15,1,13,0,1,9,15,1,13,47,1,21,10,A,7,10,A,7,5.6,A,7,3.3,A,7,86,A,7,992,A,7,50,A,7,5.2,A,7,8000,B,7,1830,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/24/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,2.8,A,7,89,A,7,992,A,7,40,A,7,4.1,A,7,8000,B,7,2590,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,21,C,8 -03/24/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,2.8,A,7,89,A,7,993,A,7,50,A,7,4.1,A,7,9700,B,7,1520,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/24/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,2.2,A,7,86,A,7,993,A,7,50,A,7,3.6,A,7,8000,B,7,240,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/24/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,1.1,A,7,82,A,7,993,A,7,50,A,7,4.1,A,7,9700,B,7,210,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/24/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,0.0,A,7,76,A,7,993,A,7,50,A,7,4.6,A,7,9700,B,7,210,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/25/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,-0.6,A,7,73,A,7,993,A,7,50,A,7,4.1,A,7,9700,B,7,180,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/25/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,-0.6,A,7,73,A,7,993,A,7,40,A,7,3.6,A,7,9700,B,7,180,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -03/25/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,-0.6,A,7,73,A,7,993,A,7,60,A,7,3.6,A,7,9700,B,7,180,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/25/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,0.0,A,7,76,A,7,993,A,7,60,A,7,4.6,A,7,9700,B,7,180,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/25/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,-0.6,A,7,76,A,7,993,A,7,50,A,7,4.1,A,7,9700,B,7,180,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -03/25/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,-0.6,A,7,76,A,7,993,A,7,60,A,7,5.2,A,7,9700,B,7,180,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/25/1990,07:00,66,974,20,1,13,1,1,9,19,1,13,22,1,13,0,1,9,22,1,13,66,1,21,10,A,7,10,A,7,3.3,A,7,-0.6,A,7,76,A,7,993,A,7,70,A,7,4.6,A,7,4000,B,7,120,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/25/1990,08:00,333,1375,91,1,13,2,1,9,91,1,13,102,1,13,1,1,9,102,1,13,314,1,21,10,A,7,10,A,7,3.9,A,7,0.0,A,7,76,A,7,994,A,7,70,A,7,4.1,A,7,4000,B,7,120,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/25/1990,09:00,598,1375,222,1,9,1,1,9,222,1,13,246,1,9,1,1,9,246,1,13,767,1,18,10,A,7,10,A,7,3.9,A,7,0.0,A,7,76,A,7,995,A,7,40,A,7,4.1,A,7,4000,B,7,90,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/25/1990,10:00,824,1375,280,1,9,1,1,9,280,1,13,318,1,9,1,1,9,318,1,13,1107,1,18,10,A,7,10,A,7,3.9,A,7,1.7,A,7,86,A,7,995,A,7,40,A,7,4.1,A,7,4000,B,7,90,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/25/1990,11:00,995,1375,352,1,9,1,1,9,351,1,13,403,1,9,1,1,9,402,1,13,1443,1,18,10,A,7,10,A,7,4.4,A,7,2.8,A,7,89,A,7,995,A,7,30,A,7,2.6,A,7,4000,B,7,90,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/25/1990,12:00,1101,1375,428,1,9,2,1,9,426,1,13,490,1,9,2,1,9,488,1,13,1716,1,18,10,A,7,10,A,7,5.6,A,7,2.8,A,7,83,A,7,995,A,7,60,A,7,2.6,A,7,11300,B,7,270,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -03/25/1990,13:00,1134,1375,591,1,13,381,1,9,277,1,13,640,1,13,398,1,9,310,1,13,1086,1,21,8,A,7,7,A,7,8.3,A,7,2.8,A,7,68,A,7,994,A,7,80,A,7,3.1,A,7,11300,B,7,460,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,14:00,1091,1375,581,1,9,310,1,9,335,1,13,635,1,9,336,1,9,368,1,13,1162,1,18,8,A,7,8,A,7,10.6,A,7,3.9,A,7,64,A,7,993,A,7,70,A,7,3.1,A,7,16100,B,7,460,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,15:00,976,1375,614,1,13,554,1,9,222,1,13,666,1,13,576,1,9,256,1,13,631,1,21,7,A,7,3,A,7,12.8,A,7,-0.6,A,7,40,A,7,992,A,7,50,A,7,2.1,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,16:00,796,1375,529,1,13,614,1,9,174,1,13,549,1,13,608,1,9,196,1,13,387,1,21,5,A,7,5,A,7,12.8,A,7,0.0,A,7,42,A,7,992,A,7,60,A,7,4.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,17:00,564,1375,232,1,13,292,1,9,113,1,13,250,1,13,283,1,9,134,1,13,218,1,21,5,A,7,5,A,7,11.7,A,7,0.0,A,7,45,A,7,992,A,7,80,A,7,3.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,18:00,296,1375,138,1,13,399,1,9,53,1,13,143,1,13,315,1,9,75,1,13,97,1,21,5,A,7,4,A,7,11.1,A,7,-2.2,A,7,40,A,7,992,A,7,50,A,7,3.1,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,19:00,44,790,21,1,13,11,1,9,19,1,13,22,1,13,6,1,9,21,1,13,46,1,21,6,A,7,6,A,7,10.0,A,7,-3.3,A,7,39,A,7,992,A,7,100,A,7,2.6,A,7,19300,B,7,1010,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,9.4,A,7,-5.6,A,7,35,A,7,992,A,7,70,A,7,3.6,A,7,19300,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,9.4,A,7,5.0,A,7,74,A,7,993,A,7,80,A,7,3.1,A,7,16100,B,7,1520,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,5.0,A,7,77,A,7,993,A,7,90,A,7,4.6,A,7,12900,B,7,1520,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,5.0,A,7,77,A,7,993,A,7,80,A,7,2.6,A,7,11300,B,7,1370,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/25/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,5.6,A,7,83,A,7,993,A,7,130,A,7,2.1,A,7,9700,B,7,1370,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,6.1,A,7,89,A,7,993,A,7,80,A,7,2.6,A,7,11300,B,7,1310,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -03/26/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,6.1,A,7,89,A,7,993,A,7,70,A,7,2.6,A,7,8000,B,7,1520,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,25,C,8 -03/26/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,6.1,A,7,93,A,7,992,A,7,80,A,7,3.1,A,7,8000,B,7,180,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/26/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,6.1,A,7,93,A,7,992,A,7,70,A,7,3.6,A,7,8000,B,7,310,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/26/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,6.1,A,7,93,A,7,993,A,7,50,A,7,3.1,A,7,8000,B,7,210,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/26/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,4.4,A,7,86,A,7,994,A,7,40,A,7,2.6,A,7,8000,B,7,790,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/26/1990,07:00,71,996,10,1,13,6,1,9,10,1,13,12,1,13,3,1,9,11,1,13,27,1,21,10,A,7,10,A,7,6.7,A,7,3.3,A,7,80,A,7,994,A,7,50,A,7,4.1,A,7,11300,B,7,760,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/26/1990,08:00,340,1374,76,1,13,5,1,9,75,1,13,86,1,13,2,1,9,86,1,13,277,1,21,10,A,7,10,A,7,6.7,A,7,2.2,A,7,74,A,7,995,A,7,70,A,7,5.7,A,7,11300,B,7,1130,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -03/26/1990,09:00,604,1374,161,1,9,2,1,9,161,1,13,184,1,9,2,1,9,184,1,13,635,1,18,10,A,7,10,A,7,7.2,A,7,-0.6,A,7,58,A,7,995,A,7,30,A,7,5.2,A,7,16100,B,7,1220,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,10:00,829,1374,452,1,13,340,1,9,248,1,13,489,1,13,362,1,9,270,1,13,619,1,21,10,A,7,6,A,7,8.9,A,7,-0.6,A,7,52,A,7,995,A,7,50,A,7,4.1,A,7,16100,B,7,7620,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,11:00,1001,1374,603,1,13,550,1,9,204,1,13,635,1,13,555,1,9,230,1,13,596,1,21,10,A,7,5,A,7,10.6,A,7,0.0,A,7,48,A,7,995,A,7,120,A,7,3.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,12:00,1106,1374,806,1,9,761,1,9,195,1,13,861,1,9,777,1,9,234,1,13,712,1,18,7,A,7,2,A,7,12.8,A,7,-0.6,A,7,40,A,7,994,A,7,360,A,7,4.1,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,13:00,1138,1374,798,1,13,715,1,9,206,1,13,851,1,13,730,1,9,245,1,13,812,1,21,6,A,7,3,A,7,13.3,A,7,-0.6,A,7,39,A,7,993,A,7,270,A,7,2.6,A,7,19300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,14:00,1095,1374,762,1,9,731,1,9,180,1,13,817,1,9,748,1,9,219,1,13,646,1,18,3,A,7,2,A,7,13.9,A,7,-0.6,A,7,37,A,7,992,A,7,350,A,7,5.2,A,7,19300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,15:00,980,1374,628,1,13,504,1,9,269,1,13,667,1,13,523,1,9,293,1,13,781,1,21,8,A,7,5,A,7,15.0,A,7,-0.6,A,7,35,A,7,991,A,7,340,A,7,2.6,A,7,19300,B,7,7620,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,16:00,800,1374,301,1,9,47,1,9,274,1,13,331,1,9,48,1,9,303,1,13,858,1,18,10,A,7,10,A,7,14.4,A,7,-2.2,A,7,32,A,7,991,A,7,290,A,7,2.6,A,7,16100,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,17:00,568,1374,137,1,9,0,1,9,137,1,13,157,1,9,0,1,9,157,1,13,548,1,18,10,A,7,10,A,7,13.3,A,7,-2.2,A,7,34,A,7,991,A,7,320,A,7,2.6,A,7,12900,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,18:00,300,1374,71,1,13,3,1,9,70,1,13,80,1,13,1,1,9,79,1,13,250,1,21,10,A,7,10,A,7,12.8,A,7,-1.7,A,7,37,A,7,991,A,7,330,A,7,1.5,A,7,16100,B,7,2900,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,19:00,46,813,9,1,13,1,1,9,9,1,13,11,1,13,0,1,9,11,1,13,34,1,21,10,A,7,10,A,7,12.2,A,7,-1.1,A,7,40,A,7,991,A,7,350,A,7,1.5,A,7,16100,B,7,2900,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,0.6,A,7,49,A,7,991,A,7,50,A,7,3.1,A,7,24100,B,7,3350,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,0.0,A,7,47,A,7,992,A,7,60,A,7,2.6,A,7,24100,B,7,3350,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,10.0,A,7,1.7,A,7,57,A,7,992,A,7,30,A,7,2.6,A,7,24100,B,7,3350,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,-0.6,A,7,50,A,7,993,A,7,20,A,7,4.1,A,7,24100,B,7,1980,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/26/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,-3.3,A,7,44,A,7,993,A,7,30,A,7,6.7,A,7,24100,B,7,1980,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,-4.4,A,7,44,A,7,994,A,7,20,A,7,5.2,A,7,16100,B,7,3660,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,-4.4,A,7,45,A,7,994,A,7,20,A,7,4.1,A,7,11300,B,7,1980,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,-4.4,A,7,47,A,7,993,A,7,50,A,7,2.6,A,7,11300,B,7,1980,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,5.6,A,7,-4.4,A,7,49,A,7,994,A,7,20,A,7,2.6,A,7,11300,B,7,1830,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,5.6,A,7,-3.9,A,7,51,A,7,994,A,7,20,A,7,3.1,A,7,11300,B,7,1980,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,4.4,A,7,-3.9,A,7,55,A,7,995,A,7,30,A,7,2.6,A,7,11300,B,7,1980,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,07:00,76,1041,26,1,13,15,1,9,24,1,13,28,1,13,9,1,9,27,1,13,58,1,21,8,A,7,7,A,7,3.9,A,7,-3.9,A,7,57,A,7,995,A,7,10,A,7,2.1,A,7,24100,B,7,1980,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,08:00,346,1373,166,1,13,283,1,9,95,1,13,176,1,13,238,1,9,116,1,13,186,1,21,5,A,7,4,A,7,6.1,A,7,-3.9,A,7,49,A,7,996,A,7,30,A,7,5.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,09:00,610,1373,416,1,9,801,1,9,63,1,13,440,1,9,770,1,9,97,1,13,138,1,18,0,A,7,0,A,7,7.8,A,7,-4.4,A,7,42,A,7,996,A,7,40,A,7,4.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,10:00,835,1373,606,1,9,870,1,9,80,1,13,637,1,9,861,1,9,112,1,13,189,1,18,0,A,7,0,A,7,9.4,A,7,-4.4,A,7,38,A,7,997,A,7,50,A,7,5.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,11:00,1006,1373,773,1,9,932,1,9,91,1,13,806,1,9,931,1,9,122,1,13,251,1,18,0,A,7,0,A,7,10.0,A,7,-4.4,A,7,36,A,7,997,A,7,60,A,7,5.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,12:00,1111,1373,877,1,9,964,1,9,98,1,13,913,1,9,966,1,9,129,1,13,320,1,18,0,A,7,0,A,7,11.7,A,7,-4.4,A,7,32,A,7,996,A,7,340,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,13:00,1143,1373,902,1,9,965,1,9,100,1,13,938,1,9,967,1,9,131,1,13,349,1,18,0,A,7,0,A,7,11.7,A,7,-4.4,A,7,32,A,7,995,A,7,340,A,7,4.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,14:00,1099,1373,864,1,9,958,1,9,97,1,13,898,1,9,960,1,9,128,1,13,310,1,18,0,A,7,0,A,7,12.8,A,7,-3.9,A,7,31,A,7,995,A,7,70,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,15:00,984,1373,754,1,9,928,1,9,90,1,13,787,1,9,926,1,9,121,1,13,241,1,18,0,A,7,0,A,7,13.3,A,7,-3.9,A,7,30,A,7,994,A,7,70,A,7,4.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,16:00,804,1373,595,1,9,885,1,9,78,1,13,624,1,9,874,1,9,111,1,13,181,1,18,0,A,7,0,A,7,13.3,A,7,-3.3,A,7,32,A,7,993,A,7,180,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,17:00,572,1373,391,1,9,797,1,9,61,1,13,418,1,9,767,1,9,98,1,13,134,1,18,0,A,7,0,A,7,13.9,A,7,-4.4,A,7,28,A,7,994,A,7,100,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,18:00,304,1373,169,1,13,590,1,9,40,1,13,176,1,13,485,1,9,68,1,13,80,1,21,0,A,7,0,A,7,12.8,A,7,-5.0,A,7,29,A,7,994,A,7,50,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,19:00,48,835,30,1,13,116,1,9,16,1,13,25,1,13,45,1,9,22,1,13,28,1,21,0,A,7,0,A,7,10.0,A,7,-3.9,A,7,38,A,7,994,A,7,100,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,-3.9,A,7,41,A,7,994,A,7,110,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,0,A,7,8.3,A,7,-2.8,A,7,46,A,7,995,A,7,110,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,1,A,7,7.8,A,7,-2.8,A,7,48,A,7,995,A,7,100,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,5.6,A,7,-2.2,A,7,58,A,7,996,A,7,140,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/27/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,1,A,7,6.7,A,7,-2.8,A,7,51,A,7,996,A,7,150,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,5.6,A,7,-2.8,A,7,55,A,7,996,A,7,170,A,7,2.6,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,5.6,A,7,-2.2,A,7,58,A,7,996,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,4.4,A,7,-1.1,A,7,68,A,7,996,A,7,50,A,7,2.1,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,2.8,A,7,-1.1,A,7,76,A,7,997,A,7,30,A,7,2.1,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,1.7,A,7,-1.7,A,7,79,A,7,997,A,7,30,A,7,2.6,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,1.7,A,7,-1.1,A,7,82,A,7,997,A,7,60,A,7,2.6,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,07:00,81,1063,39,1,13,70,1,9,31,1,13,38,1,13,28,1,9,36,1,13,57,1,21,10,A,7,3,A,7,1.7,A,7,-0.6,A,7,85,A,7,998,A,7,30,A,7,3.1,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,08:00,353,1372,164,1,13,332,1,9,81,1,13,175,1,13,278,1,9,103,1,13,149,1,21,10,A,7,3,A,7,3.3,A,7,0.6,A,7,82,A,7,999,A,7,50,A,7,3.1,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,09:00,616,1372,360,1,13,548,1,9,115,1,13,376,1,13,529,1,9,137,1,13,231,1,21,10,A,7,3,A,7,5.6,A,7,0.6,A,7,71,A,7,999,A,7,50,A,7,2.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,10:00,841,1372,498,1,13,523,1,9,179,1,13,541,1,13,538,1,9,210,1,13,425,1,21,10,A,7,4,A,7,7.2,A,7,0.0,A,7,61,A,7,999,A,7,90,A,7,3.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,11:00,1011,1372,581,1,13,441,1,9,256,1,13,623,1,13,459,1,9,284,1,13,780,1,21,10,A,7,5,A,7,9.4,A,7,0.0,A,7,52,A,7,999,A,7,140,A,7,3.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,12:00,1116,1372,705,1,13,569,1,9,243,1,13,742,1,13,575,1,9,273,1,13,892,1,21,10,A,7,4,A,7,11.7,A,7,0.6,A,7,47,A,7,998,A,7,90,A,7,2.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,13:00,1147,1372,727,1,13,589,1,9,235,1,13,769,1,13,597,1,9,268,1,13,940,1,21,10,A,7,4,A,7,13.3,A,7,1.1,A,7,44,A,7,997,A,7,110,A,7,2.1,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,14:00,1104,1372,794,1,13,757,1,9,187,1,13,851,1,13,774,1,9,227,1,13,684,1,21,10,A,7,5,A,7,13.9,A,7,0.6,A,7,40,A,7,996,A,7,190,A,7,2.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,15:00,988,1372,460,1,13,316,1,9,233,1,13,511,1,13,342,1,9,264,1,13,664,1,21,8,A,7,4,A,7,15.0,A,7,0.6,A,7,38,A,7,995,A,7,130,A,7,2.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,16:00,807,1372,449,1,13,419,1,9,203,1,13,477,1,13,428,1,9,225,1,13,473,1,21,8,A,7,4,A,7,15.0,A,7,1.7,A,7,41,A,7,994,A,7,120,A,7,4.1,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,17:00,575,1372,232,1,13,159,1,9,166,1,13,254,1,13,158,1,9,188,1,13,393,1,21,8,A,7,4,A,7,15.0,A,7,0.0,A,7,36,A,7,994,A,7,150,A,7,3.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,18:00,308,1372,157,1,13,246,1,9,102,1,13,163,1,13,195,1,9,120,1,13,206,1,21,10,A,7,2,A,7,13.3,A,7,0.0,A,7,40,A,7,994,A,7,150,A,7,4.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,19:00,50,835,30,1,13,53,1,9,24,1,13,30,1,13,23,1,9,28,1,13,50,1,21,10,A,7,2,A,7,12.2,A,7,-0.6,A,7,42,A,7,994,A,7,140,A,7,3.6,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,11.1,A,7,-0.6,A,7,45,A,7,994,A,7,110,A,7,3.1,A,7,24100,B,7,4570,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,-1.1,A,7,42,A,7,995,A,7,130,A,7,3.6,A,7,24100,B,7,2290,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,-1.7,A,7,40,A,7,995,A,7,120,A,7,3.6,A,7,24100,B,7,1680,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,-1.1,A,7,43,A,7,994,A,7,120,A,7,4.6,A,7,24100,B,7,3660,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/28/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,-0.6,A,7,45,A,7,995,A,7,110,A,7,3.1,A,7,19300,B,7,1680,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/29/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,2.8,A,7,64,A,7,994,A,7,110,A,7,3.6,A,7,12900,B,7,1680,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -03/29/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,5.0,A,7,83,A,7,994,A,7,130,A,7,2.1,A,7,11300,B,7,1520,A,7,1.4,E,8,0.000,?,0,0.00,?,0,13,1,D,9,61,C,8 -03/29/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,6.7,A,7,96,A,7,994,A,7,60,A,7,3.1,A,7,8000,B,7,1010,A,7,1.6,E,8,0.000,?,0,0.00,?,0,28,1,D,9,61,C,8 -03/29/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,6.7,A,7,96,A,7,994,A,7,60,A,7,4.1,A,7,6400,B,7,1370,A,7,1.6,E,8,0.000,?,0,0.00,?,0,46,1,D,9,45,C,8 -03/29/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,6.7,A,7,96,A,7,994,A,7,30,A,7,3.6,A,7,6400,B,7,150,A,7,1.6,E,8,0.000,?,0,0.00,?,0,15,1,D,9,45,C,8 -03/29/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,6.7,A,7,96,A,7,993,A,7,40,A,7,5.2,A,7,4800,B,7,120,A,7,1.6,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -03/29/1990,07:00,86,1086,16,1,13,25,1,9,13,1,13,17,1,13,13,1,9,16,1,13,27,1,21,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,994,A,7,40,A,7,5.7,A,7,4800,B,7,150,A,7,1.5,E,8,0.000,F,8,0.00,?,0,18,1,D,9,45,C,8 -03/29/1990,08:00,360,1371,48,1,9,7,1,9,46,1,13,57,1,9,3,1,9,56,1,13,191,1,18,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,994,A,7,60,A,7,6.7,A,7,3200,B,7,150,A,7,1.5,E,8,0.000,F,8,0.00,?,0,25,1,D,9,45,C,8 -03/29/1990,09:00,622,1371,93,1,9,7,1,9,90,1,13,111,1,9,4,1,9,109,1,13,408,1,18,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,995,A,7,60,A,7,8.8,A,7,6400,B,7,240,A,7,1.5,E,8,0.000,F,8,0.00,?,0,13,1,D,9,45,C,8 -03/29/1990,10:00,847,1371,135,1,9,10,1,9,129,1,13,164,1,9,7,1,9,159,1,13,626,1,18,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,995,A,7,60,A,7,7.2,A,7,6400,B,7,310,A,7,1.5,E,8,0.000,F,8,0.00,?,0,15,1,D,9,45,C,8 -03/29/1990,11:00,1017,1371,186,1,9,5,1,9,182,1,13,225,1,9,4,1,9,222,1,13,897,1,18,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,995,A,7,60,A,7,7.2,A,7,6400,B,7,310,A,7,1.5,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -03/29/1990,12:00,1121,1371,214,1,9,1,1,9,213,1,13,259,1,9,1,1,9,259,1,13,1052,1,18,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,994,A,7,60,A,7,7.7,A,7,8000,B,7,240,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/29/1990,13:00,1152,1371,219,1,9,0,1,9,219,1,13,266,1,9,0,1,9,266,1,13,1081,1,18,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,994,A,7,50,A,7,6.7,A,7,8000,B,7,210,A,7,1.5,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -03/29/1990,14:00,1108,1371,225,1,9,4,1,9,222,1,13,272,1,9,3,1,9,269,1,13,1085,1,18,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,993,A,7,60,A,7,6.7,A,7,8000,B,7,150,A,7,1.5,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -03/29/1990,15:00,991,1371,205,1,9,2,1,9,204,1,13,245,1,9,2,1,9,244,1,13,976,1,18,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,993,A,7,50,A,7,6.2,A,7,8000,B,7,210,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/29/1990,16:00,811,1371,159,1,9,1,1,9,159,1,13,189,1,9,1,1,9,188,1,13,732,1,18,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,993,A,7,50,A,7,5.7,A,7,8000,B,7,210,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/29/1990,17:00,579,1371,108,1,9,1,1,9,108,1,13,127,1,9,1,1,9,126,1,13,461,1,18,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,993,A,7,50,A,7,6.2,A,7,8000,B,7,240,A,7,1.5,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -03/29/1990,18:00,312,1371,50,1,13,0,1,9,50,1,13,58,1,13,0,1,9,58,1,13,196,1,21,10,A,7,10,A,7,6.1,A,7,5.0,A,7,93,A,7,993,A,7,50,A,7,5.7,A,7,6400,B,7,240,A,7,1.4,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -03/29/1990,19:00,53,857,12,1,13,0,1,9,12,1,13,14,1,13,0,1,9,14,1,13,45,1,21,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,993,A,7,40,A,7,5.7,A,7,8000,B,7,270,A,7,1.4,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -03/29/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,5.0,A,7,96,A,7,993,A,7,40,A,7,6.2,A,7,6400,B,7,210,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/29/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,992,A,7,40,A,7,7.2,A,7,3200,B,7,180,A,7,1.4,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -03/29/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,993,A,7,40,A,7,5.2,A,7,3200,B,7,180,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/29/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,993,A,7,30,A,7,4.1,A,7,2400,B,7,150,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/29/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,993,A,7,30,A,7,4.1,A,7,2400,B,7,150,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,992,A,7,40,A,7,4.6,A,7,2400,B,7,150,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,991,A,7,30,A,7,5.2,A,7,9700,B,7,150,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,991,A,7,20,A,7,5.7,A,7,9700,B,7,150,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,991,A,7,30,A,7,4.6,A,7,6400,B,7,150,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,992,A,7,20,A,7,3.6,A,7,6400,B,7,150,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,991,A,7,40,A,7,4.1,A,7,6400,B,7,150,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,07:00,91,1131,24,1,13,0,1,9,24,1,13,27,1,13,0,1,9,27,1,13,82,1,21,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,991,A,7,50,A,7,4.6,A,7,9700,B,7,210,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,08:00,366,1371,113,1,9,1,1,9,113,1,13,125,1,9,1,1,9,125,1,13,378,1,18,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,992,A,7,20,A,7,3.1,A,7,9700,B,7,180,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,20,C,8 -03/30/1990,09:00,628,1371,206,1,9,0,1,9,205,1,13,230,1,9,0,1,9,230,1,13,763,1,18,10,A,7,10,A,7,6.1,A,7,4.4,A,7,89,A,7,992,A,7,20,A,7,2.6,A,7,9700,B,7,180,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,10:00,852,1371,289,1,9,1,1,9,289,1,13,329,1,9,1,1,9,329,1,13,1158,1,18,10,A,7,10,A,7,6.7,A,7,5.0,A,7,89,A,7,992,A,7,40,A,7,3.6,A,7,12900,B,7,240,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,11:00,1022,1371,368,1,9,1,1,9,367,1,13,421,1,9,1,1,9,421,1,13,1509,1,18,10,A,7,10,A,7,7.8,A,7,5.0,A,7,83,A,7,992,A,7,40,A,7,3.1,A,7,12900,B,7,240,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/30/1990,12:00,1125,1371,393,1,9,1,1,9,393,1,13,456,1,9,1,1,9,455,1,13,1655,1,18,10,A,7,10,A,7,8.3,A,7,5.6,A,7,83,A,7,991,A,7,40,A,7,4.1,A,7,12900,B,7,310,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/30/1990,13:00,1156,1371,403,1,9,2,1,9,401,1,13,467,1,9,2,1,9,466,1,13,1693,1,18,10,A,7,10,A,7,9.4,A,7,6.1,A,7,80,A,7,990,A,7,60,A,7,4.1,A,7,12900,B,7,340,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/30/1990,14:00,1111,1371,395,1,9,2,1,9,394,1,13,457,1,9,2,1,9,455,1,13,1649,1,18,10,A,7,10,A,7,10.0,A,7,6.7,A,7,80,A,7,990,A,7,50,A,7,3.1,A,7,16100,B,7,460,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/30/1990,15:00,995,1371,355,1,9,1,1,9,354,1,13,406,1,9,1,1,9,405,1,13,1453,1,18,10,A,7,10,A,7,11.1,A,7,6.7,A,7,74,A,7,989,A,7,30,A,7,2.6,A,7,19300,B,7,490,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/30/1990,16:00,815,1371,286,1,9,1,1,9,286,1,13,324,1,9,1,1,9,324,1,13,1115,1,18,10,A,7,10,A,7,11.1,A,7,7.2,A,7,77,A,7,989,A,7,70,A,7,3.1,A,7,19300,B,7,520,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/30/1990,17:00,583,1371,193,1,9,1,1,9,192,1,13,215,1,9,1,1,9,215,1,13,697,1,18,10,A,7,10,A,7,11.1,A,7,7.2,A,7,77,A,7,989,A,7,80,A,7,3.1,A,7,19300,B,7,520,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/30/1990,18:00,315,1371,82,1,13,0,1,9,82,1,13,92,1,13,0,1,9,92,1,13,285,1,21,10,A,7,10,A,7,11.1,A,7,7.8,A,7,80,A,7,988,A,7,120,A,7,3.1,A,7,11300,B,7,490,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/30/1990,19:00,55,879,13,1,13,0,1,9,13,1,13,15,1,13,0,1,9,15,1,13,48,1,21,10,A,7,10,A,7,10.0,A,7,7.8,A,7,86,A,7,988,A,7,110,A,7,3.6,A,7,9700,B,7,490,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/30/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,8.3,A,7,90,A,7,988,A,7,30,A,7,2.1,A,7,4800,B,7,400,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,8.3,A,7,93,A,7,988,A,7,60,A,7,3.1,A,7,4800,B,7,240,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,988,A,7,360,A,7,2.1,A,7,2400,B,7,120,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,988,A,7,60,A,7,2.6,A,7,800,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/30/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,987,A,7,30,A,7,2.1,A,7,800,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/31/1990,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,987,A,7,30,A,7,2.6,A,7,800,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -03/31/1990,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,8.3,A,7,100,A,7,987,A,7,50,A,7,3.1,A,7,2400,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,36,1,D,9,45,C,8 -03/31/1990,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,985,A,7,20,A,7,2.6,A,7,2400,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -03/31/1990,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,985,A,7,50,A,7,2.6,A,7,2400,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -03/31/1990,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,985,A,7,60,A,7,3.1,A,7,2400,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -03/31/1990,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,985,A,7,90,A,7,3.1,A,7,2400,B,7,90,A,7,1.7,E,8,0.000,?,0,0.00,?,0,13,1,D,9,45,C,8 -03/31/1990,07:00,97,1153,15,1,13,0,1,9,15,1,13,18,1,13,0,1,9,18,1,13,56,1,21,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,985,A,7,70,A,7,2.6,A,7,4800,B,7,120,A,7,1.8,E,8,0.000,F,8,0.00,?,0,8,1,D,9,45,C,8 -03/31/1990,08:00,372,1370,72,1,9,0,1,9,72,1,13,83,1,9,0,1,9,83,1,13,280,1,18,10,A,7,10,A,7,9.4,A,7,8.9,A,7,96,A,7,985,A,7,100,A,7,3.1,A,7,4800,B,7,120,A,7,1.8,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -03/31/1990,09:00,635,1370,132,1,9,1,1,9,132,1,13,154,1,9,1,1,9,154,1,13,564,1,18,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,985,A,7,360,A,7,2.1,A,7,8000,B,7,120,A,7,1.9,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -03/31/1990,10:00,858,1370,325,1,9,2,1,9,324,1,13,367,1,9,2,1,9,366,1,13,1244,1,18,10,A,7,10,A,7,11.1,A,7,10.0,A,7,93,A,7,985,A,7,10,A,7,2.1,A,7,9700,B,7,120,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/31/1990,11:00,1027,1370,370,1,9,0,1,9,370,1,13,424,1,9,0,1,9,424,1,13,1522,1,18,10,A,7,10,A,7,12.2,A,7,10.6,A,7,90,A,7,985,A,7,40,A,7,1.5,A,7,9700,B,7,180,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/31/1990,12:00,1130,1370,395,1,9,0,1,9,395,1,13,457,1,9,0,1,9,457,1,13,1663,1,18,10,A,7,10,A,7,13.3,A,7,10.6,A,7,83,A,7,984,A,7,280,A,7,1.5,A,7,12900,B,7,240,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -03/31/1990,13:00,1160,1370,413,1,9,0,1,9,412,1,13,477,1,9,0,1,9,477,1,13,1724,1,18,10,A,7,10,A,7,14.4,A,7,11.1,A,7,81,A,7,984,A,7,190,A,7,1.5,A,7,12900,B,7,270,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,14:00,1115,1370,388,1,9,2,1,9,386,1,13,449,1,9,2,1,9,447,1,13,1631,1,18,10,A,7,10,A,7,15.0,A,7,12.2,A,7,84,A,7,983,A,7,210,A,7,2.6,A,7,16100,B,7,370,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -03/31/1990,15:00,999,1370,377,1,9,1,1,9,376,1,13,429,1,9,1,1,9,429,1,13,1509,1,18,10,A,7,10,A,7,16.7,A,7,12.8,A,7,78,A,7,983,A,7,280,A,7,3.1,A,7,16100,B,7,460,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,16:00,818,1370,282,1,9,66,1,9,243,1,13,311,1,9,67,1,9,271,1,13,795,1,18,10,A,7,9,A,7,17.2,A,7,13.3,A,7,78,A,7,983,A,7,200,A,7,3.6,A,7,16100,B,7,460,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,17:00,586,1370,355,1,13,545,1,9,122,1,13,381,1,13,532,1,9,153,1,13,239,1,21,10,A,7,4,A,7,17.8,A,7,13.3,A,7,75,A,7,982,A,7,160,A,7,2.6,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,18:00,319,1370,109,1,13,183,1,9,67,1,13,118,1,13,149,1,9,84,1,13,123,1,21,7,A,7,7,A,7,16.7,A,7,13.3,A,7,81,A,7,982,A,7,210,A,7,2.6,A,7,16100,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,19:00,57,902,13,1,13,8,1,9,13,1,13,15,1,13,4,1,9,15,1,13,33,1,21,8,A,7,8,A,7,15.6,A,7,12.8,A,7,84,A,7,982,A,7,240,A,7,2.6,A,7,16100,B,7,7620,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,14.4,A,7,12.8,A,7,90,A,7,982,A,7,250,A,7,2.1,A,7,16100,B,7,7620,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,11.7,A,7,11.1,A,7,96,A,7,983,A,7,250,A,7,3.1,A,7,12900,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.7,A,7,9.8,A,7,93,A,7,983,A,7,230,A,7,3.0,A,7,11300,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,0,A,7,9.8,A,7,8.6,A,7,100,A,7,983,A,7,270,A,7,2.8,A,7,11300,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -03/31/1990,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,8.8,A,7,7.3,A,7,96,A,7,983,A,7,240,A,7,2.7,A,7,6400,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,0,A,7,7.9,A,7,6.0,A,7,68,A,7,982,A,7,310,A,7,2.5,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -04/01/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,6.9,A,7,4.7,A,7,74,A,7,983,A,7,310,A,7,2.4,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,6.0,A,7,3.5,A,7,71,A,7,983,A,7,310,A,7,2.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,0,A,7,5.0,A,7,2.2,A,7,82,A,7,984,A,7,10,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,5.6,A,7,2.2,A,7,79,A,7,984,A,7,10,A,7,3.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,6.1,A,7,2.2,A,7,76,A,7,985,A,7,30,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,07:00,105,1197,48,1,13,237,1,9,22,1,13,45,1,13,128,1,9,33,1,13,40,1,21,0,A,7,0,A,7,7.8,A,7,3.3,A,7,74,A,7,986,A,7,40,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/01/1980,08:00,381,1368,227,1,9,655,1,9,45,1,13,238,1,9,577,1,9,77,1,13,94,1,18,0,A,7,0,A,7,10.6,A,7,3.9,A,7,64,A,7,987,A,7,10,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,09:00,643,1368,446,1,9,814,1,9,65,1,13,470,1,9,787,1,9,99,1,13,145,1,18,0,A,7,0,A,7,12.8,A,7,3.3,A,7,53,A,7,989,A,7,30,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,10:00,865,1368,645,1,9,892,1,9,80,1,13,674,1,9,885,1,9,112,1,13,197,1,18,0,A,7,0,A,7,13.9,A,7,3.9,A,7,51,A,7,989,A,7,120,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,11:00,1034,1368,713,1,9,802,1,9,106,1,13,738,1,9,801,1,9,131,1,13,284,1,18,1,A,7,1,A,7,14.4,A,7,3.3,A,7,48,A,7,990,A,7,60,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,12:00,1136,1368,790,1,9,778,1,9,144,1,13,841,1,9,787,1,9,186,1,13,542,1,18,2,A,7,2,A,7,15.6,A,7,4.4,A,7,48,A,7,989,A,7,120,A,7,4.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/01/1980,13:00,1166,1368,835,1,9,829,1,9,127,1,13,859,1,9,830,1,9,150,1,13,428,1,18,2,A,7,2,A,7,16.7,A,7,4.4,A,7,45,A,7,989,A,7,100,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/01/1980,14:00,1120,1368,821,1,9,860,1,9,115,1,13,847,1,9,861,1,9,140,1,13,358,1,18,2,A,7,2,A,7,17.2,A,7,4.4,A,7,43,A,7,989,A,7,80,A,7,3.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,15:00,1003,1368,602,1,9,662,1,9,115,1,13,644,1,9,670,1,9,151,1,13,340,1,18,1,A,7,1,A,7,17.8,A,7,3.9,A,7,40,A,7,988,A,7,100,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,16:00,823,1368,559,1,9,800,1,9,77,1,13,584,1,9,792,1,9,107,1,13,185,1,18,0,A,7,0,A,7,18.3,A,7,3.9,A,7,39,A,7,988,A,7,130,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,17:00,591,1368,400,1,9,785,1,9,61,1,13,421,1,9,752,1,9,95,1,13,135,1,18,0,A,7,0,A,7,18.9,A,7,3.3,A,7,36,A,7,988,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,18:00,324,1368,184,1,13,609,1,9,41,1,13,192,1,13,512,1,9,71,1,13,83,1,21,0,A,7,0,A,7,17.8,A,7,3.3,A,7,38,A,7,988,A,7,150,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,19:00,61,923,36,1,13,151,1,9,19,1,13,32,1,13,63,1,9,27,1,13,33,1,21,0,A,7,0,A,7,15.6,A,7,3.9,A,7,46,A,7,989,A,7,130,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/01/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,3.9,A,7,49,A,7,989,A,7,140,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,4.4,A,7,55,A,7,990,A,7,130,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,4.4,A,7,62,A,7,990,A,7,150,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,3.9,A,7,64,A,7,990,A,7,160,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/01/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,3.9,A,7,66,A,7,990,A,7,180,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,4.4,A,7,69,A,7,990,A,7,170,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/02/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,9.4,A,7,5.0,A,7,74,A,7,990,A,7,180,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,0,A,7,8.9,A,7,5.6,A,7,80,A,7,990,A,7,190,A,7,3.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,0,A,7,8.3,A,7,6.1,A,7,86,A,7,990,A,7,180,A,7,2.6,A,7,11300,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,7.2,A,7,86,A,7,990,A,7,180,A,7,4.1,A,7,11300,B,7,150,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,7.8,A,7,89,A,7,991,A,7,190,A,7,3.6,A,7,3200,B,7,150,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/02/1980,07:00,110,1242,23,1,13,6,1,9,23,1,13,27,1,13,0,1,9,27,1,13,82,1,21,10,A,7,10,A,7,10.0,A,7,8.3,A,7,89,A,7,991,A,7,210,A,7,3.6,A,7,3200,B,7,150,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,44,C,8 -04/02/1980,08:00,388,1367,145,1,9,57,1,9,129,1,13,159,1,9,52,1,9,144,1,13,323,1,18,10,A,7,9,A,7,11.1,A,7,8.3,A,7,83,A,7,991,A,7,210,A,7,4.6,A,7,4000,B,7,210,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/02/1980,09:00,649,1367,299,1,9,79,1,9,262,1,13,328,1,9,79,1,9,290,1,13,717,1,18,9,A,7,8,A,7,12.8,A,7,8.9,A,7,77,A,7,991,A,7,200,A,7,5.2,A,7,6400,B,7,310,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/02/1980,10:00,871,1367,584,1,13,664,1,9,160,1,13,614,1,13,669,1,9,187,1,13,398,1,21,7,A,7,3,A,7,15.0,A,7,9.4,A,7,70,A,7,991,A,7,220,A,7,4.1,A,7,8000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/02/1980,11:00,1038,1367,609,1,13,544,1,9,195,1,13,644,1,13,553,1,9,223,1,13,621,1,21,7,A,7,3,A,7,16.7,A,7,8.9,A,7,60,A,7,990,A,7,230,A,7,4.1,A,7,8000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/02/1980,12:00,1140,1367,767,1,13,668,1,9,209,1,13,816,1,13,681,1,9,246,1,13,839,1,21,7,A,7,3,A,7,18.3,A,7,9.4,A,7,56,A,7,989,A,7,250,A,7,5.2,A,7,8000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/02/1980,13:00,1170,1367,817,1,13,676,1,9,238,1,13,864,1,13,686,1,9,275,1,13,1027,1,21,10,A,7,5,A,7,20.0,A,7,8.9,A,7,49,A,7,988,A,7,230,A,7,4.6,A,7,8000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/02/1980,14:00,1124,1367,715,1,13,561,1,9,254,1,13,750,1,13,566,1,9,284,1,13,957,1,21,10,A,7,6,A,7,20.6,A,7,8.9,A,7,47,A,7,988,A,7,230,A,7,5.2,A,7,8000,B,7,7620,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/02/1980,15:00,1007,1367,626,1,9,489,1,9,266,1,13,668,1,9,508,1,9,293,1,13,811,1,18,10,A,7,8,A,7,21.1,A,7,9.4,A,7,47,A,7,987,A,7,200,A,7,8.2,A,7,8000,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/02/1980,16:00,826,1367,423,1,13,361,1,9,204,1,13,450,1,13,370,1,9,225,1,13,485,1,21,10,A,7,5,A,7,21.7,A,7,8.9,A,7,44,A,7,985,A,7,210,A,7,6.2,A,7,8000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/02/1980,17:00,595,1367,356,1,13,473,1,9,151,1,13,375,1,13,462,1,9,173,1,13,304,1,21,10,A,7,3,A,7,21.1,A,7,7.8,A,7,42,A,7,985,A,7,240,A,7,4.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,18:00,328,1367,116,1,13,202,1,9,68,1,13,126,1,13,166,1,9,86,1,13,125,1,21,10,A,7,5,A,7,20.0,A,7,7.8,A,7,45,A,7,985,A,7,240,A,7,4.1,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,19:00,63,946,30,1,13,35,1,9,26,1,13,31,1,13,16,1,9,30,1,13,54,1,21,10,A,7,3,A,7,18.3,A,7,8.9,A,7,54,A,7,985,A,7,210,A,7,4.1,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/02/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,16.7,A,7,8.3,A,7,58,A,7,985,A,7,170,A,7,2.6,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,16.1,A,7,8.9,A,7,63,A,7,986,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,16.1,A,7,8.9,A,7,63,A,7,986,A,7,220,A,7,3.1,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,5,A,7,15.6,A,7,9.4,A,7,67,A,7,986,A,7,210,A,7,2.6,A,7,16100,B,7,7620,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/02/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,14.4,A,7,9.4,A,7,72,A,7,986,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/03/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,13.9,A,7,9.4,A,7,75,A,7,986,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/03/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,13.3,A,7,9.4,A,7,78,A,7,985,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/03/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,12.2,A,7,9.4,A,7,83,A,7,985,A,7,240,A,7,2.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/03/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,10.6,A,7,8.3,A,7,86,A,7,985,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/03/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,10.6,A,7,8.9,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/03/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,3,A,7,9.4,A,7,7.2,A,7,86,A,7,987,A,7,10,A,7,2.1,A,7,8000,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,07:00,116,1264,47,1,13,190,1,9,27,1,13,48,1,13,95,1,9,39,1,13,48,1,21,1,A,7,0,A,7,10.0,A,7,8.9,A,7,93,A,7,988,A,7,30,A,7,3.6,A,7,6400,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,08:00,394,1367,224,1,9,582,1,9,57,1,13,236,1,9,512,1,9,88,1,13,110,1,18,1,A,7,0,A,7,11.7,A,7,8.3,A,7,80,A,7,988,A,7,40,A,7,6.2,A,7,8000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,09:00,654,1367,439,1,9,744,1,9,83,1,13,460,1,9,725,1,9,112,1,13,175,1,18,1,A,7,0,A,7,13.9,A,7,7.8,A,7,67,A,7,989,A,7,30,A,7,4.1,A,7,8000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,10:00,876,1367,632,1,9,826,1,9,103,1,13,673,1,9,830,1,9,140,1,13,259,1,18,1,A,7,0,A,7,15.6,A,7,8.9,A,7,65,A,7,989,A,7,60,A,7,3.1,A,7,8000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,11:00,1043,1367,781,1,9,861,1,9,123,1,13,835,1,9,872,1,9,168,1,13,387,1,18,2,A,7,0,A,7,17.2,A,7,10.0,A,7,63,A,7,989,A,7,70,A,7,3.6,A,7,8000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,12:00,1145,1367,875,1,9,877,1,9,139,1,13,898,1,9,877,1,9,162,1,13,417,1,18,3,A,7,0,A,7,19.4,A,7,10.6,A,7,57,A,7,988,A,7,340,A,7,2.1,A,7,9700,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,13:00,1173,1367,785,1,13,626,1,9,247,1,13,829,1,13,635,1,9,282,1,13,1077,1,21,7,A,7,4,A,7,21.1,A,7,11.1,A,7,53,A,7,988,A,7,260,A,7,1.5,A,7,9700,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,14:00,1128,1367,571,1,13,338,1,9,291,1,13,613,1,13,353,1,9,321,1,13,1146,1,21,8,A,7,6,A,7,22.2,A,7,11.1,A,7,50,A,7,987,A,7,240,A,7,4.1,A,7,9700,B,7,3660,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,15:00,1010,1367,489,1,13,317,1,9,255,1,13,541,1,13,343,1,9,286,1,13,762,1,21,8,A,7,7,A,7,22.2,A,7,10.6,A,7,48,A,7,985,A,7,160,A,7,3.1,A,7,9700,B,7,2130,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,16:00,830,1367,219,1,9,3,1,9,217,1,13,254,1,9,3,1,9,252,1,13,941,1,18,10,A,7,10,A,7,21.7,A,7,11.1,A,7,51,A,7,985,A,7,200,A,7,3.6,A,7,11300,B,7,1520,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/03/1980,17:00,598,1367,153,1,9,4,1,9,151,1,13,175,1,9,3,1,9,173,1,13,606,1,18,10,A,7,10,A,7,21.1,A,7,11.7,A,7,55,A,7,984,A,7,210,A,7,3.1,A,7,11300,B,7,1520,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/03/1980,18:00,331,1367,62,1,13,4,1,9,61,1,13,71,1,13,2,1,9,71,1,13,235,1,21,10,A,7,10,A,7,19.4,A,7,13.9,A,7,70,A,7,985,A,7,200,A,7,5.2,A,7,11300,B,7,1160,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,19:00,66,968,8,1,13,1,1,9,8,1,13,10,1,13,0,1,9,10,1,13,31,1,21,10,A,7,10,A,7,17.8,A,7,15.0,A,7,84,A,7,984,A,7,190,A,7,5.2,A,7,4000,B,7,1160,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,15.0,A,7,87,A,7,983,A,7,180,A,7,3.6,A,7,11300,B,7,310,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -04/03/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,15.6,A,7,93,A,7,983,A,7,180,A,7,3.1,A,7,11300,B,7,240,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/03/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,15.6,A,7,93,A,7,982,A,7,180,A,7,3.6,A,7,11300,B,7,240,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/03/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,982,A,7,180,A,7,4.1,A,7,4800,B,7,180,A,7,2.7,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -04/03/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,981,A,7,190,A,7,4.1,A,7,11300,B,7,150,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -04/04/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,980,A,7,170,A,7,3.1,A,7,3200,B,7,90,A,7,2.7,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -04/04/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,979,A,7,220,A,7,3.6,A,7,3200,B,7,90,A,7,2.8,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -04/04/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,978,A,7,220,A,7,4.1,A,7,9700,B,7,120,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -04/04/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,16.1,A,7,97,A,7,977,A,7,220,A,7,4.1,A,7,11300,B,7,210,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,15.6,A,7,93,A,7,976,A,7,220,A,7,3.6,A,7,11300,B,7,270,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/04/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,15.6,A,7,93,A,7,976,A,7,220,A,7,5.2,A,7,8000,B,7,180,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/04/1980,07:00,122,1309,37,1,13,2,1,9,37,1,13,41,1,13,0,1,9,41,1,13,116,1,21,10,A,7,10,A,7,16.7,A,7,16.1,A,7,97,A,7,976,A,7,230,A,7,3.6,A,7,8000,B,7,240,A,7,2.8,E,8,0.000,F,8,0.00,?,0,3,1,D,9,21,C,8 -04/04/1980,08:00,400,1366,70,1,9,6,1,9,69,1,13,82,1,9,3,1,9,81,1,13,278,1,18,10,A,7,10,A,7,17.2,A,7,16.1,A,7,93,A,7,975,A,7,230,A,7,4.1,A,7,9700,B,7,270,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/04/1980,09:00,660,1366,220,1,9,61,1,9,191,1,13,242,1,9,60,1,9,213,1,13,573,1,18,10,A,7,9,A,7,17.8,A,7,16.1,A,7,90,A,7,975,A,7,260,A,7,4.1,A,7,11300,B,7,370,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,10:00,881,1366,387,1,13,157,1,9,285,1,13,423,1,13,165,1,9,316,1,13,807,1,21,10,A,7,7,A,7,20.6,A,7,16.7,A,7,79,A,7,974,A,7,250,A,7,5.7,A,7,11300,B,7,3960,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,11:00,1048,1366,485,1,13,277,1,9,273,1,13,537,1,13,300,1,9,305,1,13,869,1,21,5,A,7,5,A,7,21.7,A,7,15.6,A,7,68,A,7,973,A,7,250,A,7,5.2,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,12:00,1149,1366,729,1,9,488,1,9,318,1,13,779,1,9,509,1,9,350,1,13,1333,1,18,8,A,7,8,A,7,23.9,A,7,14.4,A,7,56,A,7,972,A,7,230,A,7,6.2,A,7,16100,B,7,1040,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,13:00,1177,1366,643,1,9,413,1,9,287,1,13,698,1,9,432,1,9,324,1,13,1299,1,18,8,A,7,8,A,7,22.2,A,7,11.7,A,7,51,A,7,971,A,7,250,A,7,7.2,A,7,16100,B,7,1220,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/04/1980,14:00,1131,1366,759,1,13,682,1,9,193,1,13,812,1,13,698,1,9,232,1,13,763,1,21,5,A,7,5,A,7,23.3,A,7,12.2,A,7,50,A,7,971,A,7,250,A,7,6.2,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,15:00,1014,1366,728,1,9,808,1,9,128,1,13,772,1,9,815,1,9,166,1,13,376,1,18,2,A,7,2,A,7,24.4,A,7,3.3,A,7,25,A,7,971,A,7,290,A,7,7.2,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,16:00,833,1366,591,1,9,866,1,9,63,1,13,623,1,9,859,1,9,97,1,13,170,1,18,1,A,7,1,A,7,23.9,A,7,0.6,A,7,22,A,7,970,A,7,280,A,7,7.7,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,17:00,601,1366,414,1,9,814,1,9,56,1,13,437,1,9,782,1,9,92,1,13,133,1,18,0,A,7,0,A,7,22.2,A,7,-1.7,A,7,20,A,7,971,A,7,290,A,7,7.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,18:00,335,1366,197,1,13,649,1,9,38,1,13,207,1,13,554,1,9,71,1,13,80,1,21,0,A,7,0,A,7,20.0,A,7,0.0,A,7,26,A,7,972,A,7,290,A,7,7.7,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,19:00,68,990,39,1,13,194,1,9,18,1,13,33,1,13,96,1,9,26,1,13,33,1,21,0,A,7,0,A,7,17.2,A,7,-0.6,A,7,30,A,7,974,A,7,310,A,7,7.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/04/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,-1.1,A,7,39,A,7,976,A,7,310,A,7,8.8,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,-1.7,A,7,40,A,7,977,A,7,310,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,-1.7,A,7,43,A,7,978,A,7,310,A,7,7.7,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,-1.1,A,7,46,A,7,978,A,7,300,A,7,5.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/04/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,-0.6,A,7,52,A,7,978,A,7,270,A,7,4.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,8.9,A,7,-1.1,A,7,50,A,7,979,A,7,300,A,7,3.6,A,7,24100,B,7,3660,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -04/05/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,-1.1,A,7,50,A,7,979,A,7,320,A,7,3.6,A,7,24100,B,7,1220,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,-1.1,A,7,52,A,7,980,A,7,300,A,7,5.7,A,7,24100,B,7,1220,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,7.2,A,7,-1.7,A,7,54,A,7,980,A,7,310,A,7,5.7,A,7,24100,B,7,1220,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,-2.2,A,7,53,A,7,980,A,7,310,A,7,5.2,A,7,24100,B,7,1220,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,6.7,A,7,-2.2,A,7,53,A,7,981,A,7,310,A,7,5.2,A,7,24100,B,7,1310,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,07:00,128,1331,32,1,13,26,1,9,29,1,13,35,1,13,17,1,9,33,1,13,71,1,21,7,A,7,7,A,7,6.7,A,7,-3.3,A,7,49,A,7,983,A,7,340,A,7,7.2,A,7,24100,B,7,1220,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,08:00,406,1365,170,1,13,237,1,9,99,1,13,182,1,13,214,1,9,118,1,13,192,1,21,4,A,7,4,A,7,7.8,A,7,-3.9,A,7,44,A,7,984,A,7,330,A,7,7.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,09:00,666,1365,427,1,13,603,1,9,134,1,13,444,1,13,588,1,9,157,1,13,274,1,21,4,A,7,4,A,7,9.4,A,7,-3.3,A,7,41,A,7,985,A,7,330,A,7,6.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,10:00,886,1365,536,1,13,527,1,9,194,1,13,580,1,13,545,1,9,226,1,13,489,1,21,4,A,7,4,A,7,10.0,A,7,-3.3,A,7,39,A,7,985,A,7,350,A,7,7.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,11:00,1053,1365,757,1,9,749,1,9,179,1,13,808,1,9,765,1,9,216,1,13,594,1,18,2,A,7,2,A,7,11.1,A,7,-3.3,A,7,37,A,7,986,A,7,330,A,7,6.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,12:00,1153,1365,898,1,9,902,1,9,135,1,13,923,1,9,902,1,9,158,1,13,426,1,18,0,A,7,0,A,7,12.2,A,7,-3.3,A,7,34,A,7,985,A,7,310,A,7,5.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,13:00,1181,1365,922,1,9,906,1,9,137,1,13,947,1,9,907,1,9,160,1,13,472,1,18,0,A,7,0,A,7,13.9,A,7,-3.3,A,7,30,A,7,985,A,7,320,A,7,5.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/05/1980,14:00,1135,1365,889,1,9,907,1,9,134,1,13,914,1,9,907,1,9,158,1,13,400,1,18,0,A,7,0,A,7,14.4,A,7,-3.3,A,7,29,A,7,984,A,7,340,A,7,5.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,15:00,1017,1365,772,1,9,868,1,9,124,1,13,821,1,9,877,1,9,166,1,13,370,1,18,0,A,7,0,A,7,15.6,A,7,-3.3,A,7,27,A,7,984,A,7,350,A,7,5.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,16:00,836,1365,614,1,9,825,1,9,109,1,13,646,1,9,823,1,9,140,1,13,255,1,18,0,A,7,0,A,7,16.1,A,7,-3.9,A,7,25,A,7,984,A,7,340,A,7,5.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,17:00,605,1365,402,1,9,716,1,9,85,1,13,427,1,9,699,1,9,117,1,13,178,1,18,0,A,7,0,A,7,16.1,A,7,-3.3,A,7,26,A,7,984,A,7,300,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,18:00,339,1365,183,1,13,512,1,9,56,1,13,190,1,13,427,1,9,84,1,13,104,1,21,0,A,7,0,A,7,15.0,A,7,-3.3,A,7,28,A,7,984,A,7,330,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,19:00,71,990,34,1,13,98,1,9,23,1,13,32,1,13,43,1,9,29,1,13,41,1,21,0,A,7,0,A,7,12.8,A,7,-3.9,A,7,31,A,7,985,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/05/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,-3.3,A,7,37,A,7,986,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,-3.3,A,7,41,A,7,987,A,7,340,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,-3.3,A,7,44,A,7,987,A,7,340,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,-3.3,A,7,44,A,7,988,A,7,330,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/05/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-1.7,A,7,62,A,7,988,A,7,340,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-2.2,A,7,65,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/06/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-1.7,A,7,70,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-1.7,A,7,79,A,7,989,A,7,250,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-2.2,A,7,73,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-2.8,A,7,76,A,7,990,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,06:00,0,11,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,2,A,7,1,A,7,1.7,A,7,-2.8,A,7,73,A,7,991,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -04/06/1980,07:00,134,1364,51,1,13,176,1,9,33,1,13,52,1,13,89,1,9,43,1,13,59,1,21,6,A,7,1,A,7,2.2,A,7,-1.7,A,7,76,A,7,991,A,7,80,A,7,1.5,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/06/1980,08:00,412,1364,234,1,9,573,1,9,61,1,13,246,1,9,511,1,9,91,1,13,118,1,18,5,A,7,1,A,7,9.4,A,7,-0.6,A,7,50,A,7,992,A,7,360,A,7,1.5,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,09:00,671,1364,437,1,9,631,1,9,126,1,13,455,1,9,618,1,9,150,1,13,262,1,18,7,A,7,2,A,7,13.3,A,7,-1.1,A,7,37,A,7,992,A,7,60,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,10:00,891,1364,609,1,9,662,1,9,176,1,13,638,1,9,666,1,9,202,1,13,445,1,18,10,A,7,2,A,7,14.4,A,7,-2.2,A,7,32,A,7,992,A,7,140,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,11:00,1057,1364,632,1,9,519,1,9,230,1,13,690,1,9,542,1,9,269,1,13,765,1,18,7,A,7,2,A,7,15.6,A,7,-2.2,A,7,30,A,7,992,A,7,110,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,12:00,1157,1364,852,1,9,824,1,9,153,1,13,904,1,9,832,1,9,196,1,13,610,1,18,5,A,7,2,A,7,16.7,A,7,-1.1,A,7,30,A,7,991,A,7,160,A,7,4.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,13:00,1185,1364,853,1,9,775,1,9,178,1,13,892,1,9,779,1,9,214,1,13,749,1,18,6,A,7,2,A,7,17.2,A,7,-2.8,A,7,26,A,7,991,A,7,290,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/06/1980,14:00,1138,1364,703,1,13,524,1,9,266,1,13,765,1,13,548,1,9,307,1,13,1076,1,21,7,A,7,3,A,7,17.8,A,7,-2.2,A,7,26,A,7,990,A,7,190,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,15:00,1020,1364,722,1,13,779,1,9,139,1,13,760,1,13,783,1,9,172,1,13,404,1,21,7,A,7,3,A,7,18.9,A,7,-2.2,A,7,24,A,7,990,A,7,220,A,7,4.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,16:00,839,1364,401,1,13,241,1,9,252,1,13,432,1,13,257,1,9,274,1,13,637,1,21,7,A,7,6,A,7,18.3,A,7,-2.8,A,7,24,A,7,989,A,7,270,A,7,3.1,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,17:00,608,1364,265,1,9,150,1,9,198,1,13,288,1,9,151,1,9,220,1,13,476,1,18,10,A,7,8,A,7,17.2,A,7,-2.8,A,7,26,A,7,989,A,7,270,A,7,2.6,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,18:00,342,1364,73,1,13,17,1,9,69,1,13,81,1,13,15,1,9,77,1,13,188,1,21,10,A,7,9,A,7,16.7,A,7,-2.2,A,7,28,A,7,989,A,7,230,A,7,2.1,A,7,24100,B,7,7620,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,19:00,74,1012,25,1,13,10,1,9,24,1,13,27,1,13,6,1,9,27,1,13,58,1,21,10,A,7,8,A,7,15.6,A,7,-1.1,A,7,32,A,7,989,A,7,210,A,7,2.6,A,7,24100,B,7,6100,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/06/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,13.3,A,7,-1.1,A,7,37,A,7,989,A,7,180,A,7,1.5,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,11.7,A,7,0.6,A,7,47,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,10.0,A,7,1.1,A,7,54,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,10.0,A,7,0.0,A,7,50,A,7,990,A,7,160,A,7,1.5,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/06/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,9.4,A,7,0.0,A,7,52,A,7,990,A,7,170,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,10.0,A,7,0.0,A,7,50,A,7,990,A,7,170,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/07/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,8.3,A,7,0.0,A,7,56,A,7,990,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,9.4,A,7,0.6,A,7,54,A,7,990,A,7,190,A,7,2.1,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,8.9,A,7,1.1,A,7,59,A,7,990,A,7,200,A,7,2.1,A,7,24100,B,7,3660,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,2.2,A,7,59,A,7,990,A,7,190,A,7,2.6,A,7,24100,B,7,3660,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,06:00,0,34,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,9,A,7,8,A,7,10.0,A,7,2.8,A,7,61,A,7,990,A,7,180,A,7,2.6,A,7,24100,B,7,3660,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,07:00,141,1363,37,1,13,7,1,9,36,1,13,41,1,13,0,1,9,41,1,13,117,1,21,8,A,7,7,A,7,10.0,A,7,4.4,A,7,69,A,7,990,A,7,140,A,7,1.5,A,7,24100,B,7,3660,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/07/1980,08:00,418,1363,111,1,9,54,1,9,95,1,13,123,1,9,49,1,9,108,1,13,263,1,18,9,A,7,9,A,7,11.7,A,7,4.4,A,7,62,A,7,991,A,7,160,A,7,3.6,A,7,16100,B,7,1070,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,09:00,677,1363,196,1,9,8,1,9,192,1,13,223,1,9,7,1,9,220,1,13,769,1,18,10,A,7,10,A,7,12.2,A,7,6.7,A,7,69,A,7,991,A,7,180,A,7,3.6,A,7,16100,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,10:00,896,1363,297,1,9,10,1,9,291,1,13,341,1,9,9,1,9,335,1,13,1207,1,18,10,A,7,10,A,7,12.8,A,7,7.8,A,7,72,A,7,992,A,7,180,A,7,3.1,A,7,11300,B,7,2130,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,11:00,1062,1363,262,1,9,20,1,9,246,1,13,311,1,9,17,1,9,298,1,13,1164,1,18,10,A,7,10,A,7,14.4,A,7,7.8,A,7,65,A,7,992,A,7,160,A,7,2.6,A,7,11300,B,7,2130,A,7,1.7,E,8,0.000,F,8,0.00,?,0,3,1,D,9,61,C,8 -04/07/1980,12:00,1161,1363,191,1,9,8,1,9,185,1,13,237,1,9,6,1,9,231,1,13,940,1,18,10,A,7,10,A,7,12.8,A,7,10.0,A,7,83,A,7,992,A,7,150,A,7,2.6,A,7,6400,B,7,1250,A,7,1.9,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -04/07/1980,13:00,1188,1363,346,1,9,11,1,9,337,1,13,410,1,9,10,1,9,401,1,13,1523,1,18,10,A,7,10,A,7,13.3,A,7,11.1,A,7,87,A,7,991,A,7,90,A,7,2.6,A,7,9700,B,7,3660,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/07/1980,14:00,1141,1363,397,1,9,5,1,9,392,1,13,460,1,9,5,1,9,456,1,13,1664,1,18,10,A,7,10,A,7,15.0,A,7,11.7,A,7,81,A,7,991,A,7,90,A,7,3.6,A,7,11300,B,7,2130,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,15:00,1023,1363,311,1,9,2,1,9,309,1,13,361,1,9,2,1,9,360,1,13,1356,1,18,10,A,7,10,A,7,16.1,A,7,11.7,A,7,75,A,7,991,A,7,140,A,7,3.6,A,7,11300,B,7,2130,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,16:00,843,1363,161,1,9,3,1,9,159,1,13,192,1,9,2,1,9,190,1,13,746,1,18,10,A,7,10,A,7,15.0,A,7,11.1,A,7,78,A,7,991,A,7,140,A,7,2.6,A,7,11300,B,7,3660,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -04/07/1980,17:00,611,1363,206,1,9,1,1,9,205,1,13,230,1,9,1,1,9,229,1,13,751,1,18,10,A,7,10,A,7,15.0,A,7,11.7,A,7,81,A,7,991,A,7,120,A,7,3.1,A,7,11300,B,7,1220,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,18:00,346,1363,118,1,13,0,1,9,118,1,13,129,1,13,0,1,9,129,1,13,375,1,21,10,A,7,10,A,7,15.0,A,7,9.4,A,7,70,A,7,991,A,7,130,A,7,2.1,A,7,11300,B,7,1370,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,19:00,77,1034,29,1,13,0,1,9,29,1,13,32,1,13,0,1,9,32,1,13,92,1,21,10,A,7,10,A,7,15.0,A,7,8.9,A,7,67,A,7,991,A,7,130,A,7,3.6,A,7,11300,B,7,1370,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/07/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,8.9,A,7,67,A,7,991,A,7,150,A,7,2.1,A,7,11300,B,7,1070,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,10.0,A,7,75,A,7,992,A,7,140,A,7,3.6,A,7,16100,B,7,1070,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,10.0,A,7,72,A,7,992,A,7,150,A,7,3.1,A,7,16100,B,7,1070,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/07/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,10.0,A,7,72,A,7,992,A,7,160,A,7,3.1,A,7,16100,B,7,1070,A,7,1.9,E,8,0.000,?,0,0.00,?,0,3,1,D,9,00,C,8 -04/07/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,10.6,A,7,80,A,7,991,A,7,170,A,7,5.2,A,7,11300,B,7,1070,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -04/08/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,11.1,A,7,87,A,7,992,A,7,160,A,7,2.6,A,7,16100,B,7,940,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,25,C,8 -04/08/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,11.1,A,7,87,A,7,991,A,7,170,A,7,2.1,A,7,16100,B,7,1220,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,11.7,A,7,93,A,7,991,A,7,150,A,7,2.1,A,7,16100,B,7,1220,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,11.7,A,7,93,A,7,991,A,7,150,A,7,2.6,A,7,16100,B,7,1520,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,11.7,A,7,90,A,7,991,A,7,150,A,7,2.6,A,7,16100,B,7,1520,A,7,2.1,E,8,0.000,?,0,0.00,?,0,3,1,D,9,00,C,8 -04/08/1980,06:00,0,57,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,10,A,7,10,A,7,13.3,A,7,11.7,A,7,90,A,7,991,A,7,150,A,7,2.6,A,7,11300,B,7,1520,A,7,2.1,E,8,0.000,?,0,0.00,?,0,5,1,D,9,80,C,8 -04/08/1980,07:00,147,1362,20,1,13,0,1,9,20,1,13,23,1,13,0,1,9,23,1,13,75,1,21,10,A,7,10,A,7,13.3,A,7,12.2,A,7,93,A,7,991,A,7,140,A,7,2.6,A,7,11300,B,7,1520,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -04/08/1980,08:00,424,1362,76,1,9,1,1,9,75,1,13,88,1,9,1,1,9,87,1,13,304,1,18,10,A,7,10,A,7,13.9,A,7,11.7,A,7,87,A,7,990,A,7,140,A,7,2.6,A,7,11300,B,7,700,A,7,2.2,E,8,0.000,F,8,0.00,?,0,5,1,D,9,80,C,8 -04/08/1980,09:00,682,1362,141,1,9,1,1,9,140,1,13,164,1,9,1,1,9,164,1,13,612,1,18,10,A,7,10,A,7,14.4,A,7,12.8,A,7,90,A,7,990,A,7,160,A,7,3.1,A,7,6400,B,7,1520,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/08/1980,10:00,901,1362,335,1,9,1,1,9,334,1,13,380,1,9,1,1,9,379,1,13,1318,1,18,10,A,7,10,A,7,15.6,A,7,13.3,A,7,87,A,7,990,A,7,150,A,7,4.1,A,7,8000,B,7,1310,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/08/1980,11:00,1066,1362,424,1,9,84,1,9,358,1,13,467,1,9,86,1,9,400,1,13,1393,1,18,9,A,7,9,A,7,17.8,A,7,13.9,A,7,78,A,7,989,A,7,160,A,7,6.2,A,7,16100,B,7,3050,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,12:00,1165,1362,457,1,9,59,1,9,407,1,13,505,1,9,61,1,9,453,1,13,1766,1,18,10,A,7,10,A,7,20.0,A,7,13.9,A,7,68,A,7,988,A,7,160,A,7,5.2,A,7,11300,B,7,1370,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,13:00,1192,1362,436,1,9,8,1,9,428,1,13,505,1,9,8,1,9,498,1,13,1787,1,18,10,A,7,10,A,7,21.7,A,7,13.3,A,7,59,A,7,987,A,7,150,A,7,7.2,A,7,11300,B,7,670,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/08/1980,14:00,1145,1362,402,1,9,10,1,9,393,1,13,466,1,9,10,1,9,458,1,13,1669,1,18,10,A,7,10,A,7,20.6,A,7,12.2,A,7,59,A,7,986,A,7,170,A,7,6.2,A,7,16100,B,7,1220,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,15:00,1027,1362,275,1,9,8,1,9,269,1,13,324,1,9,7,1,9,318,1,13,1230,1,18,10,A,7,10,A,7,20.6,A,7,12.8,A,7,61,A,7,985,A,7,140,A,7,5.7,A,7,16100,B,7,1130,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,16:00,846,1362,168,1,9,0,1,9,167,1,13,198,1,9,0,1,9,198,1,13,778,1,18,10,A,7,10,A,7,17.8,A,7,15.6,A,7,87,A,7,984,A,7,140,A,7,5.2,A,7,9700,B,7,850,A,7,2.7,E,8,0.000,F,8,0.00,?,0,38,1,D,9,80,C,8 -04/08/1980,17:00,614,1362,136,1,9,7,1,9,133,1,13,158,1,9,5,1,9,156,1,13,560,1,18,10,A,7,10,A,7,16.7,A,7,15.6,A,7,93,A,7,984,A,7,160,A,7,4.1,A,7,3200,B,7,120,A,7,2.7,E,8,0.000,F,8,0.00,?,0,23,1,D,9,45,C,8 -04/08/1980,18:00,349,1362,55,1,13,1,1,9,55,1,13,64,1,13,0,1,9,64,1,13,220,1,21,10,A,7,10,A,7,16.7,A,7,15.0,A,7,90,A,7,983,A,7,160,A,7,5.2,A,7,3200,B,7,340,A,7,2.6,E,8,0.000,F,8,0.00,?,0,8,1,D,9,45,C,8 -04/08/1980,19:00,79,1056,20,1,13,0,1,9,20,1,13,23,1,13,0,1,9,23,1,13,70,1,21,10,A,7,10,A,7,16.1,A,7,15.0,A,7,93,A,7,983,A,7,160,A,7,7.2,A,7,11300,B,7,340,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -04/08/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,14.4,A,7,90,A,7,983,A,7,160,A,7,8.8,A,7,11300,B,7,310,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,14.4,A,7,93,A,7,983,A,7,150,A,7,7.7,A,7,16100,B,7,240,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,14.4,A,7,93,A,7,982,A,7,150,A,7,6.7,A,7,16100,B,7,180,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/08/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,15.0,A,7,97,A,7,981,A,7,180,A,7,6.7,A,7,8000,B,7,150,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/08/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,15.0,A,7,97,A,7,980,A,7,170,A,7,6.2,A,7,6400,B,7,120,A,7,2.6,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -04/09/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,16.1,A,7,97,A,7,980,A,7,170,A,7,6.2,A,7,6400,B,7,120,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/09/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,16.1,A,7,97,A,7,979,A,7,170,A,7,5.2,A,7,6400,B,7,120,A,7,2.8,E,8,0.000,?,0,0.00,?,0,51,1,D,9,45,C,8 -04/09/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,13.9,A,7,90,A,7,980,A,7,300,A,7,4.1,A,7,16100,B,7,760,A,7,2.4,E,8,0.000,?,0,0.00,?,0,140,1,D,9,61,C,8 -04/09/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,13.9,A,7,93,A,7,980,A,7,340,A,7,3.6,A,7,8000,B,7,850,A,7,2.4,E,8,0.000,?,0,0.00,?,0,3,1,D,9,80,C,8 -04/09/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,13.3,A,7,93,A,7,980,A,7,120,A,7,1.5,A,7,16100,B,7,910,A,7,2.3,E,8,0.000,?,0,0.00,?,0,8,1,D,9,00,C,8 -04/09/1980,06:00,1,102,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,9,A,7,7,A,7,13.9,A,7,13.3,A,7,96,A,7,981,A,7,60,A,7,2.6,A,7,11300,B,7,1520,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,07:00,153,1362,45,1,13,62,1,9,38,1,13,49,1,13,36,1,9,45,1,13,79,1,21,6,A,7,6,A,7,14.4,A,7,13.9,A,7,96,A,7,981,A,7,120,A,7,1.5,A,7,11300,B,7,1520,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/09/1980,08:00,430,1362,190,1,13,255,1,9,110,1,13,204,1,13,235,1,9,129,1,13,217,1,21,5,A,7,5,A,7,16.1,A,7,13.3,A,7,84,A,7,981,A,7,70,A,7,1.5,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,09:00,688,1362,392,1,13,436,1,9,172,1,13,415,1,13,437,1,9,193,1,13,365,1,21,4,A,7,4,A,7,17.2,A,7,11.7,A,7,70,A,7,981,A,7,80,A,7,2.1,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,10:00,906,1362,493,1,13,433,1,9,204,1,13,532,1,13,448,1,9,233,1,13,530,1,21,6,A,7,5,A,7,17.8,A,7,11.1,A,7,65,A,7,980,A,7,90,A,7,3.6,A,7,16100,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,11:00,1070,1362,687,1,13,589,1,9,224,1,13,723,1,13,596,1,9,253,1,13,759,1,21,5,A,7,5,A,7,20.0,A,7,12.8,A,7,63,A,7,980,A,7,200,A,7,3.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,12:00,1169,1362,731,1,13,507,1,9,295,1,13,790,1,13,530,1,9,333,1,13,1316,1,21,6,A,7,6,A,7,21.7,A,7,12.2,A,7,55,A,7,979,A,7,210,A,7,5.2,A,7,16100,B,7,850,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,13:00,1195,1362,680,1,13,394,1,9,334,1,13,729,1,13,412,1,9,366,1,13,1631,1,21,7,A,7,3,A,7,22.2,A,7,10.0,A,7,46,A,7,978,A,7,260,A,7,5.2,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/09/1980,14:00,1148,1362,780,1,9,623,1,9,254,1,13,820,1,9,630,1,9,287,1,13,1035,1,18,6,A,7,2,A,7,22.8,A,7,7.8,A,7,38,A,7,977,A,7,200,A,7,6.7,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,15:00,1030,1362,779,1,13,772,1,9,195,1,13,824,1,13,784,1,9,230,1,13,616,1,21,5,A,7,3,A,7,22.8,A,7,7.2,A,7,37,A,7,976,A,7,240,A,7,6.7,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,16:00,849,1362,585,1,9,694,1,9,153,1,13,617,1,9,699,1,9,181,1,13,374,1,18,2,A,7,2,A,7,22.8,A,7,7.2,A,7,37,A,7,976,A,7,240,A,7,6.2,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,17:00,618,1362,374,1,9,550,1,9,124,1,13,387,1,9,530,1,9,146,1,13,247,1,18,1,A,7,1,A,7,22.2,A,7,3.9,A,7,30,A,7,976,A,7,240,A,7,5.2,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,18:00,353,1362,182,1,13,441,1,9,68,1,13,187,1,13,370,1,9,91,1,13,124,1,21,1,A,7,1,A,7,21.1,A,7,2.8,A,7,30,A,7,976,A,7,230,A,7,5.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,19:00,82,1078,32,1,13,82,1,9,23,1,13,32,1,13,34,1,9,29,1,13,40,1,21,1,A,7,1,A,7,18.9,A,7,1.7,A,7,32,A,7,976,A,7,240,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/09/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,2.8,A,7,40,A,7,977,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,3.3,A,7,44,A,7,978,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,3.3,A,7,46,A,7,978,A,7,250,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,3.3,A,7,51,A,7,978,A,7,250,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/09/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,3.3,A,7,55,A,7,978,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,3.3,A,7,61,A,7,978,A,7,270,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/10/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,0.6,A,7,45,A,7,978,A,7,280,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,1.1,A,7,56,A,7,978,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,1.7,A,7,61,A,7,978,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,2.2,A,7,71,A,7,978,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,06:00,1,125,2,1,13,1,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,6.1,A,7,2.8,A,7,79,A,7,979,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,07:00,159,1361,65,1,13,293,1,9,31,1,13,66,1,13,176,1,9,46,1,13,55,1,21,0,A,7,0,A,7,8.9,A,7,3.9,A,7,71,A,7,980,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/10/1980,08:00,436,1361,264,1,9,641,1,9,59,1,13,273,1,9,581,1,9,87,1,13,116,1,18,0,A,7,0,A,7,12.8,A,7,3.9,A,7,55,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,09:00,693,1361,483,1,9,785,1,9,83,1,13,510,1,9,773,1,9,115,1,13,183,1,18,0,A,7,0,A,7,16.1,A,7,3.3,A,7,43,A,7,980,A,7,330,A,7,3.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,10:00,911,1361,677,1,9,859,1,9,101,1,13,702,1,9,854,1,9,129,1,13,226,1,18,0,A,7,0,A,7,17.2,A,7,3.3,A,7,40,A,7,981,A,7,290,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,11:00,1075,1361,687,1,13,592,1,9,219,1,13,724,1,13,600,1,9,249,1,13,752,1,21,5,A,7,5,A,7,18.3,A,7,4.4,A,7,40,A,7,981,A,7,300,A,7,3.1,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,12:00,1173,1361,898,1,13,842,1,9,171,1,13,942,1,13,847,1,9,210,1,13,703,1,21,3,A,7,3,A,7,18.3,A,7,2.8,A,7,36,A,7,980,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,13:00,1199,1361,880,1,9,878,1,9,106,1,13,911,1,9,881,1,9,133,1,13,439,1,18,1,A,7,1,A,7,19.4,A,7,4.4,A,7,37,A,7,980,A,7,280,A,7,3.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/10/1980,14:00,1151,1361,843,1,9,869,1,9,108,1,13,873,1,9,871,1,9,135,1,13,383,1,18,1,A,7,1,A,7,19.4,A,7,3.3,A,7,35,A,7,980,A,7,260,A,7,3.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,15:00,1033,1361,655,1,9,667,1,9,148,1,13,706,1,9,686,1,9,185,1,13,483,1,18,1,A,7,1,A,7,20.0,A,7,3.3,A,7,33,A,7,979,A,7,270,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,16:00,852,1361,545,1,9,656,1,9,135,1,13,581,1,9,665,1,9,164,1,13,337,1,18,3,A,7,2,A,7,20.6,A,7,2.8,A,7,31,A,7,979,A,7,270,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,17:00,621,1361,394,1,9,652,1,9,97,1,13,416,1,9,637,1,9,125,1,13,202,1,18,2,A,7,2,A,7,20.6,A,7,2.2,A,7,30,A,7,979,A,7,250,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,18:00,356,1361,196,1,9,504,1,9,65,1,13,203,1,9,425,1,9,92,1,13,120,1,18,2,A,7,2,A,7,19.4,A,7,1.7,A,7,31,A,7,979,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,19:00,85,1100,37,1,13,111,1,9,25,1,13,36,1,13,51,1,9,32,1,13,44,1,21,3,A,7,2,A,7,17.8,A,7,2.2,A,7,35,A,7,980,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/10/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,16.1,A,7,2.8,A,7,41,A,7,981,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,12.8,A,7,4.4,A,7,57,A,7,981,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,13.9,A,7,2.8,A,7,47,A,7,982,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,10.6,A,7,5.0,A,7,69,A,7,982,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/10/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,10.6,A,7,4.4,A,7,66,A,7,983,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,3.3,A,7,71,A,7,983,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -04/11/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,0.6,A,7,50,A,7,983,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,1.7,A,7,66,A,7,983,A,7,250,A,7,1.5,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,2.8,A,7,74,A,7,984,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,1.7,A,7,79,A,7,985,A,7,250,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,06:00,2,147,2,1,13,3,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,3,A,7,1,A,7,5.0,A,7,1.1,A,7,76,A,7,986,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,07:00,165,1360,54,1,13,51,1,9,48,1,13,59,1,13,31,1,9,55,1,13,101,1,21,8,A,7,7,A,7,8.3,A,7,3.3,A,7,71,A,7,987,A,7,230,A,7,1.5,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/11/1980,08:00,442,1360,264,1,9,621,1,9,63,1,13,279,1,9,566,1,9,95,1,13,123,1,18,4,A,7,1,A,7,13.9,A,7,3.9,A,7,51,A,7,988,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,09:00,698,1360,469,1,9,770,1,9,73,1,13,502,1,9,763,1,9,109,1,13,169,1,18,1,A,7,1,A,7,17.8,A,7,0.6,A,7,32,A,7,988,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,10:00,916,1360,690,1,9,890,1,9,90,1,13,718,1,9,886,1,9,120,1,13,221,1,18,0,A,7,0,A,7,19.4,A,7,0.6,A,7,28,A,7,989,A,7,290,A,7,2.6,A,7,32200,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,11:00,1079,1360,780,1,9,809,1,9,137,1,13,828,1,9,818,1,9,178,1,13,458,1,18,1,A,7,1,A,7,20.0,A,7,0.0,A,7,26,A,7,988,A,7,310,A,7,4.1,A,7,32200,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,12:00,1176,1360,814,1,13,672,1,9,232,1,13,864,1,13,684,1,9,271,1,13,1044,1,21,4,A,7,4,A,7,21.7,A,7,1.1,A,7,26,A,7,989,A,7,280,A,7,2.1,A,7,32200,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,13:00,1202,1360,490,1,9,192,1,9,319,1,13,544,1,9,209,1,9,359,1,13,1452,1,18,9,A,7,8,A,7,21.1,A,7,2.2,A,7,29,A,7,988,A,7,210,A,7,3.1,A,7,32200,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/11/1980,14:00,1154,1360,800,1,13,736,1,9,175,1,13,836,1,13,739,1,9,208,1,13,675,1,21,7,A,7,3,A,7,22.2,A,7,1.7,A,7,26,A,7,988,A,7,190,A,7,3.6,A,7,32200,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,15:00,1036,1360,735,1,9,825,1,9,106,1,13,761,1,9,824,1,9,132,1,13,288,1,18,1,A,7,1,A,7,22.8,A,7,2.8,A,7,27,A,7,987,A,7,210,A,7,3.6,A,7,32200,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,16:00,855,1360,634,1,9,872,1,9,86,1,13,661,1,9,865,1,9,117,1,13,200,1,18,0,A,7,0,A,7,22.8,A,7,1.7,A,7,25,A,7,987,A,7,230,A,7,2.6,A,7,32200,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,17:00,624,1360,409,1,9,731,1,9,75,1,13,432,1,9,711,1,9,105,1,13,161,1,18,2,A,7,0,A,7,22.8,A,7,1.7,A,7,25,A,7,987,A,7,240,A,7,3.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,18:00,359,1360,186,1,13,445,1,9,69,1,13,192,1,13,376,1,9,92,1,13,126,1,21,6,A,7,3,A,7,21.7,A,7,2.8,A,7,29,A,7,987,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,19:00,88,1099,31,1,13,76,1,9,23,1,13,32,1,13,32,1,9,29,1,13,40,1,21,7,A,7,4,A,7,20.0,A,7,1.7,A,7,30,A,7,987,A,7,170,A,7,2.1,A,7,24100,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/11/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,5,A,7,18.9,A,7,2.2,A,7,33,A,7,987,A,7,190,A,7,2.1,A,7,24100,B,7,7620,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,5,A,7,17.2,A,7,2.8,A,7,38,A,7,987,A,7,180,A,7,2.1,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,13.9,A,7,3.3,A,7,49,A,7,987,A,7,150,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,5,A,7,15.0,A,7,2.2,A,7,42,A,7,987,A,7,180,A,7,2.1,A,7,24100,B,7,7620,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/11/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,13.9,A,7,2.8,A,7,47,A,7,987,A,7,180,A,7,2.6,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,13.9,A,7,3.3,A,7,49,A,7,987,A,7,220,A,7,2.1,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/12/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,13.3,A,7,3.3,A,7,51,A,7,987,A,7,210,A,7,1.5,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,13.3,A,7,3.3,A,7,51,A,7,986,A,7,190,A,7,2.1,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,3.3,A,7,51,A,7,985,A,7,180,A,7,1.5,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,3.9,A,7,53,A,7,985,A,7,190,A,7,1.5,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,06:00,2,193,0,1,13,0,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,12.2,A,7,4.4,A,7,59,A,7,985,A,7,230,A,7,1.5,A,7,24100,B,7,2130,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,07:00,171,1359,37,1,13,0,1,9,37,1,13,42,1,13,0,1,9,42,1,13,128,1,21,10,A,7,10,A,7,12.8,A,7,5.6,A,7,62,A,7,987,A,7,200,A,7,2.1,A,7,24100,B,7,2130,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/12/1980,08:00,447,1359,92,1,9,1,1,9,92,1,13,106,1,9,1,1,9,106,1,13,365,1,18,10,A,7,10,A,7,14.4,A,7,5.6,A,7,55,A,7,987,A,7,230,A,7,2.1,A,7,24100,B,7,1830,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,09:00,703,1359,227,1,9,0,1,9,227,1,13,257,1,9,0,1,9,257,1,13,880,1,18,10,A,7,10,A,7,15.6,A,7,5.0,A,7,50,A,7,987,A,7,250,A,7,3.1,A,7,24100,B,7,1830,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,10:00,920,1359,155,1,9,6,1,9,151,1,13,188,1,9,4,1,9,185,1,13,742,1,18,10,A,7,10,A,7,15.6,A,7,6.7,A,7,56,A,7,987,A,7,200,A,7,2.6,A,7,24100,B,7,1830,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -04/12/1980,11:00,1083,1359,316,1,9,0,1,9,315,1,13,369,1,9,0,1,9,369,1,13,1411,1,18,10,A,7,10,A,7,17.2,A,7,8.9,A,7,58,A,7,985,A,7,250,A,7,2.6,A,7,24100,B,7,4570,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,12:00,1180,1359,374,1,9,3,1,9,372,1,13,439,1,9,3,1,9,437,1,13,1629,1,18,10,A,7,10,A,7,17.2,A,7,8.9,A,7,58,A,7,985,A,7,220,A,7,2.6,A,7,24100,B,7,640,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,13:00,1205,1359,416,1,9,3,1,9,413,1,13,485,1,9,3,1,9,483,1,13,1757,1,18,10,A,7,10,A,7,17.8,A,7,8.9,A,7,56,A,7,983,A,7,180,A,7,2.6,A,7,24100,B,7,4570,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/12/1980,14:00,1157,1359,383,1,9,2,1,9,382,1,13,448,1,9,2,1,9,446,1,13,1647,1,18,10,A,7,10,A,7,18.3,A,7,8.9,A,7,54,A,7,982,A,7,180,A,7,2.6,A,7,24100,B,7,1830,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/12/1980,15:00,1038,1359,210,1,9,0,1,9,210,1,13,252,1,9,0,1,9,252,1,13,1020,1,18,10,A,7,10,A,7,16.7,A,7,11.7,A,7,73,A,7,981,A,7,340,A,7,4.1,A,7,9700,B,7,1070,A,7,2.1,E,8,0.000,F,8,0.00,?,0,20,1,D,9,61,C,8 -04/12/1980,16:00,858,1359,167,1,9,1,1,9,166,1,13,198,1,9,1,1,9,198,1,13,780,1,18,10,A,7,10,A,7,14.4,A,7,13.3,A,7,93,A,7,980,A,7,350,A,7,2.6,A,7,6400,B,7,910,A,7,2.3,E,8,0.000,F,8,0.00,?,0,25,1,D,9,45,C,8 -04/12/1980,17:00,627,1359,112,1,9,0,1,9,112,1,13,132,1,9,0,1,9,132,1,13,493,1,18,10,A,7,10,A,7,13.9,A,7,12.8,A,7,93,A,7,980,A,7,10,A,7,3.1,A,7,3200,B,7,120,A,7,2.3,E,8,0.000,F,8,0.00,?,0,51,1,D,9,45,C,8 -04/12/1980,18:00,363,1359,62,1,9,1,1,9,61,1,13,71,1,9,0,1,9,71,1,13,243,1,18,10,A,7,10,A,7,13.9,A,7,13.3,A,7,96,A,7,981,A,7,20,A,7,2.6,A,7,4800,B,7,1070,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/12/1980,19:00,91,1121,30,1,13,1,1,9,29,1,13,32,1,13,0,1,9,32,1,13,94,1,21,10,A,7,9,A,7,13.3,A,7,12.8,A,7,96,A,7,981,A,7,30,A,7,2.1,A,7,4800,B,7,1070,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -04/12/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,13.3,A,7,96,A,7,982,A,7,10,A,7,1.5,A,7,4800,B,7,120,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/12/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,13.3,A,7,96,A,7,983,A,7,260,A,7,2.1,A,7,4800,B,7,120,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/12/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,12.8,A,7,96,A,7,983,A,7,260,A,7,2.1,A,7,4800,B,7,120,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/12/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,13.3,A,7,100,A,7,983,A,7,240,A,7,2.1,A,7,4800,B,7,120,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/12/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,12.8,A,7,96,A,7,983,A,7,250,A,7,2.6,A,7,4800,B,7,120,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,12.2,A,7,93,A,7,982,A,7,280,A,7,2.1,A,7,4800,B,7,90,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -04/13/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.2,A,7,96,A,7,983,A,7,250,A,7,2.1,A,7,4800,B,7,90,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,982,A,7,240,A,7,2.1,A,7,4800,B,7,90,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,982,A,7,230,A,7,2.1,A,7,400,B,7,30,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.2,A,7,96,A,7,982,A,7,30,A,7,2.1,A,7,400,B,7,30,A,7,2.2,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -04/13/1980,06:00,3,215,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,983,A,7,210,A,7,1.5,A,7,200,B,7,30,A,7,2.3,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -04/13/1980,07:00,177,1359,21,1,13,2,1,9,21,1,13,25,1,13,0,1,9,25,1,13,82,1,21,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,983,A,7,0,A,7,0.0,A,7,200,B,7,30,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,08:00,453,1359,62,1,9,7,1,9,60,1,13,74,1,9,3,1,9,73,1,13,259,1,18,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,984,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,2.3,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -04/13/1980,09:00,708,1359,125,1,9,2,1,9,124,1,13,148,1,9,1,1,9,148,1,13,565,1,18,10,A,7,10,A,7,14.4,A,7,13.3,A,7,93,A,7,983,A,7,0,A,7,0.0,A,7,800,B,7,60,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,10:00,925,1359,153,1,9,1,1,9,153,1,13,186,1,9,1,1,9,186,1,13,751,1,18,10,A,7,10,A,7,14.4,A,7,14.4,A,7,100,A,7,984,A,7,0,A,7,0.0,A,7,1600,B,7,120,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,11:00,1087,1359,311,1,9,1,1,9,310,1,13,365,1,9,1,1,9,364,1,13,1397,1,18,10,A,7,10,A,7,16.1,A,7,14.4,A,7,90,A,7,983,A,7,90,A,7,2.6,A,7,4800,B,7,150,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,12:00,1183,1359,434,1,9,7,1,9,428,1,13,504,1,9,7,1,9,498,1,13,1784,1,18,10,A,7,10,A,7,15.6,A,7,14.4,A,7,93,A,7,983,A,7,100,A,7,2.6,A,7,9700,B,7,210,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,13:00,1208,1359,247,1,9,5,1,9,243,1,13,301,1,9,4,1,9,297,1,13,1190,1,18,10,A,7,10,A,7,15.6,A,7,15.0,A,7,97,A,7,982,A,7,120,A,7,2.6,A,7,9700,B,7,270,A,7,2.6,E,8,0.000,F,8,0.00,?,0,10,1,D,9,45,C,8 -04/13/1980,14:00,1160,1359,235,1,9,3,1,9,233,1,13,286,1,9,2,1,9,284,1,13,1141,1,18,10,A,7,10,A,7,15.6,A,7,15.0,A,7,97,A,7,982,A,7,150,A,7,2.6,A,7,2400,B,7,150,A,7,2.6,E,8,0.000,F,8,0.00,?,0,15,1,D,9,45,C,8 -04/13/1980,15:00,1041,1359,240,1,9,0,1,9,240,1,13,286,1,9,0,1,9,286,1,13,1136,1,18,10,A,7,10,A,7,15.6,A,7,15.6,A,7,100,A,7,980,A,7,110,A,7,2.1,A,7,2400,B,7,120,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,16:00,860,1359,314,1,9,1,1,9,313,1,13,355,1,9,1,1,9,355,1,13,1230,1,18,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,979,A,7,140,A,7,2.6,A,7,4000,B,7,150,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,17:00,630,1359,202,1,9,0,1,9,202,1,13,227,1,9,0,1,9,227,1,13,761,1,18,10,A,7,10,A,7,16.7,A,7,15.6,A,7,93,A,7,979,A,7,80,A,7,2.1,A,7,6400,B,7,180,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,18:00,366,1359,114,1,9,1,1,9,114,1,13,126,1,9,1,1,9,126,1,13,382,1,18,10,A,7,10,A,7,16.7,A,7,15.6,A,7,93,A,7,979,A,7,70,A,7,2.1,A,7,4800,B,7,150,A,7,2.7,E,8,0.000,F,8,0.00,?,0,124,1,D,9,45,C,8 -04/13/1980,19:00,94,1143,17,1,13,0,1,9,17,1,13,20,1,13,0,1,9,20,1,13,63,1,21,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,979,A,7,80,A,7,2.6,A,7,1300,B,7,90,A,7,2.7,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -04/13/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,15.6,A,7,100,A,7,980,A,7,80,A,7,2.1,A,7,4000,B,7,90,A,7,2.7,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -04/13/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,979,A,7,90,A,7,4.1,A,7,2400,B,7,60,A,7,2.8,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -04/13/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,979,A,7,130,A,7,2.6,A,7,2400,B,7,60,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,16.7,A,7,100,A,7,979,A,7,90,A,7,2.1,A,7,2400,B,7,60,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/13/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,978,A,7,170,A,7,3.1,A,7,6400,B,7,210,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/14/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,977,A,7,170,A,7,4.1,A,7,11300,B,7,340,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/14/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,976,A,7,170,A,7,3.6,A,7,11300,B,7,370,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,976,A,7,170,A,7,3.1,A,7,16100,B,7,430,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,975,A,7,160,A,7,3.1,A,7,16100,B,7,490,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -04/14/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,974,A,7,160,A,7,3.6,A,7,11300,B,7,370,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,06:00,4,238,2,1,13,0,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,973,A,7,160,A,7,3.6,A,7,8000,B,7,340,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/14/1980,07:00,183,1358,26,1,13,0,1,9,26,1,13,30,1,13,0,1,9,30,1,13,99,1,21,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,973,A,7,180,A,7,5.2,A,7,8000,B,7,340,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/14/1980,08:00,458,1358,135,1,9,1,1,9,135,1,13,151,1,9,1,1,9,151,1,13,485,1,18,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,972,A,7,180,A,7,4.6,A,7,11300,B,7,1370,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,09:00,713,1358,222,1,9,1,1,9,221,1,13,251,1,9,1,1,9,251,1,13,874,1,18,10,A,7,10,A,7,20.6,A,7,18.9,A,7,90,A,7,972,A,7,170,A,7,4.1,A,7,16100,B,7,340,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,10:00,929,1358,318,1,9,0,1,9,318,1,13,364,1,9,0,1,9,364,1,13,1309,1,18,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,971,A,7,170,A,7,6.2,A,7,11300,B,7,210,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,11:00,1091,1358,375,1,9,1,1,9,374,1,13,434,1,9,1,1,9,433,1,13,1589,1,18,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,969,A,7,170,A,7,8.8,A,7,11300,B,7,340,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,12:00,1187,1358,422,1,9,0,1,9,422,1,13,491,1,9,0,1,9,491,1,13,1771,1,18,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,969,A,7,170,A,7,6.7,A,7,11300,B,7,340,A,7,3.3,E,8,0.000,F,8,0.00,?,0,13,1,D,9,00,C,8 -04/14/1980,13:00,1212,1358,272,1,9,1,1,9,272,1,13,329,1,9,1,1,9,329,1,13,1303,1,18,10,A,7,10,A,7,20.0,A,7,20.0,A,7,100,A,7,970,A,7,220,A,7,6.2,A,7,11300,B,7,270,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -04/14/1980,14:00,1163,1358,506,1,9,255,1,9,287,1,13,565,1,9,278,1,9,326,1,13,1168,1,18,8,A,7,8,A,7,19.4,A,7,18.3,A,7,93,A,7,970,A,7,210,A,7,7.2,A,7,11300,B,7,340,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,15:00,1044,1358,621,1,13,448,1,9,276,1,13,664,1,13,467,1,9,304,1,13,914,1,21,6,A,7,6,A,7,18.9,A,7,14.4,A,7,76,A,7,970,A,7,200,A,7,5.7,A,7,24100,B,7,760,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,16:00,863,1358,545,1,13,509,1,9,221,1,13,580,1,13,524,1,9,246,1,13,552,1,21,6,A,7,6,A,7,19.4,A,7,12.8,A,7,66,A,7,970,A,7,190,A,7,7.2,A,7,24100,B,7,760,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,17:00,633,1358,348,1,13,485,1,9,122,1,13,377,1,13,482,1,9,152,1,13,244,1,21,3,A,7,3,A,7,17.2,A,7,7.8,A,7,54,A,7,970,A,7,220,A,7,7.2,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,18:00,369,1358,156,1,13,222,1,9,96,1,13,166,1,13,193,1,9,114,1,13,186,1,21,6,A,7,6,A,7,16.7,A,7,6.7,A,7,52,A,7,971,A,7,230,A,7,5.7,A,7,24100,B,7,1520,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,19:00,97,1165,33,1,13,57,1,9,27,1,13,35,1,13,29,1,9,33,1,13,56,1,21,4,A,7,4,A,7,15.0,A,7,6.1,A,7,56,A,7,972,A,7,230,A,7,5.2,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/14/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,13.3,A,7,5.6,A,7,60,A,7,973,A,7,230,A,7,4.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,12.2,A,7,4.4,A,7,59,A,7,974,A,7,230,A,7,6.2,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,2.2,A,7,55,A,7,974,A,7,230,A,7,6.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,0.6,A,7,52,A,7,975,A,7,230,A,7,5.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/14/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,1.1,A,7,61,A,7,975,A,7,230,A,7,4.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,0.6,A,7,63,A,7,975,A,7,240,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/15/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-0.6,A,7,60,A,7,975,A,7,240,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,6.1,A,7,0.6,A,7,68,A,7,975,A,7,240,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,1.1,A,7,73,A,7,974,A,7,240,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,0.6,A,7,76,A,7,974,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,06:00,5,283,5,1,13,18,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,4.4,A,7,0.6,A,7,76,A,7,974,A,7,220,A,7,2.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,07:00,189,1357,89,1,13,435,1,9,29,1,13,90,1,13,303,1,9,48,1,13,55,1,21,0,A,7,0,A,7,6.1,A,7,1.1,A,7,71,A,7,975,A,7,230,A,7,2.6,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/15/1980,08:00,464,1357,296,1,9,723,1,9,50,1,13,315,1,9,671,1,9,85,1,13,108,1,18,0,A,7,0,A,7,8.3,A,7,1.1,A,7,61,A,7,975,A,7,240,A,7,4.6,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,09:00,718,1357,517,1,9,846,1,9,68,1,13,541,1,9,829,1,9,102,1,13,160,1,18,0,A,7,0,A,7,10.0,A,7,1.7,A,7,57,A,7,975,A,7,230,A,7,6.7,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,10:00,933,1357,662,1,9,793,1,9,116,1,13,702,1,9,798,1,9,151,1,13,308,1,18,2,A,7,2,A,7,11.1,A,7,2.2,A,7,55,A,7,975,A,7,230,A,7,6.2,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,11:00,1094,1357,378,1,9,98,1,9,300,1,13,422,1,9,105,1,9,338,1,13,1092,1,18,9,A,7,9,A,7,12.2,A,7,2.2,A,7,51,A,7,975,A,7,260,A,7,7.2,A,7,24100,B,7,850,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,12:00,1190,1357,297,1,9,29,1,9,272,1,13,330,1,9,29,1,9,304,1,13,1304,1,18,10,A,7,10,A,7,10.6,A,7,-0.6,A,7,46,A,7,975,A,7,240,A,7,5.2,A,7,24100,B,7,850,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,13:00,1215,1357,363,1,9,6,1,9,357,1,13,429,1,9,5,1,9,424,1,13,1598,1,18,10,A,7,10,A,7,10.0,A,7,0.6,A,7,52,A,7,976,A,7,260,A,7,4.1,A,7,24100,B,7,850,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/15/1980,14:00,1166,1357,321,1,9,12,1,9,311,1,13,382,1,9,11,1,9,372,1,13,1431,1,18,10,A,7,10,A,7,10.0,A,7,0.6,A,7,52,A,7,976,A,7,290,A,7,5.2,A,7,24100,B,7,1010,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,15:00,1047,1357,362,1,9,6,1,9,358,1,13,419,1,9,6,1,9,414,1,13,1515,1,18,10,A,7,10,A,7,10.0,A,7,1.1,A,7,54,A,7,976,A,7,290,A,7,4.6,A,7,24100,B,7,1520,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,16:00,866,1357,260,1,9,9,1,9,254,1,13,300,1,9,8,1,9,294,1,13,1082,1,18,10,A,7,10,A,7,10.6,A,7,-1.1,A,7,45,A,7,976,A,7,280,A,7,3.1,A,7,24100,B,7,1520,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,17:00,636,1357,183,1,9,2,1,9,182,1,13,208,1,9,2,1,9,207,1,13,717,1,18,10,A,7,10,A,7,10.0,A,7,-1.1,A,7,46,A,7,977,A,7,250,A,7,3.1,A,7,24100,B,7,1680,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,18:00,373,1357,152,1,13,98,1,9,125,1,13,164,1,13,86,1,9,140,1,13,277,1,21,7,A,7,5,A,7,10.0,A,7,-0.6,A,7,48,A,7,977,A,7,270,A,7,4.1,A,7,24100,B,7,3660,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,19:00,100,1187,32,1,13,16,1,9,30,1,13,34,1,13,10,1,9,34,1,13,72,1,21,9,A,7,8,A,7,9.4,A,7,-1.1,A,7,48,A,7,978,A,7,270,A,7,3.6,A,7,24100,B,7,1680,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/15/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,-1.1,A,7,50,A,7,979,A,7,270,A,7,3.1,A,7,24100,B,7,1980,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,1.7,A,7,66,A,7,980,A,7,290,A,7,5.2,A,7,24100,B,7,1680,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,-0.6,A,7,54,A,7,980,A,7,280,A,7,6.7,A,7,24100,B,7,2290,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,7.8,A,7,-0.6,A,7,56,A,7,981,A,7,300,A,7,6.2,A,7,24100,B,7,3050,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/15/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,7.2,A,7,-0.6,A,7,58,A,7,982,A,7,280,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,5.0,A,7,0.0,A,7,70,A,7,982,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/16/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,5.6,A,7,0.6,A,7,71,A,7,982,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,5,A,7,5.0,A,7,1.1,A,7,76,A,7,982,A,7,220,A,7,2.6,A,7,24100,B,7,2740,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,3.9,A,7,0.6,A,7,79,A,7,982,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,4.4,A,7,1.1,A,7,79,A,7,982,A,7,240,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,06:00,6,305,0,1,13,1,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,2,A,7,2,A,7,5.0,A,7,1.7,A,7,79,A,7,983,A,7,250,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,07:00,194,1356,77,1,13,235,1,9,44,1,13,81,1,13,149,1,9,60,1,13,79,1,21,0,A,7,0,A,7,6.1,A,7,1.7,A,7,73,A,7,983,A,7,250,A,7,3.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/16/1980,08:00,469,1356,276,1,9,559,1,9,82,1,13,286,1,9,513,1,9,109,1,13,157,1,18,0,A,7,0,A,7,9.4,A,7,2.2,A,7,61,A,7,984,A,7,270,A,7,4.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,09:00,723,1356,385,1,13,365,1,9,190,1,13,417,1,13,383,1,9,213,1,13,430,1,21,6,A,7,6,A,7,10.0,A,7,-1.1,A,7,46,A,7,985,A,7,310,A,7,8.2,A,7,24100,B,7,1070,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,10:00,937,1356,545,1,13,418,1,9,256,1,13,578,1,13,433,1,9,278,1,13,709,1,21,5,A,7,5,A,7,11.1,A,7,-1.1,A,7,43,A,7,985,A,7,300,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,11:00,1098,1356,676,1,9,541,1,9,237,1,13,710,1,9,547,1,9,266,1,13,861,1,18,2,A,7,2,A,7,12.8,A,7,-1.1,A,7,39,A,7,986,A,7,300,A,7,5.7,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,12:00,1193,1356,918,1,9,856,1,9,164,1,13,971,1,9,864,1,9,209,1,13,743,1,18,0,A,7,0,A,7,13.9,A,7,-3.3,A,7,30,A,7,986,A,7,300,A,7,7.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,13:00,1217,1356,957,1,9,880,1,9,166,1,13,1014,1,9,889,1,9,214,1,13,822,1,18,0,A,7,0,A,7,15.0,A,7,-2.8,A,7,29,A,7,986,A,7,300,A,7,6.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/16/1980,14:00,1168,1356,915,1,9,872,1,9,162,1,13,965,1,9,880,1,9,206,1,13,674,1,18,0,A,7,0,A,7,15.6,A,7,-4.4,A,7,25,A,7,986,A,7,330,A,7,6.7,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,15:00,1049,1356,803,1,9,843,1,9,151,1,13,842,1,9,847,1,9,185,1,13,462,1,18,0,A,7,0,A,7,16.1,A,7,-4.4,A,7,24,A,7,987,A,7,290,A,7,5.7,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,16:00,869,1356,633,1,9,782,1,9,132,1,13,676,1,9,795,1,9,166,1,13,338,1,18,0,A,7,0,A,7,16.1,A,7,-6.1,A,7,21,A,7,987,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,17:00,639,1356,425,1,9,682,1,9,104,1,13,448,1,9,668,1,9,132,1,13,218,1,18,0,A,7,0,A,7,15.6,A,7,-7.2,A,7,20,A,7,988,A,7,330,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,18:00,376,1356,203,1,9,483,1,9,70,1,13,210,1,9,415,1,9,95,1,13,129,1,18,0,A,7,0,A,7,15.0,A,7,-7.8,A,7,20,A,7,989,A,7,330,A,7,5.2,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/16/1980,19:00,103,1209,39,1,13,98,1,9,28,1,13,39,1,13,44,1,9,35,1,13,50,1,21,0,A,7,0,A,7,12.2,A,7,-7.2,A,7,25,A,7,989,A,7,330,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/16/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,-6.1,A,7,32,A,7,990,A,7,320,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,-5.6,A,7,35,A,7,992,A,7,330,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-4.4,A,7,45,A,7,992,A,7,10,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-5.6,A,7,43,A,7,993,A,7,20,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/16/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-6.1,A,7,47,A,7,993,A,7,10,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-6.1,A,7,47,A,7,993,A,7,10,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/17/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-5.6,A,7,55,A,7,993,A,7,50,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-5.6,A,7,59,A,7,994,A,7,310,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-5.6,A,7,62,A,7,994,A,7,340,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-5.0,A,7,69,A,7,994,A,7,60,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,06:00,8,328,7,1,13,17,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,-0.6,A,7,-5.6,A,7,69,A,7,994,A,7,50,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,07:00,200,1355,94,1,13,403,1,9,34,1,13,96,1,13,273,1,9,56,1,13,62,1,21,0,A,7,0,A,7,2.8,A,7,-3.3,A,7,65,A,7,995,A,7,40,A,7,1.5,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/17/1980,08:00,474,1355,303,1,9,700,1,9,59,1,13,317,1,9,649,1,9,90,1,13,121,1,18,0,A,7,0,A,7,6.7,A,7,-3.9,A,7,47,A,7,995,A,7,50,A,7,3.6,A,7,19300,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,09:00,728,1355,528,1,9,833,1,9,80,1,13,563,1,9,828,1,9,117,1,13,185,1,18,0,A,7,0,A,7,9.4,A,7,-5.6,A,7,35,A,7,996,A,7,80,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,10:00,942,1355,722,1,9,899,1,9,97,1,13,750,1,9,895,1,9,126,1,13,237,1,18,0,A,7,0,A,7,10.6,A,7,-4.4,A,7,35,A,7,996,A,7,30,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,11:00,1102,1355,866,1,9,926,1,9,112,1,13,895,1,9,927,1,9,139,1,13,346,1,18,1,A,7,0,A,7,12.2,A,7,-4.4,A,7,31,A,7,996,A,7,100,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,12:00,1197,1355,953,1,9,944,1,9,118,1,13,982,1,9,946,1,9,145,1,13,474,1,18,1,A,7,0,A,7,12.8,A,7,-5.6,A,7,28,A,7,995,A,7,30,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,13:00,1220,1355,972,1,9,944,1,9,120,1,13,1001,1,9,947,1,9,146,1,13,524,1,18,1,A,7,0,A,7,14.4,A,7,-3.3,A,7,29,A,7,995,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,14:00,1171,1355,930,1,9,921,1,9,133,1,13,956,1,9,922,1,9,157,1,13,462,1,18,3,A,7,0,A,7,15.0,A,7,-5.6,A,7,24,A,7,994,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,15:00,1052,1355,820,1,9,896,1,9,123,1,13,845,1,9,895,1,9,148,1,13,317,1,18,3,A,7,0,A,7,15.6,A,7,-5.0,A,7,24,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,16:00,872,1355,597,1,9,752,1,9,113,1,13,629,1,9,753,1,9,143,1,13,276,1,18,4,A,7,1,A,7,17.2,A,7,-3.9,A,7,24,A,7,993,A,7,240,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,17:00,642,1355,416,1,9,640,1,9,113,1,13,436,1,9,625,1,9,139,1,13,234,1,18,9,A,7,1,A,7,16.7,A,7,-3.9,A,7,24,A,7,992,A,7,290,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,18:00,379,1355,204,1,9,451,1,9,78,1,13,217,1,9,390,1,9,108,1,13,142,1,18,9,A,7,1,A,7,16.1,A,7,-3.9,A,7,25,A,7,992,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,19:00,106,1231,45,1,13,113,1,9,32,1,13,45,1,13,51,1,9,40,1,13,58,1,21,8,A,7,2,A,7,14.4,A,7,-3.9,A,7,28,A,7,992,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/17/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,12.2,A,7,-1.7,A,7,38,A,7,992,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,10.6,A,7,-0.6,A,7,46,A,7,992,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,10.0,A,7,-0.6,A,7,48,A,7,992,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,7.8,A,7,1.7,A,7,66,A,7,992,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/17/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,7.2,A,7,2.2,A,7,71,A,7,991,A,7,200,A,7,1.5,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,6.7,A,7,1.7,A,7,71,A,7,991,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -04/18/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,0.6,A,7,58,A,7,991,A,7,210,A,7,2.1,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,0.6,A,7,58,A,7,990,A,7,200,A,7,2.1,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,1.7,A,7,63,A,7,990,A,7,210,A,7,2.1,A,7,24100,B,7,7620,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,1.7,A,7,66,A,7,990,A,7,200,A,7,2.1,A,7,24100,B,7,7620,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,06:00,9,373,2,1,13,0,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,7.8,A,7,2.2,A,7,68,A,7,991,A,7,200,A,7,2.1,A,7,24100,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,07:00,206,1355,83,1,13,151,1,9,60,1,13,87,1,13,96,1,9,72,1,13,115,1,21,8,A,7,5,A,7,8.3,A,7,3.3,A,7,71,A,7,991,A,7,220,A,7,2.6,A,7,24100,B,7,7620,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/18/1980,08:00,479,1355,279,1,13,584,1,9,72,1,13,293,1,13,543,1,9,101,1,13,142,1,21,5,A,7,3,A,7,11.7,A,7,4.4,A,7,62,A,7,991,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,09:00,732,1355,491,1,9,750,1,9,85,1,13,520,1,9,744,1,9,117,1,13,194,1,18,5,A,7,2,A,7,14.4,A,7,4.4,A,7,51,A,7,992,A,7,250,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,10:00,946,1355,657,1,9,720,1,9,153,1,13,700,1,9,734,1,9,186,1,13,431,1,18,3,A,7,2,A,7,17.2,A,7,3.3,A,7,40,A,7,992,A,7,290,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,11:00,1105,1355,698,1,9,678,1,9,144,1,13,740,1,9,685,1,9,180,1,13,513,1,18,3,A,7,2,A,7,18.3,A,7,2.8,A,7,36,A,7,991,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,12:00,1200,1355,886,1,9,885,1,9,102,1,13,919,1,9,888,1,9,130,1,13,438,1,18,3,A,7,1,A,7,19.4,A,7,2.8,A,7,33,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,13:00,1223,1355,905,1,9,864,1,9,123,1,13,931,1,9,866,1,9,147,1,13,540,1,18,5,A,7,2,A,7,20.6,A,7,1.7,A,7,29,A,7,990,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/18/1980,14:00,1174,1355,847,1,9,856,1,9,105,1,13,877,1,9,859,1,9,132,1,13,409,1,18,5,A,7,1,A,7,21.1,A,7,3.3,A,7,31,A,7,990,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,15:00,1055,1355,754,1,9,827,1,9,110,1,13,780,1,9,827,1,9,135,1,13,307,1,18,6,A,7,1,A,7,22.2,A,7,0.6,A,7,24,A,7,989,A,7,310,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,16:00,874,1355,612,1,9,788,1,9,104,1,13,652,1,9,792,1,9,139,1,13,262,1,18,5,A,7,1,A,7,21.7,A,7,1.7,A,7,27,A,7,989,A,7,180,A,7,4.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,17:00,645,1355,437,1,9,737,1,9,87,1,13,456,1,9,716,1,9,114,1,13,179,1,18,1,A,7,1,A,7,21.7,A,7,1.1,A,7,26,A,7,989,A,7,170,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,18:00,383,1355,227,1,9,586,1,9,63,1,13,238,1,9,510,1,9,94,1,13,119,1,18,2,A,7,2,A,7,21.1,A,7,0.0,A,7,25,A,7,989,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,19:00,109,1230,40,1,13,159,1,9,23,1,13,40,1,13,79,1,9,33,1,13,40,1,21,3,A,7,2,A,7,20.0,A,7,2.2,A,7,31,A,7,989,A,7,80,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,15.6,A,7,1.1,A,7,38,A,7,990,A,7,60,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,0.6,A,7,40,A,7,990,A,7,70,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,0.0,A,7,40,A,7,990,A,7,60,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,-0.6,A,7,39,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/18/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,0.6,A,7,45,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,2.2,A,7,59,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/19/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,2.2,A,7,59,A,7,990,A,7,180,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,3.3,A,7,68,A,7,990,A,7,20,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,3.3,A,7,77,A,7,990,A,7,350,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,3.3,A,7,80,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,06:00,10,395,5,1,13,1,1,9,5,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,6.1,A,7,3.3,A,7,83,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,07:00,211,1354,79,1,13,176,1,9,52,1,13,84,1,13,114,1,9,66,1,13,96,1,21,0,A,7,0,A,7,8.9,A,7,6.1,A,7,83,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/19/1980,08:00,484,1354,270,1,9,474,1,9,101,1,13,289,1,9,443,1,9,130,1,13,190,1,18,0,A,7,0,A,7,13.3,A,7,7.2,A,7,67,A,7,991,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,09:00,737,1354,486,1,9,630,1,9,143,1,13,507,1,9,624,1,9,167,1,13,312,1,18,0,A,7,0,A,7,16.1,A,7,7.2,A,7,56,A,7,991,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,10:00,950,1354,680,1,9,721,1,9,174,1,13,719,1,9,731,1,9,205,1,13,487,1,18,0,A,7,0,A,7,17.8,A,7,8.3,A,7,54,A,7,991,A,7,150,A,7,2.6,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,11:00,1109,1354,826,1,9,770,1,9,194,1,13,881,1,9,787,1,9,235,1,13,741,1,18,0,A,7,0,A,7,20.0,A,7,8.9,A,7,49,A,7,991,A,7,150,A,7,2.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,12:00,1203,1354,865,1,13,650,1,9,287,1,13,907,1,13,655,1,9,324,1,13,1415,1,21,4,A,7,4,A,7,21.1,A,7,7.8,A,7,42,A,7,991,A,7,30,A,7,2.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,13:00,1226,1354,844,1,13,585,1,9,314,1,13,914,1,13,612,1,9,359,1,13,1753,1,21,5,A,7,5,A,7,22.2,A,7,7.8,A,7,40,A,7,990,A,7,150,A,7,2.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/19/1980,14:00,1176,1354,722,1,13,411,1,9,365,1,13,765,1,13,428,1,9,392,1,13,1719,1,21,6,A,7,6,A,7,21.1,A,7,5.6,A,7,36,A,7,990,A,7,60,A,7,1.5,A,7,24100,B,7,1220,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,15:00,1057,1354,712,1,13,547,1,9,284,1,13,761,1,13,570,1,9,315,1,13,972,1,21,6,A,7,6,A,7,22.8,A,7,6.1,A,7,34,A,7,989,A,7,120,A,7,3.6,A,7,24100,B,7,1520,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,16:00,877,1354,536,1,13,497,1,9,213,1,13,573,1,13,513,1,9,240,1,13,539,1,21,3,A,7,3,A,7,23.3,A,7,5.6,A,7,32,A,7,989,A,7,90,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,17:00,648,1354,367,1,13,442,1,9,156,1,13,390,1,13,440,1,9,179,1,13,322,1,21,3,A,7,3,A,7,22.8,A,7,5.6,A,7,33,A,7,989,A,7,120,A,7,3.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,18:00,386,1354,178,1,9,337,1,9,83,1,13,190,1,9,293,1,9,106,1,13,152,1,18,1,A,7,1,A,7,21.7,A,7,4.4,A,7,33,A,7,988,A,7,130,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,19:00,113,1252,32,1,13,52,1,9,26,1,13,34,1,13,28,1,9,32,1,13,54,1,21,1,A,7,1,A,7,18.9,A,7,3.9,A,7,37,A,7,989,A,7,170,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/19/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,4.4,A,7,45,A,7,989,A,7,170,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,5.0,A,7,55,A,7,989,A,7,140,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,5.6,A,7,54,A,7,990,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,8.3,A,7,67,A,7,990,A,7,180,A,7,2.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/19/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,8.9,A,7,72,A,7,991,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,8.9,A,7,77,A,7,991,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/20/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,8.9,A,7,83,A,7,991,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,8.9,A,7,83,A,7,991,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,8.3,A,7,89,A,7,990,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,7.2,A,7,93,A,7,990,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,06:00,12,417,10,1,13,26,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,7.8,A,7,6.7,A,7,93,A,7,990,A,7,210,A,7,2.1,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,07:00,216,1353,101,1,13,415,1,9,35,1,13,105,1,13,292,1,9,58,1,13,65,1,21,0,A,7,0,A,7,10.6,A,7,8.9,A,7,90,A,7,990,A,7,210,A,7,2.1,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/20/1980,08:00,489,1353,309,1,9,693,1,9,58,1,13,324,1,9,648,1,9,89,1,13,122,1,18,0,A,7,0,A,7,14.4,A,7,10.6,A,7,78,A,7,990,A,7,180,A,7,2.6,A,7,11300,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,09:00,741,1353,486,1,9,712,1,9,95,1,13,509,1,9,704,1,9,123,1,13,210,1,18,1,A,7,1,A,7,17.8,A,7,10.0,A,7,61,A,7,990,A,7,210,A,7,3.6,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,10:00,953,1353,685,1,9,757,1,9,151,1,13,732,1,9,773,1,9,186,1,13,432,1,18,2,A,7,2,A,7,19.4,A,7,8.3,A,7,49,A,7,990,A,7,220,A,7,2.6,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,11:00,1112,1353,766,1,9,748,1,9,150,1,13,809,1,9,755,1,9,187,1,13,541,1,18,7,A,7,2,A,7,20.6,A,7,8.9,A,7,47,A,7,989,A,7,230,A,7,2.6,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,12:00,1206,1353,803,1,9,608,1,9,261,1,13,848,1,9,616,1,9,298,1,13,1315,1,18,7,A,7,2,A,7,22.2,A,7,8.3,A,7,41,A,7,988,A,7,180,A,7,3.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,13:00,1228,1353,909,1,13,772,1,9,208,1,13,979,1,13,792,1,9,258,1,13,1164,1,21,5,A,7,4,A,7,23.3,A,7,7.8,A,7,37,A,7,987,A,7,250,A,7,3.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/20/1980,14:00,1179,1353,853,1,13,715,1,9,229,1,13,906,1,13,728,1,9,270,1,13,1059,1,21,5,A,7,5,A,7,23.3,A,7,4.4,A,7,29,A,7,986,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,15:00,1059,1353,682,1,13,552,1,9,250,1,13,740,1,13,576,1,9,287,1,13,854,1,21,7,A,7,7,A,7,23.9,A,7,6.1,A,7,32,A,7,985,A,7,180,A,7,3.1,A,7,16100,B,7,1520,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,16:00,879,1353,569,1,13,593,1,9,184,1,13,595,1,13,595,1,9,207,1,13,459,1,21,7,A,7,3,A,7,23.9,A,7,5.0,A,7,30,A,7,984,A,7,90,A,7,2.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,17:00,651,1353,372,1,9,500,1,9,132,1,13,402,1,9,499,1,9,161,1,13,268,1,18,7,A,7,2,A,7,23.9,A,7,6.1,A,7,32,A,7,983,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,18:00,389,1353,198,1,9,447,1,9,70,1,13,205,1,9,389,1,9,93,1,13,130,1,18,6,A,7,2,A,7,23.3,A,7,5.6,A,7,32,A,7,983,A,7,210,A,7,2.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,19:00,116,1274,48,1,13,167,1,9,30,1,13,48,1,13,83,1,9,40,1,13,53,1,21,6,A,7,2,A,7,21.1,A,7,5.0,A,7,35,A,7,983,A,7,230,A,7,2.6,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/20/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,17.8,A,7,5.0,A,7,43,A,7,983,A,7,170,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,17.2,A,7,5.6,A,7,46,A,7,983,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,16.1,A,7,5.0,A,7,48,A,7,983,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,6.1,A,7,58,A,7,983,A,7,180,A,7,1.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/20/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,13.9,A,7,5.0,A,7,55,A,7,982,A,7,180,A,7,1.5,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,6.7,A,7,69,A,7,982,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/21/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,6.1,A,7,67,A,7,981,A,7,230,A,7,1.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,1,A,7,11.7,A,7,6.1,A,7,69,A,7,981,A,7,230,A,7,1.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,10.6,A,7,6.1,A,7,74,A,7,981,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,11.1,A,7,6.1,A,7,72,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,06:00,14,462,11,1,13,11,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,9,A,7,3,A,7,10.0,A,7,6.1,A,7,77,A,7,981,A,7,0,A,7,0.0,A,7,19300,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,07:00,222,1352,84,1,13,173,1,9,56,1,13,89,1,13,116,1,9,70,1,13,104,1,21,9,A,7,4,A,7,12.8,A,7,6.7,A,7,67,A,7,981,A,7,360,A,7,2.6,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/21/1980,08:00,494,1352,225,1,13,301,1,9,115,1,13,243,1,13,291,1,9,137,1,13,227,1,21,6,A,7,4,A,7,17.2,A,7,6.1,A,7,48,A,7,982,A,7,20,A,7,5.2,A,7,16100,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,09:00,745,1352,459,1,9,577,1,9,141,1,13,480,1,9,573,1,9,164,1,13,311,1,18,7,A,7,2,A,7,19.4,A,7,7.2,A,7,45,A,7,982,A,7,10,A,7,5.7,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,10:00,957,1352,606,1,13,639,1,9,154,1,13,648,1,13,652,1,9,185,1,13,443,1,21,5,A,7,3,A,7,21.1,A,7,8.3,A,7,44,A,7,982,A,7,40,A,7,5.7,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,11:00,1115,1352,729,1,13,647,1,9,194,1,13,778,1,13,662,1,9,231,1,13,756,1,21,7,A,7,4,A,7,21.1,A,7,6.7,A,7,39,A,7,982,A,7,10,A,7,3.6,A,7,16100,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,12:00,1209,1352,880,1,13,795,1,9,169,1,13,930,1,13,802,1,9,212,1,13,816,1,21,3,A,7,3,A,7,22.8,A,7,7.2,A,7,37,A,7,982,A,7,10,A,7,4.6,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,13:00,1231,1352,772,1,13,613,1,9,213,1,13,829,1,13,628,1,9,255,1,13,1206,1,21,6,A,7,6,A,7,23.3,A,7,8.3,A,7,38,A,7,981,A,7,30,A,7,4.1,A,7,16100,B,7,3050,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/21/1980,14:00,1181,1352,841,1,13,735,1,9,199,1,13,904,1,13,754,1,9,244,1,13,939,1,21,5,A,7,5,A,7,23.9,A,7,6.1,A,7,32,A,7,981,A,7,10,A,7,3.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,15:00,1062,1352,750,1,13,694,1,9,204,1,13,794,1,13,706,1,9,238,1,13,696,1,21,5,A,7,5,A,7,23.3,A,7,6.7,A,7,34,A,7,981,A,7,60,A,7,2.6,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,16:00,882,1352,514,1,13,472,1,9,206,1,13,553,1,13,488,1,9,234,1,13,524,1,21,5,A,7,5,A,7,22.2,A,7,5.6,A,7,34,A,7,981,A,7,30,A,7,3.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,17:00,653,1352,425,1,9,742,1,9,68,1,13,457,1,9,730,1,9,103,1,13,155,1,18,0,A,7,0,A,7,23.9,A,7,5.0,A,7,30,A,7,980,A,7,100,A,7,3.1,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,18:00,392,1352,230,1,9,633,1,9,47,1,13,241,1,9,563,1,9,78,1,13,98,1,18,0,A,7,0,A,7,22.8,A,7,2.8,A,7,27,A,7,980,A,7,70,A,7,2.1,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,19:00,119,1296,52,1,13,263,1,9,24,1,13,51,1,13,146,1,9,37,1,13,43,1,21,0,A,7,0,A,7,21.1,A,7,3.9,A,7,32,A,7,980,A,7,80,A,7,2.1,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/21/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,4.4,A,7,40,A,7,981,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,6.1,A,7,56,A,7,981,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,6.7,A,7,64,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,6.1,A,7,77,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/21/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,6.1,A,7,80,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,5.0,A,7,74,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/22/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,5.0,A,7,77,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,4.4,A,7,74,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,3.9,A,7,80,A,7,983,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,4.4,A,7,80,A,7,983,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,06:00,16,484,8,1,13,1,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,6.7,A,7,2.8,A,7,76,A,7,983,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,07:00,227,1352,83,1,13,140,1,9,59,1,13,87,1,13,95,1,9,71,1,13,111,1,21,0,A,7,0,A,7,10.6,A,7,6.7,A,7,77,A,7,984,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/22/1980,08:00,499,1352,270,1,9,414,1,9,117,1,13,285,1,9,390,1,9,141,1,13,224,1,18,0,A,7,0,A,7,16.1,A,7,5.6,A,7,50,A,7,984,A,7,310,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,09:00,749,1352,490,1,9,582,1,9,167,1,13,526,1,9,592,1,9,197,1,13,368,1,18,0,A,7,0,A,7,18.9,A,7,3.3,A,7,36,A,7,984,A,7,340,A,7,3.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,10:00,961,1352,690,1,9,683,1,9,204,1,13,722,1,9,688,1,9,232,1,13,571,1,18,0,A,7,0,A,7,20.6,A,7,-0.6,A,7,24,A,7,984,A,7,360,A,7,4.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,11:00,1118,1352,840,1,9,739,1,9,228,1,13,888,1,9,750,1,9,266,1,13,885,1,18,0,A,7,0,A,7,21.7,A,7,-2.2,A,7,20,A,7,984,A,7,360,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,12:00,1211,1352,931,1,9,769,1,9,241,1,13,989,1,9,783,1,9,286,1,13,1254,1,18,0,A,7,0,A,7,22.2,A,7,-2.2,A,7,19,A,7,983,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,13:00,1233,1352,951,1,9,774,1,9,244,1,13,1012,1,9,788,1,9,291,1,13,1388,1,18,0,A,7,0,A,7,23.9,A,7,-2.2,A,7,18,A,7,982,A,7,290,A,7,4.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/22/1980,14:00,1183,1352,900,1,9,757,1,9,237,1,13,955,1,9,770,1,9,280,1,13,1116,1,18,0,A,7,0,A,7,25.0,A,7,-0.6,A,7,19,A,7,981,A,7,280,A,7,4.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,15:00,1064,1352,786,1,9,718,1,9,220,1,13,828,1,9,727,1,9,254,1,13,749,1,18,0,A,7,0,A,7,26.7,A,7,1.1,A,7,19,A,7,980,A,7,270,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,16:00,884,1352,617,1,9,651,1,9,191,1,13,643,1,9,652,1,9,216,1,13,478,1,18,0,A,7,0,A,7,26.7,A,7,-0.6,A,7,17,A,7,979,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,17:00,656,1352,390,1,9,507,1,9,145,1,13,419,1,9,506,1,9,172,1,13,298,1,18,1,A,7,1,A,7,26.7,A,7,1.1,A,7,19,A,7,978,A,7,260,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,18:00,395,1352,138,1,13,148,1,9,95,1,13,152,1,13,134,1,9,113,1,13,212,1,21,4,A,7,4,A,7,25.6,A,7,0.6,A,7,19,A,7,978,A,7,300,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/22/1980,19:00,123,1318,33,1,13,18,1,9,31,1,13,36,1,13,12,1,9,35,1,13,75,1,21,3,A,7,3,A,7,22.8,A,7,2.8,A,7,27,A,7,978,A,7,270,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/22/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.6,A,7,3.3,A,7,32,A,7,978,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,3.9,A,7,39,A,7,978,A,7,230,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,19.4,A,7,3.3,A,7,35,A,7,977,A,7,270,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,3.3,A,7,37,A,7,977,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/22/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,2.8,A,7,36,A,7,977,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,2.8,A,7,37,A,7,976,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/23/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,2.8,A,7,40,A,7,976,A,7,230,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.1,A,7,3.3,A,7,43,A,7,975,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,3.9,A,7,48,A,7,975,A,7,250,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,4.4,A,7,53,A,7,975,A,7,240,A,7,1.5,A,7,19300,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,06:00,17,507,7,1,13,5,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,2,A,7,1,A,7,15.6,A,7,5.0,A,7,50,A,7,975,A,7,240,A,7,2.1,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,07:00,232,1351,90,1,13,250,1,9,47,1,13,95,1,13,174,1,9,65,1,13,84,1,21,2,A,7,1,A,7,19.4,A,7,6.1,A,7,42,A,7,975,A,7,240,A,7,3.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/23/1980,08:00,504,1351,279,1,9,469,1,9,104,1,13,298,1,9,443,1,9,133,1,13,197,1,18,5,A,7,1,A,7,20.6,A,7,7.2,A,7,42,A,7,975,A,7,250,A,7,3.1,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,09:00,754,1351,505,1,9,690,1,9,120,1,13,535,1,9,692,1,9,149,1,13,274,1,18,0,A,7,0,A,7,23.3,A,7,8.3,A,7,38,A,7,974,A,7,260,A,7,3.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,10:00,964,1351,648,1,9,666,1,9,172,1,13,687,1,9,677,1,9,203,1,13,495,1,18,3,A,7,1,A,7,26.7,A,7,8.3,A,7,31,A,7,974,A,7,260,A,7,5.2,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,11:00,1121,1351,827,1,9,788,1,9,172,1,13,863,1,9,790,1,9,205,1,13,617,1,18,2,A,7,0,A,7,28.9,A,7,6.7,A,7,25,A,7,974,A,7,290,A,7,6.7,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,12:00,1214,1351,936,1,9,852,1,9,169,1,13,990,1,9,860,1,9,215,1,13,838,1,18,0,A,7,0,A,7,30.0,A,7,6.7,A,7,23,A,7,973,A,7,310,A,7,6.7,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,13:00,1236,1351,937,1,9,835,1,9,171,1,13,991,1,9,843,1,9,218,1,13,930,1,18,2,A,7,1,A,7,31.1,A,7,7.8,A,7,23,A,7,973,A,7,300,A,7,5.2,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/23/1980,14:00,1186,1351,849,1,9,779,1,9,164,1,13,897,1,9,786,1,9,205,1,13,734,1,18,2,A,7,1,A,7,31.7,A,7,8.3,A,7,23,A,7,972,A,7,290,A,7,5.7,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,15:00,1066,1351,768,1,9,783,1,9,150,1,13,808,1,9,788,1,9,185,1,13,483,1,18,2,A,7,1,A,7,31.7,A,7,7.2,A,7,22,A,7,971,A,7,270,A,7,7.2,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,16:00,887,1351,599,1,9,705,1,9,136,1,13,640,1,9,718,1,9,168,1,13,358,1,18,2,A,7,1,A,7,31.7,A,7,7.2,A,7,22,A,7,971,A,7,270,A,7,7.2,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,17:00,659,1351,412,1,9,624,1,9,108,1,13,434,1,9,614,1,9,134,1,13,229,1,18,0,A,7,0,A,7,31.1,A,7,8.3,A,7,24,A,7,971,A,7,280,A,7,4.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,18:00,398,1351,213,1,9,475,1,9,73,1,13,220,1,9,416,1,9,97,1,13,136,1,18,0,A,7,0,A,7,29.4,A,7,7.2,A,7,25,A,7,972,A,7,300,A,7,4.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,19:00,126,1340,46,1,13,121,1,9,32,1,13,47,1,13,58,1,9,41,1,13,58,1,21,0,A,7,0,A,7,27.2,A,7,7.8,A,7,29,A,7,972,A,7,260,A,7,3.1,A,7,19300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/23/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,24.4,A,7,8.3,A,7,36,A,7,972,A,7,240,A,7,2.6,A,7,19300,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.8,A,7,8.9,A,7,41,A,7,973,A,7,230,A,7,2.1,A,7,19300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.2,A,7,8.9,A,7,43,A,7,973,A,7,260,A,7,2.1,A,7,19300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.1,A,7,8.9,A,7,46,A,7,973,A,7,260,A,7,2.1,A,7,19300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/23/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,20.0,A,7,8.9,A,7,49,A,7,973,A,7,290,A,7,1.5,A,7,19300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,18.3,A,7,8.9,A,7,54,A,7,973,A,7,340,A,7,2.6,A,7,19300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/24/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,10.0,A,7,70,A,7,973,A,7,230,A,7,1.5,A,7,19300,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,10.6,A,7,78,A,7,973,A,7,0,A,7,0.0,A,7,19300,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,9.4,A,7,75,A,7,973,A,7,0,A,7,0.0,A,7,19300,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,12.2,A,7,9.4,A,7,83,A,7,974,A,7,230,A,7,2.1,A,7,19300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,06:00,19,529,8,1,13,8,1,9,7,1,13,0,1,13,0,1,9,0,1,13,0,1,21,3,A,7,1,A,7,12.8,A,7,9.4,A,7,80,A,7,974,A,7,250,A,7,1.5,A,7,12900,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/24/1980,07:00,237,1350,81,1,13,89,1,9,66,1,13,89,1,13,66,1,9,77,1,13,141,1,21,9,A,7,3,A,7,15.6,A,7,12.2,A,7,81,A,7,975,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/24/1980,08:00,508,1350,277,1,13,440,1,9,111,1,13,294,1,13,417,1,9,137,1,13,212,1,21,9,A,7,3,A,7,20.0,A,7,12.2,A,7,61,A,7,975,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,09:00,757,1350,352,1,13,222,1,9,228,1,13,387,1,13,231,1,9,257,1,13,595,1,21,9,A,7,4,A,7,21.7,A,7,10.6,A,7,49,A,7,975,A,7,60,A,7,2.1,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,10:00,968,1350,643,1,13,566,1,9,237,1,13,691,1,13,588,1,9,269,1,13,686,1,21,7,A,7,3,A,7,24.4,A,7,12.2,A,7,47,A,7,975,A,7,180,A,7,2.1,A,7,11300,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,11:00,1124,1350,782,1,9,710,1,9,190,1,13,838,1,9,727,1,9,231,1,13,764,1,18,3,A,7,1,A,7,27.2,A,7,11.1,A,7,37,A,7,975,A,7,240,A,7,3.6,A,7,11300,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,12:00,1217,1350,885,1,9,787,1,9,174,1,13,932,1,9,793,1,9,216,1,13,870,1,18,4,A,7,1,A,7,27.8,A,7,9.4,A,7,32,A,7,974,A,7,190,A,7,4.1,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,13:00,1238,1350,769,1,13,566,1,9,249,1,13,817,1,13,576,1,9,288,1,13,1453,1,21,4,A,7,3,A,7,28.9,A,7,10.0,A,7,31,A,7,973,A,7,190,A,7,2.6,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/24/1980,14:00,1188,1350,835,1,13,689,1,9,228,1,13,889,1,13,703,1,9,269,1,13,1098,1,21,4,A,7,3,A,7,29.4,A,7,7.8,A,7,26,A,7,973,A,7,240,A,7,6.2,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,15:00,1069,1350,610,1,13,462,1,9,245,1,13,664,1,13,483,1,9,281,1,13,857,1,21,5,A,7,4,A,7,29.4,A,7,8.9,A,7,28,A,7,971,A,7,210,A,7,5.2,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,16:00,889,1350,608,1,13,684,1,9,158,1,13,644,1,13,692,1,9,187,1,13,410,1,21,3,A,7,3,A,7,28.9,A,7,7.2,A,7,26,A,7,971,A,7,210,A,7,7.2,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,17:00,662,1350,334,1,13,352,1,9,161,1,13,353,1,13,352,1,9,181,1,13,336,1,21,6,A,7,3,A,7,28.9,A,7,6.7,A,7,25,A,7,970,A,7,220,A,7,5.2,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,18:00,402,1350,196,1,13,314,1,9,103,1,13,204,1,13,276,1,9,122,1,13,194,1,21,7,A,7,5,A,7,27.8,A,7,5.6,A,7,24,A,7,971,A,7,230,A,7,5.2,A,7,11300,B,7,7620,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/24/1980,19:00,129,1350,36,1,13,22,1,9,34,1,13,39,1,13,14,1,9,38,1,13,80,1,21,7,A,7,6,A,7,23.3,A,7,7.2,A,7,36,A,7,972,A,7,330,A,7,6.2,A,7,11300,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -04/24/1980,20:00,0,11,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,10,A,7,10,A,7,17.8,A,7,12.2,A,7,70,A,7,974,A,7,350,A,7,6.2,A,7,11300,B,7,1520,A,7,2.2,E,8,0.000,?,0,0.00,?,0,33,1,D,9,80,C,8 -04/24/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,13.9,A,7,84,A,7,975,A,7,360,A,7,4.1,A,7,16100,B,7,1680,A,7,2.4,E,8,0.000,?,0,0.00,?,0,13,1,D,9,80,C,8 -04/24/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,14.4,A,7,84,A,7,975,A,7,300,A,7,5.2,A,7,16100,B,7,1520,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -04/24/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,16.7,A,7,14.4,A,7,87,A,7,974,A,7,190,A,7,2.1,A,7,16100,B,7,1520,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -04/24/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,15.6,A,7,14.4,A,7,93,A,7,974,A,7,250,A,7,2.1,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,13.9,A,7,13.3,A,7,96,A,7,975,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/25/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,13.9,A,7,13.3,A,7,96,A,7,975,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,13.3,A,7,12.8,A,7,96,A,7,975,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,12.2,A,7,11.7,A,7,96,A,7,975,A,7,340,A,7,1.5,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,13.3,A,7,12.8,A,7,96,A,7,975,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,06:00,21,551,10,1,13,9,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,3,A,7,1,A,7,12.2,A,7,11.7,A,7,96,A,7,976,A,7,230,A,7,1.5,A,7,9700,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,11,C,8 -04/25/1980,07:00,242,1349,87,1,13,148,1,9,60,1,13,92,1,13,105,1,9,73,1,13,112,1,21,3,A,7,3,A,7,14.4,A,7,13.3,A,7,93,A,7,977,A,7,240,A,7,1.5,A,7,11300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/25/1980,08:00,513,1349,137,1,9,36,1,9,124,1,13,151,1,9,34,1,9,138,1,13,358,1,18,9,A,7,9,A,7,18.3,A,7,15.0,A,7,81,A,7,977,A,7,260,A,7,2.1,A,7,11300,B,7,3660,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,09:00,761,1349,445,1,13,437,1,9,198,1,13,470,1,13,445,1,9,219,1,13,448,1,21,7,A,7,6,A,7,21.1,A,7,13.9,A,7,64,A,7,978,A,7,230,A,7,2.1,A,7,11300,B,7,3660,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,10:00,971,1349,414,1,9,69,1,9,364,1,13,455,1,9,71,1,9,404,1,13,1284,1,18,9,A,7,9,A,7,20.6,A,7,13.9,A,7,66,A,7,978,A,7,240,A,7,2.1,A,7,11300,B,7,3660,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,11:00,1127,1349,689,1,13,469,1,9,296,1,13,740,1,13,490,1,9,330,1,13,1208,1,21,7,A,7,6,A,7,22.2,A,7,13.3,A,7,57,A,7,978,A,7,310,A,7,3.6,A,7,11300,B,7,3660,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,12:00,1219,1349,848,1,13,550,1,9,350,1,13,907,1,13,575,1,9,387,1,13,1942,1,21,7,A,7,6,A,7,23.9,A,7,12.8,A,7,50,A,7,978,A,7,290,A,7,2.6,A,7,11300,B,7,3660,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,13:00,1240,1349,770,1,13,570,1,9,245,1,13,819,1,13,581,1,9,284,1,13,1450,1,21,4,A,7,3,A,7,25.0,A,7,13.3,A,7,48,A,7,978,A,7,290,A,7,4.1,A,7,11300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/25/1980,14:00,1190,1349,906,1,9,850,1,9,155,1,13,964,1,9,860,1,9,203,1,13,716,1,18,0,A,7,0,A,7,25.0,A,7,13.3,A,7,48,A,7,977,A,7,80,A,7,2.6,A,7,11300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,15:00,1071,1349,736,1,9,702,1,9,178,1,13,788,1,9,719,1,9,216,1,13,631,1,18,1,A,7,1,A,7,26.7,A,7,13.3,A,7,44,A,7,977,A,7,190,A,7,1.5,A,7,11300,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,16:00,892,1349,315,1,9,61,1,9,275,1,13,347,1,9,62,1,9,306,1,13,949,1,18,9,A,7,9,A,7,26.1,A,7,13.3,A,7,45,A,7,977,A,7,310,A,7,2.1,A,7,11300,B,7,1520,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,17:00,664,1349,186,1,9,106,1,9,134,1,13,209,1,9,109,1,9,155,1,13,332,1,18,9,A,7,8,A,7,25.6,A,7,15.0,A,7,52,A,7,977,A,7,360,A,7,3.1,A,7,16100,B,7,1520,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,18:00,405,1349,149,1,13,169,1,9,99,1,13,160,1,13,153,1,9,115,1,13,192,1,21,8,A,7,6,A,7,24.4,A,7,14.4,A,7,54,A,7,977,A,7,50,A,7,2.1,A,7,16100,B,7,1520,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,19:00,133,1349,36,1,13,38,1,9,32,1,13,39,1,13,21,1,9,37,1,13,67,1,21,8,A,7,6,A,7,22.2,A,7,15.0,A,7,64,A,7,978,A,7,70,A,7,2.6,A,7,16100,B,7,3660,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/25/1980,20:00,0,11,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,8,A,7,7,A,7,20.0,A,7,16.1,A,7,78,A,7,978,A,7,40,A,7,2.1,A,7,16100,B,7,3050,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,20.0,A,7,15.6,A,7,76,A,7,979,A,7,350,A,7,3.1,A,7,11300,B,7,1520,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/25/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,980,A,7,80,A,7,1.5,A,7,11300,B,7,1520,A,7,2.9,E,8,0.000,?,0,0.00,?,0,13,1,D,9,00,C,8 -04/25/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,980,A,7,40,A,7,2.6,A,7,11300,B,7,1520,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/25/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,980,A,7,40,A,7,1.5,A,7,8000,B,7,1520,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/26/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,17.2,A,7,16.7,A,7,97,A,7,979,A,7,50,A,7,2.6,A,7,6400,B,7,1680,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -04/26/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,16.1,A,7,14.4,A,7,90,A,7,980,A,7,60,A,7,2.6,A,7,16100,B,7,1680,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,12.8,A,7,87,A,7,980,A,7,50,A,7,2.1,A,7,16100,B,7,2440,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,11.1,A,7,83,A,7,980,A,7,40,A,7,3.1,A,7,11300,B,7,2740,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,11.1,A,7,87,A,7,980,A,7,50,A,7,3.1,A,7,11300,B,7,340,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,06:00,23,596,7,1,13,0,1,9,7,1,13,8,1,13,0,1,9,8,1,13,26,1,21,10,A,7,10,A,7,12.8,A,7,10.6,A,7,86,A,7,980,A,7,70,A,7,3.6,A,7,11300,B,7,270,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,07:00,247,1349,39,1,13,8,1,9,37,1,13,45,1,13,1,1,9,45,1,13,143,1,21,10,A,7,10,A,7,12.8,A,7,8.3,A,7,75,A,7,981,A,7,90,A,7,4.1,A,7,11300,B,7,460,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/26/1980,08:00,517,1349,109,1,9,2,1,9,108,1,13,126,1,9,1,1,9,125,1,13,442,1,18,10,A,7,10,A,7,12.8,A,7,7.2,A,7,69,A,7,981,A,7,90,A,7,4.1,A,7,16100,B,7,520,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,09:00,765,1349,115,1,9,8,1,9,111,1,13,140,1,9,6,1,9,137,1,13,532,1,18,10,A,7,10,A,7,12.8,A,7,8.9,A,7,77,A,7,981,A,7,60,A,7,5.2,A,7,11300,B,7,610,A,7,1.8,E,8,0.000,F,8,0.00,?,0,41,1,D,9,61,C,8 -04/26/1980,10:00,974,1349,205,1,9,8,1,9,199,1,13,245,1,9,6,1,9,240,1,13,956,1,18,10,A,7,10,A,7,10.6,A,7,9.4,A,7,93,A,7,981,A,7,40,A,7,4.1,A,7,4000,B,7,1070,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/26/1980,11:00,1130,1349,358,1,9,6,1,9,354,1,13,420,1,9,6,1,9,416,1,13,1557,1,18,10,A,7,10,A,7,12.2,A,7,9.4,A,7,83,A,7,981,A,7,50,A,7,3.6,A,7,11300,B,7,6100,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,12:00,1222,1349,395,1,9,3,1,9,392,1,13,464,1,9,3,1,9,462,1,13,1710,1,18,10,A,7,10,A,7,13.3,A,7,9.4,A,7,78,A,7,981,A,7,50,A,7,3.6,A,7,11300,B,7,610,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,13:00,1243,1349,400,1,9,1,1,9,400,1,13,472,1,9,1,1,9,471,1,13,1744,1,18,10,A,7,10,A,7,12.8,A,7,8.9,A,7,77,A,7,981,A,7,10,A,7,3.1,A,7,11300,B,7,520,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/26/1980,14:00,1192,1349,437,1,9,1,1,9,436,1,13,508,1,9,1,1,9,507,1,13,1814,1,18,10,A,7,10,A,7,14.4,A,7,9.4,A,7,72,A,7,980,A,7,40,A,7,4.1,A,7,11300,B,7,3050,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,15:00,1073,1349,698,1,13,512,1,9,290,1,13,746,1,13,534,1,9,321,1,13,1037,1,21,8,A,7,7,A,7,16.7,A,7,11.1,A,7,70,A,7,980,A,7,20,A,7,4.1,A,7,11300,B,7,3050,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,16:00,894,1349,421,1,9,250,1,9,255,1,13,458,1,9,268,1,9,280,1,13,679,1,18,8,A,7,8,A,7,15.6,A,7,10.6,A,7,72,A,7,980,A,7,20,A,7,3.6,A,7,11300,B,7,3050,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,17:00,667,1349,144,1,9,1,1,9,143,1,13,167,1,9,1,1,9,167,1,13,618,1,18,10,A,7,10,A,7,15.0,A,7,10.0,A,7,72,A,7,980,A,7,50,A,7,2.6,A,7,11300,B,7,3660,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,18:00,408,1349,72,1,9,5,1,9,70,1,13,83,1,9,2,1,9,83,1,13,284,1,18,10,A,7,10,A,7,13.9,A,7,10.0,A,7,78,A,7,980,A,7,60,A,7,2.6,A,7,11300,B,7,3050,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,19:00,136,1349,31,1,13,0,1,9,31,1,13,35,1,13,0,1,9,35,1,13,104,1,21,10,A,7,10,A,7,13.3,A,7,8.9,A,7,75,A,7,979,A,7,60,A,7,2.6,A,7,11300,B,7,2590,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/26/1980,20:00,0,34,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,10,A,7,10,A,7,12.2,A,7,8.9,A,7,80,A,7,980,A,7,50,A,7,2.6,A,7,11300,B,7,2590,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,7.8,A,7,77,A,7,980,A,7,60,A,7,2.6,A,7,11300,B,7,2440,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,11.1,A,7,7.8,A,7,80,A,7,980,A,7,70,A,7,3.1,A,7,11300,B,7,2440,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,10.6,A,7,8.3,A,7,86,A,7,979,A,7,50,A,7,2.6,A,7,11300,B,7,2440,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/26/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,10.0,A,7,7.8,A,7,86,A,7,979,A,7,40,A,7,2.6,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/27/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,9.4,A,7,7.8,A,7,89,A,7,978,A,7,60,A,7,2.6,A,7,11300,B,7,1370,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -04/27/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,9.4,A,7,7.8,A,7,89,A,7,978,A,7,60,A,7,2.1,A,7,8000,B,7,1520,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/27/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,7.8,A,7,89,A,7,978,A,7,40,A,7,2.1,A,7,8000,B,7,210,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/27/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,7.2,A,7,89,A,7,978,A,7,30,A,7,2.1,A,7,8000,B,7,210,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/27/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,8.3,A,7,93,A,7,977,A,7,70,A,7,1.5,A,7,8000,B,7,670,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -04/27/1980,06:00,26,618,7,1,13,1,1,9,7,1,13,8,1,13,0,1,9,8,1,13,27,1,21,10,A,7,10,A,7,10.0,A,7,8.9,A,7,93,A,7,978,A,7,100,A,7,2.1,A,7,1600,B,7,120,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/27/1980,07:00,252,1348,64,1,13,0,1,9,64,1,13,71,1,13,0,1,9,71,1,13,219,1,21,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,977,A,7,60,A,7,2.6,A,7,1600,B,7,120,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -04/27/1980,08:00,521,1348,139,1,9,2,1,9,138,1,13,157,1,9,1,1,9,157,1,13,531,1,18,10,A,7,10,A,7,10.6,A,7,10.0,A,7,96,A,7,977,A,7,70,A,7,2.6,A,7,1600,B,7,120,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/27/1980,09:00,769,1348,146,1,9,6,1,9,143,1,13,174,1,9,4,1,9,171,1,13,660,1,18,10,A,7,10,A,7,11.1,A,7,10.6,A,7,96,A,7,977,A,7,80,A,7,2.1,A,7,1600,B,7,120,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/27/1980,10:00,978,1348,233,1,9,3,1,9,231,1,13,276,1,9,2,1,9,274,1,13,1078,1,18,10,A,7,10,A,7,11.7,A,7,11.1,A,7,96,A,7,977,A,7,150,A,7,2.1,A,7,1600,B,7,120,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/27/1980,11:00,1133,1348,366,1,9,0,1,9,366,1,13,428,1,9,0,1,9,428,1,13,1594,1,18,10,A,7,10,A,7,15.6,A,7,14.4,A,7,93,A,7,976,A,7,170,A,7,4.1,A,7,3200,B,7,150,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/27/1980,12:00,1224,1348,452,1,9,0,1,9,452,1,13,526,1,9,0,1,9,526,1,13,1874,1,18,10,A,7,10,A,7,20.0,A,7,15.6,A,7,76,A,7,974,A,7,210,A,7,4.1,A,7,4800,B,7,610,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/27/1980,13:00,1245,1348,793,1,13,526,1,9,307,1,13,864,1,13,551,1,9,354,1,13,1903,1,21,7,A,7,7,A,7,22.2,A,7,13.3,A,7,57,A,7,974,A,7,200,A,7,6.2,A,7,11300,B,7,760,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/27/1980,14:00,1194,1348,653,1,9,398,1,9,300,1,13,708,1,9,417,1,9,338,1,13,1511,1,18,9,A,7,8,A,7,22.2,A,7,13.3,A,7,57,A,7,972,A,7,200,A,7,6.2,A,7,11300,B,7,1070,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/27/1980,15:00,1075,1348,513,1,9,212,1,9,344,1,13,566,1,9,226,1,9,386,1,13,1229,1,18,9,A,7,9,A,7,20.0,A,7,15.0,A,7,73,A,7,972,A,7,350,A,7,4.1,A,7,11300,B,7,1220,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/27/1980,16:00,896,1348,565,1,13,600,1,9,166,1,13,596,1,13,606,1,9,192,1,13,433,1,21,4,A,7,4,A,7,21.1,A,7,14.4,A,7,66,A,7,972,A,7,360,A,7,3.1,A,7,8000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/27/1980,17:00,669,1348,292,1,13,268,1,9,159,1,13,319,1,13,278,1,9,180,1,13,343,1,21,6,A,7,6,A,7,20.0,A,7,14.4,A,7,71,A,7,972,A,7,10,A,7,3.1,A,7,8000,B,7,1070,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/27/1980,18:00,411,1348,119,1,13,92,1,9,91,1,13,132,1,13,85,1,9,106,1,13,204,1,21,7,A,7,7,A,7,17.2,A,7,13.3,A,7,78,A,7,973,A,7,340,A,7,5.2,A,7,11300,B,7,1070,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -04/27/1980,19:00,140,1348,37,1,13,89,1,9,28,1,13,40,1,13,44,1,9,35,1,13,49,1,21,7,A,7,7,A,7,16.7,A,7,11.7,A,7,73,A,7,973,A,7,360,A,7,2.6,A,7,11300,B,7,1220,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,25,C,8 -04/27/1980,20:00,0,56,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,8,A,7,7,A,7,15.6,A,7,11.7,A,7,78,A,7,974,A,7,330,A,7,2.6,A,7,16100,B,7,1830,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/27/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,14.4,A,7,11.7,A,7,84,A,7,975,A,7,10,A,7,2.1,A,7,16100,B,7,2130,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/27/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,12.8,A,7,11.1,A,7,90,A,7,974,A,7,10,A,7,2.1,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/27/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,11.7,A,7,10.6,A,7,93,A,7,975,A,7,50,A,7,2.1,A,7,16100,B,7,1520,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/27/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,11.7,A,7,8.9,A,7,83,A,7,976,A,7,30,A,7,2.6,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,10.6,A,7,7.8,A,7,83,A,7,976,A,7,10,A,7,2.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -04/28/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,10.0,A,7,6.1,A,7,77,A,7,975,A,7,350,A,7,3.1,A,7,16100,B,7,1520,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,4.4,A,7,69,A,7,975,A,7,350,A,7,3.6,A,7,16100,B,7,1520,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,9.4,A,7,4.4,A,7,71,A,7,974,A,7,350,A,7,3.1,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,4.4,A,7,71,A,7,974,A,7,340,A,7,2.1,A,7,16100,B,7,2130,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,06:00,28,640,10,1,13,1,1,9,10,1,13,12,1,13,0,1,9,12,1,13,36,1,21,9,A,7,9,A,7,9.4,A,7,3.9,A,7,69,A,7,974,A,7,330,A,7,2.6,A,7,16100,B,7,2590,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,07:00,256,1347,53,1,13,23,1,9,49,1,13,59,1,13,18,1,9,55,1,13,129,1,21,9,A,7,9,A,7,10.0,A,7,4.4,A,7,69,A,7,975,A,7,320,A,7,3.1,A,7,11300,B,7,2590,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/28/1980,08:00,525,1347,117,1,9,53,1,9,96,1,13,129,1,9,50,1,9,109,1,13,291,1,18,10,A,7,10,A,7,11.1,A,7,3.9,A,7,61,A,7,975,A,7,320,A,7,2.6,A,7,11300,B,7,2440,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,09:00,772,1347,174,1,9,10,1,9,168,1,13,204,1,9,8,1,9,199,1,13,753,1,18,10,A,7,10,A,7,11.7,A,7,4.4,A,7,62,A,7,975,A,7,340,A,7,3.6,A,7,11300,B,7,2440,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,10:00,981,1347,445,1,13,103,1,9,370,1,13,490,1,13,106,1,9,412,1,13,1316,1,21,8,A,7,7,A,7,13.3,A,7,4.4,A,7,55,A,7,975,A,7,340,A,7,4.6,A,7,11300,B,7,1680,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,11:00,1135,1347,780,1,13,625,1,9,253,1,13,820,1,13,632,1,9,286,1,13,1030,1,21,7,A,7,6,A,7,15.6,A,7,6.1,A,7,54,A,7,975,A,7,330,A,7,2.6,A,7,11300,B,7,3050,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,12:00,1226,1347,954,1,9,897,1,9,136,1,13,979,1,9,899,1,9,159,1,13,599,1,18,0,A,7,0,A,7,16.7,A,7,5.6,A,7,48,A,7,974,A,7,330,A,7,2.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,13:00,1247,1347,872,1,13,692,1,9,230,1,13,933,1,13,708,1,9,276,1,13,1421,1,21,3,A,7,3,A,7,17.8,A,7,4.4,A,7,42,A,7,973,A,7,310,A,7,4.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -04/28/1980,14:00,1196,1347,607,1,13,406,1,9,245,1,13,670,1,13,426,1,9,291,1,13,1236,1,21,4,A,7,4,A,7,18.9,A,7,4.4,A,7,39,A,7,973,A,7,300,A,7,4.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,15:00,1077,1347,774,1,13,756,1,9,169,1,13,805,1,13,757,1,9,198,1,13,543,1,21,3,A,7,3,A,7,19.4,A,7,3.9,A,7,36,A,7,973,A,7,290,A,7,5.2,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,16:00,898,1347,615,1,13,627,1,9,196,1,13,640,1,13,628,1,9,220,1,13,501,1,21,3,A,7,3,A,7,18.3,A,7,3.3,A,7,37,A,7,973,A,7,280,A,7,6.2,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,17:00,672,1347,439,1,9,689,1,9,96,1,13,468,1,9,684,1,9,126,1,13,209,1,18,1,A,7,1,A,7,18.3,A,7,2.2,A,7,34,A,7,973,A,7,300,A,7,4.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,18:00,414,1347,215,1,9,364,1,9,104,1,13,225,1,9,324,1,9,126,1,13,196,1,18,2,A,7,2,A,7,17.2,A,7,2.2,A,7,37,A,7,973,A,7,280,A,7,4.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,19:00,143,1347,48,1,13,187,1,9,29,1,13,52,1,13,100,1,9,41,1,13,51,1,21,1,A,7,1,A,7,15.0,A,7,2.2,A,7,42,A,7,974,A,7,270,A,7,2.6,A,7,19300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/28/1980,20:00,0,79,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,0,A,7,0,A,7,12.8,A,7,2.8,A,7,51,A,7,975,A,7,270,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,3.3,A,7,57,A,7,975,A,7,270,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,3.9,A,7,66,A,7,975,A,7,270,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,3.3,A,7,66,A,7,975,A,7,260,A,7,2.1,A,7,19300,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/28/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,3.9,A,7,74,A,7,975,A,7,230,A,7,1.5,A,7,19300,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,7.2,A,7,2.8,A,7,74,A,7,975,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -04/29/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,7.2,A,7,3.3,A,7,77,A,7,974,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,5.6,A,7,3.3,A,7,86,A,7,974,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,6.1,A,7,3.9,A,7,86,A,7,974,A,7,240,A,7,2.1,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,4.4,A,7,2.8,A,7,89,A,7,974,A,7,210,A,7,1.5,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,06:00,30,662,10,1,13,5,1,9,10,1,13,11,1,13,3,1,9,11,1,13,25,1,21,2,A,7,2,A,7,5.0,A,7,3.3,A,7,89,A,7,974,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/29/1980,07:00,261,1347,104,1,13,220,1,9,61,1,13,108,1,13,163,1,9,77,1,13,110,1,21,2,A,7,1,A,7,7.8,A,7,5.0,A,7,83,A,7,974,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/29/1980,08:00,529,1347,294,1,9,384,1,9,143,1,13,306,1,9,366,1,9,162,1,13,282,1,18,3,A,7,2,A,7,12.2,A,7,3.3,A,7,55,A,7,975,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/29/1980,09:00,776,1347,506,1,13,555,1,9,186,1,13,540,1,13,567,1,9,213,1,13,424,1,21,6,A,7,3,A,7,13.9,A,7,5.0,A,7,55,A,7,975,A,7,180,A,7,3.1,A,7,8000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -04/29/1980,10:00,984,1347,640,1,13,531,1,9,251,1,13,685,1,13,552,1,9,281,1,13,751,1,21,8,A,7,4,A,7,15.6,A,7,5.0,A,7,50,A,7,975,A,7,180,A,7,3.6,A,7,11300,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,11:00,1138,1347,299,1,9,22,1,9,281,1,13,332,1,9,22,1,9,313,1,13,1259,1,18,10,A,7,10,A,7,15.0,A,7,4.4,A,7,50,A,7,974,A,7,230,A,7,2.6,A,7,11300,B,7,3050,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,12:00,1228,1347,485,1,9,95,1,9,399,1,13,537,1,9,98,1,9,448,1,13,1996,1,18,9,A,7,8,A,7,15.6,A,7,6.1,A,7,54,A,7,973,A,7,130,A,7,3.1,A,7,11300,B,7,3050,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,13:00,1249,1347,532,1,9,121,1,9,420,1,13,589,1,9,129,1,9,468,1,13,2260,1,18,9,A,7,9,A,7,17.8,A,7,5.0,A,7,43,A,7,972,A,7,170,A,7,4.6,A,7,11300,B,7,1520,A,7,1.4,E,8,0.000,F,8,0.00,?,0,46,1,D,9,03,C,8 -04/29/1980,14:00,1198,1347,214,1,9,22,1,9,195,1,13,239,1,9,22,1,9,219,1,13,987,1,18,10,A,7,10,A,7,12.2,A,7,9.4,A,7,83,A,7,973,A,7,250,A,7,6.7,A,7,1600,B,7,180,A,7,1.8,E,8,0.000,F,8,0.00,?,0,10,1,D,9,81,C,8 -04/29/1980,15:00,1079,1347,160,1,9,4,1,9,157,1,13,198,1,9,3,1,9,196,1,13,808,1,18,10,A,7,10,A,7,10.6,A,7,8.9,A,7,90,A,7,972,A,7,310,A,7,4.1,A,7,11300,B,7,1130,A,7,1.8,E,8,0.000,F,8,0.00,?,0,8,1,D,9,80,C,8 -04/29/1980,16:00,901,1347,241,1,9,3,1,9,239,1,13,281,1,9,3,1,9,279,1,13,1063,1,18,10,A,7,10,A,7,10.6,A,7,8.3,A,7,86,A,7,973,A,7,260,A,7,2.6,A,7,11300,B,7,1070,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,17:00,675,1347,206,1,9,56,1,9,178,1,13,227,1,9,55,1,9,199,1,13,552,1,18,10,A,7,9,A,7,10.0,A,7,8.3,A,7,89,A,7,972,A,7,280,A,7,2.6,A,7,11300,B,7,1520,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,18:00,417,1347,201,1,9,325,1,9,101,1,13,211,1,9,290,1,9,121,1,13,189,1,18,3,A,7,2,A,7,10.6,A,7,7.8,A,7,83,A,7,972,A,7,300,A,7,2.1,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,19:00,147,1347,46,1,13,91,1,9,36,1,13,49,1,13,46,1,9,44,1,13,65,1,21,0,A,7,0,A,7,10.0,A,7,8.3,A,7,89,A,7,973,A,7,250,A,7,2.1,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/29/1980,20:00,1,101,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,0,A,7,0,A,7,8.9,A,7,7.8,A,7,93,A,7,973,A,7,240,A,7,2.1,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,7.8,A,7,6.7,A,7,93,A,7,974,A,7,190,A,7,2.1,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,3,A,7,7.2,A,7,7.2,A,7,100,A,7,974,A,7,230,A,7,1.5,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,7.2,A,7,6.7,A,7,96,A,7,974,A,7,220,A,7,2.1,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/29/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,5.6,A,7,96,A,7,973,A,7,230,A,7,2.1,A,7,11300,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,6.1,A,7,5.0,A,7,93,A,7,973,A,7,220,A,7,2.1,A,7,11300,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -04/30/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,5.6,A,7,5.0,A,7,96,A,7,973,A,7,230,A,7,2.1,A,7,11300,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,3.9,A,7,89,A,7,972,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,5.0,A,7,3.9,A,7,93,A,7,972,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,6.1,A,7,4.4,A,7,89,A,7,972,A,7,240,A,7,2.1,A,7,16100,B,7,1830,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,06:00,32,684,9,1,13,3,1,9,8,1,13,9,1,13,2,1,9,9,1,13,21,1,21,10,A,7,10,A,7,6.1,A,7,5.0,A,7,93,A,7,973,A,7,230,A,7,1.5,A,7,11300,B,7,1070,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,07:00,265,1346,73,1,13,7,1,9,71,1,13,81,1,13,2,1,9,80,1,13,241,1,21,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,974,A,7,230,A,7,2.1,A,7,11300,B,7,1680,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,08:00,533,1346,81,1,9,6,1,9,78,1,13,96,1,9,3,1,9,94,1,13,344,1,18,10,A,7,10,A,7,7.2,A,7,5.6,A,7,89,A,7,974,A,7,250,A,7,3.6,A,7,4800,B,7,1070,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -04/30/1980,09:00,779,1346,225,1,9,3,1,9,223,1,13,258,1,9,3,1,9,257,1,13,934,1,18,10,A,7,10,A,7,8.9,A,7,6.1,A,7,83,A,7,974,A,7,250,A,7,2.6,A,7,11300,B,7,980,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,10:00,986,1346,290,1,9,6,1,9,286,1,13,339,1,9,5,1,9,335,1,13,1269,1,18,10,A,7,10,A,7,10.0,A,7,7.8,A,7,86,A,7,974,A,7,250,A,7,4.1,A,7,11300,B,7,1070,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,11:00,1140,1346,333,1,9,4,1,9,330,1,13,393,1,9,4,1,9,390,1,13,1488,1,18,10,A,7,10,A,7,11.7,A,7,6.1,A,7,69,A,7,975,A,7,290,A,7,5.2,A,7,11300,B,7,1680,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,12:00,1230,1346,391,1,9,4,1,9,387,1,13,461,1,9,4,1,9,457,1,13,1701,1,18,10,A,7,10,A,7,12.2,A,7,7.2,A,7,72,A,7,975,A,7,270,A,7,5.2,A,7,11300,B,7,1250,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,13:00,1251,1346,830,1,13,585,1,9,285,1,13,875,1,13,592,1,9,324,1,13,1782,1,21,3,A,7,3,A,7,15.0,A,7,7.2,A,7,60,A,7,975,A,7,310,A,7,4.1,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -04/30/1980,14:00,1200,1346,621,1,9,330,1,9,326,1,13,690,1,9,359,1,9,369,1,13,1534,1,18,8,A,7,8,A,7,15.0,A,7,6.1,A,7,56,A,7,975,A,7,290,A,7,6.2,A,7,11300,B,7,1830,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,15:00,1081,1346,593,1,13,386,1,9,283,1,13,637,1,13,403,1,9,313,1,13,1035,1,21,6,A,7,6,A,7,16.1,A,7,6.7,A,7,54,A,7,975,A,7,320,A,7,6.2,A,7,11300,B,7,2130,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,16:00,903,1346,538,1,13,525,1,9,185,1,13,587,1,13,545,1,9,221,1,13,481,1,21,4,A,7,4,A,7,15.0,A,7,6.1,A,7,56,A,7,975,A,7,330,A,7,6.7,A,7,11300,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,17:00,677,1346,284,1,13,243,1,9,162,1,13,310,1,13,253,1,9,183,1,13,351,1,21,6,A,7,6,A,7,14.4,A,7,6.1,A,7,58,A,7,975,A,7,330,A,7,5.2,A,7,11300,B,7,1220,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,18:00,420,1346,175,1,9,218,1,9,108,1,13,188,1,9,200,1,9,126,1,13,212,1,18,8,A,7,8,A,7,13.9,A,7,6.1,A,7,60,A,7,976,A,7,330,A,7,5.2,A,7,11300,B,7,1220,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,19:00,150,1346,32,1,13,15,1,9,30,1,13,35,1,13,10,1,9,34,1,13,75,1,21,9,A,7,8,A,7,12.8,A,7,5.6,A,7,62,A,7,977,A,7,310,A,7,3.6,A,7,11300,B,7,1220,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -04/30/1980,20:00,1,123,1,1,13,0,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,9,A,7,8,A,7,11.1,A,7,5.6,A,7,69,A,7,977,A,7,310,A,7,2.6,A,7,11300,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,7,A,7,10.0,A,7,5.6,A,7,74,A,7,977,A,7,320,A,7,2.6,A,7,11300,B,7,7620,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,4,A,7,10.6,A,7,5.8,A,7,74,A,7,977,A,7,320,A,7,2.2,A,7,11300,B,7,7620,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,4,A,7,11.1,A,7,6.1,A,7,80,A,7,977,A,7,240,A,7,1.9,A,7,11300,B,7,7620,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -04/30/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,11.7,A,7,6.3,A,7,74,A,7,977,A,7,290,A,7,1.5,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,6.5,A,7,62,A,7,984,A,7,180,A,7,1.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,6.7,A,7,60,A,7,984,A,7,190,A,7,0.7,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,13.3,A,7,7.0,A,7,65,A,7,984,A,7,200,A,7,0.4,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,13.9,A,7,7.2,A,7,64,A,7,984,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,12.8,A,7,8.3,A,7,75,A,7,983,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,06:00,33,707,10,1,13,5,1,9,10,1,13,11,1,13,3,1,9,11,1,13,26,1,21,6,A,7,6,A,7,12.8,A,7,8.9,A,7,77,A,7,983,A,7,210,A,7,3.1,A,7,24100,B,7,7620,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,07:00,268,1346,87,1,13,74,1,9,73,1,13,96,1,13,58,1,9,84,1,13,157,1,21,8,A,7,8,A,7,15.6,A,7,9.4,A,7,67,A,7,984,A,7,210,A,7,3.6,A,7,24100,B,7,6710,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,08:00,535,1346,193,1,9,57,1,9,170,1,13,211,1,9,55,1,9,189,1,13,470,1,18,9,A,7,9,A,7,17.8,A,7,7.8,A,7,52,A,7,984,A,7,220,A,7,4.1,A,7,24100,B,7,6710,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,09:00,781,1346,503,1,9,594,1,9,158,1,13,525,1,9,591,1,9,181,1,13,358,1,18,8,A,7,2,A,7,20.6,A,7,10.0,A,7,51,A,7,983,A,7,220,B,8,3.4,B,8,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,10:00,988,1346,699,1,9,726,1,9,166,1,13,746,1,9,741,1,9,201,1,13,504,1,18,6,A,7,2,A,7,25.0,A,7,11.7,A,7,43,A,7,983,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,11:00,1142,1346,714,1,13,519,1,9,273,1,13,776,1,13,543,1,9,314,1,13,1165,1,21,10,A,7,4,A,7,27.2,A,7,11.7,A,7,38,A,7,983,A,7,220,A,7,4.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,12:00,1232,1346,877,1,13,696,1,9,239,1,13,935,1,13,710,1,9,283,1,13,1384,1,21,6,A,7,3,A,7,28.3,A,7,10.0,A,7,32,A,7,982,A,7,220,A,7,4.1,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,13:00,1252,1346,803,1,13,585,1,9,258,1,13,853,1,13,595,1,9,298,1,13,1634,1,21,7,A,7,5,A,7,29.4,A,7,9.4,A,7,29,A,7,981,A,7,240,A,7,4.1,A,7,24100,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,14:00,1201,1346,851,1,13,673,1,9,251,1,13,903,1,13,683,1,9,291,1,13,1277,1,21,6,A,7,3,A,7,31.1,A,7,8.9,A,7,25,A,7,981,A,7,260,A,7,4.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,15:00,1083,1346,798,1,13,727,1,9,213,1,13,845,1,13,739,1,9,249,1,13,768,1,21,7,A,7,5,A,7,30.0,A,7,8.3,A,7,26,A,7,980,A,7,270,A,7,3.6,A,7,24100,B,7,3660,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,16:00,904,1346,354,1,13,119,1,9,274,1,13,390,1,13,126,1,9,305,1,13,800,1,21,8,A,7,7,A,7,29.4,A,7,9.4,A,7,29,A,7,980,A,7,300,A,7,3.1,A,7,24100,B,7,3050,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,17:00,679,1346,347,1,13,429,1,9,132,1,13,378,1,13,432,1,9,160,1,13,273,1,21,8,A,7,5,A,7,28.3,A,7,10.0,A,7,32,A,7,979,A,7,300,A,7,3.1,A,7,24100,B,7,3050,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,18:00,421,1346,203,1,13,350,1,9,95,1,13,216,1,13,314,1,9,118,1,13,177,1,21,5,A,7,4,A,7,27.8,A,7,10.0,A,7,33,A,7,979,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,19:00,152,1346,50,1,13,136,1,9,35,1,13,54,1,13,71,1,9,46,1,13,63,1,21,4,A,7,3,A,7,26.7,A,7,10.0,A,7,35,A,7,979,A,7,270,A,7,2.1,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,20:00,1,123,0,1,13,0,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,2,A,7,2,A,7,25.0,A,7,8.9,A,7,36,A,7,979,A,7,280,A,7,2.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,9.4,A,7,40,A,7,980,A,7,270,A,7,2.1,A,7,24100,B,7,3050,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,23.9,A,7,10.6,A,7,43,A,7,980,A,7,290,A,7,2.6,A,7,24100,B,7,1680,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,21.7,A,7,11.7,A,7,53,A,7,980,A,7,270,A,7,2.1,A,7,24100,B,7,1680,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/01/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,21.1,A,7,12.2,A,7,57,A,7,981,A,7,270,A,7,2.1,A,7,24100,B,7,1370,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,20.0,A,7,12.2,A,7,61,A,7,981,A,7,360,A,7,3.1,A,7,24100,B,7,1680,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,18.3,A,7,11.7,A,7,65,A,7,981,A,7,350,A,7,3.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,16.7,A,7,8.3,A,7,58,A,7,982,A,7,350,A,7,2.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,14.4,A,7,6.7,A,7,60,A,7,982,A,7,340,A,7,2.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,13.3,A,7,6.1,A,7,62,A,7,983,A,7,320,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,06:00,36,729,12,1,13,1,1,9,12,1,13,14,1,13,0,1,9,14,1,13,43,1,21,9,A,7,4,A,7,12.8,A,7,3.9,A,7,55,A,7,984,A,7,320,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,07:00,272,1345,86,1,13,82,1,9,69,1,13,94,1,13,65,1,9,81,1,13,149,1,21,5,A,7,4,A,7,14.4,A,7,3.3,A,7,48,A,7,984,A,7,290,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,08:00,539,1345,272,1,13,332,1,9,139,1,13,293,1,13,329,1,9,161,1,13,285,1,21,3,A,7,3,A,7,16.1,A,7,3.9,A,7,44,A,7,985,A,7,270,A,7,3.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,09:00,785,1345,522,1,9,646,1,9,146,1,13,549,1,9,646,1,9,171,1,13,336,1,18,0,A,7,0,A,7,17.2,A,7,3.9,A,7,41,A,7,985,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,10:00,991,1345,725,1,9,741,1,9,178,1,13,769,1,9,754,1,9,212,1,13,539,1,18,1,A,7,0,A,7,18.9,A,7,4.4,A,7,39,A,7,985,A,7,310,A,7,3.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,11:00,1144,1345,865,1,9,790,1,9,192,1,13,895,1,9,789,1,9,222,1,13,727,1,18,0,A,7,0,A,7,20.0,A,7,3.9,A,7,35,A,7,985,A,7,300,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,12:00,1234,1345,949,1,9,813,1,9,203,1,13,988,1,9,814,1,9,239,1,13,1085,1,18,0,A,7,0,A,7,21.1,A,7,3.9,A,7,32,A,7,985,A,7,310,A,7,3.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,13:00,1254,1345,973,1,9,824,1,9,204,1,13,1014,1,9,826,1,9,242,1,13,1207,1,18,0,A,7,0,A,7,22.2,A,7,2.2,A,7,27,A,7,984,A,7,340,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,14:00,1203,1345,921,1,9,807,1,9,199,1,13,957,1,9,807,1,9,233,1,13,929,1,18,0,A,7,0,A,7,22.8,A,7,2.8,A,7,27,A,7,983,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,15:00,1084,1345,816,1,9,783,1,9,186,1,13,874,1,9,801,1,9,227,1,13,684,1,18,0,A,7,0,A,7,23.3,A,7,2.2,A,7,25,A,7,983,A,7,310,A,7,4.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,16:00,906,1345,648,1,9,720,1,9,163,1,13,686,1,9,729,1,9,193,1,13,434,1,18,0,A,7,0,A,7,23.9,A,7,1.7,A,7,23,A,7,983,A,7,300,A,7,4.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,17:00,681,1345,444,1,9,623,1,9,130,1,13,465,1,9,612,1,9,154,1,13,274,1,18,0,A,7,0,A,7,23.3,A,7,0.6,A,7,22,A,7,983,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,18:00,424,1345,225,1,9,438,1,9,88,1,13,241,1,9,394,1,9,116,1,13,163,1,18,0,A,7,0,A,7,22.2,A,7,0.6,A,7,24,A,7,983,A,7,310,A,7,4.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,19:00,155,1345,49,1,13,104,1,9,38,1,13,53,1,13,55,1,9,47,1,13,69,1,21,0,A,7,0,A,7,20.0,A,7,1.1,A,7,29,A,7,984,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,20:00,1,146,0,1,13,0,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,1,A,7,1,A,7,18.3,A,7,0.6,A,7,30,A,7,985,A,7,310,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,0.0,A,7,31,A,7,986,A,7,320,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,0.0,A,7,35,A,7,987,A,7,340,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,0.0,A,7,39,A,7,988,A,7,350,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/02/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,-0.6,A,7,40,A,7,988,A,7,360,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,-0.6,A,7,43,A,7,989,A,7,20,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,-0.6,A,7,47,A,7,989,A,7,360,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,-0.6,A,7,48,A,7,990,A,7,330,A,7,4.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,-1.1,A,7,50,A,7,990,A,7,350,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,-2.2,A,7,48,A,7,990,A,7,340,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,06:00,38,751,22,1,13,75,1,9,14,1,13,20,1,13,27,1,9,18,1,13,24,1,21,0,A,7,0,A,7,7.2,A,7,-2.2,A,7,52,A,7,991,A,7,350,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,07:00,276,1344,144,1,13,506,1,9,41,1,13,151,1,13,396,1,9,70,1,13,77,1,21,0,A,7,0,A,7,8.9,A,7,-1.1,A,7,50,A,7,992,A,7,350,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,08:00,543,1344,360,1,9,735,1,9,64,1,13,380,1,9,702,1,9,96,1,13,136,1,18,0,A,7,0,A,7,10.0,A,7,-1.7,A,7,45,A,7,992,A,7,360,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,09:00,788,1344,568,1,9,815,1,9,90,1,13,605,1,9,815,1,9,126,1,13,215,1,18,3,A,7,1,A,7,11.7,A,7,-2.2,A,7,38,A,7,993,A,7,350,A,7,4.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,10:00,994,1344,663,1,9,731,1,9,123,1,13,706,1,9,738,1,9,159,1,13,362,1,18,2,A,7,1,A,7,13.3,A,7,-4.4,A,7,29,A,7,993,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,11:00,1146,1344,904,1,9,909,1,9,129,1,13,931,1,9,910,1,9,153,1,13,432,1,18,2,A,7,2,A,7,15.0,A,7,-2.8,A,7,30,A,7,992,A,7,300,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,12:00,1236,1344,933,1,9,906,1,9,99,1,13,967,1,9,910,1,9,128,1,13,510,1,18,1,A,7,1,A,7,16.7,A,7,-4.4,A,7,23,A,7,992,A,7,330,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,13:00,1256,1344,883,1,9,784,1,9,150,1,13,951,1,9,797,1,9,205,1,13,943,1,18,2,A,7,2,A,7,17.2,A,7,-5.0,A,7,22,A,7,991,A,7,320,A,7,4.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,14:00,1205,1344,826,1,9,725,1,9,175,1,13,869,1,9,730,1,9,213,1,13,849,1,18,2,A,7,2,A,7,17.8,A,7,-5.0,A,7,21,A,7,990,A,7,330,A,7,4.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,15:00,1086,1344,803,1,9,868,1,9,102,1,13,833,1,9,869,1,9,130,1,13,325,1,18,1,A,7,1,A,7,18.9,A,7,-5.0,A,7,20,A,7,989,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,16:00,909,1344,620,1,9,777,1,9,96,1,13,670,1,9,787,1,9,138,1,13,263,1,18,1,A,7,1,A,7,18.9,A,7,-5.6,A,7,19,A,7,989,A,7,330,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,17:00,684,1344,439,1,9,696,1,9,86,1,13,463,1,9,684,1,9,114,1,13,187,1,18,1,A,7,1,A,7,18.9,A,7,-7.2,A,7,16,A,7,989,A,7,310,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,18:00,427,1344,255,1,9,642,1,9,53,1,13,268,1,9,583,1,9,83,1,13,109,1,18,1,A,7,1,A,7,17.8,A,7,-7.2,A,7,18,A,7,989,A,7,320,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,19:00,159,1344,60,1,13,266,1,9,30,1,13,63,1,13,161,1,9,44,1,13,54,1,21,1,A,7,1,A,7,16.1,A,7,-5.0,A,7,23,A,7,989,A,7,350,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,20:00,2,168,1,1,13,3,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,1,A,7,1,A,7,13.3,A,7,-6.7,A,7,25,A,7,990,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,-6.1,A,7,30,A,7,991,A,7,350,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,-6.7,A,7,27,A,7,991,A,7,340,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,-6.1,A,7,32,A,7,992,A,7,330,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/03/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,-5.6,A,7,35,A,7,992,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,-6.7,A,7,33,A,7,992,A,7,350,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,-6.7,A,7,33,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-6.1,A,7,45,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-3.9,A,7,60,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-3.9,A,7,67,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,06:00,41,773,17,1,13,18,1,9,15,1,13,18,1,13,7,1,9,17,1,13,31,1,21,0,A,7,0,A,7,2.2,A,7,-2.8,A,7,70,A,7,994,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,07:00,280,1344,113,1,13,206,1,9,70,1,13,120,1,13,158,1,9,87,1,13,132,1,21,3,A,7,3,A,7,6.7,A,7,-2.2,A,7,54,A,7,995,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,08:00,546,1344,312,1,9,492,1,9,112,1,13,335,1,9,475,1,9,142,1,13,216,1,18,2,A,7,2,A,7,10.6,A,7,-2.8,A,7,40,A,7,995,A,7,70,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,09:00,791,1344,558,1,9,720,1,9,134,1,13,590,1,9,724,1,9,163,1,13,315,1,18,1,A,7,0,A,7,13.3,A,7,-4.4,A,7,29,A,7,995,A,7,50,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,10:00,996,1344,747,1,9,742,1,9,197,1,13,788,1,9,752,1,9,230,1,13,597,1,18,6,A,7,0,A,7,14.4,A,7,-3.9,A,7,28,A,7,995,A,7,50,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,11:00,1149,1344,890,1,9,796,1,9,209,1,13,950,1,9,813,1,9,253,1,13,908,1,18,5,A,7,0,A,7,16.1,A,7,-3.9,A,7,25,A,7,995,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,12:00,1238,1344,898,1,9,706,1,9,247,1,13,956,1,9,719,1,9,292,1,13,1477,1,18,7,A,7,2,A,7,16.7,A,7,-2.8,A,7,27,A,7,994,A,7,270,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,13:00,1257,1344,902,1,9,708,1,9,239,1,13,965,1,9,723,1,9,286,1,13,1578,1,18,6,A,7,2,A,7,17.8,A,7,-3.9,A,7,23,A,7,994,A,7,180,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,14:00,1206,1344,934,1,9,830,1,9,189,1,13,977,1,9,833,1,9,227,1,13,911,1,18,2,A,7,0,A,7,19.4,A,7,-3.9,A,7,20,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,15:00,1088,1344,820,1,9,805,1,9,168,1,13,855,1,9,807,1,9,200,1,13,561,1,18,1,A,7,0,A,7,20.6,A,7,-3.3,A,7,20,A,7,991,A,7,190,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,16:00,911,1344,663,1,9,766,1,9,145,1,13,709,1,9,780,1,9,179,1,13,394,1,18,0,A,7,0,A,7,20.6,A,7,-3.3,A,7,20,A,7,991,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,17:00,686,1344,458,1,9,672,1,9,117,1,13,484,1,9,665,1,9,144,1,13,252,1,18,0,A,7,0,A,7,20.6,A,7,-2.2,A,7,22,A,7,990,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,18:00,430,1344,238,1,9,497,1,9,81,1,13,248,1,9,445,1,9,105,1,13,151,1,18,0,A,7,0,A,7,19.4,A,7,-2.2,A,7,23,A,7,989,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,19:00,162,1344,56,1,13,153,1,9,38,1,13,59,1,13,88,1,9,48,1,13,68,1,21,0,A,7,0,A,7,17.2,A,7,-1.1,A,7,29,A,7,989,A,7,170,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,20:00,2,190,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,15.0,A,7,-0.6,A,7,35,A,7,989,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,0.0,A,7,42,A,7,990,A,7,180,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,1.1,A,7,47,A,7,990,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,1.1,A,7,52,A,7,990,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/04/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,2.2,A,7,66,A,7,989,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,1.7,A,7,59,A,7,989,A,7,190,A,7,1.5,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,1.7,A,7,61,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,1.7,A,7,63,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,2.8,A,7,64,A,7,989,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,3.9,A,7,71,A,7,989,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,06:00,43,795,21,1,13,49,1,9,16,1,13,20,1,13,16,1,9,19,1,13,27,1,21,0,A,7,0,A,7,10.0,A,7,4.4,A,7,69,A,7,990,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,07:00,284,1343,124,1,13,316,1,9,58,1,13,132,1,13,244,1,9,81,1,13,104,1,21,3,A,7,3,A,7,12.2,A,7,5.0,A,7,62,A,7,990,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,08:00,550,1343,314,1,9,487,1,9,115,1,13,337,1,9,471,1,9,144,1,13,223,1,18,6,A,7,2,A,7,15.0,A,7,6.1,A,7,56,A,7,991,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,09:00,794,1343,522,1,9,594,1,9,172,1,13,543,1,9,590,1,9,194,1,13,390,1,18,7,A,7,2,A,7,18.3,A,7,7.2,A,7,49,A,7,991,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,10:00,999,1343,696,1,13,649,1,9,213,1,13,730,1,13,655,1,9,242,1,13,643,1,21,6,A,7,3,A,7,22.2,A,7,7.2,A,7,38,A,7,990,A,7,260,A,7,4.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,11:00,1151,1343,827,1,13,681,1,9,244,1,13,874,1,13,691,1,9,281,1,13,1055,1,21,6,A,7,3,A,7,22.8,A,7,6.7,A,7,36,A,7,990,A,7,240,A,7,4.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,12:00,1240,1343,782,1,13,524,1,9,298,1,13,854,1,13,549,1,9,346,1,13,1838,1,21,6,A,7,4,A,7,24.4,A,7,7.8,A,7,35,A,7,989,A,7,230,A,7,4.6,A,7,24100,B,7,7620,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,13:00,1259,1343,862,1,13,606,1,9,293,1,13,908,1,13,612,1,9,333,1,13,1934,1,21,6,A,7,3,A,7,24.4,A,7,7.8,A,7,35,A,7,989,A,7,240,A,7,4.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,14:00,1208,1343,846,1,9,767,1,9,156,1,13,903,1,9,777,1,9,203,1,13,788,1,18,3,A,7,1,A,7,25.6,A,7,8.9,A,7,35,A,7,988,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,15:00,1090,1343,807,1,9,848,1,9,120,1,13,834,1,9,848,1,9,144,1,13,355,1,18,1,A,7,1,A,7,26.1,A,7,8.3,A,7,33,A,7,987,A,7,210,A,7,4.1,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,16:00,913,1343,666,1,9,814,1,9,114,1,13,708,1,9,819,1,9,150,1,13,299,1,18,0,A,7,0,A,7,25.6,A,7,8.3,A,7,34,A,7,986,A,7,200,A,7,4.1,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,17:00,689,1343,466,1,9,731,1,9,93,1,13,488,1,9,717,1,9,120,1,13,197,1,18,0,A,7,0,A,7,25.6,A,7,8.3,A,7,34,A,7,986,A,7,220,A,7,4.1,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,18:00,433,1343,248,1,9,570,1,9,66,1,13,262,1,9,517,1,9,95,1,13,128,1,18,0,A,7,0,A,7,24.4,A,7,10.0,A,7,40,A,7,985,A,7,200,A,7,3.6,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,19:00,165,1343,62,1,13,240,1,9,34,1,13,67,1,13,139,1,9,50,1,13,60,1,21,0,A,7,0,A,7,22.8,A,7,10.0,A,7,45,A,7,986,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,20:00,3,190,2,1,13,2,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,20.0,A,7,10.0,A,7,53,A,7,986,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,10.6,A,7,61,A,7,987,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,11.1,A,7,63,A,7,987,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.9,A,7,11.1,A,7,61,A,7,987,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/05/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,11.1,A,7,63,A,7,987,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,11.1,A,7,70,A,7,987,A,7,200,A,7,1.5,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,13.3,A,7,78,A,7,987,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.1,A,7,13.9,A,7,87,A,7,987,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,13.9,A,7,90,A,7,987,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,13.3,A,7,93,A,7,987,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,06:00,45,817,23,1,13,65,1,9,16,1,13,21,1,13,21,1,9,20,1,13,27,1,21,0,A,7,0,A,7,13.9,A,7,13.3,A,7,97,A,7,988,A,7,200,A,7,2.1,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,07:00,288,1342,145,1,13,456,1,9,47,1,13,150,1,13,361,1,9,73,1,13,87,1,21,1,A,7,0,A,7,16.1,A,7,15.0,A,7,93,A,7,988,A,7,200,A,7,2.6,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,08:00,553,1342,354,1,9,686,1,9,72,1,13,370,1,9,654,1,9,100,1,13,147,1,18,0,A,7,0,A,7,19.4,A,7,15.6,A,7,78,A,7,988,A,7,230,A,7,3.6,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,09:00,796,1342,563,1,9,790,1,9,94,1,13,598,1,9,790,1,9,128,1,13,224,1,18,0,A,7,0,A,7,22.2,A,7,16.1,A,7,69,A,7,988,A,7,270,A,7,2.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,10:00,1001,1342,746,1,9,851,1,9,111,1,13,772,1,9,849,1,9,137,1,13,280,1,18,0,A,7,0,A,7,25.0,A,7,15.6,A,7,56,A,7,988,A,7,220,A,7,2.1,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,11:00,1153,1342,883,1,9,885,1,9,122,1,13,910,1,9,886,1,9,147,1,13,432,1,18,0,A,7,0,A,7,27.2,A,7,15.0,A,7,47,A,7,987,A,7,230,A,7,3.6,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,12:00,1241,1342,962,1,9,902,1,9,127,1,13,990,1,9,905,1,9,151,1,13,629,1,18,0,A,7,0,A,7,27.8,A,7,15.0,A,7,46,A,7,987,A,7,250,A,7,3.1,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,13:00,1261,1342,922,1,9,816,1,9,155,1,13,991,1,9,829,1,9,211,1,13,1006,1,18,2,A,7,2,A,7,28.9,A,7,15.0,A,7,43,A,7,986,A,7,260,A,7,4.1,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,14:00,1210,1342,798,1,13,634,1,9,226,1,13,852,1,13,648,1,9,267,1,13,1211,1,21,4,A,7,4,A,7,28.9,A,7,15.0,A,7,43,A,7,985,A,7,220,A,7,3.1,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,15:00,1092,1342,716,1,13,564,1,9,257,1,13,778,1,13,590,1,9,298,1,13,964,1,21,6,A,7,4,A,7,29.4,A,7,14.4,A,7,40,A,7,984,A,7,200,A,7,3.6,A,7,11300,B,7,7620,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,16:00,915,1342,436,1,13,223,1,9,285,1,13,481,1,13,236,1,9,320,1,13,842,1,21,7,A,7,6,A,7,30.6,A,7,14.4,A,7,38,A,7,984,A,7,190,A,7,3.6,A,7,11300,B,7,7620,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,17:00,691,1342,254,1,9,91,1,9,208,1,13,280,1,9,91,1,9,233,1,13,636,1,18,9,A,7,8,A,7,27.8,A,7,13.9,A,7,43,A,7,984,A,7,200,A,7,3.6,A,7,11300,B,7,3050,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,18:00,436,1342,161,1,13,82,1,9,135,1,13,177,1,13,76,1,9,152,1,13,356,1,21,9,A,7,6,A,7,27.2,A,7,14.4,A,7,46,A,7,983,A,7,210,A,7,4.1,A,7,11300,B,7,7620,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,19:00,169,1342,44,1,13,20,1,9,41,1,13,48,1,13,14,1,9,46,1,13,100,1,21,10,A,7,8,A,7,25.6,A,7,14.4,A,7,50,A,7,984,A,7,210,A,7,2.6,A,7,11300,B,7,7620,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,20:00,3,213,2,1,13,0,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,9,A,7,25.0,A,7,14.4,A,7,52,A,7,984,A,7,250,A,7,2.6,A,7,11300,B,7,7620,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,23.3,A,7,15.6,A,7,62,A,7,984,A,7,240,A,7,2.6,A,7,11300,B,7,7620,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,22.2,A,7,15.6,A,7,66,A,7,985,A,7,240,A,7,2.1,A,7,11300,B,7,7620,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,21.1,A,7,16.1,A,7,73,A,7,985,A,7,220,A,7,2.1,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/06/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,20.0,A,7,16.1,A,7,78,A,7,985,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.9,A,7,16.1,A,7,84,A,7,984,A,7,0,A,7,0.0,A,7,12900,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,17.2,A,7,15.6,A,7,90,A,7,984,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,18.3,A,7,16.1,A,7,87,A,7,984,A,7,230,A,7,2.6,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,17.2,A,7,15.6,A,7,90,A,7,984,A,7,230,A,7,2.6,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,17.2,A,7,15.6,A,7,90,A,7,984,A,7,240,A,7,2.6,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,06:00,48,839,26,1,13,26,1,9,23,1,13,27,1,13,11,1,9,26,1,13,47,1,21,8,A,7,4,A,7,17.8,A,7,16.1,A,7,90,A,7,984,A,7,250,A,7,1.5,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,07:00,292,1342,128,1,13,204,1,9,84,1,13,135,1,13,160,1,9,100,1,13,163,1,21,8,A,7,3,A,7,19.4,A,7,16.7,A,7,84,A,7,984,A,7,240,A,7,1.5,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,08:00,556,1342,337,1,9,635,1,9,74,1,13,359,1,9,614,1,9,104,1,13,153,1,18,4,A,7,1,A,7,23.3,A,7,17.2,A,7,69,A,7,985,A,7,280,A,7,3.1,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,09:00,799,1342,541,1,9,770,1,9,82,1,13,583,1,9,774,1,9,121,1,13,205,1,18,1,A,7,1,A,7,26.1,A,7,16.1,A,7,54,A,7,985,A,7,290,A,7,5.2,A,7,6400,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,10:00,1003,1342,684,1,13,674,1,9,180,1,13,727,1,13,686,1,9,213,1,13,560,1,21,3,A,7,3,A,7,27.2,A,7,16.1,A,7,51,A,7,985,A,7,290,A,7,3.6,A,7,8000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/07/1986,11:00,1155,1342,861,1,9,868,1,9,114,1,13,890,1,9,870,1,9,140,1,13,419,1,18,2,A,7,2,A,7,28.3,A,7,16.1,A,7,48,A,7,984,A,7,330,A,7,4.1,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/07/1986,12:00,1243,1342,956,1,9,916,1,9,108,1,13,990,1,9,920,1,9,136,1,13,567,1,18,0,A,7,0,A,7,29.4,A,7,16.7,A,7,46,A,7,984,A,7,300,A,7,4.1,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,13:00,1262,1342,793,1,13,405,1,9,412,1,13,874,1,13,441,1,9,458,1,13,2554,1,21,6,A,7,6,A,7,30.6,A,7,15.6,A,7,40,A,7,983,A,7,310,A,7,3.6,A,7,11300,B,7,1220,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,14:00,1211,1342,822,1,13,681,1,9,207,1,13,884,1,13,699,1,9,252,1,13,1125,1,21,4,A,7,4,A,7,30.6,A,7,16.1,A,7,42,A,7,982,A,7,190,A,7,2.1,A,7,8000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,15:00,1093,1342,700,1,13,580,1,9,227,1,13,739,1,13,588,1,9,258,1,13,842,1,21,4,A,7,4,A,7,31.7,A,7,15.0,A,7,36,A,7,982,A,7,290,A,7,4.6,A,7,8000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/07/1986,16:00,917,1342,616,1,13,630,1,9,187,1,13,648,1,13,635,1,9,213,1,13,498,1,21,3,A,7,3,A,7,31.7,A,7,15.0,A,7,36,A,7,981,A,7,230,A,7,4.1,A,7,9700,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/07/1986,17:00,693,1342,450,1,9,675,1,9,103,1,13,480,1,9,673,1,9,132,1,13,227,1,18,2,A,7,2,A,7,31.7,A,7,14.4,A,7,35,A,7,980,A,7,260,A,7,4.1,A,7,9700,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/07/1986,18:00,439,1342,240,1,9,557,1,9,59,1,13,255,1,9,510,1,9,88,1,13,117,1,18,2,A,7,2,A,7,29.4,A,7,17.2,A,7,48,A,7,980,A,7,200,A,7,3.6,A,7,9700,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/07/1986,19:00,172,1342,67,1,13,260,1,9,35,1,13,69,1,13,163,1,9,49,1,13,62,1,21,5,A,7,5,A,7,27.8,A,7,16.1,A,7,49,A,7,980,A,7,210,A,7,3.6,A,7,9700,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/07/1986,20:00,4,235,0,1,13,1,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,8,A,7,8,A,7,26.7,A,7,16.1,A,7,52,A,7,980,A,7,270,A,7,4.1,A,7,11300,B,7,1220,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/07/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,23.9,A,7,16.7,A,7,64,A,7,980,A,7,250,A,7,2.6,A,7,12900,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/07/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,22.8,A,7,16.1,A,7,66,A,7,980,A,7,220,A,7,2.1,A,7,12900,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,21.1,A,7,16.7,A,7,76,A,7,980,A,7,220,A,7,2.1,A,7,12900,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/07/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,21.1,A,7,16.7,A,7,76,A,7,980,A,7,250,A,7,2.6,A,7,12900,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,4,A,7,20.6,A,7,17.2,A,7,81,A,7,980,A,7,250,A,7,3.1,A,7,12900,B,7,7620,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,20.0,A,7,16.1,A,7,78,A,7,980,A,7,0,A,7,0.0,A,7,12900,B,7,7620,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -05/08/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,20.0,A,7,16.1,A,7,78,A,7,980,A,7,0,A,7,0.0,A,7,12900,B,7,7620,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,5,A,7,18.9,A,7,15.6,A,7,81,A,7,980,A,7,0,A,7,0.0,A,7,12900,B,7,7620,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,18.3,A,7,15.6,A,7,84,A,7,980,A,7,0,A,7,0.0,A,7,12900,B,7,7620,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,06:00,50,861,17,1,13,0,1,9,17,1,13,19,1,13,0,1,9,19,1,13,59,1,21,10,A,7,9,A,7,16.7,A,7,15.0,A,7,90,A,7,979,A,7,90,A,7,2.1,A,7,12900,B,7,7620,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,07:00,296,1341,99,1,13,42,1,9,89,1,13,108,1,13,35,1,9,100,1,13,220,1,21,10,A,7,5,A,7,20.6,A,7,15.0,A,7,71,A,7,980,A,7,240,A,7,1.5,A,7,12900,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,08:00,560,1341,244,1,13,176,1,9,171,1,13,267,1,13,175,1,9,193,1,13,404,1,21,7,A,7,6,A,7,22.8,A,7,15.0,A,7,62,A,7,980,A,7,80,A,7,3.1,A,7,16100,B,7,7620,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,09:00,802,1341,494,1,13,428,1,9,238,1,13,517,1,13,437,1,9,255,1,13,570,1,21,6,A,7,3,A,7,23.3,A,7,15.0,A,7,60,A,7,981,A,7,60,A,7,4.1,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,10:00,1005,1341,642,1,13,506,1,9,262,1,13,687,1,13,527,1,9,292,1,13,823,1,21,4,A,7,3,A,7,25.0,A,7,15.0,A,7,54,A,7,981,A,7,10,A,7,5.2,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,11:00,1156,1341,547,1,13,134,1,9,432,1,13,600,1,13,143,1,9,477,1,13,1814,1,21,8,A,7,7,A,7,24.4,A,7,15.0,A,7,56,A,7,981,A,7,360,A,7,5.2,A,7,16100,B,7,3660,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,12:00,1244,1341,871,1,13,568,1,9,343,1,13,938,1,13,594,1,9,386,1,13,2195,1,21,7,A,7,5,A,7,25.0,A,7,15.0,A,7,54,A,7,981,A,7,330,A,7,5.7,A,7,24100,B,7,7620,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,13:00,1264,1341,804,1,13,493,1,9,339,1,13,870,1,13,516,1,9,382,1,13,2396,1,21,6,A,7,5,A,7,24.4,A,7,15.6,A,7,58,A,7,981,A,7,340,A,7,5.2,A,7,24100,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,14:00,1213,1341,612,1,9,194,1,9,437,1,13,674,1,9,207,1,9,486,1,13,2120,1,18,8,A,7,8,A,7,26.1,A,7,15.6,A,7,52,A,7,980,A,7,40,A,7,3.6,A,7,24100,B,7,3050,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,15:00,1095,1341,703,1,13,436,1,9,346,1,13,741,1,13,454,1,9,369,1,13,1336,1,21,10,A,7,4,A,7,25.6,A,7,15.0,A,7,52,A,7,980,A,7,340,A,7,2.6,A,7,24100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,16:00,919,1341,554,1,13,346,1,9,318,1,13,597,1,13,372,1,9,342,1,13,904,1,21,10,A,7,4,A,7,26.1,A,7,15.0,A,7,51,A,7,979,A,7,20,A,7,2.6,A,7,24100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,17:00,696,1341,377,1,13,302,1,9,221,1,13,404,1,13,315,1,9,240,1,13,512,1,21,10,A,7,5,A,7,25.6,A,7,15.0,A,7,52,A,7,980,A,7,20,A,7,3.1,A,7,24100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,18:00,442,1341,215,1,13,249,1,9,134,1,13,228,1,13,232,1,9,152,1,13,274,1,21,9,A,7,3,A,7,24.4,A,7,15.6,A,7,58,A,7,980,A,7,80,A,7,2.6,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,19:00,175,1341,54,1,13,40,1,9,49,1,13,59,1,13,28,1,9,56,1,13,116,1,21,10,A,7,3,A,7,23.3,A,7,15.6,A,7,62,A,7,980,A,7,90,A,7,2.1,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,20:00,4,257,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,8,A,7,2,A,7,22.2,A,7,15.6,A,7,66,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,2,A,7,20.6,A,7,15.6,A,7,73,A,7,981,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,2,A,7,18.9,A,7,15.0,A,7,78,A,7,981,A,7,80,A,7,2.6,A,7,24100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,2,A,7,18.3,A,7,13.9,A,7,76,A,7,982,A,7,140,A,7,2.1,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/08/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,12.8,A,7,73,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,17.2,A,7,12.8,A,7,75,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,16.7,A,7,13.9,A,7,84,A,7,982,A,7,10,A,7,3.1,A,7,24100,B,7,1400,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,16.1,A,7,13.3,A,7,84,A,7,982,A,7,70,A,7,2.6,A,7,16100,B,7,1310,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,15.0,A,7,12.8,A,7,87,A,7,983,A,7,60,A,7,2.1,A,7,16100,B,7,1310,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,12.8,A,7,84,A,7,983,A,7,50,A,7,2.6,A,7,16100,B,7,1400,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,06:00,53,883,14,1,13,9,1,9,13,1,13,15,1,13,5,1,9,15,1,13,33,1,21,9,A,7,9,A,7,15.6,A,7,12.8,A,7,84,A,7,984,A,7,60,A,7,3.6,A,7,16100,B,7,1680,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,07:00,299,1341,45,1,13,7,1,9,44,1,13,53,1,13,2,1,9,53,1,13,175,1,21,10,A,7,10,A,7,15.6,A,7,11.7,A,7,78,A,7,986,A,7,50,A,7,6.7,A,7,16100,B,7,1680,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,08:00,563,1341,125,1,9,1,1,9,125,1,13,145,1,9,1,1,9,145,1,13,516,1,18,10,A,7,10,A,7,13.9,A,7,10.0,A,7,78,A,7,987,A,7,40,A,7,7.7,A,7,16100,B,7,1680,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,09:00,804,1341,349,1,9,136,1,9,267,1,13,381,1,9,142,1,9,295,1,13,722,1,18,9,A,7,9,A,7,14.4,A,7,10.0,A,7,75,A,7,989,A,7,70,A,7,5.2,A,7,16100,B,7,550,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,10:00,1007,1341,605,1,9,458,1,9,261,1,13,649,1,9,477,1,9,290,1,13,823,1,18,8,A,7,8,A,7,14.4,A,7,10.0,A,7,75,A,7,988,A,7,50,A,7,4.6,A,7,16100,B,7,580,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,11:00,1158,1341,584,1,9,261,1,9,358,1,13,642,1,9,284,1,9,396,1,13,1528,1,18,9,A,7,9,A,7,16.1,A,7,10.0,A,7,67,A,7,988,A,7,30,A,7,5.2,A,7,16100,B,7,610,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,12:00,1246,1341,422,1,9,10,1,9,413,1,13,497,1,9,10,1,9,488,1,13,1786,1,18,10,A,7,10,A,7,16.1,A,7,10.0,A,7,67,A,7,988,A,7,50,A,7,4.6,A,7,16100,B,7,670,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,13:00,1265,1341,330,1,9,14,1,9,317,1,13,398,1,9,12,1,9,386,1,13,1486,1,18,10,A,7,10,A,7,15.6,A,7,10.0,A,7,70,A,7,988,A,7,70,A,7,5.7,A,7,11300,B,7,670,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,14:00,1214,1341,328,1,9,11,1,9,318,1,13,392,1,9,10,1,9,383,1,13,1474,1,18,10,A,7,10,A,7,15.0,A,7,10.0,A,7,72,A,7,989,A,7,30,A,7,4.6,A,7,11300,B,7,640,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,15:00,1097,1341,301,1,9,4,1,9,299,1,13,357,1,9,4,1,9,354,1,13,1372,1,18,10,A,7,10,A,7,15.6,A,7,10.0,A,7,70,A,7,989,A,7,40,A,7,5.2,A,7,11300,B,7,700,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,16:00,920,1341,264,1,9,5,1,9,261,1,13,308,1,9,4,1,9,305,1,13,1149,1,18,10,A,7,10,A,7,15.0,A,7,10.0,A,7,72,A,7,989,A,7,50,A,7,5.2,A,7,12900,B,7,700,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,17:00,698,1341,200,1,9,2,1,9,199,1,13,229,1,9,2,1,9,228,1,13,810,1,18,10,A,7,10,A,7,15.0,A,7,9.4,A,7,70,A,7,989,A,7,70,A,7,5.2,A,7,12900,B,7,700,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,18:00,444,1341,124,1,9,2,1,9,123,1,13,139,1,9,1,1,9,139,1,13,452,1,18,10,A,7,10,A,7,15.0,A,7,8.9,A,7,67,A,7,988,A,7,40,A,7,4.6,A,7,16100,B,7,760,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,19:00,178,1341,40,1,13,0,1,9,40,1,13,45,1,13,0,1,9,45,1,13,138,1,21,10,A,7,10,A,7,14.4,A,7,8.9,A,7,70,A,7,989,A,7,50,A,7,4.1,A,7,16100,B,7,760,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,20:00,5,279,3,1,13,0,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,13.9,A,7,8.9,A,7,72,A,7,989,A,7,60,A,7,2.6,A,7,16100,B,7,1160,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,8.9,A,7,75,A,7,990,A,7,60,A,7,2.6,A,7,16100,B,7,980,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,9.4,A,7,78,A,7,990,A,7,80,A,7,3.1,A,7,16100,B,7,980,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,8.9,A,7,75,A,7,990,A,7,70,A,7,3.1,A,7,16100,B,7,980,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/09/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,8.3,A,7,75,A,7,991,A,7,80,A,7,4.1,A,7,24100,B,7,910,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,7.8,A,7,75,A,7,991,A,7,90,A,7,3.1,A,7,24100,B,7,910,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,9.4,A,7,7.2,A,7,86,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,8.9,A,7,7.2,A,7,89,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,8.3,A,7,6.7,A,7,89,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,5.6,A,7,93,A,7,990,A,7,290,A,7,2.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,06:00,55,904,23,1,13,49,1,9,19,1,13,24,1,13,17,1,9,23,1,13,33,1,21,0,A,7,0,A,7,5.6,A,7,4.4,A,7,93,A,7,991,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,07:00,303,1340,145,1,13,395,1,9,56,1,13,149,1,13,317,1,9,78,1,13,102,1,21,0,A,7,0,A,7,10.0,A,7,7.2,A,7,83,A,7,992,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,08:00,565,1340,359,1,9,642,1,9,88,1,13,378,1,9,619,1,9,117,1,13,179,1,18,0,A,7,0,A,7,13.3,A,7,7.8,A,7,69,A,7,992,A,7,320,A,7,2.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,09:00,807,1340,573,1,9,760,1,9,116,1,13,597,1,9,754,1,9,142,1,13,259,1,18,0,A,7,0,A,7,15.0,A,7,7.2,A,7,60,A,7,992,A,7,20,A,7,2.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,10:00,1009,1340,758,1,9,825,1,9,136,1,13,800,1,9,831,1,9,173,1,13,404,1,18,0,A,7,0,A,7,16.7,A,7,2.8,A,7,40,A,7,992,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,11:00,1160,1340,897,1,9,863,1,9,149,1,13,956,1,9,874,1,9,198,1,13,642,1,18,0,A,7,0,A,7,17.2,A,7,3.9,A,7,41,A,7,991,A,7,300,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,12:00,1247,1340,915,1,9,817,1,9,154,1,13,983,1,9,830,1,9,209,1,13,944,1,18,3,A,7,1,A,7,18.3,A,7,2.8,A,7,36,A,7,991,A,7,20,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,13:00,1266,1340,993,1,9,883,1,9,157,1,13,1014,1,9,884,1,9,176,1,13,843,1,18,0,A,7,0,A,7,19.4,A,7,3.3,A,7,35,A,7,990,A,7,360,A,7,4.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,14:00,1215,1340,948,1,9,870,1,9,158,1,13,1011,1,9,881,1,9,210,1,13,831,1,18,1,A,7,0,A,7,21.1,A,7,3.3,A,7,31,A,7,989,A,7,310,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,15:00,1098,1340,829,1,9,832,1,9,148,1,13,879,1,9,840,1,9,189,1,13,531,1,18,1,A,7,0,A,7,21.1,A,7,4.4,A,7,34,A,7,988,A,7,10,A,7,3.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,16:00,922,1340,672,1,9,788,1,9,131,1,13,705,1,9,789,1,9,161,1,13,334,1,18,1,A,7,0,A,7,21.7,A,7,3.3,A,7,30,A,7,987,A,7,60,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,17:00,700,1340,476,1,9,714,1,9,104,1,13,508,1,9,713,1,9,134,1,13,231,1,18,0,A,7,0,A,7,21.7,A,7,3.3,A,7,30,A,7,987,A,7,20,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,18:00,447,1340,258,1,9,558,1,9,73,1,13,271,1,9,509,1,9,101,1,13,141,1,18,0,A,7,0,A,7,20.6,A,7,4.4,A,7,35,A,7,987,A,7,100,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,19:00,182,1340,70,1,13,236,1,9,39,1,13,75,1,13,145,1,9,55,1,13,69,1,21,0,A,7,0,A,7,18.3,A,7,4.4,A,7,40,A,7,987,A,7,60,A,7,1.5,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,20:00,5,301,3,1,13,2,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,16.7,A,7,5.0,A,7,46,A,7,987,A,7,80,A,7,1.5,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,5.6,A,7,56,A,7,987,A,7,90,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,5.6,A,7,58,A,7,987,A,7,120,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,5.0,A,7,62,A,7,987,A,7,170,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/10/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,5.6,A,7,69,A,7,987,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,5.6,A,7,77,A,7,988,A,7,200,A,7,1.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,5.6,A,7,72,A,7,987,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,5.6,A,7,83,A,7,987,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,5.6,A,7,86,A,7,987,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,3.9,A,7,83,A,7,986,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,06:00,57,926,28,1,13,91,1,9,19,1,13,27,1,13,37,1,9,24,1,13,33,1,21,0,A,7,0,A,7,7.2,A,7,5.6,A,7,89,A,7,985,A,7,200,A,7,2.1,A,7,11300,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,07:00,306,1339,160,1,13,488,1,9,49,1,13,167,1,13,396,1,9,76,1,13,92,1,21,1,A,7,0,A,7,11.7,A,7,7.2,A,7,74,A,7,985,A,7,200,A,7,1.5,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,08:00,568,1339,309,1,13,357,1,9,158,1,13,332,1,13,358,1,9,180,1,13,333,1,21,6,A,7,3,A,7,15.6,A,7,7.2,A,7,58,A,7,985,A,7,200,A,7,3.6,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,09:00,809,1339,528,1,9,660,1,9,129,1,13,561,1,9,667,1,9,157,1,13,312,1,18,6,A,7,2,A,7,18.3,A,7,9.4,A,7,56,A,7,985,A,7,220,A,7,4.1,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,10:00,1011,1339,600,1,13,460,1,9,253,1,13,646,1,13,479,1,9,284,1,13,803,1,21,5,A,7,5,A,7,20.6,A,7,10.6,A,7,53,A,7,984,A,7,260,A,7,5.7,A,7,11300,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,11:00,1161,1339,691,1,13,560,1,9,204,1,13,739,1,13,573,1,9,241,1,13,935,1,21,3,A,7,3,A,7,22.8,A,7,12.2,A,7,52,A,7,984,A,7,210,A,7,5.2,A,7,11300,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,12:00,1249,1339,971,1,9,904,1,9,127,1,13,999,1,9,907,1,9,151,1,13,663,1,18,0,A,7,0,A,7,25.0,A,7,13.9,A,7,50,A,7,982,A,7,250,A,7,5.2,A,7,11300,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,13:00,1268,1339,980,1,9,899,1,9,129,1,13,1008,1,9,902,1,9,153,1,13,747,1,18,0,A,7,0,A,7,26.7,A,7,15.0,A,7,49,A,7,981,A,7,280,A,7,4.1,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,14:00,1217,1339,870,1,13,636,1,9,292,1,13,914,1,13,641,1,9,330,1,13,1601,1,21,7,A,7,7,A,7,26.7,A,7,15.0,A,7,49,A,7,981,A,7,260,A,7,4.6,A,7,9700,B,7,1220,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,15:00,1100,1339,422,1,9,65,1,9,369,1,13,466,1,9,67,1,9,411,1,13,1523,1,18,8,A,7,8,A,7,27.2,A,7,14.4,A,7,46,A,7,980,A,7,250,A,7,3.6,A,7,9700,B,7,1220,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/11/1986,16:00,924,1339,402,1,9,94,1,9,337,1,13,442,1,9,96,1,9,376,1,13,1159,1,18,10,A,7,9,A,7,27.8,A,7,13.3,A,7,41,A,7,979,A,7,300,A,7,4.1,A,7,9700,B,7,1220,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/11/1986,17:00,703,1339,362,1,13,227,1,9,244,1,13,394,1,13,234,1,9,272,1,13,619,1,21,6,A,7,6,A,7,25.6,A,7,15.6,A,7,54,A,7,978,A,7,120,A,7,2.6,A,7,9700,B,7,1220,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/11/1986,18:00,450,1339,264,1,13,507,1,9,95,1,13,272,1,13,457,1,9,118,1,13,175,1,21,3,A,7,3,A,7,26.7,A,7,16.1,A,7,52,A,7,978,A,7,140,A,7,1.5,A,7,8000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/11/1986,19:00,185,1339,54,1,13,104,1,9,40,1,13,58,1,13,63,1,9,50,1,13,72,1,21,4,A,7,3,A,7,25.0,A,7,15.0,A,7,54,A,7,978,A,7,260,A,7,3.1,A,7,8000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/11/1986,20:00,6,301,2,1,13,4,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,2,A,7,2,A,7,22.2,A,7,16.1,A,7,69,A,7,979,A,7,50,A,7,2.6,A,7,8000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/11/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,21.1,A,7,15.0,A,7,68,A,7,979,A,7,250,A,7,3.1,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/11/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,20.6,A,7,15.0,A,7,71,A,7,979,A,7,290,A,7,2.1,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,18.3,A,7,16.1,A,7,87,A,7,979,A,7,90,A,7,1.5,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/11/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,18.3,A,7,16.7,A,7,90,A,7,980,A,7,40,A,7,2.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,18.3,A,7,16.7,A,7,90,A,7,980,A,7,30,A,7,3.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,16.7,A,7,12.2,A,7,75,A,7,980,A,7,40,A,7,3.6,A,7,11300,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,15.6,A,7,10.0,A,7,70,A,7,980,A,7,30,A,7,4.1,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,14.4,A,7,8.3,A,7,67,A,7,981,A,7,30,A,7,5.2,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,13.3,A,7,7.8,A,7,69,A,7,981,A,7,40,A,7,4.1,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,06:00,60,948,22,1,13,30,1,9,19,1,13,23,1,13,14,1,9,22,1,13,39,1,21,4,A,7,2,A,7,12.2,A,7,7.8,A,7,75,A,7,982,A,7,20,A,7,5.2,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,07:00,309,1339,144,1,13,194,1,9,99,1,13,150,1,13,156,1,9,114,1,13,198,1,21,7,A,7,3,A,7,12.2,A,7,7.8,A,7,75,A,7,983,A,7,40,A,7,7.2,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,08:00,571,1339,241,1,13,195,1,9,158,1,13,265,1,13,195,1,9,181,1,13,376,1,21,7,A,7,6,A,7,12.8,A,7,8.9,A,7,77,A,7,984,A,7,40,A,7,7.7,A,7,16100,B,7,3050,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,09:00,811,1339,370,1,13,229,1,9,231,1,13,401,1,13,244,1,9,253,1,13,570,1,21,7,A,7,7,A,7,14.4,A,7,10.0,A,7,75,A,7,984,A,7,20,A,7,6.2,A,7,16100,B,7,3050,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,10:00,1013,1339,606,1,13,391,1,9,310,1,13,662,1,13,423,1,9,341,1,13,983,1,21,7,A,7,7,A,7,15.6,A,7,10.6,A,7,72,A,7,984,A,7,30,A,7,5.2,A,7,11300,B,7,520,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,11:00,1163,1339,590,1,9,253,1,9,370,1,13,648,1,9,275,1,9,408,1,13,1612,1,18,8,A,7,8,A,7,18.3,A,7,11.7,A,7,65,A,7,984,A,7,40,A,7,4.1,A,7,11300,B,7,3050,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,12:00,1250,1339,275,1,9,12,1,9,264,1,13,335,1,9,10,1,9,326,1,13,1284,1,18,10,A,7,10,A,7,18.9,A,7,11.7,A,7,63,A,7,983,A,7,20,A,7,4.1,A,7,9700,B,7,3050,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/12/1986,13:00,1269,1339,411,1,9,14,1,9,398,1,13,487,1,9,13,1,9,475,1,13,1754,1,18,10,A,7,10,A,7,20.6,A,7,12.2,A,7,59,A,7,983,A,7,90,A,7,2.6,A,7,8000,B,7,3050,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,14:00,1218,1339,669,1,9,374,1,9,329,1,13,722,1,9,391,1,9,365,1,13,1886,1,18,8,A,7,8,A,7,21.1,A,7,11.7,A,7,55,A,7,983,A,7,110,A,7,2.6,A,7,6400,B,7,3050,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,15:00,1101,1339,266,1,9,13,1,9,255,1,13,318,1,9,11,1,9,309,1,13,1217,1,18,10,A,7,10,A,7,21.1,A,7,11.7,A,7,55,A,7,982,A,7,260,A,7,1.5,A,7,6400,B,7,2440,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,16:00,926,1339,267,1,9,10,1,9,260,1,13,311,1,9,9,1,9,305,1,13,1151,1,18,10,A,7,10,A,7,20.6,A,7,12.8,A,7,61,A,7,982,A,7,220,A,7,2.6,A,7,6400,B,7,2440,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,17:00,705,1339,158,1,9,4,1,9,156,1,13,185,1,9,3,1,9,183,1,13,682,1,18,10,A,7,10,A,7,20.0,A,7,12.8,A,7,63,A,7,982,A,7,0,A,7,0.0,A,7,4800,B,7,2440,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,18:00,453,1339,131,1,9,4,1,9,130,1,13,147,1,9,3,1,9,146,1,13,474,1,18,10,A,7,10,A,7,19.4,A,7,13.3,A,7,68,A,7,982,A,7,230,A,7,2.6,A,7,4800,B,7,2130,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,19:00,188,1339,38,1,13,2,1,9,38,1,13,43,1,13,0,1,9,43,1,13,135,1,21,10,A,7,10,A,7,18.3,A,7,13.3,A,7,73,A,7,982,A,7,300,A,7,2.1,A,7,4800,B,7,2130,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,20:00,7,324,3,1,13,0,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,17.2,A,7,13.9,A,7,81,A,7,982,A,7,300,A,7,1.5,A,7,4800,B,7,2130,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,13.9,A,7,84,A,7,982,A,7,300,A,7,2.1,A,7,8000,B,7,2130,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,13.3,A,7,81,A,7,983,A,7,330,A,7,1.5,A,7,8000,B,7,2440,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,16.7,A,7,13.3,A,7,81,A,7,982,A,7,240,A,7,2.1,A,7,8000,B,7,2440,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/12/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,13.3,A,7,81,A,7,983,A,7,60,A,7,1.5,A,7,8000,B,7,2740,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/13/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,13.9,A,7,87,A,7,983,A,7,90,A,7,2.1,A,7,8000,B,7,640,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/13/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,13.9,A,7,87,A,7,984,A,7,90,A,7,1.5,A,7,8000,B,7,460,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/13/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,15.0,A,7,90,A,7,982,A,7,150,A,7,3.1,A,7,9700,B,7,460,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/13/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,15.0,A,7,93,A,7,982,A,7,160,A,7,3.1,A,7,9700,B,7,460,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/13/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,15.0,A,7,97,A,7,983,A,7,110,A,7,3.6,A,7,9700,B,7,460,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,06:00,62,948,9,1,13,0,1,9,9,1,13,11,1,13,0,1,9,11,1,13,35,1,21,10,A,7,10,A,7,14.4,A,7,12.8,A,7,90,A,7,983,A,7,120,A,7,2.1,A,7,8000,B,7,460,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,07:00,312,1338,47,1,13,0,1,9,47,1,13,55,1,13,0,1,9,55,1,13,188,1,21,10,A,7,10,A,7,13.9,A,7,13.3,A,7,97,A,7,984,A,7,80,A,7,2.1,A,7,9700,B,7,460,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,08:00,574,1338,114,1,9,2,1,9,113,1,13,133,1,9,1,1,9,132,1,13,481,1,18,10,A,7,10,A,7,13.3,A,7,13.3,A,7,100,A,7,984,A,7,40,A,7,2.6,A,7,9700,B,7,270,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,09:00,813,1338,154,1,9,0,1,9,154,1,13,183,1,9,0,1,9,183,1,13,721,1,18,10,A,7,10,A,7,13.3,A,7,13.3,A,7,100,A,7,985,A,7,70,A,7,3.1,A,7,2400,B,7,210,A,7,2.3,E,8,0.000,F,8,0.00,?,0,30,1,D,9,45,C,8 -05/13/1986,10:00,1015,1338,209,1,9,0,1,9,209,1,13,251,1,9,0,1,9,251,1,13,1013,1,18,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,985,A,7,70,A,7,2.6,A,7,2400,B,7,210,A,7,2.3,E,8,0.000,F,8,0.00,?,0,38,1,D,9,45,C,8 -05/13/1986,11:00,1164,1338,239,1,9,1,1,9,238,1,13,290,1,9,1,1,9,289,1,13,1165,1,18,10,A,7,10,A,7,12.2,A,7,12.2,A,7,100,A,7,985,A,7,40,A,7,4.6,A,7,6400,B,7,210,A,7,2.2,E,8,0.000,F,8,0.00,?,0,8,1,D,9,45,C,8 -05/13/1986,12:00,1251,1338,271,1,9,0,1,9,271,1,13,330,1,9,0,1,9,330,1,13,1312,1,18,10,A,7,10,A,7,12.2,A,7,12.2,A,7,100,A,7,985,A,7,40,A,7,4.6,A,7,6400,B,7,210,A,7,2.2,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -05/13/1986,13:00,1270,1338,287,1,9,1,1,9,286,1,13,348,1,9,1,1,9,348,1,13,1373,1,18,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,985,A,7,60,A,7,3.6,A,7,6400,B,7,120,A,7,2.1,E,8,0.000,F,8,0.00,?,0,58,1,D,9,45,C,8 -05/13/1986,14:00,1219,1338,280,1,9,0,1,9,280,1,13,338,1,9,0,1,9,338,1,13,1339,1,18,10,A,7,10,A,7,11.1,A,7,10.6,A,7,96,A,7,985,A,7,40,A,7,3.6,A,7,6400,B,7,120,A,7,2.0,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -05/13/1986,15:00,1103,1338,405,1,9,1,1,9,404,1,13,468,1,9,1,1,9,467,1,13,1685,1,18,10,A,7,10,A,7,11.7,A,7,11.1,A,7,96,A,7,985,A,7,30,A,7,3.6,A,7,6400,B,7,120,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,16:00,928,1338,347,1,9,0,1,9,347,1,13,395,1,9,0,1,9,395,1,13,1392,1,18,10,A,7,10,A,7,12.2,A,7,11.7,A,7,96,A,7,985,A,7,40,A,7,4.6,A,7,4000,B,7,120,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,17:00,707,1338,222,1,9,1,1,9,222,1,13,253,1,9,1,1,9,252,1,13,880,1,18,10,A,7,10,A,7,11.7,A,7,11.1,A,7,96,A,7,985,A,7,40,A,7,5.2,A,7,4000,B,7,120,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,18:00,455,1338,134,1,9,0,1,9,134,1,13,150,1,9,0,1,9,150,1,13,485,1,18,10,A,7,10,A,7,11.7,A,7,11.1,A,7,96,A,7,985,A,7,20,A,7,4.6,A,7,1600,B,7,60,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,19:00,191,1338,43,1,13,0,1,9,43,1,13,48,1,13,0,1,9,48,1,13,149,1,21,10,A,7,10,A,7,11.1,A,7,10.6,A,7,96,A,7,985,A,7,20,A,7,4.1,A,7,400,B,7,30,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,20:00,8,346,4,1,13,0,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,11.1,A,7,10.6,A,7,96,A,7,986,A,7,20,A,7,4.6,A,7,1600,B,7,60,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,10.6,A,7,96,A,7,986,A,7,10,A,7,4.1,A,7,1200,B,7,30,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,987,A,7,10,A,7,3.6,A,7,1200,B,7,30,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,987,A,7,30,A,7,3.6,A,7,1600,B,7,60,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/13/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,12.2,A,7,100,A,7,987,A,7,50,A,7,4.1,A,7,1600,B,7,60,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,12.2,A,7,100,A,7,987,A,7,60,A,7,3.1,A,7,2400,B,7,60,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,987,A,7,30,A,7,4.1,A,7,1600,B,7,60,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -05/14/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,986,A,7,40,A,7,5.2,A,7,1600,B,7,30,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,987,A,7,30,A,7,3.6,A,7,1200,B,7,30,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,987,A,7,30,A,7,3.6,A,7,1200,B,7,30,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,06:00,65,970,14,1,13,0,1,9,14,1,13,16,1,13,0,1,9,16,1,13,51,1,21,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,988,A,7,50,A,7,3.6,A,7,1600,B,7,30,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,07:00,315,1337,92,1,13,0,1,9,92,1,13,102,1,13,0,1,9,102,1,13,311,1,21,10,A,7,10,A,7,10.6,A,7,10.6,A,7,100,A,7,989,A,7,30,A,7,3.6,A,7,2400,B,7,60,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,08:00,576,1337,106,1,9,1,1,9,105,1,13,124,1,9,1,1,9,124,1,13,455,1,18,10,A,7,10,A,7,10.6,A,7,10.6,A,7,100,A,7,989,A,7,60,A,7,4.1,A,7,1200,B,7,60,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,20,C,8 -05/14/1986,09:00,815,1337,169,1,9,1,1,9,168,1,13,200,1,9,1,1,9,199,1,13,775,1,18,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,990,A,7,30,A,7,3.6,A,7,1600,B,7,60,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,20,C,8 -05/14/1986,10:00,1017,1337,213,1,9,1,1,9,212,1,13,255,1,9,1,1,9,255,1,13,1026,1,18,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,990,A,7,20,A,7,3.1,A,7,1600,B,7,90,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,11:00,1166,1337,265,1,9,1,1,9,264,1,13,319,1,9,1,1,9,318,1,13,1266,1,18,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,990,A,7,40,A,7,3.6,A,7,1600,B,7,90,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,12:00,1253,1337,267,1,9,0,1,9,266,1,13,324,1,9,0,1,9,324,1,13,1293,1,18,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,990,A,7,70,A,7,3.1,A,7,1600,B,7,90,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,13:00,1271,1337,436,1,9,2,1,9,435,1,13,514,1,9,2,1,9,512,1,13,1862,1,18,10,A,7,10,A,7,12.2,A,7,12.2,A,7,100,A,7,990,A,7,10,A,7,3.1,A,7,1600,B,7,90,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,20,C,8 -05/14/1986,14:00,1221,1337,452,1,9,1,1,9,451,1,13,526,1,9,1,1,9,526,1,13,1876,1,18,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,990,A,7,350,A,7,2.6,A,7,3200,B,7,90,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -05/14/1986,15:00,1104,1337,370,1,9,1,1,9,370,1,13,432,1,9,1,1,9,431,1,13,1596,1,18,10,A,7,10,A,7,13.3,A,7,12.8,A,7,97,A,7,989,A,7,70,A,7,2.6,A,7,3200,B,7,90,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,16:00,930,1337,297,1,9,1,1,9,296,1,13,342,1,9,1,1,9,342,1,13,1262,1,18,10,A,7,10,A,7,13.9,A,7,13.3,A,7,97,A,7,989,A,7,20,A,7,3.1,A,7,3200,B,7,150,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,17:00,709,1337,232,1,9,1,1,9,231,1,13,262,1,9,1,1,9,262,1,13,904,1,18,10,A,7,10,A,7,13.3,A,7,12.8,A,7,97,A,7,989,A,7,40,A,7,3.6,A,7,3200,B,7,120,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,18:00,458,1337,127,1,9,0,1,9,127,1,13,143,1,9,0,1,9,143,1,13,470,1,18,10,A,7,10,A,7,13.3,A,7,12.8,A,7,97,A,7,989,A,7,90,A,7,3.6,A,7,1600,B,7,90,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,19:00,194,1337,54,1,13,0,1,9,54,1,13,60,1,13,0,1,9,60,1,13,175,1,21,10,A,7,10,A,7,13.3,A,7,12.8,A,7,97,A,7,990,A,7,50,A,7,2.6,A,7,1600,B,7,90,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,20:00,9,368,4,1,13,0,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,12.8,A,7,12.2,A,7,97,A,7,990,A,7,70,A,7,3.1,A,7,1600,B,7,90,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -05/14/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,990,A,7,30,A,7,3.1,A,7,1600,B,7,60,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,990,A,7,30,A,7,3.1,A,7,1600,B,7,30,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,991,A,7,10,A,7,3.1,A,7,1600,B,7,30,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/14/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,991,A,7,30,A,7,2.6,A,7,1600,B,7,60,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,991,A,7,40,A,7,2.1,A,7,1600,B,7,30,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,991,A,7,50,A,7,2.1,A,7,1600,B,7,30,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,991,A,7,360,A,7,1.5,A,7,800,B,7,30,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,991,A,7,20,A,7,2.1,A,7,400,B,7,0,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,991,A,7,30,A,7,2.1,A,7,800,B,7,30,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,06:00,67,991,24,1,13,0,1,9,24,1,13,27,1,13,0,1,9,27,1,13,78,1,21,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,991,A,7,50,A,7,2.6,A,7,400,B,7,30,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,07:00,318,1337,81,1,13,0,1,9,81,1,13,91,1,13,0,1,9,91,1,13,287,1,21,10,A,7,10,A,7,13.3,A,7,13.3,A,7,100,A,7,992,A,7,80,A,7,1.5,A,7,200,B,7,0,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,08:00,578,1337,164,1,9,1,1,9,164,1,13,186,1,9,1,1,9,186,1,13,637,1,18,10,A,7,10,A,7,13.3,A,7,13.3,A,7,100,A,7,993,A,7,350,A,7,2.1,A,7,400,B,7,0,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,09:00,817,1337,282,1,9,1,1,9,282,1,13,321,1,9,1,1,9,321,1,13,1127,1,18,10,A,7,10,A,7,15.0,A,7,15.0,A,7,100,A,7,993,A,7,0,A,7,0.0,A,7,1200,B,7,60,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,10:00,1018,1337,380,1,9,0,1,9,379,1,13,435,1,9,0,1,9,435,1,13,1558,1,18,10,A,7,10,A,7,16.7,A,7,16.1,A,7,97,A,7,993,A,7,70,A,7,1.5,A,7,2400,B,7,120,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,11:00,1167,1337,445,1,9,1,1,9,444,1,13,515,1,9,1,1,9,514,1,13,1825,1,18,10,A,7,10,A,7,18.9,A,7,16.7,A,7,87,A,7,992,A,7,0,A,7,0.0,A,7,4000,B,7,180,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,12:00,1254,1337,441,1,9,1,1,9,440,1,13,517,1,9,1,1,9,516,1,13,1866,1,18,10,A,7,10,A,7,20.0,A,7,17.2,A,7,84,A,7,992,A,7,240,A,7,2.1,A,7,8000,B,7,460,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/15/1986,13:00,1272,1337,427,1,9,126,1,9,308,1,13,484,1,9,136,1,9,354,1,13,1901,1,18,8,A,7,8,A,7,20.6,A,7,17.2,A,7,81,A,7,992,A,7,270,A,7,3.1,A,7,8000,B,7,370,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/15/1986,14:00,1222,1337,760,1,13,470,1,9,330,1,13,820,1,13,492,1,9,370,1,13,1936,1,21,6,A,7,6,A,7,23.3,A,7,17.8,A,7,71,A,7,992,A,7,170,A,7,2.1,A,7,8000,B,7,550,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/15/1986,15:00,1106,1337,658,1,13,330,1,9,385,1,13,715,1,13,358,1,9,419,1,13,1479,1,21,6,A,7,6,A,7,23.3,A,7,16.7,A,7,66,A,7,991,A,7,280,A,7,3.6,A,7,8000,B,7,610,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/15/1986,16:00,931,1337,596,1,13,505,1,9,245,1,13,637,1,13,523,1,9,271,1,13,683,1,21,3,A,7,3,A,7,24.4,A,7,16.1,A,7,60,A,7,991,A,7,240,A,7,3.1,A,7,8000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/15/1986,17:00,711,1337,447,1,9,547,1,9,157,1,13,481,1,9,554,1,9,186,1,13,337,1,18,2,A,7,0,A,7,24.4,A,7,16.1,A,7,60,A,7,991,A,7,260,A,7,3.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/15/1986,18:00,460,1337,236,1,9,320,1,9,126,1,13,252,1,9,303,1,9,148,1,13,254,1,18,6,A,7,1,A,7,23.3,A,7,16.7,A,7,66,A,7,991,A,7,270,A,7,2.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/15/1986,19:00,197,1337,55,1,13,75,1,9,44,1,13,61,1,13,51,1,9,53,1,13,93,1,21,4,A,7,3,A,7,22.2,A,7,16.7,A,7,71,A,7,991,A,7,300,A,7,2.1,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/15/1986,20:00,9,390,2,1,13,0,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,3,A,7,2,A,7,19.4,A,7,16.7,A,7,84,A,7,991,A,7,150,A,7,1.5,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/15/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,18.3,A,7,16.7,A,7,90,A,7,991,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/15/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,17.2,A,7,16.7,A,7,97,A,7,991,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/15/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,1,A,7,16.7,A,7,16.7,A,7,100,A,7,991,A,7,200,A,7,2.1,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/15/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,1,A,7,15.6,A,7,15.6,A,7,100,A,7,991,A,7,200,A,7,1.5,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,15.6,A,7,15.6,A,7,100,A,7,990,A,7,190,A,7,2.6,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,15.6,A,7,15.0,A,7,97,A,7,990,A,7,200,A,7,1.5,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,15.0,A,7,15.0,A,7,100,A,7,990,A,7,180,A,7,1.5,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,13.9,A,7,13.9,A,7,100,A,7,990,A,7,220,A,7,2.6,A,7,9700,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,14.4,A,7,14.4,A,7,100,A,7,990,A,7,190,A,7,1.5,A,7,8000,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/16/1986,06:00,69,1013,30,1,13,28,1,9,27,1,13,32,1,13,13,1,9,31,1,13,56,1,21,10,A,7,4,A,7,15.0,A,7,14.4,A,7,97,A,7,991,A,7,200,A,7,1.5,A,7,6400,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/16/1986,07:00,321,1336,145,1,13,336,1,9,65,1,13,155,1,13,274,1,9,89,1,13,117,1,21,7,A,7,3,A,7,17.2,A,7,15.6,A,7,90,A,7,991,A,7,200,A,7,3.1,A,7,8000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/16/1986,08:00,581,1336,359,1,9,593,1,9,102,1,13,376,1,9,572,1,9,127,1,13,206,1,18,3,A,7,2,A,7,18.9,A,7,16.7,A,7,87,A,7,991,A,7,220,A,7,3.6,A,7,9700,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -05/16/1986,09:00,819,1336,438,1,13,415,1,9,183,1,13,472,1,13,427,1,9,210,1,13,435,1,21,9,A,7,4,A,7,22.8,A,7,16.1,A,7,66,A,7,991,A,7,220,A,7,4.1,A,7,9700,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/16/1986,10:00,1020,1336,460,1,9,205,1,9,303,1,13,509,1,9,219,1,9,342,1,13,1012,1,18,10,A,7,8,A,7,23.3,A,7,16.7,A,7,66,A,7,991,A,7,230,A,7,3.6,A,7,11300,B,7,3050,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/16/1986,11:00,1168,1336,593,1,13,352,1,9,285,1,13,645,1,13,369,1,9,322,1,13,1356,1,21,10,A,7,7,A,7,24.4,A,7,16.1,A,7,60,A,7,991,A,7,250,A,7,4.6,A,7,11300,B,7,3050,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,12:00,1255,1336,564,1,9,140,1,9,432,1,13,623,1,9,150,1,9,482,1,13,2469,1,18,10,A,7,8,A,7,25.6,A,7,16.1,A,7,56,A,7,991,A,7,200,A,7,6.2,A,7,11300,B,7,3050,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,13:00,1273,1336,485,1,9,165,1,9,327,1,13,545,1,9,177,1,9,376,1,13,2034,1,18,9,A,7,9,A,7,27.2,A,7,16.1,A,7,51,A,7,990,A,7,200,A,7,5.2,A,7,11300,B,7,3050,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,14:00,1223,1336,887,1,13,718,1,9,229,1,13,948,1,13,734,1,9,275,1,13,1328,1,21,7,A,7,5,A,7,28.3,A,7,15.0,A,7,44,A,7,989,A,7,240,A,7,4.6,A,7,11300,B,7,7620,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,15:00,1107,1336,801,1,13,705,1,9,217,1,13,850,1,13,718,1,9,254,1,13,849,1,21,8,A,7,4,A,7,27.8,A,7,13.9,A,7,43,A,7,988,A,7,190,A,7,5.2,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,16:00,933,1336,549,1,13,490,1,9,207,1,13,596,1,13,509,1,9,240,1,13,571,1,21,9,A,7,5,A,7,28.3,A,7,13.3,A,7,40,A,7,988,A,7,190,A,7,4.6,A,7,11300,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,17:00,713,1336,267,1,9,59,1,9,236,1,13,294,1,9,59,1,9,262,1,13,719,1,18,10,A,7,8,A,7,26.7,A,7,11.7,A,7,39,A,7,989,A,7,250,A,7,4.1,A,7,11300,B,7,3660,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,18:00,463,1336,104,1,9,66,1,9,81,1,13,117,1,9,63,1,9,95,1,13,185,1,18,10,A,7,10,A,7,20.6,A,7,15.0,A,7,71,A,7,989,A,7,310,A,7,5.2,A,7,11300,B,7,3660,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,19:00,200,1336,40,1,13,5,1,9,39,1,13,45,1,13,0,1,9,45,1,13,141,1,21,10,A,7,10,A,7,20.0,A,7,15.6,A,7,76,A,7,988,A,7,260,A,7,2.6,A,7,11300,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,17,C,8 -05/16/1986,20:00,10,412,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,20.6,A,7,16.7,A,7,79,A,7,989,A,7,280,A,7,3.1,A,7,11300,B,7,2130,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,27,C,8 -05/16/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,20.6,A,7,15.6,A,7,73,A,7,989,A,7,270,A,7,3.6,A,7,11300,B,7,7620,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -05/16/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,18.9,A,7,15.6,A,7,81,A,7,989,A,7,270,A,7,4.1,A,7,12900,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,17.2,A,7,15.0,A,7,87,A,7,988,A,7,210,A,7,2.1,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/16/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,1,A,7,16.7,A,7,15.0,A,7,90,A,7,987,A,7,170,A,7,1.5,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,15.0,A,7,14.4,A,7,97,A,7,987,A,7,190,A,7,3.1,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,15.0,A,7,97,A,7,987,A,7,220,A,7,2.6,A,7,8000,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -05/17/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,15.6,A,7,100,A,7,986,A,7,220,A,7,2.6,A,7,200,B,7,0,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/17/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,15.0,A,7,15.0,A,7,100,A,7,986,A,7,0,A,7,0.0,A,7,1600,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/17/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,15.0,A,7,15.0,A,7,100,A,7,987,A,7,220,A,7,3.1,A,7,2400,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/17/1986,06:00,71,1035,23,1,13,15,1,9,22,1,13,25,1,13,9,1,9,25,1,13,53,1,21,8,A,7,3,A,7,15.6,A,7,15.0,A,7,97,A,7,987,A,7,220,A,7,2.1,A,7,2400,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/17/1986,07:00,323,1336,69,1,13,0,1,9,69,1,13,79,1,13,0,1,9,79,1,13,258,1,21,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,987,A,7,210,A,7,2.6,A,7,800,B,7,30,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/17/1986,08:00,583,1336,139,1,9,37,1,9,123,1,13,153,1,9,36,1,9,138,1,13,378,1,18,10,A,7,9,A,7,17.8,A,7,16.1,A,7,90,A,7,987,A,7,210,A,7,3.1,A,7,2400,B,7,60,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/17/1986,09:00,821,1336,553,1,9,658,1,9,148,1,13,583,1,9,662,1,9,175,1,13,358,1,18,0,A,7,0,A,7,20.6,A,7,17.2,A,7,81,A,7,987,A,7,240,A,7,2.6,A,7,8000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/17/1986,10:00,1021,1336,731,1,9,728,1,9,174,1,13,780,1,9,744,1,9,210,1,13,568,1,18,0,A,7,0,A,7,23.9,A,7,17.2,A,7,66,A,7,987,A,7,250,A,7,2.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/17/1986,11:00,1169,1336,878,1,9,784,1,9,191,1,13,913,1,9,785,1,9,224,1,13,815,1,18,0,A,7,0,A,7,25.6,A,7,16.1,A,7,56,A,7,987,A,7,270,A,7,1.5,A,7,12900,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,12:00,1256,1336,886,1,9,694,1,9,233,1,13,950,1,9,710,1,9,281,1,13,1588,1,18,2,A,7,2,A,7,27.2,A,7,15.6,A,7,49,A,7,986,A,7,220,A,7,1.5,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,13:00,1274,1336,701,1,13,442,1,9,279,1,13,775,1,13,464,1,9,331,1,13,2158,1,21,6,A,7,6,A,7,27.8,A,7,15.0,A,7,46,A,7,985,A,7,190,A,7,3.6,A,7,16100,B,7,1070,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,14:00,1224,1336,936,1,13,679,1,9,313,1,13,979,1,13,682,1,9,352,1,13,1788,1,21,6,A,7,6,A,7,27.8,A,7,15.6,A,7,47,A,7,985,A,7,170,A,7,1.5,A,7,16100,B,7,1070,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,15:00,1108,1336,770,1,13,574,1,9,294,1,13,829,1,13,599,1,9,330,1,13,1175,1,21,6,A,7,6,A,7,28.3,A,7,15.6,A,7,46,A,7,984,A,7,170,A,7,2.6,A,7,16100,B,7,1220,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,16:00,935,1336,523,1,13,385,1,9,254,1,13,557,1,13,399,1,9,277,1,13,714,1,21,6,A,7,6,A,7,28.3,A,7,15.6,A,7,46,A,7,984,A,7,220,A,7,3.1,A,7,16100,B,7,1220,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,17:00,716,1336,226,1,13,68,1,9,190,1,13,249,1,13,68,1,9,213,1,13,606,1,21,6,A,7,6,A,7,28.3,A,7,15.0,A,7,44,A,7,983,A,7,230,A,7,3.6,A,7,16100,B,7,1370,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,18:00,466,1336,195,1,13,133,1,9,149,1,13,212,1,13,126,1,9,168,1,13,340,1,21,7,A,7,7,A,7,26.7,A,7,15.0,A,7,49,A,7,983,A,7,230,A,7,3.1,A,7,16100,B,7,1370,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,19:00,203,1336,51,1,13,29,1,9,46,1,13,55,1,13,22,1,9,52,1,13,116,1,21,8,A,7,8,A,7,26.1,A,7,16.7,A,7,56,A,7,984,A,7,300,A,7,3.1,A,7,16100,B,7,1370,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,20:00,11,412,2,1,13,0,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,8,A,7,8,A,7,23.3,A,7,17.8,A,7,71,A,7,984,A,7,210,A,7,2.1,A,7,16100,B,7,1520,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,22.2,A,7,17.2,A,7,73,A,7,985,A,7,220,A,7,3.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.6,A,7,16.7,A,7,79,A,7,985,A,7,200,A,7,2.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,19.4,A,7,16.7,A,7,84,A,7,985,A,7,200,A,7,1.5,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/17/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,18.9,A,7,16.1,A,7,84,A,7,985,A,7,180,A,7,2.1,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,17.8,A,7,16.1,A,7,90,A,7,984,A,7,190,A,7,2.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,16.1,A,7,90,A,7,984,A,7,190,A,7,2.1,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,15.6,A,7,93,A,7,984,A,7,200,A,7,2.1,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,17.8,A,7,16.1,A,7,90,A,7,984,A,7,210,A,7,3.1,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,16.1,A,7,93,A,7,984,A,7,180,A,7,3.1,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,06:00,73,1035,25,1,13,13,1,9,24,1,13,27,1,13,8,1,9,27,1,13,57,1,21,0,A,7,0,A,7,17.8,A,7,16.1,A,7,90,A,7,985,A,7,210,A,7,4.1,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,07:00,326,1335,140,1,13,245,1,9,80,1,13,149,1,13,203,1,9,100,1,13,152,1,21,0,A,7,0,A,7,19.4,A,7,16.7,A,7,84,A,7,985,A,7,220,A,7,4.1,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,08:00,585,1335,339,1,9,469,1,9,134,1,13,361,1,9,459,1,9,160,1,13,266,1,18,0,A,7,0,A,7,21.1,A,7,16.7,A,7,76,A,7,985,A,7,190,A,7,5.7,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,09:00,823,1335,518,1,9,550,1,9,179,1,13,561,1,9,566,1,9,211,1,13,427,1,18,1,A,7,1,A,7,23.3,A,7,16.7,A,7,66,A,7,985,A,7,220,A,7,5.2,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,10:00,1022,1335,704,1,9,608,1,9,238,1,13,735,1,9,612,1,9,265,1,13,752,1,18,2,A,7,2,A,7,23.9,A,7,17.8,A,7,69,A,7,985,A,7,190,A,7,5.2,A,7,24100,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,11:00,1170,1335,814,1,13,541,1,9,338,1,13,869,1,13,565,1,9,373,1,13,1640,1,21,7,A,7,3,A,7,26.7,A,7,17.2,A,7,56,A,7,985,A,7,200,A,7,7.2,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,12:00,1257,1335,668,1,9,170,1,9,508,1,13,731,1,9,181,1,9,560,1,13,2941,1,18,10,A,7,8,A,7,26.7,A,7,16.7,A,7,54,A,7,984,A,7,210,A,7,5.2,A,7,24100,B,7,3660,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,13:00,1275,1335,887,1,13,579,1,9,333,1,13,963,1,13,606,1,9,382,1,13,2613,1,21,5,A,7,4,A,7,28.3,A,7,17.8,A,7,53,A,7,983,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,14:00,1225,1335,590,1,13,155,1,9,448,1,13,649,1,13,165,1,9,497,1,13,2301,1,21,6,A,7,6,A,7,27.2,A,7,16.7,A,7,53,A,7,983,A,7,210,A,7,6.2,A,7,24100,B,7,1220,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,15:00,1110,1335,538,1,13,281,1,9,305,1,13,596,1,13,306,1,9,342,1,13,1152,1,21,7,A,7,7,A,7,26.7,A,7,15.6,A,7,51,A,7,982,A,7,170,A,7,5.2,A,7,24100,B,7,1220,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,16:00,936,1335,361,1,13,122,1,9,275,1,13,399,1,13,130,1,9,308,1,13,834,1,21,7,A,7,7,A,7,25.6,A,7,16.1,A,7,56,A,7,982,A,7,190,A,7,5.2,A,7,24100,B,7,1220,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,17:00,718,1335,252,1,13,100,1,9,199,1,13,279,1,13,104,1,9,223,1,13,509,1,21,7,A,7,7,A,7,25.6,A,7,15.6,A,7,54,A,7,982,A,7,180,A,7,6.2,A,7,24100,B,7,1220,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,18:00,468,1335,177,1,13,97,1,9,144,1,13,194,1,13,92,1,9,161,1,13,329,1,21,7,A,7,7,A,7,25.0,A,7,15.0,A,7,54,A,7,982,A,7,170,A,7,4.1,A,7,24100,B,7,2440,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,19:00,206,1335,66,1,13,23,1,9,62,1,13,72,1,13,17,1,9,69,1,13,147,1,21,7,A,7,7,A,7,23.9,A,7,15.6,A,7,60,A,7,982,A,7,170,A,7,3.6,A,7,24100,B,7,2440,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,20:00,12,434,4,1,13,0,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,8,A,7,8,A,7,22.2,A,7,16.1,A,7,69,A,7,982,A,7,170,A,7,2.6,A,7,24100,B,7,2440,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,21.7,A,7,15.6,A,7,68,A,7,983,A,7,190,A,7,3.1,A,7,24100,B,7,2440,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,21.7,A,7,16.7,A,7,73,A,7,983,A,7,180,A,7,4.1,A,7,24100,B,7,7620,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,21.1,A,7,16.7,A,7,76,A,7,983,A,7,180,A,7,5.2,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/18/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,20.6,A,7,16.7,A,7,79,A,7,984,A,7,190,A,7,4.1,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,19.4,A,7,16.7,A,7,84,A,7,983,A,7,190,A,7,3.6,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,18.9,A,7,16.7,A,7,87,A,7,983,A,7,180,A,7,3.1,A,7,19300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,17.8,A,7,16.1,A,7,90,A,7,983,A,7,180,A,7,3.1,A,7,19300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,17.8,A,7,15.6,A,7,87,A,7,983,A,7,190,A,7,4.1,A,7,19300,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,17.8,A,7,16.7,A,7,93,A,7,983,A,7,180,A,7,3.1,A,7,19300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,06:00,76,1057,15,1,13,4,1,9,15,1,13,18,1,13,0,1,9,18,1,13,55,1,21,7,A,7,7,A,7,18.3,A,7,17.2,A,7,93,A,7,983,A,7,170,A,7,4.6,A,7,19300,B,7,2440,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,07:00,328,1335,43,1,13,1,1,9,42,1,13,50,1,13,0,1,9,50,1,13,173,1,21,10,A,7,10,A,7,18.9,A,7,17.2,A,7,90,A,7,983,A,7,180,A,7,4.1,A,7,12900,B,7,240,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,08:00,587,1335,113,1,9,1,1,9,113,1,13,133,1,9,1,1,9,132,1,13,487,1,18,10,A,7,10,A,7,20.0,A,7,17.2,A,7,84,A,7,984,A,7,200,A,7,4.1,A,7,11300,B,7,270,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,09:00,824,1335,136,1,9,4,1,9,134,1,13,165,1,9,3,1,9,163,1,13,646,1,18,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,984,A,7,170,A,7,3.1,A,7,4800,B,7,340,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,10:00,1024,1335,167,1,9,3,1,9,165,1,13,205,1,9,2,1,9,203,1,13,835,1,18,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,984,A,7,170,A,7,3.1,A,7,2400,B,7,120,A,7,3.1,E,8,0.000,F,8,0.00,?,0,30,1,D,9,45,C,8 -05/19/1986,11:00,1171,1335,253,1,9,6,1,9,248,1,13,307,1,9,5,1,9,303,1,13,1206,1,18,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,984,A,7,190,A,7,3.6,A,7,6400,B,7,180,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/19/1986,12:00,1258,1335,392,1,9,2,1,9,391,1,13,465,1,9,2,1,9,464,1,13,1729,1,18,10,A,7,10,A,7,20.6,A,7,18.9,A,7,90,A,7,984,A,7,200,A,7,4.1,A,7,9700,B,7,240,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/19/1986,13:00,1276,1335,391,1,9,3,1,9,387,1,13,463,1,9,3,1,9,461,1,13,1725,1,18,10,A,7,10,A,7,21.7,A,7,18.3,A,7,81,A,7,983,A,7,200,A,7,5.2,A,7,11300,B,7,400,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/19/1986,14:00,1226,1335,399,1,9,3,1,9,396,1,13,470,1,9,3,1,9,467,1,13,1730,1,18,10,A,7,10,A,7,23.9,A,7,17.2,A,7,66,A,7,982,A,7,170,A,7,4.1,A,7,11300,B,7,910,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,15:00,1111,1335,399,1,9,1,1,9,399,1,13,463,1,9,1,1,9,462,1,13,1679,1,18,10,A,7,10,A,7,23.9,A,7,17.8,A,7,69,A,7,981,A,7,190,A,7,4.1,A,7,11300,B,7,910,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,16:00,938,1335,308,1,9,1,1,9,308,1,13,356,1,9,1,1,9,355,1,13,1304,1,18,10,A,7,10,A,7,23.3,A,7,18.3,A,7,74,A,7,981,A,7,180,A,7,4.1,A,7,16100,B,7,1070,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,17:00,720,1335,221,1,9,0,1,9,221,1,13,252,1,9,0,1,9,252,1,13,889,1,18,10,A,7,10,A,7,23.3,A,7,17.2,A,7,69,A,7,981,A,7,190,A,7,3.6,A,7,16100,B,7,1070,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,18:00,471,1335,77,1,9,1,1,9,77,1,13,91,1,9,1,1,9,91,1,13,326,1,18,10,A,7,10,A,7,20.6,A,7,17.8,A,7,84,A,7,982,A,7,160,A,7,5.2,A,7,6400,B,7,1070,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,19:00,209,1335,32,1,13,0,1,9,32,1,13,37,1,13,0,1,9,37,1,13,122,1,21,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,982,A,7,150,A,7,4.1,A,7,6400,B,7,1070,A,7,3.2,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -05/19/1986,20:00,13,456,6,1,13,0,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,981,A,7,180,A,7,5.2,A,7,11300,B,7,150,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/19/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,982,A,7,170,A,7,5.7,A,7,11300,B,7,150,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,982,A,7,180,A,7,3.6,A,7,9700,B,7,180,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/19/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,981,A,7,180,A,7,4.1,A,7,6400,B,7,120,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -05/19/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,18.3,A,7,100,A,7,981,A,7,180,A,7,4.1,A,7,11300,B,7,150,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/20/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,981,A,7,180,A,7,4.6,A,7,11300,B,7,610,A,7,3.1,E,8,0.000,?,0,0.00,?,0,5,1,D,9,80,C,8 -05/20/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,980,A,7,180,A,7,4.6,A,7,11300,B,7,610,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -05/20/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,17.2,A,7,100,A,7,980,A,7,200,A,7,3.6,A,7,11300,B,7,150,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,16.7,A,7,97,A,7,980,A,7,230,A,7,3.1,A,7,11300,B,7,150,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,16.7,A,7,97,A,7,980,A,7,160,A,7,2.1,A,7,6400,B,7,150,A,7,2.9,E,8,0.000,?,0,0.00,?,0,5,1,D,9,80,C,8 -05/20/1986,06:00,78,1078,25,1,13,0,1,9,25,1,13,28,1,13,0,1,9,28,1,13,82,1,21,10,A,7,10,A,7,17.8,A,7,16.7,A,7,93,A,7,981,A,7,220,A,7,2.6,A,7,3200,B,7,120,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/20/1986,07:00,330,1334,94,1,13,0,1,9,94,1,13,105,1,13,0,1,9,105,1,13,324,1,21,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,981,A,7,180,A,7,2.1,A,7,3200,B,7,120,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/20/1986,08:00,589,1334,204,1,9,1,1,9,203,1,13,227,1,9,1,1,9,227,1,13,738,1,18,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,981,A,7,250,A,7,2.6,A,7,3200,B,7,240,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -05/20/1986,09:00,826,1334,278,1,9,1,1,9,277,1,13,317,1,9,1,1,9,316,1,13,1124,1,18,10,A,7,10,A,7,20.0,A,7,17.8,A,7,87,A,7,981,A,7,220,A,7,2.6,A,7,4800,B,7,180,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/20/1986,10:00,1025,1334,344,1,9,0,1,9,344,1,13,398,1,9,0,1,9,398,1,13,1473,1,18,10,A,7,10,A,7,21.1,A,7,17.8,A,7,81,A,7,981,A,7,240,A,7,2.1,A,7,11300,B,7,430,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/20/1986,11:00,1172,1334,420,1,9,1,1,9,419,1,13,489,1,9,1,1,9,488,1,13,1767,1,18,10,A,7,10,A,7,21.1,A,7,17.2,A,7,79,A,7,981,A,7,180,A,7,3.1,A,7,11300,B,7,460,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,12:00,1258,1334,390,1,9,121,1,9,275,1,13,443,1,9,131,1,9,319,1,13,1610,1,18,9,A,7,9,A,7,19.4,A,7,18.3,A,7,93,A,7,980,A,7,250,A,7,1.5,A,7,3200,B,7,370,A,7,3.1,E,8,0.000,F,8,0.00,?,0,33,1,D,9,00,C,8 -05/20/1986,13:00,1277,1334,226,1,9,3,1,9,223,1,13,280,1,9,2,1,9,278,1,13,1122,1,18,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,980,A,7,200,A,7,2.6,A,7,4800,B,7,460,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/20/1986,14:00,1227,1334,566,1,9,247,1,9,339,1,13,631,1,9,269,1,9,383,1,13,1832,1,18,8,A,7,8,A,7,22.2,A,7,17.2,A,7,73,A,7,980,A,7,200,A,7,4.6,A,7,11300,B,7,910,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/20/1986,15:00,1112,1334,743,1,13,572,1,9,266,1,13,808,1,13,598,1,9,308,1,13,1072,1,21,6,A,7,6,A,7,22.8,A,7,17.2,A,7,71,A,7,979,A,7,190,A,7,4.1,A,7,11300,B,7,2440,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,16:00,940,1334,482,1,13,314,1,9,261,1,13,528,1,13,339,1,9,289,1,13,737,1,21,5,A,7,5,A,7,23.9,A,7,17.2,A,7,66,A,7,978,A,7,210,A,7,4.1,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,17:00,722,1334,304,1,13,143,1,9,227,1,13,333,1,13,148,1,9,253,1,13,583,1,21,7,A,7,6,A,7,21.7,A,7,16.1,A,7,71,A,7,978,A,7,210,A,7,3.1,A,7,11300,B,7,7620,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,18:00,473,1334,183,1,13,122,1,9,140,1,13,200,1,13,117,1,9,158,1,13,321,1,21,7,A,7,7,A,7,23.3,A,7,16.7,A,7,66,A,7,979,A,7,240,A,7,3.1,A,7,11300,B,7,1010,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,19:00,212,1334,66,1,13,99,1,9,51,1,13,73,1,13,70,1,9,62,1,13,108,1,21,5,A,7,5,A,7,20.0,A,7,12.2,A,7,61,A,7,980,A,7,300,A,7,3.6,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,20:00,14,478,6,1,13,4,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,4,A,7,4,A,7,17.2,A,7,13.3,A,7,78,A,7,980,A,7,340,A,7,2.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -05/20/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,16.7,A,7,13.9,A,7,84,A,7,980,A,7,40,A,7,2.1,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,15.6,A,7,14.4,A,7,93,A,7,980,A,7,320,A,7,2.6,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,15.6,A,7,14.4,A,7,93,A,7,980,A,7,360,A,7,3.1,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/20/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,5,A,7,16.1,A,7,13.9,A,7,87,A,7,981,A,7,40,A,7,3.1,A,7,11300,B,7,1520,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,15.0,A,7,13.9,A,7,93,A,7,981,A,7,350,A,7,3.6,A,7,11300,B,7,1220,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,15.0,A,7,13.9,A,7,93,A,7,981,A,7,340,A,7,3.1,A,7,12900,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,15.0,A,7,13.9,A,7,93,A,7,981,A,7,360,A,7,2.6,A,7,12900,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,13.9,A,7,11.7,A,7,87,A,7,981,A,7,10,A,7,2.1,A,7,12900,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,13.3,A,7,11.1,A,7,87,A,7,981,A,7,350,A,7,2.6,A,7,12900,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,06:00,80,1078,31,1,13,98,1,9,21,1,13,30,1,13,43,1,9,27,1,13,37,1,21,2,A,7,2,A,7,12.8,A,7,10.6,A,7,87,A,7,981,A,7,330,A,7,2.6,A,7,12900,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,07:00,333,1334,161,1,13,388,1,9,64,1,13,172,1,13,321,1,9,92,1,13,115,1,21,2,A,7,2,A,7,14.4,A,7,11.7,A,7,84,A,7,981,A,7,340,A,7,2.1,A,7,12900,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,08:00,590,1334,374,1,9,670,1,9,78,1,13,391,1,9,646,1,9,104,1,13,161,1,18,2,A,7,2,A,7,16.7,A,7,10.0,A,7,65,A,7,982,A,7,350,A,7,3.6,A,7,12900,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,09:00,827,1334,601,1,9,796,1,9,107,1,13,633,1,9,796,1,9,139,1,13,255,1,18,2,A,7,2,A,7,17.8,A,7,10.0,A,7,61,A,7,982,A,7,340,A,7,2.6,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,10:00,1026,1334,778,1,9,879,1,9,102,1,13,807,1,9,879,1,9,130,1,13,290,1,18,1,A,7,1,A,7,18.9,A,7,10.0,A,7,57,A,7,981,A,7,320,A,7,3.1,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,11:00,1173,1334,793,1,13,652,1,9,218,1,13,846,1,13,666,1,9,259,1,13,1053,1,21,4,A,7,4,A,7,20.0,A,7,9.4,A,7,51,A,7,982,A,7,360,A,7,2.6,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,12:00,1259,1334,971,1,13,761,1,9,252,1,13,1036,1,13,776,1,9,302,1,13,1765,1,21,6,A,7,6,A,7,21.7,A,7,10.6,A,7,49,A,7,981,A,7,310,A,7,1.5,A,7,11300,B,7,1830,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,13:00,1278,1334,815,1,13,518,1,9,318,1,13,890,1,13,543,1,9,368,1,13,2562,1,21,6,A,7,6,A,7,22.8,A,7,10.6,A,7,46,A,7,980,A,7,180,A,7,2.1,A,7,11300,B,7,1160,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,14:00,1228,1334,789,1,13,511,1,9,318,1,13,856,1,13,535,1,9,362,1,13,1943,1,21,7,A,7,7,A,7,22.2,A,7,11.1,A,7,50,A,7,980,A,7,230,A,7,4.1,A,7,11300,B,7,1220,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,15:00,1113,1334,700,1,13,475,1,9,304,1,13,752,1,13,496,1,9,337,1,13,1240,1,21,7,A,7,7,A,7,23.9,A,7,10.0,A,7,42,A,7,979,A,7,250,A,7,3.6,A,7,11300,B,7,1220,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,16:00,941,1334,637,1,13,614,1,9,204,1,13,667,1,13,618,1,9,230,1,13,564,1,21,6,A,7,6,A,7,23.9,A,7,9.4,A,7,40,A,7,979,A,7,290,A,7,2.1,A,7,11300,B,7,1220,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,17:00,724,1334,366,1,13,293,1,9,208,1,13,396,1,13,308,1,9,229,1,13,481,1,21,5,A,7,5,A,7,23.9,A,7,10.0,A,7,42,A,7,979,A,7,320,A,7,4.6,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,18:00,476,1334,270,1,13,489,1,9,97,1,13,291,1,13,457,1,9,128,1,13,182,1,21,4,A,7,4,A,7,22.2,A,7,11.1,A,7,50,A,7,979,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,19:00,215,1334,81,1,13,168,1,9,55,1,13,87,1,13,111,1,9,69,1,13,102,1,21,4,A,7,4,A,7,21.1,A,7,10.0,A,7,49,A,7,979,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,20:00,15,478,6,1,13,17,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,4,A,7,4,A,7,19.4,A,7,13.9,A,7,70,A,7,979,A,7,330,A,7,5.2,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,17.8,A,7,8.9,A,7,56,A,7,980,A,7,340,A,7,4.6,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,16.7,A,7,7.8,A,7,56,A,7,981,A,7,360,A,7,4.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,15.6,A,7,6.7,A,7,56,A,7,981,A,7,360,A,7,4.1,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/21/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,15.0,A,7,7.2,A,7,60,A,7,981,A,7,350,A,7,3.6,A,7,11300,B,7,1250,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,14.4,A,7,5.6,A,7,56,A,7,981,A,7,340,A,7,4.6,A,7,11300,B,7,1310,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,5.6,A,7,62,A,7,980,A,7,360,A,7,2.6,A,7,11300,B,7,1220,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,6.1,A,7,69,A,7,980,A,7,20,A,7,2.6,A,7,11300,B,7,1220,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,12.2,A,7,6.1,A,7,67,A,7,980,A,7,30,A,7,2.1,A,7,11300,B,7,1370,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,10.6,A,7,6.7,A,7,77,A,7,980,A,7,330,A,7,2.1,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,06:00,82,1100,24,1,13,15,1,9,23,1,13,26,1,13,9,1,9,26,1,13,56,1,21,8,A,7,8,A,7,11.7,A,7,6.1,A,7,69,A,7,981,A,7,20,A,7,3.1,A,7,11300,B,7,1310,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,07:00,335,1333,135,1,13,156,1,9,95,1,13,146,1,13,134,1,9,113,1,13,208,1,21,6,A,7,6,A,7,12.2,A,7,6.1,A,7,67,A,7,981,A,7,20,A,7,3.6,A,7,11300,B,7,1310,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,08:00,592,1333,190,1,9,7,1,9,187,1,13,214,1,9,6,1,9,211,1,13,705,1,18,10,A,7,10,A,7,13.9,A,7,6.7,A,7,62,A,7,982,A,7,350,A,7,4.6,A,7,11300,B,7,1310,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,09:00,828,1333,566,1,9,530,1,9,237,1,13,596,1,9,544,1,9,258,1,13,584,1,18,8,A,7,8,A,7,15.0,A,7,5.6,A,7,54,A,7,982,A,7,360,A,7,6.7,A,7,16100,B,7,1520,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,10:00,1027,1333,606,1,9,385,1,9,309,1,13,663,1,9,417,1,9,341,1,13,1005,1,18,8,A,7,8,A,7,17.2,A,7,6.7,A,7,50,A,7,982,A,7,40,A,7,5.2,A,7,16100,B,7,1680,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,11:00,1174,1333,671,1,9,414,1,9,305,1,13,724,1,9,433,1,9,342,1,13,1500,1,18,8,A,7,8,A,7,17.8,A,7,7.2,A,7,50,A,7,982,A,7,360,A,7,3.1,A,7,16100,B,7,1830,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,12:00,1260,1333,931,1,13,756,1,9,216,1,13,1004,1,13,776,1,9,269,1,13,1535,1,21,4,A,7,4,A,7,18.9,A,7,7.8,A,7,49,A,7,982,A,7,340,A,7,2.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,13:00,1279,1333,952,1,13,797,1,9,186,1,13,1006,1,13,804,1,9,233,1,13,1396,1,21,3,A,7,3,A,7,20.6,A,7,7.8,A,7,44,A,7,981,A,7,300,A,7,4.1,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,14:00,1229,1333,880,1,13,653,1,9,277,1,13,929,1,13,661,1,9,318,1,13,1654,1,21,6,A,7,6,A,7,23.3,A,7,8.3,A,7,38,A,7,981,A,7,260,A,7,4.6,A,7,16100,B,7,1220,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,15:00,1115,1333,575,1,13,344,1,9,287,1,13,620,1,13,359,1,9,319,1,13,1172,1,21,7,A,7,7,A,7,21.7,A,7,5.0,A,7,34,A,7,980,A,7,280,A,7,4.6,A,7,24100,B,7,1520,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,16:00,943,1333,475,1,13,234,1,9,309,1,13,514,1,13,252,1,9,335,1,13,901,1,21,7,A,7,7,A,7,21.1,A,7,6.1,A,7,38,A,7,980,A,7,330,A,7,2.6,A,7,24100,B,7,1520,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,17:00,726,1333,422,1,13,479,1,9,162,1,13,454,1,13,486,1,9,189,1,13,353,1,21,4,A,7,4,A,7,22.2,A,7,5.6,A,7,34,A,7,980,A,7,290,A,7,4.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,18:00,478,1333,222,1,9,457,1,9,59,1,13,238,1,9,429,1,9,84,1,13,120,1,18,1,A,7,1,A,7,20.6,A,7,4.4,A,7,35,A,7,981,A,7,320,A,7,4.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,19:00,218,1333,100,1,13,422,1,9,33,1,13,106,1,13,300,1,9,57,1,13,62,1,21,0,A,7,0,A,7,18.3,A,7,6.7,A,7,47,A,7,982,A,7,310,A,7,3.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,20:00,16,500,10,1,13,31,1,9,6,1,13,0,1,13,0,1,9,0,1,13,0,1,21,1,A,7,1,A,7,17.2,A,7,6.7,A,7,50,A,7,982,A,7,330,A,7,2.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,15.6,A,7,6.7,A,7,56,A,7,983,A,7,20,A,7,2.6,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,15.0,A,7,7.2,A,7,60,A,7,983,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,14.4,A,7,8.3,A,7,67,A,7,983,A,7,10,A,7,2.1,A,7,16100,B,7,2130,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/22/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,13.9,A,7,7.2,A,7,64,A,7,984,A,7,340,A,7,2.1,A,7,16100,B,7,1980,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,12.2,A,7,7.8,A,7,75,A,7,983,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,10.6,A,7,5.0,A,7,69,A,7,983,A,7,350,A,7,1.5,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,10.0,A,7,8.9,A,7,93,A,7,983,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,7.8,A,7,93,A,7,983,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,8.3,A,7,93,A,7,983,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,06:00,83,1122,29,1,13,46,1,9,25,1,13,31,1,13,22,1,9,30,1,13,52,1,21,0,A,7,0,A,7,9.4,A,7,6.1,A,7,80,A,7,984,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,07:00,337,1332,158,1,13,348,1,9,70,1,13,168,1,13,289,1,9,95,1,13,127,1,21,1,A,7,1,A,7,13.9,A,7,10.0,A,7,78,A,7,985,A,7,270,A,7,2.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,08:00,594,1332,305,1,13,364,1,9,143,1,13,323,1,13,357,1,9,164,1,13,287,1,21,3,A,7,3,A,7,17.2,A,7,8.3,A,7,56,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,09:00,829,1332,513,1,13,495,1,9,205,1,13,548,1,13,509,1,9,231,1,13,499,1,21,3,A,7,3,A,7,18.3,A,7,6.7,A,7,47,A,7,985,A,7,230,A,7,1.5,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,10:00,1028,1332,521,1,9,220,1,9,351,1,13,572,1,9,234,1,9,391,1,13,1190,1,18,8,A,7,8,A,7,20.0,A,7,5.6,A,7,39,A,7,985,A,7,230,A,7,2.6,A,7,16100,B,7,3660,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,11:00,1175,1332,660,1,13,379,1,9,325,1,13,709,1,13,396,1,9,358,1,13,1610,1,21,4,A,7,4,A,7,21.7,A,7,6.7,A,7,38,A,7,985,A,7,240,A,7,4.1,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,12:00,1261,1332,322,1,9,4,1,9,318,1,13,387,1,9,3,1,9,384,1,13,1490,1,18,10,A,7,10,A,7,20.6,A,7,6.7,A,7,41,A,7,985,A,7,240,A,7,4.1,A,7,11300,B,7,3660,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,13:00,1280,1332,389,1,9,8,1,9,381,1,13,463,1,9,7,1,9,456,1,13,1708,1,18,10,A,7,10,A,7,19.4,A,7,7.2,A,7,45,A,7,985,A,7,250,A,7,5.7,A,7,11300,B,7,1520,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,14:00,1230,1332,393,1,9,1,1,9,392,1,13,464,1,9,1,1,9,463,1,13,1721,1,18,10,A,7,10,A,7,17.2,A,7,8.9,A,7,58,A,7,985,A,7,260,A,7,3.6,A,7,11300,B,7,2440,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,15:00,1116,1332,277,1,9,1,1,9,276,1,13,330,1,9,1,1,9,330,1,13,1299,1,18,10,A,7,10,A,7,16.7,A,7,10.0,A,7,65,A,7,984,A,7,270,A,7,4.1,A,7,11300,B,7,2740,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,16:00,944,1332,278,1,9,5,1,9,275,1,13,324,1,9,4,1,9,321,1,13,1213,1,18,10,A,7,10,A,7,16.7,A,7,11.1,A,7,70,A,7,984,A,7,270,A,7,3.1,A,7,11300,B,7,1520,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,17:00,728,1332,248,1,9,4,1,9,246,1,13,281,1,9,4,1,9,279,1,13,959,1,18,10,A,7,10,A,7,17.2,A,7,10.6,A,7,65,A,7,984,A,7,250,A,7,2.6,A,7,11300,B,7,1520,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,18:00,480,1332,81,1,9,3,1,9,80,1,13,95,1,9,2,1,9,95,1,13,339,1,18,10,A,7,10,A,7,16.7,A,7,12.2,A,7,75,A,7,984,A,7,230,A,7,2.6,A,7,11300,B,7,2740,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,19:00,220,1332,45,1,13,1,1,9,45,1,13,51,1,13,0,1,9,51,1,13,162,1,21,10,A,7,10,A,7,16.1,A,7,12.2,A,7,78,A,7,984,A,7,240,A,7,2.1,A,7,11300,B,7,2740,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -05/23/1986,20:00,17,522,8,1,13,0,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,16.1,A,7,11.7,A,7,75,A,7,984,A,7,270,A,7,1.5,A,7,11300,B,7,2740,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,25,C,8 -05/23/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,12.2,A,7,81,A,7,984,A,7,260,A,7,1.5,A,7,11300,B,7,2130,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,12.2,A,7,84,A,7,985,A,7,330,A,7,2.1,A,7,11300,B,7,1370,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/23/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,12.8,A,7,84,A,7,984,A,7,0,A,7,0.0,A,7,11300,B,7,1520,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -05/23/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,13.3,A,7,90,A,7,985,A,7,280,A,7,1.5,A,7,11300,B,7,1680,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,13.3,A,7,90,A,7,984,A,7,310,A,7,2.1,A,7,11300,B,7,1520,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,13.3,A,7,93,A,7,984,A,7,250,A,7,2.1,A,7,9700,B,7,1310,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -05/24/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,13.3,A,7,93,A,7,985,A,7,0,A,7,0.0,A,7,8000,B,7,1490,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/24/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,13.3,A,7,93,A,7,985,A,7,230,A,7,2.6,A,7,8000,B,7,1520,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/24/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,13.3,A,7,93,A,7,985,A,7,240,A,7,1.5,A,7,8000,B,7,1280,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/24/1986,06:00,85,1121,24,1,13,0,1,9,24,1,13,27,1,13,0,1,9,27,1,13,81,1,21,10,A,7,10,A,7,15.0,A,7,13.3,A,7,90,A,7,986,A,7,300,A,7,1.5,A,7,8000,B,7,1010,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/24/1986,07:00,338,1332,140,1,13,65,1,9,123,1,13,152,1,13,57,1,9,138,1,13,296,1,21,10,A,7,7,A,7,16.7,A,7,13.3,A,7,81,A,7,986,A,7,330,A,7,2.6,A,7,9700,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/24/1986,08:00,595,1332,279,1,13,264,1,9,161,1,13,300,1,13,268,1,9,180,1,13,342,1,21,3,A,7,3,A,7,18.9,A,7,13.3,A,7,70,A,7,987,A,7,40,A,7,2.1,A,7,11300,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/24/1986,09:00,830,1332,596,1,9,808,1,9,91,1,13,639,1,9,813,1,9,131,1,13,230,1,18,1,A,7,0,A,7,18.9,A,7,12.8,A,7,68,A,7,987,A,7,60,A,7,2.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,10:00,1028,1332,773,1,9,869,1,9,102,1,13,802,1,9,869,1,9,130,1,13,292,1,18,0,A,7,0,A,7,21.7,A,7,12.2,A,7,55,A,7,986,A,7,70,A,7,3.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,11:00,1175,1332,901,1,9,889,1,9,116,1,13,930,1,9,891,1,9,142,1,13,468,1,18,1,A,7,0,A,7,22.8,A,7,12.8,A,7,53,A,7,986,A,7,320,A,7,2.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,12:00,1261,1332,864,1,9,732,1,9,170,1,13,920,1,9,741,1,9,217,1,13,1157,1,18,3,A,7,2,A,7,24.4,A,7,12.2,A,7,47,A,7,986,A,7,270,A,7,3.6,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,13:00,1280,1332,936,1,13,732,1,9,232,1,13,1006,1,13,750,1,9,284,1,13,1881,1,21,10,A,7,3,A,7,26.1,A,7,13.9,A,7,47,A,7,986,A,7,290,A,7,5.2,A,7,11300,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,14:00,1231,1332,512,1,9,192,1,9,335,1,13,572,1,9,209,1,9,378,1,13,1851,1,18,9,A,7,8,A,7,26.7,A,7,13.3,A,7,44,A,7,985,A,7,270,A,7,3.6,A,7,11300,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,15:00,1117,1332,484,1,9,172,1,9,340,1,13,537,1,9,184,1,9,383,1,13,1336,1,18,10,A,7,9,A,7,26.1,A,7,15.0,A,7,51,A,7,985,A,7,270,A,7,5.2,A,7,11300,B,7,7620,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,16:00,946,1332,346,1,9,101,1,9,274,1,13,383,1,9,107,1,9,306,1,13,841,1,18,10,A,7,9,A,7,26.1,A,7,15.0,A,7,51,A,7,985,A,7,270,A,7,3.1,A,7,11300,B,7,3050,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,17:00,729,1332,350,1,9,192,1,9,245,1,13,382,1,9,199,1,9,273,1,13,632,1,18,10,A,7,8,A,7,26.1,A,7,15.6,A,7,52,A,7,984,A,7,250,A,7,2.6,A,7,11300,B,7,3050,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,18:00,483,1332,175,1,13,149,1,9,122,1,13,194,1,13,144,1,9,142,1,13,280,1,21,10,A,7,5,A,7,25.6,A,7,15.0,A,7,52,A,7,984,A,7,280,A,7,2.1,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,19:00,223,1332,48,1,13,10,1,9,47,1,13,55,1,13,2,1,9,55,1,13,168,1,21,10,A,7,10,A,7,25.0,A,7,15.6,A,7,56,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,2440,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,20:00,19,544,2,1,13,0,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,23.3,A,7,16.7,A,7,66,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,2440,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,17.8,A,7,81,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,2440,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,21.7,A,7,16.7,A,7,73,A,7,986,A,7,0,A,7,0.0,A,7,11300,B,7,2440,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,20.6,A,7,17.2,A,7,81,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/24/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,20.0,A,7,16.7,A,7,81,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,2130,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/25/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,19.4,A,7,16.1,A,7,81,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/25/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,16.1,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,3050,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/25/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,18.3,A,7,16.1,A,7,87,A,7,986,A,7,280,A,7,1.5,A,7,11300,B,7,3050,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/25/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,18.3,A,7,16.1,A,7,87,A,7,986,A,7,360,A,7,2.6,A,7,11300,B,7,3050,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/25/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,6,A,7,17.8,A,7,15.0,A,7,84,A,7,986,A,7,10,A,7,4.1,A,7,9700,B,7,7620,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/25/1986,06:00,87,1143,19,1,13,9,1,9,18,1,13,21,1,13,5,1,9,20,1,13,46,1,21,10,A,7,9,A,7,17.2,A,7,14.4,A,7,84,A,7,987,A,7,20,A,7,1.5,A,7,9700,B,7,1980,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/25/1986,07:00,340,1331,65,1,13,2,1,9,65,1,13,75,1,13,1,1,9,75,1,13,252,1,21,10,A,7,10,A,7,17.2,A,7,13.9,A,7,81,A,7,986,A,7,30,A,7,3.1,A,7,8000,B,7,2440,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/25/1986,08:00,596,1331,145,1,9,8,1,9,142,1,13,168,1,9,6,1,9,165,1,13,586,1,18,10,A,7,10,A,7,18.3,A,7,13.9,A,7,76,A,7,987,A,7,20,A,7,3.1,A,7,9700,B,7,3050,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,09:00,832,1331,464,1,13,354,1,9,243,1,13,504,1,13,378,1,9,267,1,13,615,1,21,9,A,7,5,A,7,19.4,A,7,14.4,A,7,73,A,7,987,A,7,330,A,7,3.1,A,7,8000,B,7,7620,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,10:00,1029,1331,335,1,9,10,1,9,327,1,13,389,1,9,9,1,9,382,1,13,1429,1,18,10,A,7,10,A,7,22.2,A,7,15.6,A,7,66,A,7,987,A,7,50,A,7,2.6,A,7,8000,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,11:00,1176,1331,276,1,9,7,1,9,269,1,13,332,1,9,6,1,9,327,1,13,1289,1,18,10,A,7,10,A,7,22.2,A,7,15.0,A,7,64,A,7,987,A,7,70,A,7,2.6,A,7,8000,B,7,7620,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,12:00,1262,1331,409,1,9,12,1,9,398,1,13,485,1,9,11,1,9,474,1,13,1754,1,18,10,A,7,10,A,7,22.2,A,7,15.0,A,7,64,A,7,987,A,7,350,A,7,3.6,A,7,8000,B,7,6100,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,13:00,1281,1331,456,1,9,5,1,9,452,1,13,537,1,9,5,1,9,532,1,13,1916,1,18,10,A,7,10,A,7,23.3,A,7,15.0,A,7,60,A,7,986,A,7,50,A,7,3.6,A,7,8000,B,7,6100,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,14:00,1232,1331,355,1,9,1,1,9,354,1,13,422,1,9,1,1,9,421,1,13,1604,1,18,10,A,7,10,A,7,23.3,A,7,15.6,A,7,62,A,7,986,A,7,70,A,7,3.6,A,7,8000,B,7,6100,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,15:00,1118,1331,381,1,9,3,1,9,379,1,13,444,1,9,3,1,9,442,1,13,1630,1,18,10,A,7,10,A,7,22.2,A,7,16.1,A,7,69,A,7,986,A,7,50,A,7,2.6,A,7,8000,B,7,3050,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,16:00,947,1331,277,1,9,2,1,9,276,1,13,323,1,9,2,1,9,322,1,13,1218,1,18,10,A,7,10,A,7,22.2,A,7,16.1,A,7,69,A,7,985,A,7,40,A,7,3.1,A,7,8000,B,7,3660,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,17:00,731,1331,223,1,9,3,1,9,221,1,13,254,1,9,3,1,9,253,1,13,899,1,18,10,A,7,10,A,7,21.7,A,7,16.7,A,7,73,A,7,985,A,7,40,A,7,5.2,A,7,8000,B,7,3660,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,18:00,485,1331,133,1,9,2,1,9,132,1,13,150,1,9,1,1,9,150,1,13,499,1,18,10,A,7,10,A,7,21.1,A,7,16.7,A,7,76,A,7,985,A,7,20,A,7,3.6,A,7,8000,B,7,3660,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,19:00,226,1331,64,1,13,1,1,9,64,1,13,71,1,13,0,1,9,71,1,13,209,1,21,10,A,7,10,A,7,20.6,A,7,17.2,A,7,81,A,7,985,A,7,30,A,7,3.1,A,7,6400,B,7,3660,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,20:00,20,544,9,1,13,0,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,20.0,A,7,16.1,A,7,78,A,7,986,A,7,40,A,7,2.6,A,7,6400,B,7,3660,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,16.1,A,7,81,A,7,986,A,7,40,A,7,3.1,A,7,4000,B,7,3660,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,15.6,A,7,81,A,7,987,A,7,50,A,7,3.6,A,7,4000,B,7,2130,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,15.6,A,7,84,A,7,987,A,7,50,A,7,2.6,A,7,4000,B,7,2590,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/25/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,15.6,A,7,84,A,7,987,A,7,50,A,7,3.1,A,7,4000,B,7,2130,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,15.6,A,7,87,A,7,986,A,7,60,A,7,2.6,A,7,4000,B,7,2130,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,15.0,A,7,84,A,7,986,A,7,40,A,7,3.1,A,7,4000,B,7,760,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,15.0,A,7,87,A,7,985,A,7,50,A,7,3.6,A,7,4000,B,7,670,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,15.0,A,7,84,A,7,985,A,7,50,A,7,3.1,A,7,4000,B,7,580,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,15.0,A,7,84,A,7,986,A,7,30,A,7,2.6,A,7,4000,B,7,580,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,06:00,88,1142,28,1,13,0,1,9,28,1,13,31,1,13,0,1,9,31,1,13,91,1,21,10,A,7,10,A,7,17.2,A,7,15.0,A,7,87,A,7,987,A,7,40,A,7,3.6,A,7,4000,B,7,550,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,07:00,342,1331,87,1,13,1,1,9,87,1,13,98,1,13,0,1,9,98,1,13,313,1,21,10,A,7,10,A,7,17.2,A,7,15.6,A,7,90,A,7,987,A,7,60,A,7,3.6,A,7,4000,B,7,700,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,08:00,598,1331,205,1,9,0,1,9,204,1,13,228,1,9,0,1,9,228,1,13,749,1,18,10,A,7,10,A,7,17.8,A,7,15.6,A,7,87,A,7,987,A,7,70,A,7,4.1,A,7,4000,B,7,760,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,09:00,832,1331,161,1,9,1,1,9,160,1,13,191,1,9,1,1,9,191,1,13,753,1,18,10,A,7,10,A,7,17.2,A,7,16.7,A,7,97,A,7,988,A,7,60,A,7,3.6,A,7,4000,B,7,180,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,10:00,1030,1331,205,1,9,1,1,9,205,1,13,248,1,9,1,1,9,248,1,13,1004,1,18,10,A,7,10,A,7,17.2,A,7,16.7,A,7,97,A,7,988,A,7,70,A,7,3.6,A,7,4000,B,7,180,A,7,2.9,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -05/26/1986,11:00,1177,1331,409,1,9,1,1,9,408,1,13,478,1,9,1,1,9,477,1,13,1741,1,18,10,A,7,10,A,7,18.3,A,7,16.1,A,7,87,A,7,988,A,7,110,A,7,4.1,A,7,4000,B,7,760,A,7,2.8,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -05/26/1986,12:00,1262,1331,267,1,9,0,1,9,266,1,13,325,1,9,0,1,9,325,1,13,1296,1,18,10,A,7,10,A,7,18.3,A,7,14.4,A,7,78,A,7,988,A,7,90,A,7,3.1,A,7,8000,B,7,760,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/26/1986,13:00,1282,1331,294,1,9,1,1,9,293,1,13,357,1,9,1,1,9,356,1,13,1404,1,18,10,A,7,10,A,7,18.9,A,7,15.6,A,7,81,A,7,988,A,7,90,A,7,4.1,A,7,8000,B,7,760,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,14:00,1233,1331,428,1,9,1,1,9,427,1,13,502,1,9,1,1,9,501,1,13,1823,1,18,10,A,7,10,A,7,20.0,A,7,15.0,A,7,73,A,7,988,A,7,100,A,7,3.6,A,7,9700,B,7,2130,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,15:00,1119,1331,405,1,9,0,1,9,405,1,13,469,1,9,0,1,9,469,1,13,1701,1,18,10,A,7,10,A,7,20.6,A,7,15.0,A,7,71,A,7,988,A,7,100,A,7,3.1,A,7,9700,B,7,2740,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,16:00,949,1331,350,1,9,1,1,9,349,1,13,400,1,9,1,1,9,399,1,13,1423,1,18,10,A,7,10,A,7,20.0,A,7,13.9,A,7,68,A,7,987,A,7,90,A,7,4.1,A,7,9700,B,7,1520,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,17:00,733,1331,240,1,9,0,1,9,240,1,13,272,1,9,0,1,9,272,1,13,950,1,18,10,A,7,10,A,7,20.6,A,7,14.4,A,7,68,A,7,987,A,7,90,A,7,2.6,A,7,9700,B,7,3050,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,18:00,487,1331,108,1,9,27,1,9,98,1,13,119,1,9,25,1,9,110,1,13,289,1,18,10,A,7,9,A,7,20.0,A,7,12.8,A,7,63,A,7,987,A,7,80,A,7,2.1,A,7,11300,B,7,7620,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/26/1986,19:00,228,1331,75,1,13,78,1,9,62,1,13,82,1,13,57,1,9,72,1,13,132,1,21,10,A,7,8,A,7,19.4,A,7,12.8,A,7,66,A,7,987,A,7,30,A,7,1.5,A,7,11300,B,7,7620,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/26/1986,20:00,21,566,3,1,13,0,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,9,A,7,18.3,A,7,13.9,A,7,76,A,7,988,A,7,70,A,7,1.5,A,7,11300,B,7,7620,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/26/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,16.1,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,11300,B,7,1310,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/26/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,15.6,A,7,84,A,7,988,A,7,0,A,7,0.0,A,7,11300,B,7,1310,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/26/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,15.6,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,11300,B,7,1310,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/26/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,15.6,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,11300,B,7,1310,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/27/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,15.6,A,7,90,A,7,988,A,7,240,A,7,2.6,A,7,9700,B,7,1310,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/27/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,15.6,A,7,90,A,7,988,A,7,50,A,7,3.1,A,7,6400,B,7,520,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -05/27/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,15.6,A,7,90,A,7,988,A,7,70,A,7,2.1,A,7,6400,B,7,850,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,16.1,A,7,97,A,7,988,A,7,90,A,7,3.1,A,7,4800,B,7,1370,A,7,2.8,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -05/27/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,16.1,A,7,93,A,7,988,A,7,100,A,7,3.1,A,7,4800,B,7,1220,A,7,2.8,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -05/27/1986,06:00,90,1164,16,1,13,1,1,9,16,1,13,19,1,13,0,1,9,19,1,13,59,1,21,10,A,7,10,A,7,17.2,A,7,16.1,A,7,93,A,7,988,A,7,130,A,7,3.6,A,7,4800,B,7,490,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,07:00,343,1331,67,1,13,4,1,9,66,1,13,77,1,13,2,1,9,77,1,13,256,1,21,10,A,7,10,A,7,17.2,A,7,15.6,A,7,90,A,7,989,A,7,120,A,7,3.1,A,7,6400,B,7,550,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,08:00,599,1331,78,1,9,5,1,9,76,1,13,95,1,9,3,1,9,93,1,13,351,1,18,10,A,7,10,A,7,17.2,A,7,15.6,A,7,90,A,7,989,A,7,130,A,7,3.6,A,7,6400,B,7,1370,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -05/27/1986,09:00,833,1331,283,1,9,0,1,9,283,1,13,323,1,9,0,1,9,323,1,13,1148,1,18,10,A,7,10,A,7,17.8,A,7,16.1,A,7,90,A,7,989,A,7,150,A,7,4.1,A,7,6400,B,7,550,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,10:00,1031,1331,209,1,9,6,1,9,205,1,13,253,1,9,5,1,9,249,1,13,1004,1,18,10,A,7,10,A,7,17.2,A,7,16.1,A,7,93,A,7,989,A,7,140,A,7,5.2,A,7,6400,B,7,460,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,11:00,1177,1331,238,1,9,1,1,9,237,1,13,290,1,9,1,1,9,289,1,13,1164,1,18,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,989,A,7,170,A,7,4.1,A,7,6400,B,7,460,A,7,3.0,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -05/27/1986,12:00,1263,1331,226,1,9,3,1,9,223,1,13,279,1,9,2,1,9,277,1,13,1120,1,18,10,A,7,10,A,7,19.4,A,7,17.2,A,7,87,A,7,989,A,7,170,A,7,5.2,A,7,6400,B,7,460,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,13:00,1282,1331,399,1,9,3,1,9,396,1,13,474,1,9,3,1,9,471,1,13,1757,1,18,10,A,7,10,A,7,20.0,A,7,18.3,A,7,90,A,7,988,A,7,180,A,7,3.1,A,7,6400,B,7,460,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,14:00,1233,1331,472,1,9,1,1,9,471,1,13,549,1,9,1,1,9,548,1,13,1937,1,18,10,A,7,10,A,7,20.6,A,7,18.3,A,7,87,A,7,988,A,7,180,A,7,5.2,A,7,6400,B,7,370,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -05/27/1986,15:00,1120,1331,401,1,9,1,1,9,400,1,13,465,1,9,1,1,9,464,1,13,1689,1,18,10,A,7,10,A,7,22.2,A,7,17.8,A,7,76,A,7,988,A,7,160,A,7,3.6,A,7,9700,B,7,370,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,16:00,950,1331,322,1,9,1,1,9,322,1,13,371,1,9,1,1,9,371,1,13,1355,1,18,10,A,7,10,A,7,21.1,A,7,17.8,A,7,81,A,7,987,A,7,190,A,7,2.6,A,7,9700,B,7,340,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/27/1986,17:00,735,1331,245,1,9,0,1,9,245,1,13,278,1,9,0,1,9,278,1,13,964,1,18,10,A,7,10,A,7,21.1,A,7,17.8,A,7,81,A,7,986,A,7,200,A,7,2.6,A,7,11300,B,7,460,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/27/1986,18:00,489,1331,147,1,9,1,1,9,147,1,13,165,1,9,1,1,9,165,1,13,539,1,18,10,A,7,10,A,7,21.1,A,7,17.8,A,7,81,A,7,986,A,7,210,A,7,3.1,A,7,11300,B,7,520,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/27/1986,19:00,231,1331,77,1,13,30,1,9,71,1,13,83,1,13,24,1,9,79,1,13,169,1,21,10,A,7,5,A,7,20.6,A,7,17.8,A,7,84,A,7,986,A,7,180,A,7,2.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/27/1986,20:00,22,588,9,1,13,1,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,5,A,7,18.9,A,7,17.2,A,7,90,A,7,987,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/27/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,17.8,A,7,90,A,7,987,A,7,190,A,7,2.1,A,7,8000,B,7,850,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,17.8,A,7,90,A,7,987,A,7,190,A,7,3.1,A,7,6400,B,7,700,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,987,A,7,0,A,7,0.0,A,7,4000,B,7,150,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/27/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,987,A,7,190,A,7,3.6,A,7,4000,B,7,150,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/28/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,987,A,7,190,A,7,2.6,A,7,4000,B,7,150,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/28/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,986,A,7,190,A,7,3.6,A,7,4000,B,7,150,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -05/28/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,210,A,7,3.6,A,7,4000,B,7,150,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/28/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,19.4,A,7,17.8,A,7,90,A,7,986,A,7,200,A,7,3.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/28/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,17.8,A,7,90,A,7,986,A,7,210,A,7,3.1,A,7,11300,B,7,3050,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,06:00,91,1164,20,1,13,1,1,9,20,1,13,23,1,13,0,1,9,23,1,13,71,1,21,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,987,A,7,210,A,7,2.1,A,7,6400,B,7,2440,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,07:00,345,1330,75,1,9,1,1,9,75,1,13,86,1,9,0,1,9,86,1,13,283,1,18,10,A,7,10,A,7,19.4,A,7,17.8,A,7,90,A,7,987,A,7,220,A,7,2.6,A,7,8000,B,7,2130,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/28/1986,08:00,600,1330,297,1,13,318,1,9,154,1,13,322,1,13,324,1,9,175,1,13,324,1,21,7,A,7,6,A,7,20.6,A,7,17.2,A,7,81,A,7,987,A,7,230,A,7,5.2,A,7,11300,B,7,2440,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -05/28/1986,09:00,834,1330,327,1,13,178,1,9,216,1,13,364,1,13,188,1,9,246,1,13,599,1,21,7,A,7,7,A,7,23.9,A,7,19.4,A,7,76,A,7,987,A,7,220,A,7,4.1,A,7,11300,B,7,3050,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,10:00,1031,1330,478,1,9,82,1,9,415,1,13,527,1,9,85,1,9,461,1,13,1548,1,18,10,A,7,9,A,7,23.9,A,7,18.3,A,7,71,A,7,987,A,7,260,A,7,3.6,A,7,16100,B,7,3050,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,11:00,1178,1330,442,1,9,53,1,9,395,1,13,488,1,9,55,1,9,440,1,13,1841,1,18,10,A,7,10,A,7,25.0,A,7,18.3,A,7,67,A,7,987,A,7,280,A,7,2.6,A,7,16100,B,7,3050,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,12:00,1263,1330,510,1,9,82,1,9,432,1,13,564,1,9,84,1,9,483,1,13,2442,1,18,10,A,7,9,A,7,26.7,A,7,16.7,A,7,54,A,7,986,A,7,280,A,7,4.1,A,7,11300,B,7,3050,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,13:00,1283,1330,908,1,13,639,1,9,291,1,13,961,1,13,647,1,9,335,1,13,2409,1,21,10,A,7,5,A,7,28.3,A,7,16.7,A,7,49,A,7,985,A,7,280,A,7,4.1,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,14:00,1234,1330,324,1,9,35,1,9,292,1,13,360,1,9,36,1,9,327,1,13,1586,1,18,10,A,7,10,A,7,28.9,A,7,15.6,A,7,44,A,7,985,A,7,270,A,7,4.1,A,7,11300,B,7,1070,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,15:00,1121,1330,285,1,9,5,1,9,281,1,13,340,1,9,4,1,9,337,1,13,1319,1,18,10,A,7,10,A,7,27.2,A,7,16.7,A,7,53,A,7,985,A,7,260,A,7,7.7,A,7,11300,B,7,1220,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,16:00,952,1330,564,1,9,422,1,9,262,1,13,600,1,9,438,1,9,286,1,13,762,1,18,8,A,7,8,A,7,25.0,A,7,17.2,A,7,62,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,1220,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,17:00,737,1330,256,1,9,108,1,9,196,1,13,283,1,9,113,1,9,221,1,13,508,1,18,9,A,7,9,A,7,26.1,A,7,18.3,A,7,62,A,7,984,A,7,0,A,7,0.0,A,7,11300,B,7,1220,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,18:00,492,1330,161,1,9,104,1,9,122,1,13,177,1,9,101,1,9,140,1,13,281,1,18,8,A,7,8,A,7,25.0,A,7,19.4,A,7,71,A,7,984,A,7,0,A,7,0.0,A,7,16100,B,7,3050,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,19:00,234,1330,59,1,13,43,1,9,52,1,13,65,1,13,33,1,9,59,1,13,133,1,21,8,A,7,8,A,7,24.4,A,7,19.4,A,7,74,A,7,984,A,7,0,A,7,0.0,A,7,16100,B,7,3050,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,20:00,23,610,9,1,13,1,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,8,A,7,8,A,7,23.3,A,7,20.0,A,7,82,A,7,984,A,7,0,A,7,0.0,A,7,16100,B,7,3050,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,22.2,A,7,18.9,A,7,82,A,7,985,A,7,0,A,7,0.0,A,7,16100,B,7,3050,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,21.1,A,7,19.4,A,7,90,A,7,985,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,21.1,A,7,19.4,A,7,90,A,7,985,A,7,0,A,7,0.0,A,7,12900,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/28/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,0,A,7,0.0,A,7,12900,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,19.4,A,7,17.8,A,7,90,A,7,985,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,19.4,A,7,18.3,A,7,93,A,7,985,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,18.9,A,7,18.3,A,7,97,A,7,985,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,985,A,7,0,A,7,0.0,A,7,16100,B,7,2740,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,18.9,A,7,17.8,A,7,93,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,2440,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,06:00,93,1186,19,1,13,16,1,9,17,1,13,20,1,13,10,1,9,19,1,13,44,1,21,7,A,7,7,A,7,19.4,A,7,18.3,A,7,93,A,7,985,A,7,0,A,7,0.0,A,7,8000,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,07:00,346,1330,112,1,13,124,1,9,80,1,13,124,1,13,108,1,9,96,1,13,176,1,21,5,A,7,4,A,7,21.1,A,7,18.9,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/29/1986,08:00,601,1330,255,1,13,205,1,9,163,1,13,275,1,13,209,1,9,181,1,13,347,1,21,5,A,7,5,A,7,23.9,A,7,17.2,A,7,66,A,7,985,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/29/1986,09:00,835,1330,455,1,13,384,1,9,213,1,13,484,1,13,395,1,9,235,1,13,524,1,21,6,A,7,6,A,7,23.9,A,7,18.9,A,7,74,A,7,985,A,7,310,A,7,2.6,A,7,11300,B,7,2740,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/29/1986,10:00,1032,1330,657,1,13,494,1,9,273,1,13,704,1,13,515,1,9,304,1,13,919,1,21,6,A,7,6,A,7,26.7,A,7,17.8,A,7,58,A,7,985,A,7,350,A,7,2.1,A,7,11300,B,7,3050,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,11:00,1178,1330,678,1,13,354,1,9,364,1,13,747,1,13,385,1,9,405,1,13,1690,1,21,6,A,7,5,A,7,27.8,A,7,18.3,A,7,57,A,7,985,A,7,350,A,7,2.6,A,7,11300,B,7,3050,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,12:00,1264,1330,815,1,13,516,1,9,323,1,13,886,1,13,541,1,9,371,1,13,2429,1,21,7,A,7,4,A,7,28.3,A,7,17.8,A,7,53,A,7,984,A,7,340,A,7,1.5,A,7,11300,B,7,3660,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,13:00,1283,1330,562,1,13,189,1,9,380,1,13,628,1,13,203,1,9,432,1,13,2582,1,21,9,A,7,7,A,7,28.3,A,7,15.6,A,7,46,A,7,984,A,7,360,A,7,2.6,A,7,11300,B,7,3660,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,14:00,1235,1330,645,1,13,317,1,9,351,1,13,718,1,13,345,1,9,397,1,13,1997,1,21,10,A,7,7,A,7,29.4,A,7,17.2,A,7,48,A,7,984,A,7,360,A,7,4.6,A,7,11300,B,7,3660,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,15:00,1122,1330,493,1,13,214,1,9,312,1,13,546,1,13,233,1,9,349,1,13,1228,1,21,10,A,7,7,A,7,28.9,A,7,17.8,A,7,51,A,7,983,A,7,340,A,7,3.1,A,7,11300,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,16:00,953,1330,295,1,9,4,1,9,292,1,13,342,1,9,4,1,9,339,1,13,1272,1,18,10,A,7,10,A,7,28.9,A,7,18.3,A,7,53,A,7,983,A,7,340,A,7,2.6,A,7,9700,B,7,7620,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/29/1986,17:00,739,1330,159,1,9,9,1,9,154,1,13,187,1,9,7,1,9,183,1,13,692,1,18,10,A,7,10,A,7,28.3,A,7,18.3,A,7,55,A,7,983,A,7,340,A,7,2.1,A,7,9700,B,7,6100,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/29/1986,18:00,494,1330,108,1,9,2,1,9,107,1,13,124,1,9,1,1,9,124,1,13,432,1,18,10,A,7,10,A,7,27.2,A,7,18.3,A,7,58,A,7,983,A,7,360,A,7,2.1,A,7,9700,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/29/1986,19:00,236,1330,35,1,13,15,1,9,33,1,13,39,1,13,12,1,9,37,1,13,90,1,21,9,A,7,9,A,7,26.1,A,7,18.9,A,7,65,A,7,982,A,7,20,A,7,2.1,A,7,9700,B,7,6100,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/29/1986,20:00,24,609,9,1,13,4,1,9,9,1,13,10,1,13,2,1,9,10,1,13,23,1,21,8,A,7,7,A,7,25.0,A,7,19.4,A,7,71,A,7,982,A,7,0,A,7,0.0,A,7,11300,B,7,6100,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,04,C,8 -05/29/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,23.9,A,7,19.4,A,7,76,A,7,983,A,7,0,A,7,0.0,A,7,11300,B,7,6100,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,21.7,A,7,19.4,A,7,87,A,7,983,A,7,0,A,7,0.0,A,7,11300,B,7,6100,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,22.2,A,7,19.4,A,7,84,A,7,983,A,7,0,A,7,0.0,A,7,11300,B,7,1520,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/29/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,22.2,A,7,20.0,A,7,87,A,7,983,A,7,0,A,7,0.0,A,7,11300,B,7,1520,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,21.7,A,7,20.0,A,7,90,A,7,983,A,7,350,A,7,2.1,A,7,11300,B,7,1520,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,21.7,A,7,19.4,A,7,87,A,7,982,A,7,340,A,7,2.1,A,7,11300,B,7,1520,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,21.7,A,7,20.0,A,7,90,A,7,982,A,7,340,A,7,1.5,A,7,9700,B,7,1520,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,21.7,A,7,20.0,A,7,90,A,7,982,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/30/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,20.6,A,7,18.9,A,7,90,A,7,982,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -05/30/1986,06:00,94,1185,23,1,13,20,1,9,21,1,13,25,1,13,12,1,9,24,1,13,52,1,21,3,A,7,2,A,7,20.0,A,7,18.9,A,7,93,A,7,982,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/30/1986,07:00,347,1329,107,1,13,76,1,9,87,1,13,117,1,13,66,1,9,100,1,13,191,1,21,5,A,7,4,A,7,21.7,A,7,18.9,A,7,84,A,7,982,A,7,280,A,7,1.5,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -05/30/1986,08:00,602,1329,333,1,9,413,1,9,146,1,13,353,1,9,407,1,9,168,1,13,295,1,18,3,A,7,2,A,7,25.0,A,7,18.9,A,7,69,A,7,983,A,7,310,A,7,2.1,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -05/30/1986,09:00,835,1329,523,1,13,535,1,9,186,1,13,565,1,13,552,1,9,217,1,13,452,1,21,8,A,7,3,A,7,26.1,A,7,18.3,A,7,62,A,7,983,A,7,310,A,7,2.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,10:00,1032,1329,688,1,9,539,1,9,268,1,13,738,1,9,562,1,9,301,1,13,902,1,18,8,A,7,2,A,7,27.8,A,7,17.8,A,7,55,A,7,983,A,7,360,A,7,2.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,11:00,1178,1329,868,1,9,670,1,9,273,1,13,912,1,9,677,1,9,311,1,13,1337,1,18,10,A,7,1,A,7,28.9,A,7,19.4,A,7,57,A,7,982,A,7,230,A,7,1.5,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,12:00,1264,1329,846,1,9,513,1,9,357,1,13,911,1,9,537,1,9,399,1,13,2706,1,18,10,A,7,2,A,7,30.0,A,7,20.6,A,7,57,A,7,982,A,7,340,A,7,2.1,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,13:00,1284,1329,803,1,13,416,1,9,401,1,13,857,1,13,435,1,9,437,1,13,3490,1,21,10,A,7,4,A,7,30.6,A,7,19.4,A,7,52,A,7,981,A,7,270,A,7,3.1,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,14:00,1236,1329,773,1,13,304,1,9,490,1,13,839,1,13,330,1,9,531,1,13,2885,1,21,10,A,7,7,A,7,30.0,A,7,16.7,A,7,45,A,7,980,A,7,290,A,7,5.2,A,7,11300,B,7,7620,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,15:00,1123,1329,689,1,13,420,1,9,334,1,13,733,1,13,438,1,9,362,1,13,1422,1,21,10,A,7,5,A,7,30.0,A,7,16.7,A,7,45,A,7,980,A,7,320,A,7,2.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,16:00,954,1329,535,1,13,356,1,9,279,1,13,584,1,13,384,1,9,308,1,13,813,1,21,10,A,7,4,A,7,28.3,A,7,17.2,A,7,51,A,7,979,A,7,40,A,7,4.1,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,17:00,740,1329,306,1,13,113,1,9,243,1,13,334,1,13,117,1,9,269,1,13,632,1,21,10,A,7,7,A,7,27.8,A,7,17.8,A,7,55,A,7,979,A,7,30,A,7,2.1,A,7,11300,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,18:00,496,1329,175,1,9,56,1,9,155,1,13,193,1,9,53,1,9,173,1,13,424,1,18,10,A,7,8,A,7,27.2,A,7,18.3,A,7,58,A,7,979,A,7,20,A,7,1.5,A,7,11300,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,19:00,238,1329,63,1,13,21,1,9,60,1,13,70,1,13,16,1,9,67,1,13,150,1,21,10,A,7,8,A,7,25.6,A,7,18.3,A,7,64,A,7,979,A,7,360,A,7,2.6,A,7,11300,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,20:00,25,631,6,1,13,0,1,9,6,1,13,7,1,13,0,1,9,7,1,13,23,1,21,10,A,7,10,A,7,23.9,A,7,18.3,A,7,71,A,7,980,A,7,40,A,7,2.6,A,7,11300,B,7,2440,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,18.3,A,7,71,A,7,980,A,7,10,A,7,2.6,A,7,11300,B,7,2440,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,18.3,A,7,71,A,7,980,A,7,310,A,7,2.6,A,7,11300,B,7,1830,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,18.3,A,7,74,A,7,980,A,7,0,A,7,0.0,A,7,11300,B,7,2440,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/30/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,16.7,A,7,76,A,7,981,A,7,180,A,7,2.1,A,7,11300,B,7,2130,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,21.1,A,7,17.2,A,7,79,A,7,980,A,7,0,A,7,0.0,A,7,11300,B,7,2130,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,18.3,A,7,87,A,7,980,A,7,240,A,7,2.6,A,7,11300,B,7,2440,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,19.4,A,7,17.8,A,7,90,A,7,980,A,7,230,A,7,3.1,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,20.0,A,7,17.8,A,7,87,A,7,980,A,7,260,A,7,3.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,19.4,A,7,17.2,A,7,87,A,7,980,A,7,270,A,7,2.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,06:00,95,1185,28,1,13,14,1,9,27,1,13,31,1,13,9,1,9,30,1,13,65,1,21,10,A,7,7,A,7,20.0,A,7,16.1,A,7,78,A,7,980,A,7,300,A,7,3.6,A,7,11300,B,7,7620,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,07:00,348,1329,69,1,9,22,1,9,63,1,13,76,1,9,19,1,9,71,1,13,176,1,18,10,A,7,9,A,7,20.6,A,7,16.7,A,7,79,A,7,981,A,7,320,A,7,2.6,A,7,11300,B,7,7620,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,08:00,602,1329,343,1,13,450,1,9,139,1,13,365,1,13,444,1,9,164,1,13,279,1,21,7,A,7,3,A,7,22.2,A,7,16.7,A,7,71,A,7,981,A,7,330,A,7,2.1,A,7,9700,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,09:00,836,1329,539,1,13,571,1,9,179,1,13,561,1,13,571,1,9,201,1,13,431,1,21,7,A,7,5,A,7,23.9,A,7,16.1,A,7,62,A,7,981,A,7,310,A,7,3.6,A,7,9700,B,7,7620,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,10:00,1032,1329,625,1,13,532,1,9,211,1,13,659,1,13,539,1,9,239,1,13,699,1,21,4,A,7,4,A,7,26.7,A,7,17.8,A,7,58,A,7,981,A,7,30,A,7,2.6,A,7,9700,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,11:00,1179,1329,897,1,9,846,1,9,145,1,13,918,1,9,847,1,9,166,1,13,541,1,18,0,A,7,0,A,7,27.8,A,7,18.3,A,7,57,A,7,981,A,7,350,A,7,2.1,A,7,9700,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,12:00,1264,1329,883,1,13,695,1,9,220,1,13,950,1,13,713,1,9,270,1,13,1642,1,21,4,A,7,4,A,7,28.9,A,7,18.9,A,7,55,A,7,980,A,7,330,A,7,4.1,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,13:00,1284,1329,856,1,13,561,1,9,313,1,13,937,1,13,588,1,9,367,1,13,2723,1,21,5,A,7,5,A,7,29.4,A,7,19.4,A,7,55,A,7,980,A,7,320,A,7,3.1,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,14:00,1236,1329,663,1,13,339,1,9,348,1,13,739,1,13,369,1,9,395,1,13,1997,1,21,7,A,7,7,A,7,27.8,A,7,13.9,A,7,43,A,7,979,A,7,40,A,7,3.1,A,7,8000,B,7,1520,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,15:00,1124,1329,771,1,9,666,1,9,207,1,13,823,1,9,680,1,9,246,1,13,869,1,18,1,A,7,1,A,7,30.6,A,7,13.9,A,7,36,A,7,979,A,7,300,A,7,3.1,A,7,8000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,16:00,956,1329,641,1,9,670,1,9,160,1,13,685,1,9,684,1,9,192,1,13,470,1,18,2,A,7,2,A,7,29.4,A,7,13.9,A,7,39,A,7,979,A,7,340,A,7,1.5,A,7,8000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,17:00,742,1329,476,1,9,680,1,9,97,1,13,501,1,9,674,1,9,124,1,13,216,1,18,1,A,7,1,A,7,30.0,A,7,12.8,A,7,35,A,7,978,A,7,310,A,7,3.1,A,7,8000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,18:00,498,1329,301,1,9,599,1,9,78,1,13,318,1,9,563,1,9,106,1,13,155,1,18,0,A,7,0,A,7,28.9,A,7,13.3,A,7,38,A,7,978,A,7,310,A,7,2.1,A,7,8000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,19:00,241,1329,99,1,13,268,1,9,51,1,13,105,1,13,192,1,9,70,1,13,91,1,21,4,A,7,1,A,7,28.3,A,7,13.9,A,7,41,A,7,979,A,7,300,A,7,2.1,A,7,8000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,20:00,27,653,11,1,13,14,1,9,9,1,13,11,1,13,5,1,9,11,1,13,18,1,21,3,A,7,2,A,7,26.1,A,7,15.0,A,7,51,A,7,979,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,23.9,A,7,15.6,A,7,60,A,7,979,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,23.3,A,7,16.0,A,7,66,A,7,980,A,7,0,A,7,0.3,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -05/31/1986,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,22.8,A,7,16.4,A,7,78,A,7,980,A,7,0,A,7,0.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -05/31/1986,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.2,A,7,16.8,A,7,76,A,7,980,A,7,0,A,7,0.9,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,21.7,A,7,17.1,A,7,79,A,7,990,A,7,240,A,7,1.2,A,7,11300,B,7,3660,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,21.1,A,7,17.5,A,7,79,A,7,990,A,7,290,A,7,1.5,A,7,16100,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,20.6,A,7,17.9,A,7,84,A,7,989,A,7,250,A,7,1.8,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.0,A,7,18.3,A,7,90,A,7,989,A,7,230,A,7,2.1,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,19.4,A,7,17.8,A,7,90,A,7,990,A,7,240,A,7,2.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,06:00,97,1207,35,1,13,92,1,9,26,1,13,36,1,13,39,1,9,33,1,13,46,1,21,0,A,7,0,A,7,20.0,A,7,18.3,A,7,90,A,7,991,A,7,300,A,7,2.6,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,07:00,349,1328,181,1,9,445,1,9,64,1,13,187,1,9,376,1,9,88,1,13,118,1,18,0,A,7,0,A,7,23.3,A,7,17.8,A,7,71,A,7,991,A,7,320,A,7,3.1,A,7,6400,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,08:00,603,1328,385,1,9,637,1,9,95,1,13,405,1,9,622,1,9,123,1,13,198,1,18,0,A,7,0,A,7,26.7,A,7,18.3,A,7,60,A,7,991,A,7,330,A,7,3.6,A,7,8000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,09:00,836,1328,588,1,9,739,1,9,122,1,13,612,1,9,735,1,9,148,1,13,281,1,18,0,A,7,0,A,7,28.3,A,7,18.9,A,7,57,A,7,991,A,7,320,A,7,3.1,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,10:00,1033,1328,763,1,9,797,1,9,142,1,13,804,1,9,803,1,9,178,1,13,447,1,18,0,A,7,0,A,7,30.0,A,7,18.9,A,7,51,A,7,991,A,7,350,A,7,3.6,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,11:00,1179,1328,895,1,9,833,1,9,154,1,13,953,1,9,844,1,9,203,1,13,732,1,18,0,A,7,0,A,7,31.1,A,7,18.9,A,7,48,A,7,991,A,7,300,A,7,4.1,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,12:00,1265,1328,916,1,9,768,1,9,183,1,13,968,1,9,775,1,9,228,1,13,1289,1,18,2,A,7,2,A,7,31.1,A,7,18.9,A,7,48,A,7,990,A,7,300,A,7,3.1,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,13:00,1285,1328,900,1,13,681,1,9,241,1,13,966,1,13,697,1,9,291,1,13,2071,1,21,4,A,7,4,A,7,32.2,A,7,18.9,A,7,45,A,7,990,A,7,300,A,7,4.1,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,14:00,1237,1328,875,1,13,723,1,9,201,1,13,946,1,13,744,1,9,252,1,13,1298,1,21,3,A,7,3,A,7,32.8,A,7,19.4,A,7,45,A,7,989,A,7,240,A,7,2.6,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,15:00,1126,1328,648,1,13,495,1,9,229,1,13,687,1,13,503,1,9,260,1,13,957,1,21,3,A,7,3,A,7,32.8,A,7,19.4,A,7,45,A,7,989,A,7,230,A,7,4.1,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,16:00,957,1328,685,1,13,721,1,9,166,1,13,730,1,13,735,1,9,199,1,13,488,1,21,3,A,7,3,A,7,32.8,A,7,19.4,A,7,45,A,7,988,A,7,260,A,7,4.1,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,17:00,744,1328,487,1,9,652,1,9,123,1,13,517,1,9,653,1,9,150,1,13,281,1,18,2,A,7,2,A,7,32.2,A,7,20.0,A,7,48,A,7,988,A,7,240,A,7,4.6,A,7,9700,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,18:00,501,1328,285,1,13,494,1,9,100,1,13,295,1,13,460,1,9,122,1,13,190,1,21,4,A,7,3,A,7,31.7,A,7,19.4,A,7,48,A,7,987,A,7,230,A,7,3.1,A,7,8000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,19:00,244,1328,92,1,13,196,1,9,56,1,13,98,1,13,140,1,9,73,1,13,103,1,21,5,A,7,2,A,7,29.4,A,7,20.0,A,7,57,A,7,987,A,7,220,A,7,3.1,A,7,8000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,20:00,28,653,10,1,13,12,1,9,8,1,13,10,1,13,5,1,9,10,1,13,16,1,21,2,A,7,1,A,7,27.2,A,7,20.0,A,7,65,A,7,987,A,7,210,A,7,2.6,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/01/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,26.1,A,7,20.0,A,7,69,A,7,988,A,7,220,A,7,2.6,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.6,A,7,20.0,A,7,72,A,7,988,A,7,240,A,7,2.6,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,19.4,A,7,71,A,7,988,A,7,250,A,7,1.5,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/01/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.9,A,7,19.4,A,7,76,A,7,988,A,7,250,A,7,2.6,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/02/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.2,A,7,19.4,A,7,84,A,7,987,A,7,230,A,7,3.1,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/02/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.8,A,7,20.0,A,7,84,A,7,987,A,7,270,A,7,3.1,A,7,9700,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.2,A,7,20.0,A,7,87,A,7,987,A,7,290,A,7,2.6,A,7,9700,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.2,A,7,20.0,A,7,87,A,7,987,A,7,270,A,7,2.6,A,7,9700,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.7,A,7,19.4,A,7,87,A,7,987,A,7,300,A,7,2.6,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,06:00,98,1206,33,1,13,52,1,9,27,1,13,35,1,13,26,1,9,32,1,13,56,1,21,0,A,7,0,A,7,22.2,A,7,18.9,A,7,82,A,7,987,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,07:00,350,1328,170,1,9,365,1,9,74,1,13,181,1,9,308,1,9,99,1,13,135,1,18,0,A,7,0,A,7,24.4,A,7,20.0,A,7,76,A,7,987,A,7,230,A,7,2.6,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,08:00,604,1328,370,1,9,562,1,9,114,1,13,385,1,9,544,1,9,137,1,13,231,1,18,0,A,7,0,A,7,27.2,A,7,20.0,A,7,65,A,7,988,A,7,290,A,7,3.1,A,7,8000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,09:00,837,1328,574,1,9,676,1,9,148,1,13,607,1,9,683,1,9,176,1,13,367,1,18,0,A,7,0,A,7,30.0,A,7,20.0,A,7,55,A,7,987,A,7,340,A,7,3.1,A,7,9700,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,10:00,1033,1328,750,1,9,741,1,9,172,1,13,802,1,9,759,1,9,210,1,13,584,1,18,0,A,7,0,A,7,30.6,A,7,18.9,A,7,50,A,7,987,A,7,310,A,7,4.6,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,11:00,1179,1328,880,1,9,778,1,9,188,1,13,918,1,9,780,1,9,223,1,13,858,1,18,0,A,7,0,A,7,31.7,A,7,19.4,A,7,48,A,7,987,A,7,300,A,7,5.2,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,12:00,1265,1328,959,1,9,799,1,9,197,1,13,1006,1,9,803,1,9,240,1,13,1379,1,18,0,A,7,0,A,7,32.2,A,7,20.0,A,7,48,A,7,987,A,7,280,A,7,5.2,A,7,9700,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,13:00,1285,1328,941,1,9,771,1,9,194,1,13,991,1,9,776,1,9,238,1,13,1578,1,18,1,A,7,1,A,7,32.2,A,7,18.9,A,7,45,A,7,986,A,7,240,A,7,3.1,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,14:00,1238,1328,884,1,13,674,1,9,255,1,13,940,1,13,686,1,9,299,1,13,1634,1,21,3,A,7,3,A,7,33.3,A,7,18.9,A,7,42,A,7,985,A,7,260,A,7,4.1,A,7,8000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,15:00,1126,1328,473,1,13,278,1,9,237,1,13,521,1,13,291,1,9,274,1,13,1003,1,21,5,A,7,5,A,7,33.9,A,7,18.9,A,7,41,A,7,984,A,7,260,A,7,4.1,A,7,8000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/02/1989,16:00,959,1328,172,1,9,13,1,9,163,1,13,209,1,9,10,1,9,202,1,13,810,1,18,10,A,7,10,A,7,28.3,A,7,17.2,A,7,51,A,7,985,A,7,250,A,7,10.3,A,7,2400,B,7,1520,A,7,3.0,E,8,0.000,F,8,0.00,?,0,13,1,D,9,05,C,8 -06/02/1989,17:00,746,1328,209,1,9,9,1,9,204,1,13,241,1,9,7,1,9,237,1,13,861,1,18,10,A,7,10,A,7,21.7,A,7,19.4,A,7,87,A,7,986,A,7,320,A,7,4.1,A,7,8000,B,7,1980,A,7,3.4,E,8,0.000,F,8,0.00,?,0,124,1,D,9,05,C,8 -06/02/1989,18:00,502,1328,61,1,9,6,1,9,59,1,13,74,1,9,3,1,9,73,1,13,265,1,18,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,986,A,7,30,A,7,2.6,A,7,6400,B,7,910,A,7,3.5,E,8,0.000,F,8,0.00,?,0,84,1,D,9,45,C,8 -06/02/1989,19:00,246,1328,63,1,13,31,1,9,57,1,13,69,1,13,25,1,9,64,1,13,146,1,21,8,A,7,8,A,7,21.7,A,7,18.9,A,7,84,A,7,986,A,7,0,A,7,0.0,A,7,11300,B,7,2130,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/02/1989,20:00,29,675,14,1,13,1,1,9,14,1,13,16,1,13,0,1,9,16,1,13,48,1,21,8,A,7,7,A,7,20.6,A,7,18.9,A,7,90,A,7,985,A,7,20,A,7,2.1,A,7,11300,B,7,3050,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,25,C,8 -06/02/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,5,A,7,20.0,A,7,18.9,A,7,93,A,7,986,A,7,30,A,7,1.5,A,7,24100,B,7,7620,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/02/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,20.0,A,7,18.3,A,7,90,A,7,985,A,7,350,A,7,1.5,A,7,24100,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/02/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,18.9,A,7,18.3,A,7,97,A,7,985,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/02/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,19.4,A,7,18.9,A,7,97,A,7,986,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,18.9,A,7,18.3,A,7,97,A,7,986,A,7,210,A,7,1.5,A,7,16100,B,7,2130,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,19.4,A,7,18.3,A,7,93,A,7,985,A,7,210,A,7,2.1,A,7,16100,B,7,1980,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,18.9,A,7,18.9,A,7,100,A,7,985,A,7,240,A,7,2.1,A,7,16100,B,7,2130,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,18.9,A,7,17.8,A,7,93,A,7,985,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,18.9,A,7,17.8,A,7,93,A,7,985,A,7,280,A,7,2.1,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,06:00,99,1228,36,1,13,63,1,9,30,1,13,39,1,13,32,1,9,36,1,13,62,1,21,9,A,7,2,A,7,18.9,A,7,17.8,A,7,93,A,7,985,A,7,300,A,7,2.1,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,07:00,351,1328,181,1,9,435,1,9,66,1,13,186,1,9,368,1,9,89,1,13,121,1,18,7,A,7,2,A,7,20.0,A,7,18.3,A,7,90,A,7,986,A,7,320,A,7,2.6,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,08:00,604,1328,365,1,9,515,1,9,130,1,13,391,1,9,509,1,9,159,1,13,260,1,18,5,A,7,2,A,7,22.2,A,7,18.9,A,7,82,A,7,986,A,7,290,A,7,2.6,A,7,16100,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,09:00,837,1328,525,1,13,562,1,9,170,1,13,549,1,13,564,1,9,193,1,13,414,1,21,5,A,7,3,A,7,25.0,A,7,18.3,A,7,67,A,7,986,A,7,320,A,7,2.1,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,10:00,1033,1328,706,1,9,782,1,9,97,1,13,733,1,9,783,1,9,123,1,13,290,1,18,3,A,7,2,A,7,27.2,A,7,19.4,A,7,63,A,7,986,A,7,80,A,7,2.1,A,7,16100,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,11:00,1179,1328,800,1,13,632,1,9,238,1,13,850,1,13,643,1,9,277,1,13,1189,1,21,4,A,7,3,A,7,28.9,A,7,18.9,A,7,55,A,7,985,A,7,340,A,7,1.5,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,12:00,1265,1328,913,1,9,775,1,9,173,1,13,971,1,9,784,1,9,222,1,13,1237,1,18,3,A,7,2,A,7,29.4,A,7,19.4,A,7,55,A,7,985,A,7,240,A,7,2.1,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,13:00,1285,1328,971,1,13,862,1,9,136,1,13,997,1,13,865,1,9,158,1,13,952,1,21,3,A,7,3,A,7,29.4,A,7,17.8,A,7,50,A,7,984,A,7,320,A,7,2.1,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,14:00,1238,1328,853,1,13,643,1,9,252,1,13,907,1,13,655,1,9,295,1,13,1623,1,21,4,A,7,4,A,7,30.6,A,7,18.3,A,7,48,A,7,983,A,7,170,A,7,3.6,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,15:00,1127,1328,646,1,13,482,1,9,236,1,13,712,1,13,505,1,9,282,1,13,1002,1,21,4,A,7,4,A,7,30.6,A,7,18.3,A,7,48,A,7,982,A,7,190,A,7,4.6,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,16:00,960,1328,685,1,9,769,1,9,130,1,13,724,1,9,773,1,9,163,1,13,361,1,18,4,A,7,2,A,7,30.0,A,7,17.8,A,7,48,A,7,982,A,7,220,A,7,5.2,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,17:00,747,1328,434,1,9,492,1,9,158,1,13,471,1,9,502,1,9,188,1,13,350,1,18,6,A,7,2,A,7,30.0,A,7,18.3,A,7,50,A,7,981,A,7,230,A,7,4.1,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,18:00,504,1328,286,1,9,472,1,9,108,1,13,307,1,9,448,1,9,136,1,13,206,1,18,8,A,7,2,A,7,29.4,A,7,18.3,A,7,51,A,7,981,A,7,250,A,7,3.1,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,19:00,248,1328,72,1,13,45,1,9,64,1,13,79,1,13,36,1,9,73,1,13,160,1,21,8,A,7,7,A,7,27.8,A,7,19.4,A,7,61,A,7,981,A,7,210,A,7,2.1,A,7,16100,B,7,7620,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,20:00,30,697,14,1,13,25,1,9,12,1,13,15,1,13,10,1,9,14,1,13,25,1,21,4,A,7,3,A,7,25.0,A,7,19.4,A,7,71,A,7,981,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,24.4,A,7,20.0,A,7,76,A,7,982,A,7,320,A,7,1.5,A,7,16100,B,7,1980,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,22.8,A,7,20.0,A,7,84,A,7,982,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,21.7,A,7,20.0,A,7,90,A,7,982,A,7,220,A,7,2.6,A,7,16100,B,7,3660,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/03/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,23.3,A,7,18.9,A,7,76,A,7,982,A,7,240,A,7,4.6,A,7,16100,B,7,3660,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,23.3,A,7,17.8,A,7,71,A,7,982,A,7,230,A,7,4.6,A,7,16100,B,7,3660,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,22.2,A,7,16.7,A,7,71,A,7,982,A,7,230,A,7,4.1,A,7,16100,B,7,3660,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,21.1,A,7,17.2,A,7,79,A,7,982,A,7,230,A,7,4.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,21.1,A,7,16.7,A,7,76,A,7,982,A,7,240,A,7,4.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,1,A,7,20.6,A,7,16.1,A,7,76,A,7,982,A,7,230,A,7,5.2,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,06:00,99,1228,33,1,13,38,1,9,29,1,13,35,1,13,19,1,9,34,1,13,60,1,21,8,A,7,1,A,7,20.6,A,7,16.7,A,7,79,A,7,982,A,7,230,A,7,4.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,07:00,352,1327,150,1,13,228,1,9,90,1,13,160,1,13,196,1,9,108,1,13,173,1,21,5,A,7,3,A,7,21.7,A,7,17.2,A,7,76,A,7,982,A,7,220,A,7,4.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,08:00,605,1327,346,1,9,470,1,9,131,1,13,370,1,9,464,1,9,158,1,13,262,1,18,2,A,7,2,A,7,23.9,A,7,18.9,A,7,74,A,7,982,A,7,230,A,7,4.6,A,7,16100,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,09:00,837,1327,513,1,9,502,1,9,196,1,13,552,1,9,517,1,9,225,1,13,480,1,18,2,A,7,2,A,7,25.0,A,7,19.4,A,7,71,A,7,982,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,10:00,1033,1327,714,1,9,709,1,9,161,1,13,767,1,9,728,1,9,199,1,13,550,1,18,3,A,7,1,A,7,27.8,A,7,19.4,A,7,61,A,7,983,A,7,260,A,7,3.6,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,11:00,1179,1327,841,1,9,723,1,9,197,1,13,905,1,9,743,1,9,243,1,13,998,1,18,2,A,7,2,A,7,28.9,A,7,18.9,A,7,55,A,7,983,A,7,260,A,7,4.6,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,12:00,1265,1327,862,1,13,624,1,9,265,1,13,915,1,13,635,1,9,309,1,13,1992,1,21,4,A,7,3,A,7,29.4,A,7,18.9,A,7,53,A,7,983,A,7,240,A,7,6.2,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,13:00,1286,1327,930,1,13,649,1,9,300,1,13,982,1,13,656,1,9,345,1,13,2597,1,21,4,A,7,4,A,7,30.0,A,7,18.3,A,7,50,A,7,982,A,7,280,A,7,4.6,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,14:00,1239,1327,815,1,13,542,1,9,309,1,13,889,1,13,568,1,9,357,1,13,2044,1,21,5,A,7,4,A,7,31.1,A,7,17.8,A,7,45,A,7,982,A,7,240,A,7,3.1,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,15:00,1128,1327,468,1,13,204,1,9,295,1,13,522,1,13,222,1,9,332,1,13,1177,1,21,6,A,7,6,A,7,31.1,A,7,18.3,A,7,47,A,7,981,A,7,250,A,7,3.6,A,7,16100,B,7,1520,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,16:00,961,1327,503,1,13,370,1,9,236,1,13,543,1,13,385,1,9,264,1,13,693,1,21,6,A,7,6,A,7,31.1,A,7,18.3,A,7,47,A,7,981,A,7,220,A,7,6.2,A,7,16100,B,7,1520,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,17:00,749,1327,299,1,9,82,1,9,252,1,13,328,1,9,83,1,9,281,1,13,786,1,18,8,A,7,8,A,7,29.4,A,7,19.4,A,7,55,A,7,981,A,7,10,A,7,1.5,A,7,16100,B,7,1520,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,18:00,506,1327,90,1,9,4,1,9,88,1,13,105,1,9,2,1,9,104,1,13,375,1,18,10,A,7,10,A,7,27.2,A,7,20.6,A,7,67,A,7,981,A,7,230,A,7,10.3,A,7,16100,B,7,1220,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,19:00,250,1327,27,1,13,12,1,9,24,1,13,29,1,13,9,1,9,27,1,13,68,1,21,10,A,7,8,A,7,21.7,A,7,19.4,A,7,87,A,7,983,A,7,350,A,7,2.6,A,7,11300,B,7,1220,A,7,3.4,E,8,0.000,F,8,0.00,?,0,8,1,D,9,17,C,8 -06/04/1989,20:00,32,697,9,1,13,0,1,9,9,1,13,11,1,13,0,1,9,11,1,13,33,1,21,10,A,7,9,A,7,20.6,A,7,19.4,A,7,93,A,7,983,A,7,100,A,7,2.1,A,7,16100,B,7,3050,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -06/04/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,983,A,7,230,A,7,3.6,A,7,19300,B,7,1830,A,7,3.5,E,8,0.000,?,0,0.00,?,0,3,1,D,9,80,C,8 -06/04/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,20.6,A,7,20.0,A,7,97,A,7,984,A,7,40,A,7,2.6,A,7,19300,B,7,3350,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/04/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,984,A,7,230,A,7,2.1,A,7,16100,B,7,1220,A,7,3.5,E,8,0.000,?,0,0.00,?,0,3,1,D,9,00,C,8 -06/04/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,984,A,7,160,A,7,2.6,A,7,16100,B,7,3050,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -06/05/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,983,A,7,170,A,7,3.6,A,7,16100,B,7,3050,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.9,A,7,97,A,7,983,A,7,170,A,7,2.6,A,7,16100,B,7,3050,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -06/05/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,19.4,A,7,97,A,7,983,A,7,210,A,7,3.1,A,7,11300,B,7,1520,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,19.4,A,7,97,A,7,983,A,7,230,A,7,2.1,A,7,11300,B,7,1520,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,19.4,A,7,18.9,A,7,97,A,7,983,A,7,230,A,7,3.1,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,06:00,100,1227,29,1,13,0,1,9,29,1,13,32,1,13,0,1,9,32,1,13,95,1,21,10,A,7,10,A,7,20.0,A,7,19.4,A,7,97,A,7,983,A,7,230,A,7,3.6,A,7,3200,B,7,120,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,07:00,352,1327,58,1,9,3,1,9,57,1,13,67,1,9,1,1,9,67,1,13,230,1,18,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,983,A,7,230,A,7,5.2,A,7,3200,B,7,180,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/05/1989,08:00,605,1327,157,1,9,3,1,9,155,1,13,179,1,9,2,1,9,178,1,13,630,1,18,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,984,A,7,210,A,7,3.6,A,7,3200,B,7,180,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -06/05/1989,09:00,837,1327,269,1,9,5,1,9,266,1,13,309,1,9,4,1,9,306,1,13,1108,1,18,10,A,7,10,A,7,22.8,A,7,20.0,A,7,84,A,7,984,A,7,250,A,7,2.6,A,7,4800,B,7,370,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/05/1989,10:00,1033,1327,657,1,13,425,1,9,325,1,13,691,1,13,442,1,9,347,1,13,1117,1,21,6,A,7,6,A,7,24.4,A,7,20.6,A,7,79,A,7,984,A,7,250,A,7,2.6,A,7,11300,B,7,1830,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/05/1989,11:00,1179,1327,780,1,13,480,1,9,352,1,13,831,1,13,501,1,9,385,1,13,1811,1,21,5,A,7,5,A,7,26.1,A,7,20.6,A,7,72,A,7,983,A,7,230,A,7,4.1,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,12:00,1266,1327,818,1,9,539,1,9,303,1,13,896,1,9,565,1,9,356,1,13,2339,1,18,2,A,7,2,A,7,27.2,A,7,20.6,A,7,67,A,7,983,A,7,240,A,7,4.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,13:00,1286,1327,926,1,9,648,1,9,297,1,13,979,1,9,656,1,9,342,1,13,2585,1,18,2,A,7,2,A,7,28.9,A,7,19.4,A,7,57,A,7,982,A,7,260,A,7,5.2,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,14:00,1239,1327,855,1,13,524,1,9,365,1,13,916,1,13,548,1,9,404,1,13,2439,1,21,4,A,7,4,A,7,30.0,A,7,18.9,A,7,51,A,7,981,A,7,230,A,7,4.6,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,15:00,1129,1327,554,1,9,225,1,9,362,1,13,607,1,9,244,1,9,398,1,13,1481,1,18,8,A,7,8,A,7,29.4,A,7,18.9,A,7,53,A,7,980,A,7,210,A,7,5.7,A,7,11300,B,7,2440,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,16:00,962,1327,411,1,9,80,1,9,353,1,13,453,1,9,82,1,9,393,1,13,1263,1,18,8,A,7,8,A,7,29.4,A,7,19.4,A,7,55,A,7,980,A,7,220,A,7,5.2,A,7,11300,B,7,7620,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,17:00,750,1327,373,1,9,254,1,9,230,1,13,402,1,9,268,1,9,250,1,13,550,1,18,8,A,7,8,A,7,29.4,A,7,19.4,A,7,55,A,7,980,A,7,210,A,7,5.2,A,7,11300,B,7,7620,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,18:00,508,1327,60,1,9,30,1,9,49,1,13,67,1,9,28,1,9,56,1,13,157,1,18,8,A,7,8,A,7,26.7,A,7,19.4,A,7,65,A,7,980,A,7,190,A,7,4.1,A,7,11300,B,7,910,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,19:00,252,1327,31,1,13,1,1,9,31,1,13,37,1,13,0,1,9,37,1,13,125,1,21,10,A,7,10,A,7,22.8,A,7,19.4,A,7,82,A,7,982,A,7,30,A,7,2.6,A,7,800,B,7,90,A,7,3.4,E,8,0.000,F,8,0.00,?,0,66,1,D,9,17,C,8 -06/05/1989,20:00,33,719,8,1,13,0,1,9,8,1,13,10,1,13,0,1,9,10,1,13,30,1,21,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,982,A,7,320,A,7,2.6,A,7,11300,B,7,1070,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/05/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,981,A,7,160,A,7,2.6,A,7,11300,B,7,1070,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -06/05/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,19.4,A,7,97,A,7,982,A,7,160,A,7,5.2,A,7,11300,B,7,7620,A,7,3.4,E,8,0.000,?,0,0.00,?,0,3,1,D,9,80,C,8 -06/05/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.9,A,7,97,A,7,981,A,7,150,A,7,3.1,A,7,11300,B,7,2130,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/05/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.9,A,7,97,A,7,981,A,7,180,A,7,4.1,A,7,11300,B,7,210,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -06/06/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,19.4,A,7,18.3,A,7,93,A,7,980,A,7,200,A,7,4.1,A,7,11300,B,7,270,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.9,A,7,97,A,7,980,A,7,240,A,7,3.1,A,7,11300,B,7,240,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -06/06/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,980,A,7,240,A,7,4.6,A,7,11300,B,7,270,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.9,A,7,97,A,7,980,A,7,230,A,7,3.6,A,7,11300,B,7,270,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,51,C,8 -06/06/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.3,A,7,90,A,7,981,A,7,230,A,7,4.1,A,7,11300,B,7,1040,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,06:00,101,1227,21,1,13,6,1,9,20,1,13,23,1,13,4,1,9,22,1,13,51,1,21,10,A,7,8,A,7,19.4,A,7,18.3,A,7,93,A,7,981,A,7,230,A,7,4.1,A,7,11300,B,7,4570,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,07:00,352,1326,93,1,9,3,1,9,92,1,13,104,1,9,2,1,9,104,1,13,331,1,18,10,A,7,10,A,7,20.0,A,7,18.3,A,7,90,A,7,981,A,7,240,A,7,3.1,A,7,11300,B,7,400,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,08:00,605,1326,150,1,9,23,1,9,140,1,13,166,1,9,22,1,9,156,1,13,430,1,18,10,A,7,10,A,7,20.0,A,7,18.3,A,7,90,A,7,982,A,7,220,A,7,2.6,A,7,11300,B,7,400,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -06/06/1989,09:00,837,1326,277,1,9,3,1,9,276,1,13,318,1,9,3,1,9,316,1,13,1136,1,18,10,A,7,10,A,7,21.1,A,7,18.9,A,7,87,A,7,982,A,7,240,A,7,3.1,A,7,11300,B,7,400,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,10:00,1033,1326,306,1,9,11,1,9,297,1,13,359,1,9,10,1,9,351,1,13,1341,1,18,10,A,7,10,A,7,22.2,A,7,18.9,A,7,82,A,7,982,A,7,200,A,7,3.6,A,7,11300,B,7,460,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,11:00,1179,1326,508,1,9,148,1,9,376,1,13,563,1,9,158,1,9,422,1,13,1721,1,18,9,A,7,9,A,7,22.8,A,7,18.3,A,7,76,A,7,982,A,7,200,A,7,4.1,A,7,11300,B,7,610,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,12:00,1266,1326,431,1,9,91,1,9,344,1,13,484,1,9,98,1,9,390,1,13,2155,1,18,8,A,7,8,A,7,24.4,A,7,18.3,A,7,69,A,7,981,A,7,230,A,7,4.1,A,7,11300,B,7,610,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,13:00,1286,1326,630,1,9,193,1,9,442,1,13,697,1,9,206,1,9,496,1,13,3124,1,18,8,A,7,8,A,7,23.9,A,7,18.3,A,7,71,A,7,981,A,7,210,A,7,3.1,A,7,11300,B,7,610,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,14:00,1240,1326,257,1,9,3,1,9,254,1,13,314,1,9,2,1,9,312,1,13,1245,1,18,9,A,7,9,A,7,25.0,A,7,18.9,A,7,69,A,7,980,A,7,220,A,7,3.1,A,7,11300,B,7,760,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,15:00,1130,1326,654,1,13,371,1,9,338,1,13,721,1,13,403,1,9,377,1,13,1375,1,21,6,A,7,6,A,7,26.7,A,7,18.3,A,7,60,A,7,979,A,7,190,A,7,3.6,A,7,11300,B,7,3050,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,16:00,963,1326,443,1,13,131,1,9,348,1,13,484,1,13,139,1,9,383,1,13,1095,1,21,7,A,7,7,A,7,25.6,A,7,17.8,A,7,62,A,7,979,A,7,180,A,7,3.1,A,7,11300,B,7,3050,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,17:00,752,1326,163,1,9,5,1,9,160,1,13,192,1,9,4,1,9,189,1,13,721,1,18,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,979,A,7,230,A,7,5.2,A,7,8000,B,7,760,A,7,3.3,E,8,0.000,F,8,0.00,?,0,25,1,D,9,00,C,8 -06/06/1989,18:00,510,1326,93,1,9,7,1,9,90,1,13,109,1,9,4,1,9,107,1,13,383,1,18,10,A,7,10,A,7,21.7,A,7,20.0,A,7,90,A,7,979,A,7,220,A,7,2.6,A,7,8000,B,7,2440,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/06/1989,19:00,254,1326,24,1,13,1,1,9,24,1,13,29,1,13,0,1,9,29,1,13,99,1,21,10,A,7,10,A,7,21.7,A,7,20.0,A,7,90,A,7,979,A,7,190,A,7,3.1,A,7,11300,B,7,2440,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/06/1989,20:00,34,718,10,1,13,0,1,9,10,1,13,12,1,13,0,1,9,12,1,13,37,1,21,10,A,7,10,A,7,20.6,A,7,18.9,A,7,90,A,7,980,A,7,180,A,7,2.6,A,7,19300,B,7,3050,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -06/06/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,18.9,A,7,90,A,7,980,A,7,190,A,7,2.6,A,7,19300,B,7,1280,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,980,A,7,170,A,7,2.6,A,7,16100,B,7,7620,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,980,A,7,180,A,7,2.1,A,7,16100,B,7,270,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/06/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,980,A,7,210,A,7,3.1,A,7,16100,B,7,370,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,19.4,A,7,18.3,A,7,93,A,7,980,A,7,190,A,7,3.1,A,7,16100,B,7,760,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,6,A,7,18.9,A,7,18.3,A,7,97,A,7,980,A,7,190,A,7,2.6,A,7,16100,B,7,310,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -06/07/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,980,A,7,200,A,7,3.6,A,7,11300,B,7,580,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,979,A,7,180,A,7,2.6,A,7,11300,B,7,1310,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,980,A,7,200,A,7,2.6,A,7,11300,B,7,310,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,06:00,101,1227,19,1,13,0,1,9,19,1,13,22,1,13,0,1,9,22,1,13,69,1,21,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,980,A,7,220,A,7,3.1,A,7,9700,B,7,340,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,07:00,353,1326,94,1,9,5,1,9,92,1,13,105,1,9,3,1,9,104,1,13,331,1,18,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,981,A,7,170,A,7,2.1,A,7,8000,B,7,490,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/07/1989,08:00,605,1326,166,1,9,2,1,9,165,1,13,189,1,9,2,1,9,189,1,13,659,1,18,10,A,7,10,A,7,20.0,A,7,18.3,A,7,90,A,7,981,A,7,220,A,7,2.6,A,7,8000,B,7,550,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -06/07/1989,09:00,837,1326,261,1,9,3,1,9,258,1,13,299,1,9,3,1,9,297,1,13,1086,1,18,10,A,7,10,A,7,20.6,A,7,18.3,A,7,87,A,7,981,A,7,220,A,7,2.6,A,7,11300,B,7,550,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/07/1989,10:00,1033,1326,330,1,9,2,1,9,329,1,13,385,1,9,2,1,9,383,1,13,1440,1,18,10,A,7,10,A,7,21.7,A,7,18.3,A,7,81,A,7,981,A,7,170,A,7,2.1,A,7,11300,B,7,550,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,11:00,1179,1326,568,1,9,268,1,9,330,1,13,632,1,9,292,1,9,371,1,13,1538,1,18,8,A,7,8,A,7,22.2,A,7,18.3,A,7,79,A,7,981,A,7,150,A,7,3.1,A,7,11300,B,7,910,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,12:00,1266,1326,670,1,9,264,1,9,417,1,13,738,1,9,287,1,9,463,1,13,2846,1,18,8,A,7,8,A,7,24.4,A,7,19.4,A,7,74,A,7,981,A,7,140,A,7,4.6,A,7,11300,B,7,910,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,13:00,1287,1326,923,1,13,670,1,9,271,1,13,981,1,13,681,1,9,318,1,13,2392,1,21,6,A,7,6,A,7,24.4,A,7,18.3,A,7,69,A,7,980,A,7,160,A,7,3.1,A,7,11300,B,7,760,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,14:00,1240,1326,872,1,13,624,1,9,288,1,13,920,1,13,631,1,9,329,1,13,1873,1,21,6,A,7,6,A,7,23.9,A,7,18.3,A,7,71,A,7,980,A,7,180,A,7,2.6,A,7,11300,B,7,610,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,15:00,1131,1326,719,1,13,466,1,9,321,1,13,769,1,13,487,1,9,353,1,13,1403,1,21,8,A,7,7,A,7,25.6,A,7,18.9,A,7,67,A,7,980,A,7,150,A,7,4.1,A,7,11300,B,7,760,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,16:00,964,1326,622,1,13,529,1,9,237,1,13,670,1,13,550,1,9,269,1,13,701,1,21,7,A,7,5,A,7,25.6,A,7,18.9,A,7,67,A,7,979,A,7,170,A,7,2.6,A,7,11300,B,7,7620,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,17:00,753,1326,452,1,13,464,1,9,190,1,13,482,1,13,473,1,9,213,1,13,430,1,21,8,A,7,4,A,7,26.1,A,7,18.9,A,7,65,A,7,979,A,7,180,A,7,3.6,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,18:00,511,1326,252,1,13,339,1,9,122,1,13,267,1,13,323,1,9,142,1,13,236,1,21,8,A,7,3,A,7,24.4,A,7,19.4,A,7,74,A,7,980,A,7,160,A,7,2.6,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,19:00,256,1326,99,1,13,200,1,9,61,1,13,106,1,13,147,1,9,78,1,13,113,1,21,5,A,7,5,A,7,22.8,A,7,19.4,A,7,82,A,7,980,A,7,160,A,7,2.6,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,20:00,35,740,7,1,13,1,1,9,7,1,13,8,1,13,0,1,9,8,1,13,27,1,21,10,A,7,10,A,7,21.1,A,7,17.2,A,7,79,A,7,981,A,7,50,A,7,5.2,A,7,11300,B,7,460,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -06/07/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,19.4,A,7,17.2,A,7,87,A,7,981,A,7,100,A,7,5.2,A,7,11300,B,7,610,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,17,C,8 -06/07/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,19.4,A,7,17.2,A,7,87,A,7,981,A,7,110,A,7,5.2,A,7,11300,B,7,610,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,17,C,8 -06/07/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,18.3,A,7,17.2,A,7,93,A,7,981,A,7,310,A,7,1.5,A,7,3200,B,7,460,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/07/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,17.8,A,7,17.2,A,7,97,A,7,982,A,7,340,A,7,2.1,A,7,8000,B,7,760,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,17,C,8 -06/08/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,981,A,7,50,A,7,2.6,A,7,9700,B,7,310,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,17,C,8 -06/08/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,982,A,7,80,A,7,2.6,A,7,12900,B,7,460,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,25,C,8 -06/08/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,982,A,7,80,A,7,2.6,A,7,16100,B,7,490,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/08/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,982,A,7,80,A,7,2.1,A,7,16100,B,7,490,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/08/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,982,A,7,340,A,7,1.5,A,7,9700,B,7,460,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/08/1989,06:00,102,1248,17,1,13,2,1,9,16,1,13,19,1,13,0,1,9,19,1,13,60,1,21,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,982,A,7,50,A,7,2.6,A,7,6400,B,7,490,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/08/1989,07:00,353,1326,165,1,13,312,1,9,81,1,13,173,1,13,264,1,9,102,1,13,149,1,21,4,A,7,4,A,7,19.4,A,7,18.3,A,7,93,A,7,982,A,7,100,A,7,2.6,A,7,6400,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/08/1989,08:00,605,1326,367,1,9,560,1,9,110,1,13,382,1,9,544,1,9,133,1,13,224,1,18,2,A,7,2,A,7,22.2,A,7,18.9,A,7,82,A,7,983,A,7,110,A,7,2.1,A,7,8000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -06/08/1989,09:00,837,1326,563,1,13,601,1,9,183,1,13,586,1,13,600,1,9,206,1,13,441,1,21,6,A,7,6,A,7,22.8,A,7,20.0,A,7,84,A,7,983,A,7,60,A,7,2.6,A,7,9700,B,7,370,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/08/1989,10:00,1033,1326,626,1,13,378,1,9,331,1,13,682,1,13,409,1,9,363,1,13,1108,1,21,6,A,7,6,A,7,24.4,A,7,20.6,A,7,79,A,7,983,A,7,50,A,7,2.1,A,7,9700,B,7,640,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/08/1989,11:00,1179,1326,316,1,9,9,1,9,309,1,13,379,1,9,8,1,9,372,1,13,1436,1,18,10,A,7,10,A,7,25.6,A,7,20.0,A,7,72,A,7,983,A,7,130,A,7,2.6,A,7,9700,B,7,760,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/08/1989,12:00,1266,1326,351,1,9,4,1,9,347,1,13,420,1,9,4,1,9,417,1,13,1594,1,18,10,A,7,10,A,7,26.7,A,7,20.0,A,7,67,A,7,982,A,7,170,A,7,4.6,A,7,9700,B,7,760,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/08/1989,13:00,1287,1326,830,1,13,519,1,9,326,1,13,906,1,13,544,1,9,377,1,13,2968,1,21,6,A,7,6,A,7,26.7,A,7,20.6,A,7,69,A,7,982,A,7,170,A,7,6.2,A,7,9700,B,7,760,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/08/1989,14:00,1241,1326,774,1,9,482,1,9,322,1,13,840,1,9,505,1,9,366,1,13,2169,1,18,9,A,7,8,A,7,27.2,A,7,19.4,A,7,63,A,7,981,A,7,190,A,7,3.1,A,7,9700,B,7,760,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/08/1989,15:00,1131,1326,395,1,9,43,1,9,358,1,13,436,1,9,44,1,9,398,1,13,1578,1,18,10,A,7,8,A,7,27.2,A,7,18.9,A,7,60,A,7,981,A,7,180,A,7,3.6,A,7,11300,B,7,7620,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/08/1989,16:00,965,1326,137,1,9,0,1,9,136,1,13,168,1,9,0,1,9,168,1,13,695,1,18,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,982,A,7,70,A,7,2.6,A,7,11300,B,7,2130,A,7,3.5,E,8,0.000,F,8,0.00,?,0,104,1,D,9,00,C,8 -06/08/1989,17:00,754,1326,99,1,9,3,1,9,97,1,13,121,1,9,2,1,9,120,1,13,473,1,18,10,A,7,10,A,7,21.7,A,7,20.6,A,7,93,A,7,981,A,7,320,A,7,3.6,A,7,6400,B,7,820,A,7,3.6,E,8,0.000,F,8,0.00,?,0,23,1,D,9,80,C,8 -06/08/1989,18:00,513,1326,90,1,9,3,1,9,88,1,13,105,1,9,2,1,9,104,1,13,377,1,18,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,981,A,7,0,A,7,0.0,A,7,9700,B,7,520,A,7,3.5,E,8,0.000,F,8,0.00,?,0,10,1,D,9,45,C,8 -06/08/1989,19:00,258,1326,58,1,13,4,1,9,57,1,13,65,1,13,1,1,9,65,1,13,205,1,21,10,A,7,10,A,7,21.7,A,7,20.6,A,7,93,A,7,981,A,7,90,A,7,2.6,A,7,9700,B,7,2740,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/08/1989,20:00,36,740,5,1,13,0,1,9,5,1,13,6,1,13,0,1,9,6,1,13,20,1,21,10,A,7,10,A,7,21.7,A,7,20.6,A,7,93,A,7,981,A,7,140,A,7,2.6,A,7,8000,B,7,2740,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -06/08/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,981,A,7,180,A,7,4.6,A,7,11300,B,7,1490,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/08/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,981,A,7,170,A,7,3.6,A,7,2400,B,7,1830,A,7,3.5,E,8,0.000,?,0,0.00,?,0,66,1,D,9,45,C,8 -06/08/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,981,A,7,190,A,7,4.1,A,7,8000,B,7,610,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/08/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,981,A,7,190,A,7,2.6,A,7,11300,B,7,520,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/09/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,980,A,7,180,A,7,2.6,A,7,9700,B,7,120,A,7,3.5,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -06/09/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,979,A,7,190,A,7,2.6,A,7,8000,B,7,180,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,21,C,8 -06/09/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,979,A,7,180,A,7,2.6,A,7,11300,B,7,210,A,7,3.4,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -06/09/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,979,A,7,180,A,7,4.6,A,7,9700,B,7,180,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,979,A,7,180,A,7,2.6,A,7,9700,B,7,180,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/09/1989,06:00,102,1248,18,1,13,0,1,9,18,1,13,21,1,13,0,1,9,21,1,13,66,1,21,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,979,A,7,180,A,7,3.1,A,7,8000,B,7,180,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/09/1989,07:00,353,1325,85,1,9,3,1,9,85,1,13,97,1,9,1,1,9,97,1,13,313,1,18,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,979,A,7,180,A,7,4.6,A,7,9700,B,7,210,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/09/1989,08:00,605,1325,105,1,9,4,1,9,103,1,13,124,1,9,3,1,9,123,1,13,458,1,18,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,979,A,7,200,A,7,2.6,A,7,2400,B,7,210,A,7,3.5,E,8,0.000,F,8,0.00,?,0,76,1,D,9,21,C,8 -06/09/1989,09:00,837,1325,285,1,9,0,1,9,285,1,13,325,1,9,0,1,9,325,1,13,1159,1,18,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,979,A,7,210,A,7,6.7,A,7,11300,B,7,370,A,7,3.3,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -06/09/1989,10:00,1033,1325,226,1,9,1,1,9,226,1,13,272,1,9,1,1,9,271,1,13,1089,1,18,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,978,A,7,210,A,7,5.2,A,7,11300,B,7,370,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,11:00,1179,1325,259,1,9,1,1,9,258,1,13,314,1,9,1,1,9,313,1,13,1249,1,18,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,978,A,7,210,A,7,5.2,A,7,4000,B,7,310,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -06/09/1989,12:00,1266,1325,262,1,9,1,1,9,260,1,13,319,1,9,1,1,9,319,1,13,1274,1,18,10,A,7,10,A,7,22.2,A,7,20.6,A,7,90,A,7,978,A,7,210,A,7,5.2,A,7,11300,B,7,310,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/09/1989,13:00,1287,1325,497,1,9,0,1,9,497,1,13,581,1,9,0,1,9,581,1,13,2037,1,18,10,A,7,10,A,7,24.4,A,7,21.7,A,7,85,A,7,978,A,7,290,A,7,6.2,A,7,16100,B,7,400,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -06/09/1989,14:00,1241,1325,867,1,13,643,1,9,264,1,13,920,1,13,653,1,9,307,1,13,1740,1,21,8,A,7,6,A,7,25.0,A,7,21.7,A,7,82,A,7,977,A,7,230,A,7,4.6,A,7,16100,B,7,7620,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -06/09/1989,15:00,1132,1325,259,1,9,3,1,9,256,1,13,311,1,9,2,1,9,309,1,13,1231,1,18,10,A,7,10,A,7,26.1,A,7,20.6,A,7,72,A,7,977,A,7,230,A,7,3.6,A,7,16100,B,7,1830,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,16:00,966,1325,657,1,13,690,1,9,153,1,13,703,1,13,706,1,9,187,1,13,462,1,21,4,A,7,4,A,7,27.2,A,7,21.1,A,7,69,A,7,977,A,7,220,A,7,5.2,A,7,14500,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,17:00,756,1325,263,1,9,84,1,9,216,1,13,291,1,9,84,1,9,242,1,13,700,1,18,10,A,7,9,A,7,26.1,A,7,20.0,A,7,69,A,7,978,A,7,230,A,7,6.2,A,7,14500,B,7,1830,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,18:00,515,1325,204,1,9,149,1,9,146,1,13,223,1,9,146,1,9,166,1,13,340,1,18,9,A,7,8,A,7,24.4,A,7,19.4,A,7,74,A,7,978,A,7,250,A,7,5.2,A,7,16100,B,7,1980,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,19:00,260,1325,77,1,13,54,1,9,67,1,13,85,1,13,44,1,9,76,1,13,169,1,21,8,A,7,7,A,7,23.9,A,7,21.1,A,7,85,A,7,979,A,7,230,A,7,3.6,A,7,16100,B,7,2130,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,20:00,37,762,17,1,13,32,1,9,14,1,13,18,1,13,13,1,9,17,1,13,29,1,21,5,A,7,5,A,7,22.2,A,7,20.6,A,7,90,A,7,979,A,7,240,A,7,3.6,A,7,16100,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,25,C,8 -06/09/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,21.7,A,7,20.0,A,7,90,A,7,980,A,7,270,A,7,2.6,A,7,16100,B,7,2740,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,21.7,A,7,20.0,A,7,90,A,7,981,A,7,270,A,7,2.1,A,7,16100,B,7,1520,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,20.6,A,7,19.4,A,7,93,A,7,982,A,7,270,A,7,2.6,A,7,16100,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/09/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.0,A,7,19.4,A,7,97,A,7,982,A,7,290,A,7,3.1,A,7,16100,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.0,A,7,18.3,A,7,90,A,7,982,A,7,300,A,7,2.6,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,17.2,A,7,93,A,7,982,A,7,260,A,7,3.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,16.7,A,7,97,A,7,983,A,7,230,A,7,3.1,A,7,14500,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,16.1,A,7,97,A,7,983,A,7,240,A,7,2.1,A,7,9700,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.1,A,7,16.1,A,7,100,A,7,983,A,7,250,A,7,3.1,A,7,8000,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/10/1989,06:00,102,1248,31,1,13,26,1,9,29,1,13,34,1,13,16,1,9,33,1,13,69,1,21,0,A,7,0,A,7,17.2,A,7,16.7,A,7,97,A,7,984,A,7,270,A,7,2.1,A,7,9700,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/10/1989,07:00,353,1325,160,1,9,279,1,9,86,1,13,168,1,9,236,1,9,105,1,13,159,1,18,0,A,7,0,A,7,19.4,A,7,17.2,A,7,87,A,7,984,A,7,260,A,7,2.6,A,7,6400,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/10/1989,08:00,605,1325,358,1,9,484,1,9,137,1,13,382,1,9,478,1,9,163,1,13,276,1,18,0,A,7,0,A,7,22.2,A,7,17.2,A,7,73,A,7,985,A,7,300,A,7,3.6,A,7,6400,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -06/10/1989,09:00,837,1325,564,1,9,607,1,9,179,1,13,586,1,9,607,1,9,202,1,13,433,1,18,0,A,7,0,A,7,23.9,A,7,16.1,A,7,62,A,7,985,A,7,320,A,7,4.6,A,7,8000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,10:00,1032,1325,743,1,9,682,1,9,211,1,13,784,1,9,692,1,9,244,1,13,704,1,18,0,A,7,0,A,7,25.0,A,7,16.7,A,7,60,A,7,985,A,7,270,A,7,3.6,A,7,9700,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,11:00,1179,1325,835,1,9,677,1,9,231,1,13,888,1,9,690,1,9,272,1,13,1164,1,18,1,A,7,1,A,7,26.1,A,7,16.7,A,7,56,A,7,985,A,7,280,A,7,3.6,A,7,9700,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,12:00,1266,1325,926,1,13,668,1,9,287,1,13,979,1,13,676,1,9,332,1,13,2177,1,21,3,A,7,3,A,7,26.7,A,7,16.7,A,7,54,A,7,985,A,7,310,A,7,3.6,A,7,9700,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,13:00,1287,1325,1013,1,13,668,1,9,363,1,13,1055,1,13,667,1,9,406,1,13,3195,1,21,6,A,7,6,A,7,26.7,A,7,16.7,A,7,54,A,7,985,A,7,310,A,7,3.6,A,7,8000,B,7,1460,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,14:00,1242,1325,852,1,13,558,1,9,329,1,13,924,1,13,584,1,9,375,1,13,2234,1,21,5,A,7,5,A,7,28.3,A,7,15.6,A,7,46,A,7,985,A,7,250,A,7,4.6,A,7,8000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,15:00,1133,1325,799,1,13,589,1,9,295,1,13,863,1,13,616,1,9,335,1,13,1295,1,21,5,A,7,5,A,7,27.8,A,7,15.0,A,7,46,A,7,985,A,7,270,A,7,4.1,A,7,8000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,16:00,967,1325,649,1,9,591,1,9,217,1,13,678,1,9,595,1,9,243,1,13,630,1,18,1,A,7,1,A,7,27.8,A,7,15.0,A,7,46,A,7,984,A,7,290,A,7,3.6,A,7,8000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,17:00,757,1325,465,1,9,499,1,9,180,1,13,498,1,9,509,1,9,206,1,13,407,1,18,2,A,7,1,A,7,27.8,A,7,13.9,A,7,43,A,7,984,A,7,280,A,7,2.6,A,7,9700,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,18:00,516,1325,246,1,13,207,1,9,165,1,13,267,1,13,202,1,9,188,1,13,385,1,21,5,A,7,5,A,7,27.2,A,7,14.4,A,7,46,A,7,984,A,7,270,A,7,2.6,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/10/1989,19:00,262,1325,94,1,13,144,1,9,66,1,13,100,1,13,107,1,9,79,1,13,124,1,21,4,A,7,4,A,7,26.1,A,7,16.1,A,7,54,A,7,985,A,7,260,A,7,2.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,20:00,38,762,9,1,13,3,1,9,9,1,13,10,1,13,2,1,9,10,1,13,23,1,21,1,A,7,1,A,7,23.9,A,7,16.1,A,7,62,A,7,985,A,7,310,A,7,2.1,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.3,A,7,15.0,A,7,60,A,7,985,A,7,310,A,7,2.6,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.7,A,7,14.4,A,7,64,A,7,986,A,7,310,A,7,3.6,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.1,A,7,13.9,A,7,64,A,7,986,A,7,340,A,7,2.6,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/10/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.0,A,7,13.9,A,7,68,A,7,987,A,7,350,A,7,2.6,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,19.4,A,7,12.8,A,7,66,A,7,986,A,7,20,A,7,2.6,A,7,19300,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,12.8,A,7,70,A,7,987,A,7,360,A,7,2.1,A,7,19300,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,12.8,A,7,75,A,7,987,A,7,360,A,7,3.1,A,7,19300,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,12.2,A,7,75,A,7,988,A,7,360,A,7,2.6,A,7,19300,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.1,A,7,12.2,A,7,78,A,7,989,A,7,20,A,7,2.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,06:00,102,1248,35,1,13,82,1,9,27,1,13,36,1,13,35,1,9,33,1,13,48,1,21,0,A,7,0,A,7,16.7,A,7,12.8,A,7,78,A,7,989,A,7,10,A,7,2.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,07:00,353,1325,166,1,9,333,1,9,77,1,13,175,1,9,282,1,9,100,1,13,141,1,18,3,A,7,1,A,7,18.3,A,7,13.3,A,7,73,A,7,990,A,7,30,A,7,3.1,A,7,11300,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,08:00,605,1325,364,1,9,545,1,9,114,1,13,378,1,9,528,1,9,137,1,13,231,1,18,2,A,7,1,A,7,20.0,A,7,12.8,A,7,63,A,7,991,A,7,30,A,7,3.6,A,7,11300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,09:00,836,1325,549,1,9,621,1,9,156,1,13,577,1,9,626,1,9,182,1,13,385,1,18,2,A,7,1,A,7,21.1,A,7,11.7,A,7,55,A,7,991,A,7,30,A,7,3.1,A,7,12900,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,10:00,1032,1325,670,1,9,627,1,9,180,1,13,714,1,9,641,1,9,214,1,13,610,1,18,3,A,7,1,A,7,22.2,A,7,12.2,A,7,53,A,7,990,A,7,90,A,7,4.1,A,7,12900,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,11:00,1178,1325,826,1,9,641,1,9,255,1,13,873,1,9,650,1,9,293,1,13,1275,1,18,7,A,7,2,A,7,23.3,A,7,12.8,A,7,52,A,7,990,A,7,330,A,7,3.6,A,7,12900,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,12:00,1265,1325,869,1,9,620,1,9,275,1,13,921,1,9,629,1,9,318,1,13,2094,1,18,5,A,7,2,A,7,23.9,A,7,12.2,A,7,48,A,7,990,A,7,90,A,7,1.5,A,7,12900,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,13:00,1287,1325,915,1,13,628,1,9,304,1,13,966,1,13,635,1,9,348,1,13,2711,1,21,10,A,7,3,A,7,25.0,A,7,13.3,A,7,48,A,7,990,A,7,350,A,7,2.6,A,7,12900,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,14:00,1242,1325,897,1,9,701,1,9,239,1,13,959,1,9,716,1,9,286,1,13,1595,1,18,6,A,7,2,A,7,26.1,A,7,12.2,A,7,42,A,7,989,A,7,70,A,7,2.1,A,7,12900,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,15:00,1133,1325,804,1,9,723,1,9,185,1,13,866,1,9,743,1,9,229,1,13,813,1,18,4,A,7,1,A,7,26.1,A,7,11.7,A,7,41,A,7,989,A,7,30,A,7,2.1,A,7,12900,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,16:00,968,1325,672,1,9,625,1,9,215,1,13,703,1,9,629,1,9,242,1,13,627,1,18,7,A,7,2,A,7,26.7,A,7,11.7,A,7,39,A,7,988,A,7,10,A,7,3.1,A,7,12900,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,17:00,758,1325,474,1,13,474,1,9,203,1,13,501,1,13,483,1,9,224,1,13,465,1,21,7,A,7,3,A,7,26.7,A,7,12.2,A,7,41,A,7,988,A,7,90,A,7,2.1,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,18:00,518,1325,287,1,9,434,1,9,118,1,13,305,1,9,415,1,9,143,1,13,228,1,18,5,A,7,2,A,7,25.6,A,7,12.2,A,7,44,A,7,988,A,7,110,A,7,1.5,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,19:00,264,1325,109,1,13,250,1,9,60,1,13,115,1,13,187,1,9,78,1,13,108,1,21,3,A,7,1,A,7,23.9,A,7,13.3,A,7,52,A,7,988,A,7,70,A,7,2.1,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,20:00,39,784,17,1,13,20,1,9,15,1,13,18,1,13,8,1,9,18,1,13,31,1,21,0,A,7,0,A,7,21.7,A,7,13.9,A,7,61,A,7,988,A,7,100,A,7,2.1,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.6,A,7,14.4,A,7,68,A,7,989,A,7,100,A,7,2.1,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,19.4,A,7,14.4,A,7,73,A,7,989,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,19.4,A,7,14.4,A,7,73,A,7,988,A,7,130,A,7,2.6,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/11/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,20.0,A,7,13.9,A,7,68,A,7,988,A,7,130,A,7,2.6,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,18.9,A,7,13.9,A,7,73,A,7,987,A,7,160,A,7,2.6,A,7,16100,B,7,1830,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,18.9,A,7,14.4,A,7,76,A,7,987,A,7,170,A,7,2.1,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,6,A,7,18.3,A,7,14.4,A,7,78,A,7,987,A,7,160,A,7,2.1,A,7,16100,B,7,7620,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,7,A,7,18.3,A,7,15.0,A,7,81,A,7,987,A,7,150,A,7,1.5,A,7,16100,B,7,7620,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,18.3,A,7,15.6,A,7,84,A,7,987,A,7,150,A,7,1.5,A,7,11300,B,7,2130,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,06:00,102,1247,25,1,13,16,1,9,24,1,13,28,1,13,10,1,9,27,1,13,59,1,21,9,A,7,8,A,7,18.9,A,7,16.1,A,7,84,A,7,987,A,7,180,A,7,2.1,A,7,8000,B,7,1830,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,07:00,353,1325,100,1,9,34,1,9,91,1,13,110,1,9,30,1,9,102,1,13,241,1,18,10,A,7,9,A,7,18.9,A,7,16.7,A,7,87,A,7,988,A,7,160,A,7,3.1,A,7,4800,B,7,3660,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,08:00,604,1325,320,1,13,398,1,9,138,1,13,341,1,13,393,1,9,161,1,13,278,1,21,5,A,7,4,A,7,21.1,A,7,17.2,A,7,79,A,7,988,A,7,190,A,7,4.1,A,7,4800,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,09:00,836,1325,545,1,9,632,1,9,146,1,13,577,1,9,639,1,9,173,1,13,364,1,18,5,A,7,1,A,7,23.3,A,7,18.3,A,7,74,A,7,988,A,7,180,A,7,4.1,A,7,4800,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,10:00,1032,1325,718,1,9,681,1,9,185,1,13,762,1,9,695,1,9,220,1,13,625,1,18,5,A,7,2,A,7,25.0,A,7,18.3,A,7,67,A,7,987,A,7,200,A,7,6.2,A,7,9700,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,11:00,1178,1325,650,1,13,328,1,9,357,1,13,717,1,13,357,1,9,399,1,13,1678,1,21,8,A,7,3,A,7,26.1,A,7,19.4,A,7,67,A,7,986,A,7,200,A,7,5.2,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,12:00,1265,1325,862,1,13,581,1,9,306,1,13,907,1,13,586,1,9,346,1,13,2318,1,21,5,A,7,5,A,7,26.7,A,7,19.4,A,7,65,A,7,986,A,7,210,A,7,5.2,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,13:00,1287,1325,673,1,13,214,1,9,464,1,13,742,1,13,228,1,9,520,1,13,3342,1,21,7,A,7,7,A,7,27.2,A,7,20.0,A,7,65,A,7,985,A,7,200,A,7,4.1,A,7,6400,B,7,1040,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,14:00,1242,1325,556,1,9,130,1,9,435,1,13,615,1,9,139,1,9,485,1,13,2470,1,18,8,A,7,8,A,7,27.8,A,7,20.0,A,7,63,A,7,984,A,7,210,A,7,4.1,A,7,6400,B,7,1040,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,15:00,1134,1325,506,1,9,206,1,9,329,1,13,559,1,9,224,1,9,366,1,13,1354,1,18,8,A,7,8,A,7,28.3,A,7,20.6,A,7,63,A,7,983,A,7,190,A,7,6.2,A,7,6400,B,7,1040,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,16:00,969,1325,291,1,9,1,1,9,291,1,13,340,1,9,1,1,9,339,1,13,1283,1,18,10,A,7,10,A,7,27.8,A,7,20.6,A,7,65,A,7,983,A,7,220,A,7,4.6,A,7,6400,B,7,1040,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/12/1989,17:00,759,1325,121,1,9,4,1,9,119,1,13,146,1,9,3,1,9,145,1,13,567,1,18,10,A,7,10,A,7,24.4,A,7,19.4,A,7,74,A,7,984,A,7,300,A,7,8.2,A,7,800,B,7,760,A,7,3.4,E,8,0.000,F,8,0.00,?,0,81,1,D,9,05,C,8 -06/12/1989,18:00,519,1325,202,1,13,149,1,9,144,1,13,222,1,13,146,1,9,165,1,13,336,1,21,8,A,7,7,A,7,20.6,A,7,18.9,A,7,90,A,7,982,A,7,0,A,7,0.0,A,7,9700,B,7,2290,A,7,3.3,E,8,0.000,F,8,0.00,?,0,30,1,D,9,81,C,8 -06/12/1989,19:00,265,1325,90,1,13,108,1,9,68,1,13,98,1,13,85,1,9,81,1,13,146,1,21,10,A,7,5,A,7,21.7,A,7,19.4,A,7,87,A,7,983,A,7,180,A,7,1.5,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/12/1989,20:00,40,784,16,1,13,7,1,9,15,1,13,17,1,13,4,1,9,17,1,13,37,1,21,10,A,7,4,A,7,20.6,A,7,18.9,A,7,90,A,7,983,A,7,150,A,7,2.6,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,20.0,A,7,18.3,A,7,90,A,7,983,A,7,190,A,7,2.6,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,19.4,A,7,18.3,A,7,93,A,7,983,A,7,200,A,7,3.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,19.4,A,7,18.3,A,7,93,A,7,983,A,7,230,A,7,2.6,A,7,11300,B,7,3050,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/12/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,18.9,A,7,17.8,A,7,93,A,7,984,A,7,230,A,7,1.5,A,7,11300,B,7,2440,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,18.9,A,7,18.3,A,7,97,A,7,983,A,7,200,A,7,3.1,A,7,16100,B,7,2440,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -06/13/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,18.3,A,7,17.8,A,7,97,A,7,982,A,7,210,A,7,2.6,A,7,16100,B,7,2440,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,25,C,8 -06/13/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,18.3,A,7,17.8,A,7,97,A,7,980,A,7,190,A,7,3.1,A,7,16100,B,7,2440,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,18.3,A,7,17.8,A,7,97,A,7,981,A,7,220,A,7,2.6,A,7,16100,B,7,2440,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,18.9,A,7,18.3,A,7,97,A,7,981,A,7,220,A,7,3.6,A,7,11300,B,7,2440,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,06:00,102,1247,37,1,13,60,1,9,31,1,13,39,1,13,31,1,9,37,1,13,64,1,21,7,A,7,7,A,7,18.9,A,7,18.3,A,7,97,A,7,981,A,7,230,A,7,3.1,A,7,8000,B,7,2440,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,07:00,353,1324,147,1,13,247,1,9,81,1,13,158,1,13,213,1,9,101,1,13,152,1,21,4,A,7,4,A,7,20.0,A,7,19.4,A,7,97,A,7,981,A,7,220,A,7,3.6,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/13/1989,08:00,604,1324,399,1,9,726,1,9,67,1,13,424,1,9,708,1,9,100,1,13,149,1,18,1,A,7,1,A,7,22.2,A,7,20.6,A,7,90,A,7,981,A,7,230,A,7,5.2,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,28,C,8 -06/13/1989,09:00,836,1324,561,1,9,742,1,9,91,1,13,601,1,9,748,1,9,129,1,13,233,1,18,1,A,7,1,A,7,25.0,A,7,21.1,A,7,79,A,7,980,A,7,210,A,7,5.2,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,10:00,1031,1324,751,1,13,779,1,9,142,1,13,791,1,13,785,1,9,178,1,13,449,1,21,3,A,7,3,A,7,27.2,A,7,21.1,A,7,69,A,7,980,A,7,220,A,7,7.7,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,11:00,1178,1324,744,1,13,559,1,9,245,1,13,787,1,13,568,1,9,281,1,13,1228,1,21,10,A,7,7,A,7,27.2,A,7,21.1,A,7,69,A,7,979,A,7,220,A,7,7.2,A,7,11300,B,7,910,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,12:00,1265,1324,522,1,13,94,1,9,433,1,13,578,1,13,97,1,9,486,1,13,2510,1,21,8,A,7,7,A,7,27.8,A,7,20.6,A,7,65,A,7,979,A,7,220,A,7,7.2,A,7,11300,B,7,980,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,13:00,1287,1324,648,1,9,211,1,9,442,1,13,717,1,9,225,1,9,497,1,13,3191,1,18,9,A,7,9,A,7,27.2,A,7,20.6,A,7,67,A,7,979,A,7,230,A,7,6.2,A,7,11300,B,7,1070,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,14:00,1243,1324,221,1,9,9,1,9,213,1,13,274,1,9,7,1,9,268,1,13,1076,1,18,10,A,7,10,A,7,23.9,A,7,20.6,A,7,82,A,7,979,A,7,240,A,7,7.7,A,7,4800,B,7,460,A,7,3.6,E,8,0.000,F,8,0.00,?,0,25,1,D,9,80,C,8 -06/13/1989,15:00,1135,1324,309,1,9,11,1,9,300,1,13,368,1,9,10,1,9,360,1,13,1392,1,18,10,A,7,10,A,7,25.6,A,7,21.1,A,7,77,A,7,979,A,7,260,A,7,4.1,A,7,11300,B,7,1830,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,80,C,8 -06/13/1989,16:00,970,1324,466,1,9,300,1,9,246,1,13,515,1,9,325,1,9,277,1,13,722,1,18,8,A,7,8,A,7,25.6,A,7,20.0,A,7,72,A,7,980,A,7,250,A,7,3.1,A,7,11300,B,7,1830,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,17:00,761,1324,513,1,13,635,1,9,149,1,13,538,1,13,633,1,9,173,1,13,337,1,21,5,A,7,4,A,7,26.7,A,7,17.8,A,7,58,A,7,980,A,7,290,A,7,8.8,A,7,12900,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,18:00,521,1324,307,1,9,510,1,9,107,1,13,330,1,9,488,1,9,138,1,13,204,1,18,8,A,7,2,A,7,26.7,A,7,17.2,A,7,56,A,7,980,A,7,270,A,7,5.2,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,19:00,267,1324,133,1,13,430,1,9,47,1,13,138,1,13,331,1,9,71,1,13,86,1,21,4,A,7,0,A,7,25.6,A,7,18.3,A,7,64,A,7,981,A,7,270,A,7,3.6,A,7,24100,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,20:00,41,806,20,1,13,64,1,9,14,1,13,19,1,13,23,1,9,18,1,13,24,1,21,1,A,7,1,A,7,23.3,A,7,18.3,A,7,74,A,7,981,A,7,270,A,7,3.1,A,7,24100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -06/13/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,22.8,A,7,18.3,A,7,76,A,7,982,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,21.1,A,7,18.3,A,7,84,A,7,982,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,21.1,A,7,17.8,A,7,81,A,7,982,A,7,250,A,7,3.1,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/13/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,21.7,A,7,17.2,A,7,76,A,7,982,A,7,270,A,7,2.6,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,20.0,A,7,17.2,A,7,84,A,7,982,A,7,180,A,7,2.6,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,20.0,A,7,17.8,A,7,87,A,7,982,A,7,220,A,7,2.1,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,18.9,A,7,17.2,A,7,90,A,7,982,A,7,220,A,7,2.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,19.4,A,7,17.8,A,7,90,A,7,982,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,17.2,A,7,93,A,7,982,A,7,240,A,7,1.5,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,06:00,102,1247,31,1,13,15,1,9,29,1,13,33,1,13,9,1,9,32,1,13,69,1,21,0,A,7,0,A,7,18.9,A,7,18.3,A,7,97,A,7,983,A,7,170,A,7,2.1,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,07:00,352,1324,153,1,9,231,1,9,92,1,13,163,1,9,199,1,9,111,1,13,177,1,18,0,A,7,0,A,7,21.7,A,7,19.4,A,7,87,A,7,983,A,7,230,A,7,3.1,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,08:00,604,1324,347,1,9,431,1,9,150,1,13,366,1,9,425,1,9,172,1,13,304,1,18,0,A,7,0,A,7,24.4,A,7,19.4,A,7,74,A,7,984,A,7,230,A,7,3.1,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/14/1989,09:00,835,1324,548,1,9,550,1,9,199,1,13,586,1,9,567,1,9,228,1,13,488,1,18,0,A,7,0,A,7,26.1,A,7,20.0,A,7,69,A,7,984,A,7,230,A,7,3.1,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,10:00,1031,1324,726,1,9,629,1,9,235,1,13,759,1,9,634,1,9,264,1,13,772,1,18,0,A,7,0,A,7,27.8,A,7,20.0,A,7,63,A,7,984,A,7,230,A,7,5.2,A,7,19300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,11:00,1177,1324,863,1,9,677,1,9,259,1,13,910,1,9,686,1,9,298,1,13,1292,1,18,0,A,7,0,A,7,28.9,A,7,18.3,A,7,53,A,7,984,A,7,230,A,7,5.7,A,7,24100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,12:00,1265,1324,946,1,9,704,1,9,272,1,13,1004,1,9,715,1,9,319,1,13,2077,1,18,0,A,7,0,A,7,30.0,A,7,18.9,A,7,51,A,7,984,A,7,240,A,7,4.6,A,7,24100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,13:00,1287,1324,968,1,9,710,1,9,276,1,13,1028,1,9,721,1,9,325,1,13,2494,1,18,0,A,7,0,A,7,31.1,A,7,18.9,A,7,48,A,7,983,A,7,210,A,7,5.7,A,7,24100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,14:00,1243,1324,935,1,9,690,1,9,286,1,13,987,1,9,698,1,9,330,1,13,1907,1,18,2,A,7,2,A,7,31.7,A,7,20.0,A,7,50,A,7,982,A,7,240,A,7,6.2,A,7,24100,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,15:00,1135,1324,706,1,13,469,1,9,303,1,13,760,1,13,490,1,9,339,1,13,1345,1,21,4,A,7,4,A,7,31.7,A,7,20.0,A,7,50,A,7,982,A,7,220,A,7,5.2,A,7,24100,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,16:00,971,1324,616,1,13,441,1,9,292,1,13,650,1,13,457,1,9,314,1,13,890,1,21,5,A,7,5,A,7,31.1,A,7,20.6,A,7,53,A,7,982,A,7,210,A,7,5.7,A,7,24100,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,17:00,762,1324,401,1,13,299,1,9,229,1,13,433,1,13,316,1,9,250,1,13,551,1,21,3,A,7,3,A,7,31.1,A,7,20.0,A,7,52,A,7,982,A,7,230,A,7,4.6,A,7,24100,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,18:00,522,1324,253,1,9,314,1,9,130,1,13,274,1,9,310,1,9,152,1,13,263,1,18,2,A,7,2,A,7,30.6,A,7,19.4,A,7,52,A,7,981,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,19:00,268,1324,79,1,13,76,1,9,64,1,13,87,1,13,60,1,9,75,1,13,138,1,21,3,A,7,3,A,7,28.9,A,7,19.4,A,7,57,A,7,982,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,20:00,42,805,14,1,13,1,1,9,14,1,13,16,1,13,0,1,9,16,1,13,49,1,21,3,A,7,2,A,7,27.2,A,7,20.6,A,7,67,A,7,982,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,26.1,A,7,20.0,A,7,69,A,7,983,A,7,230,A,7,3.1,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,25.0,A,7,18.9,A,7,69,A,7,984,A,7,320,A,7,3.6,A,7,16100,B,7,1680,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,22.8,A,7,18.3,A,7,76,A,7,984,A,7,10,A,7,2.6,A,7,16100,B,7,1830,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/14/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,21.7,A,7,18.3,A,7,81,A,7,984,A,7,150,A,7,1.5,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,21.1,A,7,18.3,A,7,84,A,7,984,A,7,190,A,7,2.1,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,20.6,A,7,18.3,A,7,87,A,7,984,A,7,180,A,7,2.1,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,20.0,A,7,18.9,A,7,93,A,7,984,A,7,220,A,7,2.6,A,7,16100,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,20.0,A,7,18.9,A,7,93,A,7,983,A,7,190,A,7,2.1,A,7,16100,B,7,7620,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,6,A,7,20.0,A,7,18.9,A,7,93,A,7,984,A,7,190,A,7,2.6,A,7,16100,B,7,7620,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,06:00,102,1247,40,1,13,30,1,9,37,1,13,43,1,13,19,1,9,42,1,13,83,1,21,7,A,7,5,A,7,20.6,A,7,19.4,A,7,93,A,7,984,A,7,190,A,7,2.6,A,7,11300,B,7,7620,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,07:00,352,1324,121,1,9,41,1,9,110,1,13,132,1,9,36,1,9,123,1,13,279,1,18,10,A,7,8,A,7,22.8,A,7,20.0,A,7,84,A,7,984,A,7,190,A,7,3.6,A,7,9700,B,7,7620,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,08:00,603,1324,200,1,13,116,1,9,147,1,13,222,1,13,118,1,9,168,1,13,355,1,21,7,A,7,5,A,7,24.4,A,7,20.0,A,7,76,A,7,984,A,7,190,A,7,3.6,A,7,9700,B,7,7620,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/15/1989,09:00,834,1324,522,1,13,572,1,9,160,1,13,547,1,13,575,1,9,184,1,13,393,1,21,5,A,7,3,A,7,26.1,A,7,20.6,A,7,72,A,7,984,A,7,210,A,7,5.2,A,7,16100,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/15/1989,10:00,1030,1324,226,1,9,1,1,9,225,1,13,271,1,9,1,1,9,270,1,13,1085,1,18,10,A,7,10,A,7,26.7,A,7,20.6,A,7,69,A,7,984,A,7,220,A,7,5.7,A,7,16100,B,7,4570,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,11:00,1177,1324,833,1,13,730,1,9,182,1,13,871,1,13,734,1,9,217,1,13,843,1,21,3,A,7,3,A,7,27.2,A,7,20.6,A,7,67,A,7,984,A,7,210,A,7,4.1,A,7,16100,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,12:00,1265,1324,859,1,13,649,1,9,237,1,13,920,1,13,664,1,9,284,1,13,1822,1,21,7,A,7,5,A,7,28.9,A,7,20.6,A,7,61,A,7,983,A,7,240,A,7,5.2,A,7,16100,B,7,7620,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,13:00,1287,1324,667,1,13,296,1,9,379,1,13,743,1,13,323,1,9,429,1,13,3022,1,21,10,A,7,7,A,7,29.4,A,7,20.0,A,7,57,A,7,983,A,7,230,A,7,6.2,A,7,16100,B,7,1220,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,14:00,1243,1324,684,1,9,374,1,9,333,1,13,741,1,9,392,1,9,373,1,13,2298,1,18,10,A,7,8,A,7,29.4,A,7,20.0,A,7,57,A,7,983,A,7,220,A,7,6.7,A,7,12900,B,7,7620,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/15/1989,15:00,1136,1324,209,1,9,1,1,9,208,1,13,256,1,9,1,1,9,255,1,13,1040,1,18,10,A,7,10,A,7,27.8,A,7,20.0,A,7,63,A,7,983,A,7,220,A,7,4.1,A,7,16100,B,7,1830,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,16:00,972,1324,184,1,9,2,1,9,182,1,13,222,1,9,2,1,9,220,1,13,894,1,18,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,984,A,7,270,A,7,4.6,A,7,16100,B,7,1830,A,7,3.4,E,8,0.000,F,8,0.00,?,0,41,1,D,9,17,C,8 -06/15/1989,17:00,763,1324,357,1,13,251,1,9,213,1,13,388,1,13,266,1,9,235,1,13,506,1,21,10,A,7,6,A,7,22.8,A,7,18.9,A,7,79,A,7,983,A,7,240,A,7,3.6,A,7,16100,B,7,7620,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,17,C,8 -06/15/1989,18:00,523,1324,72,1,9,9,1,9,68,1,13,86,1,9,5,1,9,84,1,13,305,1,18,10,A,7,10,A,7,21.7,A,7,19.4,A,7,87,A,7,983,A,7,270,A,7,5.2,A,7,12900,B,7,1520,A,7,3.4,E,8,0.000,F,8,0.00,?,0,10,1,D,9,00,C,8 -06/15/1989,19:00,270,1324,30,1,13,4,1,9,29,1,13,36,1,13,1,1,9,36,1,13,119,1,21,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,984,A,7,220,A,7,3.6,A,7,4000,B,7,910,A,7,3.4,E,8,0.000,F,8,0.00,?,0,46,1,D,9,00,C,8 -06/15/1989,20:00,43,805,11,1,13,0,1,9,11,1,13,13,1,13,0,1,9,13,1,13,40,1,21,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,984,A,7,200,A,7,2.6,A,7,16100,B,7,3050,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/15/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,20.6,A,7,18.9,A,7,90,A,7,984,A,7,180,A,7,3.6,A,7,16100,B,7,3660,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,20.0,A,7,18.9,A,7,93,A,7,984,A,7,180,A,7,2.6,A,7,16100,B,7,1520,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,19.4,A,7,18.3,A,7,93,A,7,984,A,7,180,A,7,3.6,A,7,16100,B,7,3660,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/15/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,19.4,A,7,18.3,A,7,93,A,7,985,A,7,220,A,7,2.6,A,7,24100,B,7,3660,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,220,A,7,4.1,A,7,16100,B,7,370,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,220,A,7,2.6,A,7,11300,B,7,270,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -06/16/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,210,A,7,1.5,A,7,11300,B,7,270,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,220,A,7,1.5,A,7,11300,B,7,270,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,220,A,7,2.6,A,7,11300,B,7,270,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,06:00,101,1246,22,1,13,0,1,9,22,1,13,25,1,13,0,1,9,25,1,13,77,1,21,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,986,A,7,210,A,7,2.1,A,7,11300,B,7,270,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,07:00,351,1324,64,1,9,4,1,9,63,1,13,74,1,9,2,1,9,74,1,13,249,1,18,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,987,A,7,220,A,7,4.1,A,7,11300,B,7,310,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,08:00,602,1324,96,1,9,1,1,9,96,1,13,115,1,9,1,1,9,115,1,13,432,1,18,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,987,A,7,220,A,7,4.6,A,7,16100,B,7,3660,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -06/16/1989,09:00,834,1324,245,1,9,4,1,9,243,1,13,284,1,9,3,1,9,281,1,13,1041,1,18,10,A,7,10,A,7,22.8,A,7,20.0,A,7,84,A,7,987,A,7,220,A,7,4.6,A,7,24100,B,7,400,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -06/16/1989,10:00,1030,1324,324,1,9,2,1,9,323,1,13,378,1,9,2,1,9,377,1,13,1421,1,18,10,A,7,10,A,7,23.9,A,7,20.0,A,7,79,A,7,987,A,7,210,A,7,5.2,A,7,24100,B,7,490,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,11:00,1177,1324,376,1,9,2,1,9,374,1,13,442,1,9,2,1,9,441,1,13,1647,1,18,10,A,7,10,A,7,23.3,A,7,19.4,A,7,79,A,7,987,A,7,240,A,7,3.6,A,7,24100,B,7,730,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,12:00,1265,1324,439,1,9,1,1,9,438,1,13,517,1,9,1,1,9,516,1,13,1873,1,18,10,A,7,10,A,7,22.2,A,7,20.0,A,7,87,A,7,987,A,7,250,A,7,3.1,A,7,24100,B,7,1370,A,7,3.5,E,8,0.000,F,8,0.00,?,0,74,1,D,9,00,C,8 -06/16/1989,13:00,1287,1324,270,1,9,1,1,9,269,1,13,331,1,9,1,1,9,330,1,13,1314,1,18,10,A,7,10,A,7,22.2,A,7,20.0,A,7,87,A,7,986,A,7,240,A,7,4.1,A,7,11300,B,7,1370,A,7,3.5,E,8,0.000,F,8,0.00,?,0,58,1,D,9,00,C,8 -06/16/1989,14:00,1244,1324,293,1,9,1,1,9,292,1,13,355,1,9,1,1,9,354,1,13,1393,1,18,10,A,7,10,A,7,21.7,A,7,20.6,A,7,93,A,7,986,A,7,220,A,7,3.1,A,7,11300,B,7,1370,A,7,3.6,E,8,0.000,F,8,0.00,?,0,18,1,D,9,80,C,8 -06/16/1989,15:00,1136,1324,377,1,9,1,1,9,376,1,13,441,1,9,1,1,9,440,1,13,1634,1,18,10,A,7,9,A,7,22.8,A,7,20.6,A,7,87,A,7,985,A,7,220,A,7,5.2,A,7,24100,B,7,3050,A,7,3.6,E,8,0.000,F,8,0.00,?,0,3,1,D,9,80,C,8 -06/16/1989,16:00,972,1324,479,1,13,198,1,9,333,1,13,525,1,13,210,1,9,370,1,13,1061,1,21,9,A,7,6,A,7,23.3,A,7,20.6,A,7,85,A,7,984,A,7,200,A,7,3.6,A,7,24100,B,7,6100,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,17:00,764,1324,310,1,13,72,1,9,268,1,13,340,1,13,73,1,9,298,1,13,837,1,21,10,A,7,7,A,7,23.9,A,7,20.0,A,7,79,A,7,984,A,7,210,A,7,5.2,A,7,24100,B,7,760,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,18:00,524,1324,126,1,9,1,1,9,126,1,13,145,1,9,1,1,9,145,1,13,504,1,18,10,A,7,10,A,7,22.8,A,7,20.6,A,7,87,A,7,984,A,7,220,A,7,3.1,A,7,24100,B,7,1520,A,7,3.6,E,8,0.000,F,8,0.00,?,0,38,1,D,9,00,C,8 -06/16/1989,19:00,271,1324,27,1,13,6,1,9,26,1,13,33,1,13,1,1,9,33,1,13,108,1,21,10,A,7,10,A,7,20.0,A,7,19.4,A,7,97,A,7,985,A,7,210,A,7,5.2,A,7,8000,B,7,760,A,7,3.4,E,8,0.000,F,8,0.00,?,0,51,1,D,9,00,C,8 -06/16/1989,20:00,43,827,11,1,13,0,1,9,11,1,13,13,1,13,0,1,9,13,1,13,40,1,21,10,A,7,10,A,7,19.4,A,7,18.9,A,7,97,A,7,985,A,7,190,A,7,4.1,A,7,16100,B,7,2130,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/16/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,986,A,7,210,A,7,3.6,A,7,11300,B,7,240,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,986,A,7,210,A,7,4.6,A,7,11300,B,7,270,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,987,A,7,200,A,7,4.1,A,7,11300,B,7,210,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/16/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,987,A,7,210,A,7,6.2,A,7,11300,B,7,210,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,987,A,7,220,A,7,3.1,A,7,11300,B,7,210,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,987,A,7,220,A,7,2.1,A,7,11300,B,7,210,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -06/17/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,988,A,7,210,A,7,2.6,A,7,11300,B,7,270,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,988,A,7,230,A,7,2.1,A,7,11300,B,7,490,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,989,A,7,230,A,7,1.5,A,7,11300,B,7,490,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,06:00,101,1246,25,1,13,4,1,9,25,1,13,29,1,13,0,1,9,29,1,13,85,1,21,10,A,7,6,A,7,18.9,A,7,18.3,A,7,97,A,7,989,A,7,210,A,7,2.1,A,7,11300,B,7,7620,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,07:00,351,1323,74,1,9,3,1,9,74,1,13,86,1,9,1,1,9,85,1,13,282,1,18,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,990,A,7,220,A,7,3.1,A,7,11300,B,7,240,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,08:00,602,1323,139,1,9,22,1,9,129,1,13,153,1,9,21,1,9,144,1,13,401,1,18,10,A,7,10,A,7,20.6,A,7,18.9,A,7,90,A,7,991,A,7,230,A,7,3.1,A,7,11300,B,7,310,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,09:00,833,1323,292,1,9,97,1,9,231,1,13,323,1,9,102,1,9,259,1,13,643,1,18,10,A,7,9,A,7,22.2,A,7,18.9,A,7,82,A,7,991,A,7,240,A,7,3.6,A,7,14500,B,7,430,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,10:00,1029,1323,590,1,13,363,1,9,307,1,13,646,1,13,393,1,9,340,1,13,1014,1,21,10,A,7,7,A,7,22.8,A,7,17.8,A,7,74,A,7,991,A,7,220,A,7,3.1,A,7,16100,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,11:00,1176,1323,660,1,9,254,1,9,434,1,13,718,1,9,276,1,9,472,1,13,2078,1,18,9,A,7,8,A,7,24.4,A,7,18.3,A,7,69,A,7,991,A,7,220,A,7,3.6,A,7,14500,B,7,910,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,12:00,1264,1323,750,1,13,399,1,9,368,1,13,806,1,13,417,1,9,406,1,13,2897,1,21,6,A,7,6,A,7,25.0,A,7,17.2,A,7,62,A,7,990,A,7,280,A,7,2.6,A,7,14500,B,7,1220,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,13:00,1287,1323,642,1,9,201,1,9,446,1,13,710,1,9,215,1,9,501,1,13,3242,1,18,9,A,7,9,A,7,25.0,A,7,16.7,A,7,60,A,7,990,A,7,270,A,7,2.1,A,7,16100,B,7,1100,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,14:00,1244,1323,940,1,13,658,1,9,320,1,13,983,1,13,661,1,9,361,1,13,2134,1,21,4,A,7,4,A,7,26.1,A,7,17.2,A,7,58,A,7,989,A,7,240,A,7,5.2,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,15:00,1137,1323,733,1,13,505,1,9,299,1,13,791,1,13,528,1,9,337,1,13,1335,1,21,4,A,7,4,A,7,26.7,A,7,16.1,A,7,52,A,7,989,A,7,270,A,7,3.1,A,7,24100,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,16:00,973,1323,641,1,13,485,1,9,284,1,13,679,1,13,503,1,9,308,1,13,868,1,21,3,A,7,3,A,7,26.7,A,7,17.2,A,7,56,A,7,989,A,7,230,A,7,4.1,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,17:00,765,1323,469,1,9,468,1,9,199,1,13,498,1,9,478,1,9,221,1,13,457,1,18,2,A,7,2,A,7,26.1,A,7,17.2,A,7,58,A,7,988,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,18:00,525,1323,275,1,9,387,1,9,122,1,13,292,1,9,371,1,9,145,1,13,237,1,18,1,A,7,1,A,7,26.1,A,7,16.7,A,7,56,A,7,988,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,19:00,272,1323,96,1,13,165,1,9,62,1,13,103,1,13,126,1,9,77,1,13,114,1,21,1,A,7,1,A,7,24.4,A,7,17.2,A,7,64,A,7,988,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,20:00,44,827,17,1,13,4,1,9,16,1,13,18,1,13,0,1,9,18,1,13,55,1,21,0,A,7,0,A,7,22.8,A,7,17.2,A,7,71,A,7,989,A,7,180,A,7,2.6,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.1,A,7,17.8,A,7,81,A,7,989,A,7,210,A,7,2.1,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.6,A,7,17.2,A,7,81,A,7,989,A,7,190,A,7,2.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,19.4,A,7,17.8,A,7,90,A,7,990,A,7,220,A,7,2.1,A,7,12900,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/17/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,19.4,A,7,17.8,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.3,A,7,16.7,A,7,90,A,7,990,A,7,240,A,7,2.6,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,16.1,A,7,90,A,7,990,A,7,240,A,7,1.5,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,16.1,A,7,93,A,7,990,A,7,300,A,7,1.5,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,16.1,A,7,97,A,7,990,A,7,0,A,7,0.0,A,7,14500,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,16.1,A,7,15.6,A,7,97,A,7,990,A,7,200,A,7,1.5,A,7,8000,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,06:00,101,1224,24,1,13,16,1,9,23,1,13,27,1,13,10,1,9,26,1,13,57,1,21,6,A,7,2,A,7,16.7,A,7,16.1,A,7,97,A,7,991,A,7,330,A,7,1.5,A,7,6400,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/18/1989,07:00,350,1323,159,1,13,201,1,9,105,1,13,167,1,13,172,1,9,121,1,13,209,1,21,10,A,7,3,A,7,18.9,A,7,17.2,A,7,90,A,7,991,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/18/1989,08:00,601,1323,356,1,9,421,1,9,164,1,13,372,1,9,414,1,9,183,1,13,336,1,18,10,A,7,2,A,7,21.7,A,7,16.1,A,7,71,A,7,991,A,7,30,A,7,2.1,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/18/1989,09:00,832,1323,541,1,9,493,1,9,229,1,13,571,1,9,507,1,9,251,1,13,568,1,18,10,A,7,2,A,7,23.3,A,7,14.4,A,7,58,A,7,991,A,7,60,A,7,2.6,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,10:00,1029,1323,704,1,9,574,1,9,256,1,13,758,1,9,599,1,9,292,1,13,862,1,18,9,A,7,1,A,7,24.4,A,7,15.0,A,7,56,A,7,991,A,7,60,A,7,2.1,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,11:00,1176,1323,844,1,9,649,1,9,265,1,13,888,1,9,657,1,9,303,1,13,1315,1,18,8,A,7,1,A,7,26.7,A,7,11.1,A,7,38,A,7,991,A,7,360,A,7,2.6,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,12:00,1264,1323,919,1,9,648,1,9,299,1,13,969,1,9,655,1,9,342,1,13,2269,1,18,7,A,7,1,A,7,27.2,A,7,14.4,A,7,46,A,7,991,A,7,30,A,7,2.1,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,13:00,1287,1323,939,1,9,714,1,9,243,1,13,1007,1,9,730,1,9,295,1,13,2223,1,18,6,A,7,1,A,7,27.8,A,7,13.9,A,7,43,A,7,991,A,7,360,A,7,2.6,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,14:00,1244,1323,892,1,9,699,1,9,233,1,13,955,1,9,715,1,9,281,1,13,1588,1,18,6,A,7,1,A,7,28.3,A,7,13.9,A,7,41,A,7,991,A,7,300,A,7,2.1,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,15:00,1137,1323,852,1,9,738,1,9,217,1,13,907,1,9,753,1,9,259,1,13,957,1,18,3,A,7,0,A,7,28.3,A,7,13.9,A,7,41,A,7,990,A,7,290,A,7,3.1,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,16:00,974,1323,700,1,9,676,1,9,202,1,13,736,1,9,684,1,9,232,1,13,602,1,18,4,A,7,0,A,7,28.3,A,7,12.8,A,7,38,A,7,989,A,7,190,A,7,2.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,17:00,766,1323,459,1,13,452,1,9,197,1,13,487,1,13,461,1,9,220,1,13,453,1,21,4,A,7,3,A,7,28.3,A,7,15.0,A,7,44,A,7,989,A,7,180,A,7,2.6,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,18:00,526,1323,167,1,13,87,1,9,133,1,13,185,1,13,86,1,9,151,1,13,311,1,21,6,A,7,5,A,7,26.7,A,7,16.1,A,7,52,A,7,988,A,7,170,A,7,3.1,A,7,16100,B,7,7620,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,19:00,273,1323,84,1,13,123,1,9,59,1,13,91,1,13,94,1,9,71,1,13,108,1,21,5,A,7,5,A,7,25.6,A,7,16.7,A,7,58,A,7,988,A,7,160,A,7,3.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,20:00,45,827,12,1,13,5,1,9,12,1,13,14,1,13,3,1,9,13,1,13,30,1,21,5,A,7,2,A,7,23.9,A,7,16.7,A,7,64,A,7,988,A,7,170,A,7,2.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,22.8,A,7,16.7,A,7,69,A,7,989,A,7,180,A,7,1.5,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,21.7,A,7,17.8,A,7,79,A,7,989,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,21.7,A,7,17.8,A,7,79,A,7,989,A,7,0,A,7,0.0,A,7,11300,B,7,3960,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/18/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,21.7,A,7,17.8,A,7,79,A,7,989,A,7,160,A,7,2.1,A,7,16100,B,7,4570,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,20.6,A,7,17.2,A,7,81,A,7,989,A,7,180,A,7,2.6,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,20.0,A,7,16.7,A,7,81,A,7,989,A,7,170,A,7,2.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,20.0,A,7,16.7,A,7,81,A,7,989,A,7,180,A,7,1.5,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,19.4,A,7,16.7,A,7,84,A,7,988,A,7,180,A,7,1.5,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,19.4,A,7,16.7,A,7,84,A,7,988,A,7,190,A,7,1.5,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,06:00,100,1224,31,1,13,2,1,9,31,1,13,35,1,13,0,1,9,35,1,13,99,1,21,10,A,7,9,A,7,20.6,A,7,17.8,A,7,84,A,7,988,A,7,140,A,7,2.1,A,7,11300,B,7,3350,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,07:00,349,1323,113,1,13,105,1,9,85,1,13,124,1,13,92,1,9,100,1,13,187,1,21,5,A,7,5,A,7,21.7,A,7,18.3,A,7,81,A,7,988,A,7,120,A,7,2.1,A,7,9700,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,08:00,600,1323,364,1,9,549,1,9,114,1,13,378,1,9,531,1,9,137,1,13,230,1,18,1,A,7,0,A,7,24.4,A,7,18.3,A,7,69,A,7,989,A,7,170,A,7,2.6,A,7,9700,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/19/1989,09:00,832,1323,543,1,9,564,1,9,187,1,13,585,1,9,582,1,9,219,1,13,455,1,18,2,A,7,1,A,7,26.1,A,7,18.9,A,7,65,A,7,989,A,7,170,A,7,3.6,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/19/1989,10:00,1028,1323,691,1,9,576,1,9,241,1,13,720,1,9,580,1,9,268,1,13,786,1,18,6,A,7,2,A,7,27.2,A,7,17.8,A,7,56,A,7,989,A,7,190,A,7,3.1,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/19/1989,11:00,1175,1323,870,1,9,705,1,9,241,1,13,921,1,9,717,1,9,283,1,13,1204,1,18,7,A,7,2,A,7,28.3,A,7,18.3,A,7,55,A,7,989,A,7,180,A,7,4.6,A,7,14500,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,12:00,1264,1323,840,1,13,553,1,9,310,1,13,917,1,13,580,1,9,362,1,13,2424,1,21,7,A,7,4,A,7,28.9,A,7,17.2,A,7,49,A,7,988,A,7,180,A,7,4.1,A,7,14500,B,7,7620,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,13:00,1287,1323,701,1,13,345,1,9,365,1,13,783,1,13,376,1,9,416,1,13,2920,1,21,8,A,7,7,A,7,29.4,A,7,17.8,A,7,50,A,7,988,A,7,200,A,7,4.1,A,7,14500,B,7,1520,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,14:00,1244,1323,873,1,13,678,1,9,235,1,13,935,1,13,693,1,9,282,1,13,1604,1,21,8,A,7,3,A,7,29.4,A,7,17.8,A,7,50,A,7,988,A,7,160,A,7,3.6,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,15:00,1137,1323,748,1,13,572,1,9,256,1,13,788,1,13,579,1,9,289,1,13,1115,1,21,5,A,7,3,A,7,30.0,A,7,17.2,A,7,46,A,7,987,A,7,150,A,7,4.6,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,16:00,975,1323,304,1,9,76,1,9,247,1,13,335,1,9,77,1,9,278,1,13,953,1,18,10,A,7,9,A,7,27.2,A,7,17.2,A,7,54,A,7,986,A,7,160,A,7,5.2,A,7,16100,B,7,1520,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,17:00,766,1323,303,1,9,155,1,9,214,1,13,336,1,9,162,1,9,241,1,13,567,1,18,10,A,7,9,A,7,26.1,A,7,18.3,A,7,62,A,7,986,A,7,170,A,7,2.6,A,7,16100,B,7,3050,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,18:00,527,1323,177,1,9,108,1,9,134,1,13,195,1,9,107,1,9,153,1,13,314,1,18,8,A,7,8,A,7,26.7,A,7,19.4,A,7,65,A,7,985,A,7,120,A,7,3.1,A,7,16100,B,7,3050,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,19:00,274,1323,83,1,13,24,1,9,78,1,13,91,1,13,20,1,9,87,1,13,194,1,21,10,A,7,8,A,7,26.7,A,7,18.9,A,7,63,A,7,985,A,7,160,A,7,2.6,A,7,16100,B,7,3660,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,20:00,45,849,13,1,13,0,1,9,13,1,13,15,1,13,0,1,9,15,1,13,47,1,21,10,A,7,10,A,7,25.0,A,7,19.4,A,7,71,A,7,986,A,7,170,A,7,3.6,A,7,12900,B,7,1520,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,19.4,A,7,82,A,7,987,A,7,210,A,7,5.2,A,7,11300,B,7,1370,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,20.0,A,7,87,A,7,987,A,7,170,A,7,2.6,A,7,11300,B,7,2440,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,17,C,8 -06/19/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.7,A,7,20.0,A,7,90,A,7,988,A,7,170,A,7,3.1,A,7,11300,B,7,6100,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/19/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,21.7,A,7,19.4,A,7,87,A,7,987,A,7,200,A,7,2.1,A,7,19300,B,7,7620,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,20.6,A,7,18.9,A,7,90,A,7,987,A,7,200,A,7,2.6,A,7,19300,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,2,A,7,20.0,A,7,18.9,A,7,93,A,7,987,A,7,180,A,7,2.6,A,7,19300,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -06/20/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,19.4,A,7,18.3,A,7,93,A,7,987,A,7,170,A,7,2.6,A,7,19300,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,18.9,A,7,18.3,A,7,97,A,7,987,A,7,170,A,7,2.1,A,7,19300,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,5,A,7,18.9,A,7,17.8,A,7,93,A,7,988,A,7,200,A,7,2.6,A,7,14500,B,7,7620,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,06:00,99,1223,20,1,13,3,1,9,19,1,13,22,1,13,0,1,9,22,1,13,69,1,21,10,A,7,8,A,7,19.4,A,7,18.3,A,7,93,A,7,988,A,7,180,A,7,3.1,A,7,14500,B,7,1070,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,07:00,348,1323,65,1,9,15,1,9,61,1,13,72,1,9,13,1,9,68,1,13,171,1,18,10,A,7,9,A,7,20.0,A,7,18.9,A,7,93,A,7,988,A,7,180,A,7,2.6,A,7,14500,B,7,880,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,08:00,599,1323,137,1,9,2,1,9,136,1,13,159,1,9,1,1,9,158,1,13,570,1,18,10,A,7,10,A,7,20.6,A,7,18.9,A,7,90,A,7,989,A,7,210,A,7,2.6,A,7,11300,B,7,760,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,09:00,831,1323,291,1,9,55,1,9,257,1,13,321,1,9,56,1,9,286,1,13,863,1,18,9,A,7,9,A,7,21.7,A,7,19.4,A,7,87,A,7,989,A,7,180,A,7,2.1,A,7,11300,B,7,1220,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,10:00,1027,1323,253,1,9,22,1,9,236,1,13,280,1,9,22,1,9,263,1,13,967,1,18,10,A,7,10,A,7,23.9,A,7,19.4,A,7,76,A,7,989,A,7,190,A,7,4.1,A,7,11300,B,7,2740,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,11:00,1175,1323,553,1,9,121,1,9,445,1,13,606,1,9,129,1,9,491,1,13,2031,1,18,10,A,7,9,A,7,25.0,A,7,19.4,A,7,71,A,7,989,A,7,230,A,7,2.6,A,7,11300,B,7,2740,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,12:00,1263,1323,627,1,9,212,1,9,424,1,13,695,1,9,227,1,9,478,1,13,2674,1,18,10,A,7,9,A,7,25.6,A,7,19.4,A,7,69,A,7,989,A,7,260,A,7,1.5,A,7,11300,B,7,2740,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,13:00,1287,1323,547,1,9,37,1,9,511,1,13,604,1,9,38,1,9,567,1,13,3206,1,18,10,A,7,10,A,7,25.0,A,7,20.0,A,7,74,A,7,988,A,7,230,A,7,2.6,A,7,11300,B,7,2740,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,14:00,1244,1323,433,1,9,88,1,9,350,1,13,485,1,9,94,1,9,396,1,13,2017,1,18,10,A,7,9,A,7,27.2,A,7,20.6,A,7,67,A,7,988,A,7,220,A,7,2.6,A,7,11300,B,7,2740,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,15:00,1138,1323,205,1,9,29,1,9,180,1,13,228,1,9,29,1,9,203,1,13,862,1,18,10,A,7,10,A,7,22.2,A,7,20.0,A,7,87,A,7,988,A,7,140,A,7,5.2,A,7,11300,B,7,880,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,16:00,975,1323,141,1,9,8,1,9,135,1,13,174,1,9,6,1,9,170,1,13,693,1,18,10,A,7,10,A,7,21.7,A,7,20.6,A,7,93,A,7,988,A,7,160,A,7,3.1,A,7,11300,B,7,910,A,7,3.6,E,8,0.000,F,8,0.00,?,0,18,1,D,9,80,C,8 -06/20/1989,17:00,767,1323,204,1,9,2,1,9,203,1,13,236,1,9,2,1,9,236,1,13,874,1,18,10,A,7,10,A,7,22.2,A,7,21.1,A,7,94,A,7,988,A,7,180,A,7,3.1,A,7,16100,B,7,2740,A,7,3.7,E,8,0.000,F,8,0.00,?,0,3,1,D,9,80,C,8 -06/20/1989,18:00,528,1323,113,1,9,1,1,9,112,1,13,130,1,9,1,1,9,130,1,13,463,1,18,10,A,7,10,A,7,21.7,A,7,20.6,A,7,93,A,7,988,A,7,180,A,7,2.6,A,7,12900,B,7,1070,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,19:00,275,1323,55,1,13,2,1,9,54,1,13,62,1,13,1,1,9,62,1,13,202,1,21,10,A,7,10,A,7,21.7,A,7,21.1,A,7,97,A,7,987,A,7,180,A,7,3.1,A,7,12900,B,7,3050,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,20:00,46,849,12,1,13,0,1,9,12,1,13,14,1,13,0,1,9,14,1,13,44,1,21,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,988,A,7,160,A,7,2.6,A,7,11300,B,7,3050,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,25,C,8 -06/20/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,989,A,7,180,A,7,1.5,A,7,11300,B,7,3050,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,20.6,A,7,97,A,7,989,A,7,170,A,7,2.1,A,7,11300,B,7,370,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,20.6,A,7,97,A,7,988,A,7,140,A,7,3.6,A,7,11300,B,7,270,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/20/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,20.6,A,7,97,A,7,988,A,7,170,A,7,3.1,A,7,800,B,7,60,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,20.6,A,7,97,A,7,988,A,7,160,A,7,4.1,A,7,4000,B,7,240,A,7,3.6,E,8,0.000,?,0,0.00,?,0,76,1,D,9,45,C,8 -06/21/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,989,A,7,210,A,7,2.1,A,7,4800,B,7,1220,A,7,3.2,E,8,0.000,?,0,0.00,?,0,122,1,D,9,45,C,8 -06/21/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,6,A,7,18.9,A,7,18.3,A,7,97,A,7,988,A,7,0,A,7,0.0,A,7,24100,B,7,2900,A,7,3.2,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -06/21/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,18.3,A,7,17.8,A,7,97,A,7,988,A,7,120,A,7,1.5,A,7,24100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,18.3,A,7,18.3,A,7,100,A,7,989,A,7,160,A,7,1.5,A,7,24100,B,7,850,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,06:00,98,1223,21,1,13,0,1,9,21,1,13,24,1,13,0,1,9,24,1,13,74,1,21,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,989,A,7,110,A,7,1.5,A,7,16100,B,7,400,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,07:00,347,1322,47,1,9,1,1,9,47,1,13,56,1,9,0,1,9,56,1,13,195,1,18,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,990,A,7,120,A,7,2.6,A,7,11300,B,7,270,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,08:00,598,1322,166,1,9,1,1,9,165,1,13,189,1,9,1,1,9,188,1,13,656,1,18,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,990,A,7,170,A,7,2.1,A,7,8000,B,7,270,A,7,3.5,E,8,0.000,F,8,0.00,?,0,25,1,D,9,80,C,8 -06/21/1989,09:00,830,1322,272,1,9,0,1,9,271,1,13,310,1,9,0,1,9,310,1,13,1118,1,18,10,A,7,10,A,7,21.7,A,7,20.6,A,7,93,A,7,990,A,7,200,A,7,3.6,A,7,11300,B,7,270,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/21/1989,10:00,1026,1322,390,1,9,0,1,9,390,1,13,448,1,9,0,1,9,448,1,13,1602,1,18,10,A,7,10,A,7,23.3,A,7,21.7,A,7,90,A,7,990,A,7,220,A,7,3.1,A,7,11300,B,7,310,A,7,3.8,E,8,0.000,F,8,0.00,?,0,5,1,D,9,00,C,8 -06/21/1989,11:00,1174,1322,481,1,13,82,1,9,408,1,13,531,1,13,84,1,9,456,1,13,1904,1,21,7,A,7,7,A,7,24.4,A,7,21.1,A,7,82,A,7,990,A,7,230,A,7,4.1,A,7,11300,B,7,400,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,12:00,1263,1322,702,1,13,395,1,9,324,1,13,764,1,13,414,1,9,368,1,13,2531,1,21,6,A,7,6,A,7,25.0,A,7,21.1,A,7,79,A,7,990,A,7,260,A,7,2.6,A,7,11300,B,7,610,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,13:00,1287,1322,745,1,13,380,1,9,374,1,13,801,1,13,397,1,9,413,1,13,3518,1,21,6,A,7,6,A,7,27.2,A,7,21.1,A,7,69,A,7,989,A,7,180,A,7,2.6,A,7,11300,B,7,610,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,14:00,1244,1322,448,1,9,72,1,9,380,1,13,496,1,9,74,1,9,426,1,13,2103,1,18,10,A,7,9,A,7,25.0,A,7,21.1,A,7,79,A,7,989,A,7,120,A,7,5.2,A,7,16100,B,7,760,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -06/21/1989,15:00,1138,1322,842,1,13,658,1,9,275,1,13,882,1,13,663,1,9,310,1,13,1194,1,21,8,A,7,6,A,7,25.0,A,7,22.8,A,7,88,A,7,989,A,7,160,A,7,5.2,A,7,16100,B,7,760,A,7,4.1,E,8,0.000,F,8,0.00,?,0,8,1,D,9,00,C,8 -06/21/1989,16:00,976,1322,637,1,13,572,1,9,215,1,13,667,1,13,577,1,9,241,1,13,638,1,21,8,A,7,4,A,7,25.6,A,7,22.2,A,7,82,A,7,988,A,7,150,A,7,3.6,A,7,16100,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,17:00,768,1322,437,1,9,375,1,9,219,1,13,473,1,9,397,1,9,242,1,13,524,1,18,10,A,7,8,A,7,24.4,A,7,21.1,A,7,82,A,7,988,A,7,160,A,7,4.1,A,7,16100,B,7,1370,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,18:00,529,1322,100,1,9,4,1,9,99,1,13,118,1,9,3,1,9,117,1,13,420,1,18,10,A,7,10,A,7,23.9,A,7,21.7,A,7,87,A,7,988,A,7,150,A,7,2.6,A,7,11300,B,7,1370,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,19:00,276,1322,51,1,13,6,1,9,49,1,13,58,1,13,2,1,9,58,1,13,187,1,21,10,A,7,10,A,7,23.3,A,7,21.1,A,7,87,A,7,989,A,7,150,A,7,2.1,A,7,16100,B,7,3050,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,20:00,47,849,10,1,13,0,1,9,10,1,13,12,1,13,0,1,9,12,1,13,37,1,21,10,A,7,10,A,7,22.8,A,7,21.7,A,7,94,A,7,989,A,7,150,A,7,3.1,A,7,24100,B,7,3050,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -06/21/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,21.1,A,7,94,A,7,990,A,7,170,A,7,2.1,A,7,11300,B,7,460,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/21/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.9,A,7,97,A,7,990,A,7,240,A,7,2.1,A,7,8000,B,7,460,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,95,C,8 -06/21/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,19.4,A,7,100,A,7,990,A,7,200,A,7,2.1,A,7,8000,B,7,400,A,7,3.4,E,8,0.000,?,0,0.00,?,0,10,1,D,9,45,C,8 -06/21/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,20.0,A,7,100,A,7,990,A,7,210,A,7,2.6,A,7,11300,B,7,150,A,7,3.5,E,8,0.000,?,0,0.00,?,0,15,1,D,9,45,C,8 -06/22/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,20.0,A,7,19.4,A,7,97,A,7,989,A,7,210,A,7,2.6,A,7,9700,B,7,240,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -06/22/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,19.4,A,7,97,A,7,989,A,7,230,A,7,2.1,A,7,11300,B,7,240,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/22/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,19.4,A,7,97,A,7,989,A,7,230,A,7,2.1,A,7,11300,B,7,180,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,19.4,A,7,97,A,7,989,A,7,220,A,7,1.5,A,7,11300,B,7,1490,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,6,A,7,19.4,A,7,18.9,A,7,97,A,7,990,A,7,0,A,7,0.0,A,7,11300,B,7,7620,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,06:00,98,1223,17,1,13,0,1,9,17,1,13,20,1,13,0,1,9,20,1,13,62,1,21,8,A,7,7,A,7,19.4,A,7,18.9,A,7,97,A,7,990,A,7,110,A,7,2.6,A,7,6400,B,7,7620,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,07:00,346,1322,83,1,9,23,1,9,77,1,13,91,1,9,20,1,9,86,1,13,209,1,18,10,A,7,9,A,7,20.6,A,7,19.4,A,7,93,A,7,990,A,7,180,A,7,2.6,A,7,6400,B,7,700,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/22/1989,08:00,597,1322,127,1,9,1,1,9,127,1,13,148,1,9,1,1,9,148,1,13,540,1,18,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,991,A,7,190,A,7,2.6,A,7,11300,B,7,270,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -06/22/1989,09:00,829,1322,193,1,9,1,1,9,192,1,13,226,1,9,1,1,9,226,1,13,872,1,18,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,991,A,7,220,A,7,2.6,A,7,11300,B,7,270,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,10:00,1026,1322,255,1,9,5,1,9,251,1,13,303,1,9,4,1,9,300,1,13,1181,1,18,10,A,7,10,A,7,21.7,A,7,19.4,A,7,87,A,7,991,A,7,190,A,7,2.6,A,7,8000,B,7,270,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,11:00,1173,1322,297,1,9,0,1,9,296,1,13,355,1,9,0,1,9,355,1,13,1390,1,18,10,A,7,10,A,7,22.8,A,7,20.0,A,7,84,A,7,991,A,7,200,A,7,3.1,A,7,8000,B,7,310,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/22/1989,12:00,1263,1322,365,1,9,2,1,9,363,1,13,436,1,9,2,1,9,434,1,13,1647,1,18,10,A,7,10,A,7,23.3,A,7,20.0,A,7,82,A,7,990,A,7,220,A,7,3.1,A,7,8000,B,7,460,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/22/1989,13:00,1287,1322,728,1,9,259,1,9,475,1,13,796,1,9,281,1,9,522,1,13,3865,1,18,9,A,7,8,A,7,25.0,A,7,20.0,A,7,74,A,7,990,A,7,190,A,7,2.6,A,7,8000,B,7,940,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/22/1989,14:00,1244,1322,625,1,9,247,1,9,392,1,13,691,1,9,269,1,9,437,1,13,2424,1,18,8,A,7,8,A,7,26.1,A,7,20.6,A,7,72,A,7,989,A,7,170,A,7,3.6,A,7,11300,B,7,1100,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/22/1989,15:00,1139,1322,676,1,13,285,1,9,430,1,13,732,1,13,309,1,9,466,1,13,1857,1,21,7,A,7,7,A,7,26.7,A,7,20.0,A,7,67,A,7,989,A,7,250,A,7,3.6,A,7,16100,B,7,1190,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,16:00,976,1322,634,1,9,502,1,9,263,1,13,677,1,9,522,1,9,291,1,13,804,1,18,2,A,7,2,A,7,27.2,A,7,20.0,A,7,65,A,7,988,A,7,230,A,7,3.1,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,17:00,769,1322,392,1,13,277,1,9,231,1,13,423,1,13,293,1,9,252,1,13,559,1,21,6,A,7,5,A,7,26.7,A,7,20.0,A,7,67,A,7,988,A,7,230,A,7,3.6,A,7,16100,B,7,7620,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,18:00,530,1322,250,1,13,194,1,9,172,1,13,271,1,13,191,1,9,195,1,13,403,1,21,8,A,7,4,A,7,26.7,A,7,20.0,A,7,67,A,7,988,A,7,190,A,7,2.1,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,19:00,277,1322,86,1,13,50,1,9,76,1,13,95,1,13,41,1,9,86,1,13,191,1,21,8,A,7,4,A,7,25.6,A,7,20.0,A,7,72,A,7,988,A,7,180,A,7,2.6,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,20:00,47,848,11,1,13,0,1,9,11,1,13,13,1,13,0,1,9,13,1,13,41,1,21,8,A,7,4,A,7,23.3,A,7,20.6,A,7,85,A,7,988,A,7,200,A,7,2.1,A,7,16100,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,23.3,A,7,21.1,A,7,87,A,7,988,A,7,220,A,7,2.1,A,7,16100,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,22.8,A,7,20.6,A,7,87,A,7,989,A,7,160,A,7,1.5,A,7,16100,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,22.2,A,7,20.6,A,7,90,A,7,989,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/22/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,22.2,A,7,20.6,A,7,90,A,7,989,A,7,190,A,7,3.1,A,7,11300,B,7,2130,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,21.1,A,7,20.0,A,7,93,A,7,988,A,7,200,A,7,3.1,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,20.6,A,7,20.0,A,7,97,A,7,988,A,7,210,A,7,2.6,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,20.0,A,7,19.4,A,7,97,A,7,988,A,7,240,A,7,2.1,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,20.6,A,7,20.0,A,7,97,A,7,988,A,7,240,A,7,2.6,A,7,9700,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/23/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,20.0,A,7,20.0,A,7,100,A,7,988,A,7,260,A,7,1.5,A,7,3200,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/23/1989,06:00,97,1201,20,1,13,4,1,9,19,1,13,22,1,13,0,1,9,22,1,13,68,1,21,7,A,7,6,A,7,20.6,A,7,20.0,A,7,97,A,7,988,A,7,220,A,7,2.6,A,7,3200,B,7,2130,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/23/1989,07:00,345,1322,157,1,9,282,1,9,83,1,13,164,1,9,237,1,9,102,1,13,153,1,18,0,A,7,0,A,7,21.7,A,7,21.1,A,7,97,A,7,988,A,7,230,A,7,2.1,A,7,4000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/23/1989,08:00,596,1322,336,1,9,408,1,9,151,1,13,353,1,9,401,1,9,172,1,13,306,1,18,1,A,7,1,A,7,23.9,A,7,21.1,A,7,85,A,7,988,A,7,290,A,7,3.6,A,7,6400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -06/23/1989,09:00,828,1322,545,1,9,590,1,9,174,1,13,568,1,9,591,1,9,197,1,13,419,1,18,2,A,7,2,A,7,26.7,A,7,21.1,A,7,72,A,7,988,A,7,350,A,7,2.6,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/23/1989,10:00,1025,1322,638,1,13,430,1,9,304,1,13,676,1,13,447,1,9,328,1,13,1029,1,21,4,A,7,4,A,7,27.2,A,7,21.1,A,7,69,A,7,988,A,7,280,A,7,2.6,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/23/1989,11:00,1173,1322,755,1,13,487,1,9,322,1,13,812,1,13,509,1,9,359,1,13,1635,1,21,5,A,7,5,A,7,27.2,A,7,20.0,A,7,65,A,7,988,A,7,340,A,7,2.6,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,12:00,1262,1322,756,1,13,414,1,9,360,1,13,814,1,13,433,1,9,399,1,13,2812,1,21,5,A,7,5,A,7,28.3,A,7,19.4,A,7,59,A,7,987,A,7,180,A,7,2.1,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,13:00,1287,1322,968,1,13,643,1,9,341,1,13,1013,1,13,645,1,9,384,1,13,3077,1,21,5,A,7,5,A,7,28.9,A,7,19.4,A,7,57,A,7,987,A,7,280,A,7,3.1,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,14:00,1244,1322,840,1,13,503,1,9,365,1,13,900,1,13,526,1,9,404,1,13,2565,1,21,4,A,7,4,A,7,30.6,A,7,19.4,A,7,52,A,7,985,A,7,360,A,7,3.6,A,7,14500,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,15:00,1139,1322,778,1,9,611,1,9,251,1,13,820,1,9,619,1,9,286,1,13,1102,1,18,2,A,7,2,A,7,30.6,A,7,20.0,A,7,53,A,7,985,A,7,240,A,7,2.6,A,7,14500,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,16:00,977,1322,671,1,13,657,1,9,185,1,13,710,1,13,668,1,9,216,1,13,561,1,21,3,A,7,3,A,7,31.1,A,7,18.3,A,7,47,A,7,984,A,7,320,A,7,2.6,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,17:00,769,1322,477,1,9,541,1,9,163,1,13,518,1,9,554,1,9,195,1,13,369,1,18,1,A,7,1,A,7,30.0,A,7,20.0,A,7,55,A,7,984,A,7,240,A,7,2.6,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,18:00,531,1322,290,1,9,406,1,9,128,1,13,307,1,9,390,1,9,151,1,13,250,1,18,2,A,7,2,A,7,30.0,A,7,19.4,A,7,53,A,7,984,A,7,270,A,7,2.6,A,7,16100,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,19:00,278,1322,85,1,13,115,1,9,61,1,13,92,1,13,89,1,9,73,1,13,112,1,21,4,A,7,4,A,7,28.3,A,7,20.6,A,7,63,A,7,984,A,7,270,A,7,2.1,A,7,16100,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,20:00,47,848,14,1,13,2,1,9,14,1,13,16,1,13,0,1,9,16,1,13,50,1,21,7,A,7,6,A,7,26.1,A,7,21.1,A,7,74,A,7,984,A,7,230,A,7,2.1,A,7,16100,B,7,7620,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,25.6,A,7,21.1,A,7,77,A,7,984,A,7,220,A,7,2.6,A,7,11300,B,7,1220,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/23/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,986,A,7,40,A,7,2.6,A,7,6400,B,7,370,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,17,C,8 -06/23/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,15.0,A,7,73,A,7,986,A,7,180,A,7,3.1,A,7,11300,B,7,370,A,7,2.6,E,8,0.000,?,0,0.00,?,0,33,1,D,9,95,C,8 -06/23/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,985,A,7,240,A,7,3.6,A,7,11300,B,7,1220,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -06/24/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,985,A,7,250,A,7,3.1,A,7,11300,B,7,1220,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -06/24/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,984,A,7,320,A,7,2.1,A,7,11300,B,7,3050,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,20.6,A,7,20.0,A,7,97,A,7,984,A,7,330,A,7,2.1,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,20.6,A,7,20.0,A,7,97,A,7,984,A,7,310,A,7,2.6,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/24/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,20.0,A,7,20.0,A,7,100,A,7,983,A,7,320,A,7,2.1,A,7,4800,B,7,6100,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/24/1989,06:00,96,1201,20,1,13,5,1,9,19,1,13,22,1,13,0,1,9,22,1,13,68,1,21,10,A,7,8,A,7,20.6,A,7,20.0,A,7,97,A,7,984,A,7,320,A,7,1.5,A,7,4800,B,7,6100,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/24/1989,07:00,344,1322,140,1,13,65,1,9,123,1,13,153,1,13,58,1,9,138,1,13,299,1,21,8,A,7,6,A,7,22.2,A,7,20.6,A,7,90,A,7,985,A,7,10,A,7,2.6,A,7,6400,B,7,6100,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/24/1989,08:00,595,1322,319,1,13,356,1,9,158,1,13,343,1,13,362,1,9,180,1,13,334,1,21,6,A,7,5,A,7,23.9,A,7,21.7,A,7,87,A,7,985,A,7,360,A,7,2.6,A,7,6400,B,7,6100,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/24/1989,09:00,827,1322,491,1,13,419,1,9,228,1,13,518,1,13,431,1,9,249,1,13,563,1,21,6,A,7,3,A,7,26.1,A,7,22.8,A,7,82,A,7,985,A,7,360,A,7,3.1,A,7,8000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/24/1989,10:00,1024,1322,572,1,13,375,1,9,280,1,13,610,1,13,391,1,9,307,1,13,941,1,21,6,A,7,5,A,7,26.7,A,7,21.7,A,7,74,A,7,985,A,7,40,A,7,5.2,A,7,8000,B,7,7620,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/24/1989,11:00,1172,1322,566,1,13,249,1,9,345,1,13,626,1,13,271,1,9,386,1,13,1598,1,21,6,A,7,6,A,7,27.2,A,7,21.1,A,7,69,A,7,985,A,7,50,A,7,4.1,A,7,8000,B,7,670,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/24/1989,12:00,1262,1322,806,1,13,457,1,9,368,1,13,865,1,13,478,1,9,408,1,13,2870,1,21,5,A,7,5,A,7,27.8,A,7,21.1,A,7,67,A,7,985,A,7,60,A,7,3.6,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/24/1989,13:00,1286,1322,739,1,13,355,1,9,392,1,13,820,1,13,387,1,9,443,1,13,3149,1,21,5,A,7,5,A,7,28.9,A,7,20.0,A,7,59,A,7,985,A,7,40,A,7,3.1,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,14:00,1245,1322,774,1,13,469,1,9,332,1,13,839,1,13,491,1,9,375,1,13,2327,1,21,6,A,7,6,A,7,28.9,A,7,19.4,A,7,57,A,7,984,A,7,10,A,7,3.6,A,7,12900,B,7,1070,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,15:00,1139,1322,769,1,13,604,1,9,248,1,13,811,1,13,612,1,9,283,1,13,1092,1,21,4,A,7,4,A,7,30.6,A,7,19.4,A,7,52,A,7,984,A,7,360,A,7,3.6,A,7,14500,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,16:00,977,1322,664,1,13,610,1,9,212,1,13,695,1,13,615,1,9,239,1,13,632,1,21,3,A,7,3,A,7,29.4,A,7,19.4,A,7,55,A,7,983,A,7,60,A,7,3.6,A,7,14500,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,17:00,770,1322,486,1,9,591,1,9,142,1,13,511,1,9,592,1,9,166,1,13,328,1,18,0,A,7,0,A,7,30.6,A,7,19.4,A,7,52,A,7,983,A,7,20,A,7,3.6,A,7,14500,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,18:00,531,1322,301,1,9,487,1,9,105,1,13,324,1,9,469,1,9,136,1,13,201,1,18,0,A,7,0,A,7,29.4,A,7,20.0,A,7,57,A,7,983,A,7,40,A,7,2.6,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,19:00,278,1322,123,1,13,238,1,9,73,1,13,130,1,13,183,1,9,92,1,13,138,1,21,5,A,7,0,A,7,28.3,A,7,20.0,A,7,61,A,7,984,A,7,10,A,7,2.1,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,20:00,48,870,19,1,13,10,1,9,18,1,13,20,1,13,5,1,9,20,1,13,44,1,21,7,A,7,1,A,7,25.0,A,7,21.1,A,7,79,A,7,984,A,7,30,A,7,1.5,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,1,A,7,25.0,A,7,21.1,A,7,79,A,7,984,A,7,90,A,7,2.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,23.3,A,7,20.0,A,7,82,A,7,985,A,7,110,A,7,2.6,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,22.8,A,7,19.4,A,7,82,A,7,986,A,7,90,A,7,2.6,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/24/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,22.8,A,7,19.4,A,7,82,A,7,986,A,7,70,A,7,2.1,A,7,11300,B,7,7620,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,21.7,A,7,19.4,A,7,87,A,7,986,A,7,40,A,7,2.1,A,7,11300,B,7,7620,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,5,A,7,21.1,A,7,20.0,A,7,93,A,7,986,A,7,360,A,7,2.1,A,7,9700,B,7,7620,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/25/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,6,A,7,20.6,A,7,19.4,A,7,93,A,7,985,A,7,10,A,7,2.1,A,7,9700,B,7,7620,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/25/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,30,A,7,2.6,A,7,8000,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/25/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,70,A,7,2.6,A,7,3200,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/25/1989,06:00,95,1201,39,1,13,151,1,9,24,1,13,39,1,13,70,1,9,33,1,13,42,1,21,2,A,7,0,A,7,20.6,A,7,19.4,A,7,93,A,7,986,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/25/1989,07:00,343,1322,186,1,9,515,1,9,52,1,13,194,1,9,438,1,9,81,1,13,99,1,18,1,A,7,0,A,7,22.2,A,7,20.0,A,7,87,A,7,987,A,7,20,A,7,2.6,A,7,2400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/25/1989,08:00,594,1322,386,1,9,685,1,9,76,1,13,402,1,9,663,1,9,104,1,13,160,1,18,1,A,7,0,A,7,23.9,A,7,20.0,A,7,79,A,7,987,A,7,60,A,7,2.6,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/25/1989,09:00,826,1322,584,1,9,767,1,9,103,1,13,617,1,9,768,1,9,136,1,13,251,1,18,2,A,7,0,A,7,25.6,A,7,19.4,A,7,69,A,7,987,A,7,70,A,7,2.6,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/25/1989,10:00,1023,1322,762,1,9,826,1,9,120,1,13,816,1,9,838,1,9,166,1,13,391,1,18,2,A,7,0,A,7,27.2,A,7,20.0,A,7,65,A,7,987,A,7,30,A,7,2.1,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,11:00,1171,1322,747,1,13,600,1,9,213,1,13,798,1,13,614,1,9,252,1,13,1062,1,21,4,A,7,4,A,7,28.3,A,7,20.0,A,7,61,A,7,987,A,7,180,A,7,2.1,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,12:00,1261,1322,929,1,13,743,1,9,218,1,13,1001,1,13,763,1,9,271,1,13,1662,1,21,4,A,7,4,A,7,29.4,A,7,20.0,A,7,57,A,7,986,A,7,10,A,7,2.6,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,13:00,1286,1322,890,1,13,623,1,9,283,1,13,944,1,13,632,1,9,328,1,13,2573,1,21,5,A,7,5,A,7,29.4,A,7,19.4,A,7,55,A,7,986,A,7,10,A,7,2.1,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,14:00,1245,1322,709,1,13,412,1,9,320,1,13,770,1,13,432,1,9,363,1,13,2242,1,21,7,A,7,7,A,7,30.6,A,7,19.4,A,7,52,A,7,985,A,7,70,A,7,3.6,A,7,11300,B,7,1070,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,15:00,1139,1322,831,1,9,822,1,9,121,1,13,856,1,9,823,1,9,144,1,13,435,1,18,2,A,7,2,A,7,30.0,A,7,19.4,A,7,53,A,7,985,A,7,60,A,7,2.1,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,16:00,977,1322,743,1,9,829,1,9,129,1,13,786,1,9,836,1,9,167,1,13,375,1,18,2,A,7,2,A,7,30.6,A,7,18.3,A,7,48,A,7,985,A,7,50,A,7,3.1,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,17:00,770,1322,539,1,9,745,1,9,105,1,13,565,1,9,740,1,9,133,1,13,236,1,18,2,A,7,2,A,7,30.6,A,7,19.4,A,7,52,A,7,984,A,7,90,A,7,3.1,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,18:00,532,1322,303,1,9,537,1,9,87,1,13,318,1,9,512,1,9,112,1,13,174,1,18,4,A,7,1,A,7,28.9,A,7,21.1,A,7,63,A,7,984,A,7,160,A,7,3.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,19:00,279,1322,116,1,13,177,1,9,79,1,13,123,1,13,136,1,9,94,1,13,152,1,21,10,A,7,3,A,7,27.2,A,7,21.1,A,7,69,A,7,984,A,7,170,A,7,2.6,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,20:00,48,870,22,1,13,7,1,9,21,1,13,23,1,13,4,1,9,23,1,13,49,1,21,10,A,7,4,A,7,25.6,A,7,21.1,A,7,77,A,7,985,A,7,180,A,7,2.6,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,25.0,A,7,21.7,A,7,82,A,7,985,A,7,180,A,7,2.1,A,7,11300,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,24.4,A,7,21.7,A,7,85,A,7,985,A,7,200,A,7,2.1,A,7,11300,B,7,7620,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,23.3,A,7,21.7,A,7,90,A,7,985,A,7,200,A,7,2.1,A,7,11300,B,7,7620,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/25/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,22.8,A,7,21.1,A,7,90,A,7,985,A,7,210,A,7,2.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/26/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,22.8,A,7,20.6,A,7,87,A,7,985,A,7,260,A,7,2.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/26/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,22.2,A,7,20.6,A,7,90,A,7,985,A,7,250,A,7,2.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/26/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,22.2,A,7,20.6,A,7,90,A,7,984,A,7,260,A,7,2.1,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/26/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,21.7,A,7,20.6,A,7,93,A,7,984,A,7,230,A,7,2.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/26/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,21.1,A,7,20.0,A,7,93,A,7,984,A,7,220,A,7,3.1,A,7,8000,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/26/1989,06:00,93,1201,34,1,13,75,1,9,27,1,13,35,1,13,31,1,9,33,1,13,48,1,21,2,A,7,0,A,7,21.7,A,7,20.6,A,7,93,A,7,985,A,7,280,A,7,1.5,A,7,8000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,07:00,342,1322,173,1,9,408,1,9,66,1,13,176,1,9,342,1,9,88,1,13,121,1,18,1,A,7,0,A,7,23.3,A,7,21.1,A,7,87,A,7,985,A,7,250,A,7,2.6,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,08:00,593,1322,374,1,9,613,1,9,98,1,13,392,1,9,596,1,9,124,1,13,202,1,18,0,A,7,0,A,7,25.6,A,7,21.7,A,7,79,A,7,984,A,7,300,A,7,3.1,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,09:00,825,1322,574,1,9,715,1,9,126,1,13,611,1,9,726,1,9,158,1,13,316,1,18,0,A,7,0,A,7,27.2,A,7,21.1,A,7,69,A,7,984,A,7,280,A,7,3.6,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,10:00,1022,1322,745,1,9,772,1,9,146,1,13,781,1,9,777,1,9,180,1,13,450,1,18,0,A,7,0,A,7,28.9,A,7,21.7,A,7,65,A,7,984,A,7,340,A,7,2.1,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,11:00,1171,1322,883,1,9,814,1,9,160,1,13,936,1,9,823,1,9,205,1,13,748,1,18,0,A,7,0,A,7,30.0,A,7,21.7,A,7,61,A,7,984,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,12:00,1261,1322,929,1,9,775,1,9,188,1,13,979,1,9,781,1,9,232,1,13,1338,1,18,1,A,7,1,A,7,30.6,A,7,21.1,A,7,57,A,7,984,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,13:00,1286,1322,923,1,9,776,1,9,166,1,13,988,1,9,787,1,9,221,1,13,1456,1,18,1,A,7,1,A,7,31.7,A,7,21.1,A,7,54,A,7,984,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,14:00,1244,1322,423,1,9,50,1,9,377,1,13,470,1,9,51,1,9,421,1,13,2093,1,18,8,A,7,8,A,7,31.1,A,7,20.6,A,7,53,A,7,983,A,7,40,A,7,1.5,A,7,6400,B,7,1340,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,15:00,1139,1322,715,1,13,536,1,9,253,1,13,754,1,13,543,1,9,285,1,13,1114,1,21,6,A,7,6,A,7,31.7,A,7,20.6,A,7,52,A,7,983,A,7,10,A,7,2.1,A,7,6400,B,7,1370,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,16:00,978,1322,681,1,13,662,1,9,191,1,13,719,1,13,672,1,9,222,1,13,578,1,21,3,A,7,3,A,7,31.7,A,7,20.6,A,7,52,A,7,982,A,7,180,A,7,2.1,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,17:00,771,1322,481,1,9,568,1,9,149,1,13,503,1,9,567,1,9,172,1,13,342,1,18,2,A,7,2,A,7,31.7,A,7,20.6,A,7,52,A,7,982,A,7,220,A,7,2.6,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,18:00,532,1322,287,1,13,340,1,9,151,1,13,308,1,13,337,1,9,172,1,13,315,1,21,5,A,7,5,A,7,30.0,A,7,21.7,A,7,61,A,7,982,A,7,270,A,7,2.6,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,19:00,279,1322,84,1,13,43,1,9,75,1,13,92,1,13,36,1,9,85,1,13,190,1,21,5,A,7,5,A,7,28.3,A,7,22.2,A,7,70,A,7,982,A,7,230,A,7,2.1,A,7,4000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,20:00,48,870,17,1,13,14,1,9,15,1,13,17,1,13,8,1,9,17,1,13,37,1,21,4,A,7,4,A,7,27.8,A,7,21.7,A,7,69,A,7,982,A,7,270,A,7,2.6,A,7,4000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,26.7,A,7,21.7,A,7,74,A,7,983,A,7,270,A,7,2.6,A,7,4000,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,26.1,A,7,21.7,A,7,77,A,7,983,A,7,220,A,7,2.1,A,7,4000,B,7,2290,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,25.0,A,7,22.2,A,7,85,A,7,984,A,7,210,A,7,2.1,A,7,4000,B,7,2290,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/26/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,24.4,A,7,22.2,A,7,88,A,7,983,A,7,260,A,7,3.1,A,7,4000,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,25.0,A,7,21.7,A,7,82,A,7,983,A,7,250,A,7,3.6,A,7,4000,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,24.4,A,7,21.7,A,7,85,A,7,983,A,7,250,A,7,2.6,A,7,4000,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,23.3,A,7,21.7,A,7,90,A,7,982,A,7,230,A,7,2.6,A,7,4000,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,22.8,A,7,21.7,A,7,94,A,7,982,A,7,220,A,7,2.6,A,7,4000,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,22.2,A,7,21.7,A,7,97,A,7,982,A,7,260,A,7,1.5,A,7,3200,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,06:00,92,1179,23,1,13,9,1,9,22,1,13,25,1,13,5,1,9,25,1,13,54,1,21,2,A,7,2,A,7,22.2,A,7,21.7,A,7,97,A,7,983,A,7,240,A,7,2.1,A,7,3200,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,07:00,340,1322,149,1,9,219,1,9,92,1,13,157,1,9,186,1,9,110,1,13,178,1,18,2,A,7,0,A,7,23.9,A,7,22.2,A,7,90,A,7,983,A,7,240,A,7,2.1,A,7,2400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,08:00,591,1322,337,1,9,419,1,9,148,1,13,354,1,9,412,1,9,170,1,13,299,1,18,1,A,7,0,A,7,26.1,A,7,22.8,A,7,82,A,7,983,A,7,280,A,7,1.5,A,7,2400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,09:00,824,1322,540,1,9,551,1,9,195,1,13,579,1,9,567,1,9,224,1,13,473,1,18,0,A,7,0,A,7,28.9,A,7,22.2,A,7,67,A,7,983,A,7,120,A,7,2.1,A,7,4000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,10:00,1021,1322,715,1,9,625,1,9,230,1,13,747,1,9,630,1,9,259,1,13,745,1,18,0,A,7,0,A,7,30.0,A,7,22.8,A,7,65,A,7,983,A,7,170,A,7,2.1,A,7,4000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,11:00,1170,1322,855,1,9,676,1,9,255,1,13,902,1,9,686,1,9,294,1,13,1248,1,18,0,A,7,0,A,7,30.6,A,7,22.8,A,7,63,A,7,983,A,7,240,A,7,2.6,A,7,4000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,12:00,1260,1322,832,1,9,538,1,9,317,1,13,906,1,9,564,1,9,367,1,13,2443,1,18,2,A,7,2,A,7,31.1,A,7,22.8,A,7,61,A,7,983,A,7,210,A,7,4.1,A,7,4800,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,13:00,1286,1322,936,1,13,605,1,9,345,1,13,1014,1,13,634,1,9,396,1,13,3224,1,21,3,A,7,3,A,7,31.7,A,7,22.8,A,7,59,A,7,983,A,7,270,A,7,3.1,A,7,4800,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,14:00,1244,1322,825,1,13,533,1,9,322,1,13,896,1,13,558,1,9,369,1,13,2258,1,21,3,A,7,3,A,7,31.7,A,7,22.8,A,7,59,A,7,982,A,7,270,A,7,3.6,A,7,4800,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,15:00,1140,1322,804,1,9,625,1,9,264,1,13,844,1,9,631,1,9,299,1,13,1158,1,18,1,A,7,1,A,7,31.7,A,7,21.7,A,7,55,A,7,982,A,7,240,A,7,5.2,A,7,6400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,16:00,978,1322,596,1,13,428,1,9,279,1,13,633,1,13,445,1,9,303,1,13,860,1,21,3,A,7,3,A,7,31.1,A,7,21.1,A,7,55,A,7,982,A,7,240,A,7,5.2,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,17:00,771,1322,260,1,9,60,1,9,225,1,13,286,1,9,60,1,9,251,1,13,734,1,18,10,A,7,9,A,7,29.4,A,7,21.1,A,7,61,A,7,982,A,7,240,A,7,3.6,A,7,8000,B,7,7620,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,18:00,532,1322,137,1,9,4,1,9,135,1,13,156,1,9,3,1,9,155,1,13,535,1,18,10,A,7,10,A,7,29.4,A,7,22.2,A,7,65,A,7,982,A,7,240,A,7,2.6,A,7,8000,B,7,7620,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,19:00,279,1322,81,1,13,45,1,9,72,1,13,89,1,13,37,1,9,81,1,13,184,1,21,10,A,7,5,A,7,28.3,A,7,21.7,A,7,67,A,7,982,A,7,230,A,7,3.1,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,20:00,48,870,12,1,13,1,1,9,11,1,13,13,1,13,0,1,9,13,1,13,41,1,21,10,A,7,4,A,7,26.7,A,7,22.2,A,7,77,A,7,982,A,7,230,A,7,2.6,A,7,9700,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,25.6,A,7,22.2,A,7,82,A,7,982,A,7,210,A,7,2.1,A,7,9700,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,25.0,A,7,21.7,A,7,82,A,7,983,A,7,220,A,7,2.1,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,23.9,A,7,21.7,A,7,87,A,7,983,A,7,220,A,7,2.6,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/27/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,23.3,A,7,21.1,A,7,87,A,7,983,A,7,230,A,7,2.6,A,7,9700,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,23.3,A,7,21.1,A,7,87,A,7,983,A,7,220,A,7,3.1,A,7,9700,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,23.3,A,7,21.7,A,7,90,A,7,983,A,7,240,A,7,2.6,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.8,A,7,21.1,A,7,90,A,7,983,A,7,220,A,7,2.6,A,7,9700,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.8,A,7,21.1,A,7,90,A,7,983,A,7,230,A,7,1.5,A,7,9700,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.2,A,7,21.1,A,7,94,A,7,983,A,7,220,A,7,2.6,A,7,8000,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,06:00,91,1178,22,1,13,6,1,9,21,1,13,24,1,13,0,1,9,24,1,13,74,1,21,5,A,7,5,A,7,22.8,A,7,21.1,A,7,90,A,7,983,A,7,230,A,7,3.6,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,07:00,339,1322,143,1,9,207,1,9,90,1,13,152,1,9,175,1,9,107,1,13,174,1,18,1,A,7,0,A,7,23.9,A,7,21.7,A,7,87,A,7,983,A,7,240,A,7,2.6,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,08:00,590,1322,337,1,9,423,1,9,147,1,13,355,1,9,415,1,9,169,1,13,296,1,18,0,A,7,0,A,7,25.6,A,7,22.2,A,7,82,A,7,984,A,7,250,A,7,3.1,A,7,4800,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,09:00,823,1322,539,1,9,548,1,9,196,1,13,577,1,9,564,1,9,225,1,13,475,1,18,0,A,7,0,A,7,27.2,A,7,22.2,A,7,74,A,7,984,A,7,240,A,7,3.1,A,7,4800,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,10:00,1020,1322,720,1,9,615,1,9,244,1,13,750,1,9,618,1,9,272,1,13,782,1,18,2,A,7,0,A,7,28.9,A,7,22.2,A,7,67,A,7,984,A,7,230,A,7,3.1,A,7,6400,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,11:00,1169,1322,852,1,9,657,1,9,270,1,13,896,1,9,664,1,9,308,1,13,1312,1,18,2,A,7,0,A,7,29.4,A,7,22.8,A,7,67,A,7,984,A,7,210,A,7,2.6,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,12:00,1260,1322,725,1,9,347,1,9,394,1,13,803,1,9,378,1,9,442,1,13,2653,1,18,8,A,7,8,A,7,30.6,A,7,22.2,A,7,61,A,7,984,A,7,260,A,7,3.6,A,7,6400,B,7,7620,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,13:00,1285,1322,773,1,9,298,1,9,482,1,13,844,1,9,324,1,9,529,1,13,3904,1,18,10,A,7,8,A,7,30.0,A,7,22.2,A,7,63,A,7,983,A,7,260,A,7,3.6,A,7,4800,B,7,7620,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,14:00,1244,1322,182,1,9,9,1,9,173,1,13,228,1,9,7,1,9,222,1,13,899,1,18,10,A,7,10,A,7,30.6,A,7,21.1,A,7,57,A,7,983,A,7,360,A,7,2.6,A,7,4800,B,7,1070,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,15:00,1140,1322,519,1,9,153,1,9,387,1,13,573,1,9,163,1,9,432,1,13,1624,1,18,9,A,7,8,A,7,27.2,A,7,20.0,A,7,65,A,7,983,A,7,360,A,7,4.6,A,7,6400,B,7,1220,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,16:00,978,1322,534,1,13,289,1,9,320,1,13,580,1,13,312,1,9,348,1,13,988,1,21,8,A,7,7,A,7,28.9,A,7,19.4,A,7,57,A,7,983,A,7,30,A,7,3.1,A,7,8000,B,7,1370,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,17:00,771,1322,325,1,9,168,1,9,227,1,13,358,1,9,176,1,9,255,1,13,604,1,18,8,A,7,8,A,7,28.3,A,7,20.6,A,7,63,A,7,983,A,7,360,A,7,2.1,A,7,8000,B,7,3050,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,18:00,533,1322,128,1,9,30,1,9,116,1,13,141,1,9,29,1,9,130,1,13,347,1,18,9,A,7,9,A,7,27.2,A,7,21.1,A,7,69,A,7,983,A,7,70,A,7,3.1,A,7,8000,B,7,2740,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,19:00,280,1322,68,1,13,25,1,9,62,1,13,74,1,13,21,1,9,70,1,13,163,1,21,10,A,7,10,A,7,25.6,A,7,21.1,A,7,77,A,7,984,A,7,130,A,7,2.1,A,7,8000,B,7,2740,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,20:00,49,870,7,1,13,0,1,9,7,1,13,9,1,13,0,1,9,9,1,13,27,1,21,10,A,7,10,A,7,24.4,A,7,22.8,A,7,91,A,7,984,A,7,240,A,7,2.1,A,7,8000,B,7,3050,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/28/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,22.8,A,7,94,A,7,985,A,7,200,A,7,2.6,A,7,8000,B,7,3050,A,7,4.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/28/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,22.8,A,7,97,A,7,985,A,7,200,A,7,2.1,A,7,8000,B,7,3050,A,7,4.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/28/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,22.2,A,7,94,A,7,985,A,7,220,A,7,2.1,A,7,8000,B,7,3050,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/28/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,21.7,A,7,90,A,7,985,A,7,250,A,7,2.6,A,7,9700,B,7,3660,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/29/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,21.7,A,7,94,A,7,985,A,7,260,A,7,2.6,A,7,8000,B,7,3660,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/29/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,22.2,A,7,97,A,7,985,A,7,260,A,7,2.1,A,7,6400,B,7,3350,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -06/29/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,21.7,A,7,94,A,7,984,A,7,300,A,7,3.1,A,7,6400,B,7,2740,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/29/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,20.6,A,7,87,A,7,984,A,7,350,A,7,2.1,A,7,8000,B,7,3660,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/29/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,20.6,A,7,90,A,7,985,A,7,350,A,7,2.6,A,7,6400,B,7,3660,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -06/29/1989,06:00,90,1156,17,1,13,1,1,9,17,1,13,20,1,13,0,1,9,20,1,13,62,1,21,10,A,7,10,A,7,22.2,A,7,20.0,A,7,87,A,7,986,A,7,10,A,7,2.6,A,7,6400,B,7,3960,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/29/1989,07:00,337,1322,87,1,13,59,1,9,71,1,13,96,1,13,51,1,9,82,1,13,156,1,21,8,A,7,8,A,7,22.8,A,7,19.4,A,7,82,A,7,987,A,7,40,A,7,3.1,A,7,6400,B,7,3960,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -06/29/1989,08:00,589,1322,220,1,13,154,1,9,151,1,13,243,1,13,156,1,9,173,1,13,363,1,21,10,A,7,6,A,7,24.4,A,7,18.3,A,7,69,A,7,987,A,7,50,A,7,4.6,A,7,6400,B,7,3960,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/29/1989,09:00,821,1322,343,1,13,120,1,9,268,1,13,375,1,13,126,1,9,297,1,13,740,1,21,10,A,7,6,A,7,24.4,A,7,16.7,A,7,62,A,7,988,A,7,60,A,7,4.6,A,7,8000,B,7,3960,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/29/1989,10:00,1019,1322,627,1,13,423,1,9,300,1,13,664,1,13,440,1,9,324,1,13,1004,1,21,10,A,7,5,A,7,25.6,A,7,17.2,A,7,60,A,7,988,A,7,80,A,7,4.1,A,7,8000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/29/1989,11:00,1168,1322,779,1,13,593,1,9,254,1,13,823,1,13,601,1,9,290,1,13,1237,1,21,7,A,7,3,A,7,26.1,A,7,17.2,A,7,58,A,7,989,A,7,80,A,7,4.6,A,7,9700,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/29/1989,12:00,1259,1322,751,1,13,463,1,9,309,1,13,821,1,13,485,1,9,357,1,13,2366,1,21,7,A,7,3,A,7,26.7,A,7,17.2,A,7,56,A,7,989,A,7,50,A,7,2.6,A,7,9700,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/29/1989,13:00,1285,1322,882,1,13,657,1,9,242,1,13,946,1,13,672,1,9,291,1,13,2200,1,21,7,A,7,3,A,7,27.2,A,7,16.1,A,7,51,A,7,989,A,7,70,A,7,5.7,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -06/29/1989,14:00,1244,1322,770,1,13,560,1,9,242,1,13,823,1,13,572,1,9,283,1,13,1662,1,21,6,A,7,3,A,7,28.3,A,7,16.7,A,7,49,A,7,988,A,7,70,A,7,3.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,15:00,1140,1322,738,1,13,539,1,9,272,1,13,804,1,13,564,1,9,316,1,13,1226,1,21,7,A,7,3,A,7,28.3,A,7,16.7,A,7,49,A,7,988,A,7,40,A,7,2.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,16:00,978,1322,638,1,13,605,1,9,189,1,13,674,1,13,614,1,9,218,1,13,574,1,21,7,A,7,3,A,7,28.3,A,7,16.1,A,7,48,A,7,987,A,7,40,A,7,3.1,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,17:00,771,1322,511,1,9,646,1,9,134,1,13,540,1,9,649,1,9,160,1,13,313,1,18,6,A,7,2,A,7,27.2,A,7,16.1,A,7,51,A,7,987,A,7,80,A,7,2.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,18:00,533,1322,211,1,13,138,1,9,155,1,13,230,1,13,136,1,9,175,1,13,364,1,21,8,A,7,5,A,7,26.7,A,7,17.2,A,7,56,A,7,988,A,7,90,A,7,2.6,A,7,11300,B,7,7620,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,19:00,280,1322,115,1,13,216,1,9,70,1,13,123,1,13,167,1,9,88,1,13,131,1,21,10,A,7,5,A,7,25.0,A,7,17.2,A,7,62,A,7,988,A,7,70,A,7,2.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,20:00,49,870,23,1,13,31,1,9,20,1,13,24,1,13,13,1,9,23,1,13,41,1,21,10,A,7,3,A,7,23.9,A,7,16.7,A,7,64,A,7,989,A,7,90,A,7,2.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,22.2,A,7,17.8,A,7,76,A,7,989,A,7,40,A,7,1.5,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,21.7,A,7,17.2,A,7,76,A,7,990,A,7,120,A,7,2.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,21.7,A,7,17.2,A,7,76,A,7,991,A,7,70,A,7,2.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/29/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,20.6,A,7,17.8,A,7,84,A,7,991,A,7,70,A,7,3.1,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,20.0,A,7,17.2,A,7,84,A,7,991,A,7,70,A,7,2.6,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.9,A,7,16.1,A,7,84,A,7,991,A,7,60,A,7,3.1,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,15.0,A,7,84,A,7,991,A,7,60,A,7,2.6,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,14.4,A,7,81,A,7,991,A,7,50,A,7,4.1,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,16.7,A,7,14.4,A,7,87,A,7,991,A,7,30,A,7,3.6,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,06:00,88,1156,26,1,13,48,1,9,21,1,13,27,1,13,20,1,9,25,1,13,36,1,21,1,A,7,1,A,7,17.2,A,7,13.9,A,7,81,A,7,992,A,7,50,A,7,4.1,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,07:00,336,1321,125,1,13,46,1,9,113,1,13,136,1,13,40,1,9,126,1,13,279,1,21,8,A,7,8,A,7,18.9,A,7,15.0,A,7,78,A,7,992,A,7,40,A,7,2.6,A,7,16100,B,7,1520,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,08:00,587,1321,366,1,9,566,1,9,114,1,13,380,1,9,545,1,9,137,1,13,228,1,18,2,A,7,0,A,7,19.4,A,7,14.4,A,7,73,A,7,992,A,7,80,A,7,3.1,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,09:00,820,1321,571,1,9,687,1,9,142,1,13,602,1,9,694,1,9,170,1,13,349,1,18,1,A,7,0,A,7,21.7,A,7,14.4,A,7,64,A,7,992,A,7,50,A,7,3.6,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,10:00,1018,1321,744,1,9,752,1,9,162,1,13,797,1,9,771,1,9,201,1,13,541,1,18,0,A,7,0,A,7,22.8,A,7,13.3,A,7,55,A,7,992,A,7,30,A,7,4.1,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,11:00,1168,1321,885,1,9,798,1,9,178,1,13,927,1,9,802,1,9,216,1,13,805,1,18,0,A,7,0,A,7,23.3,A,7,13.9,A,7,56,A,7,992,A,7,100,A,7,2.6,A,7,19300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,12:00,1259,1321,970,1,9,820,1,9,187,1,13,1022,1,9,826,1,9,234,1,13,1315,1,18,0,A,7,0,A,7,25.0,A,7,14.4,A,7,52,A,7,991,A,7,40,A,7,3.6,A,7,19300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,13:00,1285,1321,961,1,9,730,1,9,250,1,13,1028,1,9,746,1,9,302,1,13,2264,1,18,2,A,7,2,A,7,25.0,A,7,15.0,A,7,54,A,7,991,A,7,50,A,7,2.1,A,7,19300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,14:00,1244,1321,938,1,13,736,1,9,243,1,13,1001,1,13,751,1,9,292,1,13,1667,1,21,4,A,7,4,A,7,26.7,A,7,15.6,A,7,51,A,7,991,A,7,110,A,7,2.6,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,15:00,1140,1321,802,1,13,659,1,9,232,1,13,849,1,13,670,1,9,270,1,13,1031,1,21,4,A,7,4,A,7,26.7,A,7,15.6,A,7,51,A,7,991,A,7,60,A,7,3.6,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,16:00,978,1321,625,1,13,555,1,9,213,1,13,654,1,13,560,1,9,239,1,13,637,1,21,4,A,7,4,A,7,26.7,A,7,15.6,A,7,51,A,7,990,A,7,40,A,7,3.1,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,17:00,772,1321,492,1,13,497,1,9,202,1,13,522,1,13,508,1,9,225,1,13,468,1,21,3,A,7,3,A,7,26.1,A,7,14.4,A,7,49,A,7,990,A,7,70,A,7,4.1,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,18:00,533,1321,302,1,9,519,1,9,92,1,13,315,1,9,494,1,9,116,1,13,183,1,18,1,A,7,1,A,7,26.7,A,7,14.4,A,7,47,A,7,989,A,7,80,A,7,3.6,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,19:00,280,1321,125,1,13,307,1,9,60,1,13,132,1,13,237,1,9,82,1,13,108,1,21,0,A,7,0,A,7,24.4,A,7,15.0,A,7,56,A,7,989,A,7,70,A,7,3.1,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,20:00,48,870,16,1,13,20,1,9,14,1,13,17,1,13,9,1,9,17,1,13,29,1,21,1,A,7,1,A,7,23.3,A,7,15.0,A,7,60,A,7,990,A,7,70,A,7,2.6,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,21.7,A,7,15.6,A,7,68,A,7,990,A,7,80,A,7,2.6,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,21.0,A,7,15.6,A,7,71,A,7,990,A,7,90,A,7,2.6,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,20.3,A,7,15.6,A,7,78,A,7,990,A,7,80,A,7,2.6,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -06/30/1989,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,19.6,A,7,15.6,A,7,84,A,7,990,A,7,0,A,7,2.6,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/01/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,18.8,A,7,15.6,A,7,90,A,7,986,A,7,320,A,7,2.6,A,7,6400,B,7,7620,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -07/01/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,18.1,A,7,15.6,A,7,90,A,7,986,A,7,20,A,7,2.6,A,7,6400,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/01/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,17.4,A,7,15.6,A,7,93,A,7,986,A,7,30,A,7,2.6,A,7,4800,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/01/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,15.6,A,7,93,A,7,986,A,7,340,A,7,2.6,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/01/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,17.2,A,7,15.6,A,7,90,A,7,987,A,7,70,A,7,2.1,A,7,3200,B,7,3050,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/01/1981,06:00,87,1156,27,1,13,5,1,9,27,1,13,31,1,13,0,1,9,31,1,13,88,1,21,9,A,7,7,A,7,16.7,A,7,15.0,A,7,90,A,7,987,A,7,60,A,7,2.1,A,7,3200,B,7,3050,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/01/1981,07:00,334,1321,132,1,13,151,1,9,93,1,13,143,1,13,130,1,9,110,1,13,204,1,21,9,A,7,8,A,7,17.2,A,7,15.6,A,7,90,A,7,987,A,7,80,A,7,1.5,A,7,6400,B,7,3050,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/01/1981,08:00,586,1321,176,1,9,62,1,9,148,1,13,193,1,9,60,1,9,166,1,13,445,1,18,9,A,7,9,A,7,20.0,A,7,15.6,A,7,76,A,7,987,A,7,80,A,7,3.6,A,7,6400,B,7,3050,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/01/1981,09:00,819,1321,292,1,9,106,1,9,226,1,13,323,1,9,112,1,9,254,1,13,622,1,18,10,A,7,9,A,7,23.3,A,7,14.4,A,7,58,A,7,987,A,7,70,A,7,2.6,A,7,11300,B,7,3050,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/01/1981,10:00,1017,1321,343,1,9,28,1,9,321,1,13,378,1,9,29,1,9,356,1,13,1247,1,18,10,A,7,10,A,7,24.4,A,7,16.1,A,7,60,A,7,987,A,7,80,A,7,3.6,A,7,11300,B,7,3050,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/01/1981,11:00,1167,1321,758,1,13,532,1,9,286,1,13,823,1,13,557,1,9,330,1,13,1417,1,21,7,A,7,6,A,7,26.7,A,7,15.6,A,7,51,A,7,987,A,7,80,A,7,4.1,A,7,11300,B,7,3050,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/01/1981,12:00,1258,1321,448,1,13,113,1,9,340,1,13,503,1,13,121,1,9,387,1,13,2100,1,21,8,A,7,7,A,7,27.8,A,7,15.0,A,7,46,A,7,987,A,7,290,A,7,2.1,A,7,11300,B,7,1220,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -07/01/1981,13:00,1284,1321,831,1,13,536,1,9,308,1,13,910,1,13,562,1,9,363,1,13,2844,1,21,9,A,7,7,A,7,28.3,A,7,15.6,A,7,46,A,7,987,A,7,80,A,7,4.1,A,7,11300,B,7,1370,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -07/01/1981,14:00,1244,1321,458,1,9,111,1,9,353,1,13,512,1,9,119,1,9,400,1,13,2042,1,18,9,A,7,8,A,7,27.8,A,7,13.3,A,7,41,A,7,986,A,7,0,A,7,0.0,A,7,11300,B,7,1370,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/01/1981,15:00,1140,1321,555,1,9,291,1,9,303,1,13,617,1,9,317,1,9,343,1,13,1264,1,18,10,A,7,8,A,7,27.8,A,7,13.3,A,7,41,A,7,986,A,7,60,A,7,4.1,A,7,11300,B,7,1370,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/01/1981,16:00,978,1321,406,1,9,147,1,9,297,1,13,449,1,9,157,1,9,333,1,13,955,1,18,9,A,7,8,A,7,27.2,A,7,16.7,A,7,53,A,7,986,A,7,60,A,7,4.6,A,7,11300,B,7,1370,A,7,2.9,E,8,0.000,F,8,0.00,?,0,58,1,D,9,00,C,8 -07/01/1981,17:00,772,1321,102,1,9,4,1,9,100,1,13,125,1,9,3,1,9,124,1,13,491,1,18,10,A,7,10,A,7,19.4,A,7,15.6,A,7,78,A,7,987,A,7,90,A,7,7.7,A,7,2400,B,7,910,A,7,2.7,E,8,0.000,F,8,0.00,?,0,36,1,D,9,81,C,8 -07/01/1981,18:00,533,1321,83,1,9,8,1,9,80,1,13,99,1,9,5,1,9,97,1,13,353,1,18,10,A,7,10,A,7,20.0,A,7,17.2,A,7,84,A,7,987,A,7,80,A,7,3.6,A,7,8000,B,7,3660,A,7,3.0,E,8,0.000,F,8,0.00,?,0,3,1,D,9,80,C,8 -07/01/1981,19:00,280,1321,46,1,13,2,1,9,46,1,13,54,1,13,1,1,9,54,1,13,179,1,21,10,A,7,10,A,7,19.4,A,7,17.2,A,7,87,A,7,988,A,7,50,A,7,1.5,A,7,8000,B,7,6100,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/01/1981,20:00,48,870,12,1,13,0,1,9,12,1,13,14,1,13,0,1,9,14,1,13,44,1,21,10,A,7,10,A,7,18.3,A,7,16.7,A,7,90,A,7,989,A,7,80,A,7,3.6,A,7,8000,B,7,1070,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/01/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,16.7,A,7,90,A,7,989,A,7,70,A,7,3.6,A,7,8000,B,7,1070,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/01/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,16.7,A,7,93,A,7,990,A,7,60,A,7,2.6,A,7,8000,B,7,1520,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/01/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,16.7,A,7,93,A,7,990,A,7,60,A,7,2.1,A,7,4800,B,7,1220,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/01/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,17.8,A,7,16.7,A,7,93,A,7,989,A,7,70,A,7,2.1,A,7,4800,B,7,3660,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,17.2,A,7,16.7,A,7,97,A,7,989,A,7,80,A,7,2.6,A,7,3200,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -07/02/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,17.8,A,7,16.7,A,7,93,A,7,990,A,7,70,A,7,2.1,A,7,3200,B,7,1980,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,17.8,A,7,16.7,A,7,93,A,7,990,A,7,60,A,7,2.1,A,7,3200,B,7,1070,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,16.7,A,7,93,A,7,990,A,7,80,A,7,2.6,A,7,3200,B,7,1070,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,16.7,A,7,97,A,7,990,A,7,80,A,7,2.6,A,7,1600,B,7,1070,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,06:00,86,1134,21,1,13,1,1,9,21,1,13,24,1,13,0,1,9,24,1,13,73,1,21,10,A,7,10,A,7,17.2,A,7,16.1,A,7,93,A,7,990,A,7,80,A,7,3.1,A,7,2400,B,7,3050,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,07:00,333,1321,84,1,13,0,1,9,84,1,13,95,1,13,0,1,9,95,1,13,303,1,21,10,A,7,10,A,7,17.8,A,7,16.7,A,7,93,A,7,990,A,7,80,A,7,3.1,A,7,3200,B,7,580,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -07/02/1981,08:00,584,1321,152,1,9,5,1,9,150,1,13,174,1,9,4,1,9,173,1,13,606,1,18,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,991,A,7,70,A,7,2.1,A,7,3200,B,7,610,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,09:00,818,1321,263,1,9,1,1,9,262,1,13,301,1,9,1,1,9,300,1,13,1084,1,18,10,A,7,10,A,7,20.0,A,7,18.3,A,7,90,A,7,991,A,7,70,A,7,2.6,A,7,6400,B,7,3050,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,10:00,1016,1321,337,1,9,1,1,9,337,1,13,392,1,9,1,1,9,391,1,13,1454,1,18,10,A,7,10,A,7,21.1,A,7,17.8,A,7,81,A,7,991,A,7,50,A,7,3.6,A,7,11300,B,7,240,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/02/1981,11:00,1166,1321,241,1,9,1,1,9,240,1,13,293,1,9,1,1,9,292,1,13,1176,1,18,10,A,7,10,A,7,21.7,A,7,18.3,A,7,81,A,7,991,A,7,80,A,7,4.1,A,7,11300,B,7,550,A,7,3.2,E,8,0.000,F,8,0.00,?,0,58,1,D,9,80,C,8 -07/02/1981,12:00,1257,1321,447,1,9,1,1,9,447,1,13,526,1,9,1,1,9,525,1,13,1895,1,18,10,A,7,10,A,7,22.2,A,7,20.0,A,7,87,A,7,991,A,7,110,A,7,4.1,A,7,11300,B,7,460,A,7,3.5,E,8,0.000,F,8,0.00,?,0,13,1,D,9,00,C,8 -07/02/1981,13:00,1284,1321,295,1,9,1,1,9,293,1,13,358,1,9,1,1,9,357,1,13,1407,1,18,10,A,7,10,A,7,22.2,A,7,19.4,A,7,84,A,7,991,A,7,170,A,7,3.6,A,7,6400,B,7,270,A,7,3.4,E,8,0.000,F,8,0.00,?,0,5,1,D,9,05,C,8 -07/02/1981,14:00,1244,1321,451,1,9,0,1,9,450,1,13,527,1,9,0,1,9,527,1,13,1895,1,18,10,A,7,10,A,7,21.7,A,7,18.9,A,7,84,A,7,991,A,7,130,A,7,2.6,A,7,8000,B,7,610,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/02/1981,15:00,1139,1321,403,1,9,1,1,9,402,1,13,469,1,9,1,1,9,468,1,13,1709,1,18,10,A,7,10,A,7,21.7,A,7,18.9,A,7,84,A,7,991,A,7,120,A,7,2.6,A,7,8000,B,7,310,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/02/1981,16:00,978,1321,335,1,9,0,1,9,334,1,13,385,1,9,0,1,9,385,1,13,1417,1,18,10,A,7,10,A,7,21.7,A,7,19.4,A,7,87,A,7,991,A,7,80,A,7,2.6,A,7,8000,B,7,310,A,7,3.4,E,8,0.000,F,8,0.00,?,0,3,1,D,9,05,C,8 -07/02/1981,17:00,772,1321,162,1,9,1,1,9,161,1,13,191,1,9,1,1,9,190,1,13,734,1,18,10,A,7,10,A,7,21.7,A,7,19.4,A,7,87,A,7,991,A,7,140,A,7,3.1,A,7,8000,B,7,310,A,7,3.4,E,8,0.000,F,8,0.00,?,0,20,1,D,9,05,C,8 -07/02/1981,18:00,533,1321,106,1,9,1,1,9,106,1,13,124,1,9,1,1,9,124,1,13,445,1,18,10,A,7,10,A,7,20.0,A,7,18.3,A,7,90,A,7,991,A,7,150,A,7,3.6,A,7,800,B,7,370,A,7,3.2,E,8,0.000,F,8,0.00,?,0,5,1,D,9,05,C,8 -07/02/1981,19:00,280,1321,48,1,13,1,1,9,48,1,13,56,1,13,0,1,9,56,1,13,185,1,21,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,991,A,7,100,A,7,1.5,A,7,8000,B,7,310,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,20:00,48,870,12,1,13,0,1,9,12,1,13,14,1,13,0,1,9,14,1,13,44,1,21,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,991,A,7,0,A,7,0.0,A,7,4000,B,7,60,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,992,A,7,180,A,7,3.1,A,7,4800,B,7,90,A,7,3.3,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -07/02/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,992,A,7,160,A,7,3.6,A,7,4800,B,7,60,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,992,A,7,150,A,7,3.1,A,7,4800,B,7,60,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/02/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,992,A,7,170,A,7,2.6,A,7,4800,B,7,90,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/03/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,992,A,7,0,A,7,0.0,A,7,4800,B,7,90,A,7,3.3,E,8,0.000,?,0,0.00,?,0,15,1,D,9,10,C,8 -07/03/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,992,A,7,0,A,7,0.0,A,7,4800,B,7,240,A,7,3.3,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -07/03/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,992,A,7,0,A,7,0.0,A,7,4800,B,7,240,A,7,3.3,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -07/03/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,992,A,7,0,A,7,0.0,A,7,4800,B,7,550,A,7,3.3,E,8,0.000,?,0,0.00,?,0,10,1,D,9,45,C,8 -07/03/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,992,A,7,70,A,7,2.1,A,7,4800,B,7,550,A,7,3.2,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -07/03/1981,06:00,84,1134,23,1,13,0,1,9,23,1,13,26,1,13,0,1,9,26,1,13,78,1,21,10,A,7,10,A,7,19.4,A,7,18.9,A,7,97,A,7,992,A,7,70,A,7,2.6,A,7,3200,B,7,90,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/03/1981,07:00,331,1321,97,1,13,0,1,9,97,1,13,108,1,13,0,1,9,108,1,13,332,1,21,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,992,A,7,80,A,7,2.6,A,7,1600,B,7,90,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -07/03/1981,08:00,583,1321,123,1,9,1,1,9,122,1,13,143,1,9,1,1,9,142,1,13,518,1,18,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,993,A,7,80,A,7,2.1,A,7,4000,B,7,120,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/03/1981,09:00,816,1321,301,1,9,0,1,9,300,1,13,340,1,9,0,1,9,340,1,13,1178,1,18,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,993,A,7,80,A,7,2.1,A,7,6400,B,7,3050,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/03/1981,10:00,1015,1321,230,1,9,0,1,9,230,1,13,275,1,9,0,1,9,275,1,13,1099,1,18,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,993,A,7,80,A,7,2.6,A,7,6400,B,7,430,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/03/1981,11:00,1165,1321,242,1,9,1,1,9,241,1,13,294,1,9,1,1,9,293,1,13,1180,1,18,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,993,A,7,120,A,7,3.6,A,7,9700,B,7,610,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/03/1981,12:00,1257,1321,262,1,9,2,1,9,261,1,13,322,1,9,2,1,9,320,1,13,1277,1,18,10,A,7,10,A,7,20.0,A,7,17.2,A,7,84,A,7,993,A,7,80,A,7,3.6,A,7,11300,B,7,3050,A,7,3.0,E,8,0.000,F,8,0.00,?,0,3,1,D,9,61,C,8 -07/03/1981,13:00,1283,1321,276,1,9,2,1,9,274,1,13,337,1,9,2,1,9,336,1,13,1333,1,18,10,A,7,10,A,7,20.6,A,7,18.3,A,7,87,A,7,992,A,7,80,A,7,3.6,A,7,11300,B,7,3050,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -07/03/1981,14:00,1243,1321,260,1,9,0,1,9,259,1,13,316,1,9,0,1,9,316,1,13,1266,1,18,10,A,7,10,A,7,22.2,A,7,20.0,A,7,87,A,7,992,A,7,60,A,7,4.1,A,7,11300,B,7,610,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -07/03/1981,15:00,1139,1321,241,1,9,1,1,9,240,1,13,292,1,9,1,1,9,291,1,13,1171,1,18,10,A,7,10,A,7,21.7,A,7,18.3,A,7,81,A,7,992,A,7,80,A,7,3.1,A,7,11300,B,7,340,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -07/03/1981,16:00,978,1321,206,1,9,0,1,9,205,1,13,246,1,9,0,1,9,246,1,13,989,1,18,10,A,7,10,A,7,21.1,A,7,18.9,A,7,87,A,7,991,A,7,80,A,7,2.6,A,7,11300,B,7,370,A,7,3.3,E,8,0.000,F,8,0.00,?,0,8,1,D,9,61,C,8 -07/03/1981,17:00,772,1321,161,1,9,1,1,9,160,1,13,190,1,9,1,1,9,189,1,13,731,1,18,10,A,7,10,A,7,20.6,A,7,18.9,A,7,90,A,7,991,A,7,80,A,7,3.6,A,7,2400,B,7,310,A,7,3.3,E,8,0.000,F,8,0.00,?,0,18,1,D,9,45,C,8 -07/03/1981,18:00,533,1321,111,1,9,1,1,9,111,1,13,129,1,9,1,1,9,129,1,13,462,1,18,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,991,A,7,80,A,7,2.1,A,7,2400,B,7,90,A,7,3.3,E,8,0.000,F,8,0.00,?,0,13,1,D,9,45,C,8 -07/03/1981,19:00,279,1321,48,1,13,1,1,9,47,1,13,55,1,13,0,1,9,55,1,13,182,1,21,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,990,A,7,60,A,7,3.1,A,7,2400,B,7,60,A,7,3.2,E,8,0.000,F,8,0.00,?,0,46,1,D,9,45,C,8 -07/03/1981,20:00,48,870,9,1,13,0,1,9,9,1,13,11,1,13,0,1,9,11,1,13,34,1,21,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,990,A,7,80,A,7,3.1,A,7,2400,B,7,60,A,7,3.2,E,8,0.000,F,8,0.00,?,0,140,1,D,9,45,C,8 -07/03/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,990,A,7,60,A,7,2.6,A,7,2400,B,7,60,A,7,3.2,E,8,0.000,?,0,0.00,?,0,53,1,D,9,45,C,8 -07/03/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,990,A,7,80,A,7,4.6,A,7,2400,B,7,30,A,7,3.1,E,8,0.000,?,0,0.00,?,0,13,1,D,9,45,C,8 -07/03/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,989,A,7,80,A,7,3.6,A,7,2400,B,7,30,A,7,3.1,E,8,0.000,?,0,0.00,?,0,36,1,D,9,45,C,8 -07/03/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,989,A,7,360,A,7,3.6,A,7,2400,B,7,90,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/04/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,17.8,A,7,93,A,7,987,A,7,40,A,7,4.1,A,7,6400,B,7,60,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,21,C,8 -07/04/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,987,A,7,70,A,7,5.7,A,7,6400,B,7,120,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/04/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,986,A,7,60,A,7,3.6,A,7,6400,B,7,460,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/04/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,986,A,7,30,A,7,4.1,A,7,6400,B,7,60,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/04/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,986,A,7,290,A,7,3.1,A,7,6400,B,7,60,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/04/1981,06:00,82,1112,26,1,13,0,1,9,26,1,13,29,1,13,0,1,9,29,1,13,85,1,21,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,986,A,7,290,A,7,4.6,A,7,1600,B,7,90,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/04/1981,07:00,329,1321,98,1,13,0,1,9,98,1,13,109,1,13,0,1,9,109,1,13,333,1,21,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,986,A,7,290,A,7,3.1,A,7,1600,B,7,90,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -07/04/1981,08:00,581,1321,191,1,9,1,1,9,190,1,13,214,1,9,1,1,9,213,1,13,708,1,18,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,987,A,7,300,A,7,4.1,A,7,11300,B,7,120,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,09:00,815,1321,418,1,9,214,1,9,285,1,13,455,1,9,224,1,9,316,1,13,783,1,18,9,A,7,8,A,7,21.1,A,7,18.3,A,7,84,A,7,987,A,7,290,A,7,2.1,A,7,11300,B,7,7620,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,10:00,1014,1321,545,1,9,289,1,9,322,1,13,593,1,9,313,1,9,353,1,13,1047,1,18,9,A,7,8,A,7,23.3,A,7,18.9,A,7,76,A,7,987,A,7,290,A,7,2.6,A,7,11300,B,7,240,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,11:00,1164,1321,704,1,13,453,1,9,304,1,13,761,1,13,474,1,9,342,1,13,1497,1,21,8,A,7,5,A,7,23.9,A,7,18.9,A,7,74,A,7,987,A,7,260,A,7,2.1,A,7,11300,B,7,7620,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,12:00,1256,1321,870,1,13,624,1,9,275,1,13,921,1,13,633,1,9,318,1,13,2014,1,21,5,A,7,4,A,7,26.1,A,7,20.0,A,7,69,A,7,986,A,7,280,A,7,3.6,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,13:00,1283,1321,890,1,13,683,1,9,225,1,13,959,1,13,701,1,9,277,1,13,2020,1,21,5,A,7,4,A,7,27.2,A,7,18.9,A,7,60,A,7,985,A,7,280,A,7,3.1,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/04/1981,14:00,1243,1321,889,1,13,641,1,9,284,1,13,938,1,13,649,1,9,326,1,13,1923,1,21,4,A,7,4,A,7,28.9,A,7,19.4,A,7,57,A,7,985,A,7,250,A,7,2.1,A,7,24100,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,15:00,1139,1321,449,1,13,87,1,9,374,1,13,496,1,13,89,1,9,419,1,13,1668,1,21,7,A,7,7,A,7,28.9,A,7,19.4,A,7,57,A,7,984,A,7,0,A,7,0.0,A,7,24100,B,7,910,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,16:00,978,1321,572,1,13,449,1,9,239,1,13,617,1,13,468,1,9,270,1,13,729,1,21,6,A,7,6,A,7,28.3,A,7,18.9,A,7,57,A,7,983,A,7,0,A,7,0.0,A,7,24100,B,7,7620,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,17:00,771,1321,417,1,9,271,1,9,258,1,13,446,1,9,287,1,9,278,1,13,639,1,18,10,A,7,8,A,7,28.3,A,7,18.3,A,7,55,A,7,983,A,7,170,A,7,3.1,A,7,24100,B,7,3050,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,18:00,533,1321,157,1,9,53,1,9,136,1,13,173,1,9,51,1,9,153,1,13,396,1,18,10,A,7,8,A,7,27.8,A,7,18.9,A,7,58,A,7,983,A,7,220,A,7,3.6,A,7,24100,B,7,3050,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,19:00,279,1321,66,1,13,7,1,9,64,1,13,74,1,13,2,1,9,73,1,13,231,1,21,10,A,7,10,A,7,26.7,A,7,19.4,A,7,65,A,7,984,A,7,240,A,7,2.1,A,7,24100,B,7,3050,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,29,C,8 -07/04/1981,20:00,48,848,12,1,13,0,1,9,12,1,13,14,1,13,0,1,9,14,1,13,44,1,21,10,A,7,10,A,7,23.9,A,7,18.9,A,7,74,A,7,984,A,7,70,A,7,2.1,A,7,24100,B,7,7620,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,17.8,A,7,76,A,7,984,A,7,0,A,7,0.0,A,7,24100,B,7,520,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,18.9,A,7,82,A,7,985,A,7,280,A,7,2.1,A,7,24100,B,7,520,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.7,A,7,18.9,A,7,84,A,7,985,A,7,200,A,7,2.1,A,7,16100,B,7,760,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/04/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,3,A,7,21.7,A,7,18.9,A,7,84,A,7,984,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/05/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,21.1,A,7,19.4,A,7,90,A,7,984,A,7,200,A,7,1.5,A,7,24100,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/05/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,21.1,A,7,18.9,A,7,87,A,7,984,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/05/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,4,A,7,21.1,A,7,19.4,A,7,90,A,7,983,A,7,210,A,7,1.5,A,7,16100,B,7,7620,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/05/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,4,A,7,21.1,A,7,19.4,A,7,90,A,7,983,A,7,200,A,7,1.5,A,7,11300,B,7,7620,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/05/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,19.4,A,7,93,A,7,983,A,7,210,A,7,1.5,A,7,11300,B,7,7620,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/05/1981,06:00,81,1112,25,1,13,43,1,9,21,1,13,27,1,13,21,1,9,25,1,13,43,1,21,6,A,7,3,A,7,20.6,A,7,18.9,A,7,90,A,7,983,A,7,230,A,7,2.1,A,7,3200,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/05/1981,07:00,327,1321,134,1,13,165,1,9,93,1,13,141,1,13,137,1,9,107,1,13,181,1,21,7,A,7,3,A,7,21.7,A,7,20.0,A,7,90,A,7,983,A,7,230,A,7,2.6,A,7,3200,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -07/05/1981,08:00,579,1321,350,1,9,615,1,9,79,1,13,372,1,9,600,1,9,108,1,13,166,1,18,2,A,7,1,A,7,23.3,A,7,20.6,A,7,84,A,7,984,A,7,260,A,7,4.1,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/05/1981,09:00,813,1321,438,1,9,488,1,9,136,1,13,463,1,9,493,1,9,159,1,13,333,1,18,2,A,7,2,A,7,25.6,A,7,21.1,A,7,77,A,7,984,A,7,230,A,7,3.6,A,7,6400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,10:00,1013,1321,637,1,13,583,1,9,188,1,13,674,1,13,594,1,9,218,1,13,612,1,21,3,A,7,3,A,7,26.7,A,7,21.7,A,7,74,A,7,983,A,7,240,A,7,3.1,A,7,6400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,11:00,1163,1321,841,1,13,703,1,9,220,1,13,896,1,13,718,1,9,262,1,13,1064,1,21,6,A,7,3,A,7,27.8,A,7,21.1,A,7,67,A,7,983,A,7,220,A,7,3.6,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,12:00,1255,1321,915,1,13,732,1,9,218,1,13,986,1,13,751,1,9,270,1,13,1608,1,21,5,A,7,3,A,7,28.9,A,7,20.6,A,7,61,A,7,983,A,7,230,A,7,4.1,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,13:00,1283,1321,824,1,13,536,1,9,303,1,13,905,1,13,562,1,9,358,1,13,2757,1,21,7,A,7,3,A,7,29.4,A,7,21.1,A,7,61,A,7,982,A,7,220,A,7,4.1,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,14:00,1243,1321,826,1,13,575,1,9,283,1,13,871,1,13,582,1,9,322,1,13,1913,1,21,10,A,7,6,A,7,30.0,A,7,21.1,A,7,59,A,7,981,A,7,210,A,7,5.2,A,7,6400,B,7,7620,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,15:00,1139,1321,766,1,13,665,1,9,191,1,13,822,1,13,683,1,9,233,1,13,860,1,21,7,A,7,5,A,7,30.6,A,7,21.1,A,7,57,A,7,981,A,7,240,A,7,4.1,A,7,8000,B,7,7620,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,16:00,978,1321,450,1,13,224,1,9,284,1,13,493,1,13,242,1,9,313,1,13,862,1,21,8,A,7,7,A,7,31.1,A,7,20.6,A,7,53,A,7,981,A,7,240,A,7,5.2,A,7,8000,B,7,910,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,17:00,771,1321,384,1,13,277,1,9,222,1,13,416,1,13,294,1,9,244,1,13,534,1,21,8,A,7,6,A,7,31.1,A,7,20.6,A,7,53,A,7,981,A,7,230,A,7,4.6,A,7,8000,B,7,3050,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,18:00,532,1321,325,1,13,467,1,9,136,1,13,341,1,13,449,1,9,160,1,13,267,1,21,10,A,7,4,A,7,31.1,A,7,20.6,A,7,53,A,7,980,A,7,200,A,7,3.6,A,7,9700,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,19:00,278,1321,122,1,13,249,1,9,69,1,13,126,1,13,191,1,9,86,1,13,126,1,21,10,A,7,4,A,7,28.9,A,7,20.6,A,7,61,A,7,980,A,7,210,A,7,4.1,A,7,9700,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/05/1981,20:00,47,848,21,1,13,13,1,9,20,1,13,23,1,13,7,1,9,22,1,13,48,1,21,10,A,7,8,A,7,27.2,A,7,20.6,A,7,67,A,7,981,A,7,200,A,7,3.1,A,7,24100,B,7,7620,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/05/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,26.1,A,7,20.6,A,7,72,A,7,981,A,7,170,A,7,4.1,A,7,24100,B,7,7620,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/05/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,25.6,A,7,21.1,A,7,77,A,7,982,A,7,190,A,7,6.2,A,7,24100,B,7,3660,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/05/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,25.0,A,7,20.0,A,7,74,A,7,981,A,7,200,A,7,4.1,A,7,24100,B,7,3660,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/05/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,24.4,A,7,20.0,A,7,76,A,7,981,A,7,220,A,7,4.1,A,7,24100,B,7,3660,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,20.0,A,7,79,A,7,981,A,7,230,A,7,4.1,A,7,24100,B,7,3050,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/06/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,981,A,7,230,A,7,3.1,A,7,11300,B,7,240,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -07/06/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,981,A,7,230,A,7,3.1,A,7,16100,B,7,270,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,981,A,7,230,A,7,3.1,A,7,16100,B,7,180,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,982,A,7,230,A,7,3.6,A,7,16100,B,7,180,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,06:00,79,1090,12,1,13,1,1,9,12,1,13,14,1,13,0,1,9,14,1,13,46,1,21,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,982,A,7,210,A,7,3.1,A,7,11300,B,7,180,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,07:00,325,1321,79,1,13,4,1,9,78,1,13,89,1,13,2,1,9,89,1,13,284,1,21,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,982,A,7,240,A,7,3.6,A,7,11300,B,7,180,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/06/1981,08:00,578,1321,118,1,9,8,1,9,114,1,13,137,1,9,5,1,9,135,1,13,489,1,18,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,983,A,7,260,A,7,2.6,A,7,11300,B,7,240,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,09:00,812,1321,301,1,9,4,1,9,298,1,13,340,1,9,4,1,9,338,1,13,1169,1,18,10,A,7,10,A,7,23.3,A,7,21.1,A,7,87,A,7,983,A,7,220,A,7,2.6,A,7,11300,B,7,1980,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,10:00,1011,1321,287,1,9,9,1,9,281,1,13,338,1,9,8,1,9,332,1,13,1278,1,18,10,A,7,10,A,7,24.4,A,7,21.1,A,7,82,A,7,983,A,7,260,A,7,2.1,A,7,11300,B,7,1830,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,11:00,1162,1321,345,1,9,6,1,9,340,1,13,409,1,9,5,1,9,404,1,13,1536,1,18,10,A,7,10,A,7,26.1,A,7,21.7,A,7,77,A,7,984,A,7,230,A,7,2.1,A,7,11300,B,7,1830,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,12:00,1255,1321,447,1,9,1,1,9,446,1,13,525,1,9,1,1,9,524,1,13,1891,1,18,10,A,7,10,A,7,27.2,A,7,22.2,A,7,74,A,7,984,A,7,220,A,7,4.1,A,7,11300,B,7,1830,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,13:00,1282,1321,403,1,9,5,1,9,398,1,13,479,1,9,5,1,9,474,1,13,1766,1,18,10,A,7,10,A,7,27.2,A,7,21.7,A,7,72,A,7,984,A,7,230,A,7,4.1,A,7,11300,B,7,1830,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/06/1981,14:00,1242,1321,399,1,9,2,1,9,397,1,13,472,1,9,2,1,9,470,1,13,1746,1,18,10,A,7,10,A,7,26.7,A,7,22.2,A,7,77,A,7,984,A,7,200,A,7,3.6,A,7,11300,B,7,2130,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,15:00,1139,1321,443,1,9,1,1,9,443,1,13,513,1,9,1,1,9,512,1,13,1813,1,18,10,A,7,10,A,7,27.8,A,7,22.8,A,7,74,A,7,983,A,7,220,A,7,4.1,A,7,11300,B,7,2130,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,16:00,978,1321,347,1,9,1,1,9,346,1,13,399,1,9,1,1,9,398,1,13,1449,1,18,10,A,7,10,A,7,27.2,A,7,21.7,A,7,72,A,7,983,A,7,210,A,7,5.7,A,7,11300,B,7,400,A,7,3.8,E,8,0.000,F,8,0.00,?,0,13,1,D,9,00,C,8 -07/06/1981,17:00,771,1321,151,1,9,1,1,9,150,1,13,179,1,9,1,1,9,178,1,13,693,1,18,10,A,7,10,A,7,25.6,A,7,23.3,A,7,88,A,7,983,A,7,220,A,7,4.1,A,7,6400,B,7,760,A,7,4.3,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -07/06/1981,18:00,532,1321,174,1,9,39,1,9,158,1,13,191,1,9,38,1,9,176,1,13,447,1,18,10,A,7,9,A,7,25.6,A,7,22.2,A,7,82,A,7,983,A,7,250,A,7,3.1,A,7,24100,B,7,2440,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,19:00,278,1321,83,1,13,37,1,9,75,1,13,91,1,13,31,1,9,84,1,13,189,1,21,9,A,7,8,A,7,25.0,A,7,21.7,A,7,82,A,7,983,A,7,240,A,7,2.1,A,7,24100,B,7,7620,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/06/1981,20:00,47,848,11,1,13,4,1,9,11,1,13,12,1,13,2,1,9,12,1,13,28,1,21,10,A,7,8,A,7,23.9,A,7,21.7,A,7,87,A,7,984,A,7,270,A,7,2.1,A,7,24100,B,7,7620,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,6,A,7,24.4,A,7,21.1,A,7,82,A,7,985,A,7,280,A,7,3.1,A,7,24100,B,7,7620,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,23.3,A,7,20.6,A,7,84,A,7,985,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,23.3,A,7,20.6,A,7,84,A,7,985,A,7,280,A,7,2.1,A,7,24100,B,7,1830,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/06/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,985,A,7,240,A,7,1.5,A,7,24100,B,7,1830,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/07/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,985,A,7,250,A,7,2.1,A,7,24100,B,7,1980,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/07/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,3,A,7,22.8,A,7,20.6,A,7,87,A,7,985,A,7,260,A,7,1.5,A,7,24100,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/07/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,21.7,A,7,20.6,A,7,93,A,7,985,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/07/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,21.7,A,7,20.0,A,7,90,A,7,985,A,7,240,A,7,1.5,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/07/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,21.7,A,7,20.0,A,7,90,A,7,986,A,7,280,A,7,2.1,A,7,16100,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/07/1981,06:00,77,1090,20,1,13,29,1,9,17,1,13,22,1,13,14,1,9,21,1,13,35,1,21,4,A,7,3,A,7,21.7,A,7,20.0,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/07/1981,07:00,323,1321,144,1,13,291,1,9,72,1,13,151,1,13,239,1,9,93,1,13,131,1,21,5,A,7,1,A,7,23.9,A,7,20.6,A,7,82,A,7,987,A,7,290,A,7,2.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -07/07/1981,08:00,576,1321,340,1,9,505,1,9,119,1,13,365,1,9,495,1,9,149,1,13,234,1,18,5,A,7,2,A,7,26.7,A,7,20.6,A,7,69,A,7,988,A,7,290,A,7,3.1,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/07/1981,09:00,810,1321,506,1,9,579,1,9,150,1,13,532,1,9,582,1,9,174,1,13,361,1,18,2,A,7,1,A,7,28.3,A,7,21.1,A,7,65,A,7,988,A,7,330,A,7,4.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/07/1981,10:00,1010,1321,722,1,9,719,1,9,170,1,13,770,1,9,735,1,9,206,1,13,556,1,18,5,A,7,2,A,7,28.3,A,7,21.1,A,7,65,A,7,988,A,7,350,A,7,3.1,A,7,8000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,11:00,1161,1321,568,1,13,270,1,9,330,1,13,629,1,13,294,1,9,370,1,13,1476,1,21,7,A,7,6,A,7,29.4,A,7,21.7,A,7,63,A,7,988,A,7,40,A,7,3.1,A,7,8000,B,7,910,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,12:00,1254,1321,573,1,13,323,1,9,265,1,13,634,1,13,339,1,9,312,1,13,1958,1,21,7,A,7,6,A,7,30.0,A,7,21.7,A,7,61,A,7,988,A,7,290,A,7,2.1,A,7,8000,B,7,910,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,13:00,1281,1321,914,1,13,733,1,9,201,1,13,958,1,13,737,1,9,242,1,13,1666,1,21,7,A,7,5,A,7,31.1,A,7,21.1,A,7,55,A,7,988,A,7,300,A,7,4.1,A,7,6400,B,7,7620,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,14:00,1242,1321,944,1,13,787,1,9,202,1,13,984,1,13,789,1,9,241,1,13,1267,1,21,3,A,7,3,A,7,31.7,A,7,21.1,A,7,54,A,7,988,A,7,70,A,7,1.5,A,7,6400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,15:00,1138,1321,819,1,9,728,1,9,191,1,13,880,1,9,747,1,9,235,1,13,859,1,18,2,A,7,2,A,7,32.2,A,7,21.1,A,7,52,A,7,988,A,7,70,A,7,3.1,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,16:00,978,1321,622,1,13,551,1,9,213,1,13,651,1,13,556,1,9,239,1,13,636,1,21,3,A,7,3,A,7,31.7,A,7,20.6,A,7,52,A,7,988,A,7,300,A,7,2.1,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,17:00,771,1321,488,1,9,609,1,9,132,1,13,515,1,9,612,1,9,158,1,13,308,1,18,3,A,7,2,A,7,32.2,A,7,20.6,A,7,50,A,7,988,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,18:00,531,1321,327,1,9,606,1,9,82,1,13,343,1,9,579,1,9,110,1,13,165,1,18,0,A,7,0,A,7,31.1,A,7,21.1,A,7,55,A,7,988,A,7,70,A,7,2.6,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,19:00,277,1321,133,1,13,383,1,9,52,1,13,136,1,13,298,1,9,73,1,13,94,1,21,0,A,7,0,A,7,30.6,A,7,21.1,A,7,57,A,7,988,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,20:00,46,848,22,1,13,45,1,9,18,1,13,22,1,13,14,1,9,21,1,13,31,1,21,0,A,7,0,A,7,28.9,A,7,21.1,A,7,63,A,7,988,A,7,70,A,7,1.5,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,28.3,A,7,21.1,A,7,65,A,7,989,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,25.6,A,7,21.7,A,7,79,A,7,989,A,7,200,A,7,1.5,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,25.0,A,7,21.7,A,7,82,A,7,990,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/07/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,25.0,A,7,21.1,A,7,79,A,7,990,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,24.4,A,7,21.1,A,7,82,A,7,989,A,7,290,A,7,1.5,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,24.4,A,7,21.1,A,7,82,A,7,989,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.3,A,7,20.0,A,7,82,A,7,989,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.3,A,7,19.4,A,7,79,A,7,989,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.2,A,7,18.9,A,7,82,A,7,990,A,7,280,A,7,1.5,A,7,4000,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,06:00,76,1068,28,1,13,40,1,9,24,1,13,30,1,13,19,1,9,28,1,13,50,1,21,0,A,7,0,A,7,22.2,A,7,18.9,A,7,82,A,7,990,A,7,0,A,7,0.0,A,7,4000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,07:00,321,1321,153,1,13,343,1,9,69,1,13,161,1,13,281,1,9,93,1,13,125,1,21,0,A,7,0,A,7,23.3,A,7,18.9,A,7,76,A,7,991,A,7,290,A,7,2.1,A,7,4000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,08:00,574,1321,349,1,9,551,1,9,109,1,13,362,1,9,529,1,9,132,1,13,217,1,18,0,A,7,0,A,7,25.6,A,7,19.4,A,7,69,A,7,991,A,7,290,A,7,3.1,A,7,4000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,09:00,809,1321,554,1,9,670,1,9,142,1,13,584,1,9,675,1,9,170,1,13,344,1,18,0,A,7,0,A,7,27.2,A,7,20.6,A,7,67,A,7,991,A,7,290,A,7,3.1,A,7,4000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,10:00,1009,1321,731,1,9,735,1,9,167,1,13,780,1,9,752,1,9,204,1,13,546,1,18,0,A,7,0,A,7,28.9,A,7,21.1,A,7,63,A,7,991,A,7,290,A,7,2.6,A,7,4000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,11:00,1160,1321,869,1,9,779,1,9,183,1,13,907,1,9,782,1,9,218,1,13,800,1,18,0,A,7,0,A,7,29.4,A,7,20.6,A,7,59,A,7,991,A,7,320,A,7,4.1,A,7,4000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,12:00,1253,1321,953,1,9,799,1,9,193,1,13,1000,1,9,804,1,9,236,1,13,1306,1,18,0,A,7,0,A,7,30.6,A,7,21.1,A,7,57,A,7,991,A,7,30,A,7,4.1,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,13:00,1281,1321,937,1,9,767,1,9,191,1,13,987,1,9,773,1,9,236,1,13,1585,1,18,1,A,7,1,A,7,32.2,A,7,21.1,A,7,52,A,7,991,A,7,290,A,7,3.6,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -07/08/1981,14:00,1242,1321,935,1,9,789,1,9,191,1,13,980,1,9,794,1,9,233,1,13,1206,1,18,0,A,7,0,A,7,32.2,A,7,20.0,A,7,48,A,7,991,A,7,290,A,7,4.6,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,15:00,1138,1321,728,1,13,493,1,9,302,1,13,784,1,13,515,1,9,339,1,13,1363,1,21,5,A,7,5,A,7,32.8,A,7,20.0,A,7,47,A,7,990,A,7,50,A,7,4.1,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,16:00,977,1321,635,1,13,522,1,9,248,1,13,682,1,13,543,1,9,279,1,13,757,1,21,4,A,7,4,A,7,32.8,A,7,20.6,A,7,49,A,7,990,A,7,60,A,7,3.6,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,17:00,770,1321,480,1,13,529,1,9,171,1,13,517,1,13,542,1,9,201,1,13,390,1,21,3,A,7,3,A,7,32.8,A,7,20.0,A,7,47,A,7,990,A,7,290,A,7,2.6,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,18:00,531,1321,283,1,13,358,1,9,139,1,13,296,1,13,343,1,9,158,1,13,274,1,21,3,A,7,3,A,7,32.2,A,7,20.6,A,7,50,A,7,989,A,7,310,A,7,2.6,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,19:00,276,1321,110,1,13,173,1,9,74,1,13,117,1,13,133,1,9,89,1,13,141,1,21,3,A,7,3,A,7,30.6,A,7,20.6,A,7,55,A,7,988,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,20:00,46,826,15,1,13,12,1,9,13,1,13,15,1,13,6,1,9,15,1,13,33,1,21,3,A,7,3,A,7,29.4,A,7,20.6,A,7,59,A,7,988,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,27.2,A,7,21.1,A,7,69,A,7,989,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,25.6,A,7,21.1,A,7,77,A,7,989,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,24.4,A,7,20.6,A,7,79,A,7,989,A,7,250,A,7,2.1,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/08/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,23.9,A,7,20.6,A,7,82,A,7,989,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,23.9,A,7,20.0,A,7,79,A,7,989,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,22.8,A,7,20.0,A,7,84,A,7,989,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,23.3,A,7,20.0,A,7,82,A,7,988,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,22.2,A,7,20.0,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,23.9,A,7,20.0,A,7,79,A,7,988,A,7,0,A,7,0.0,A,7,3200,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,06:00,74,1046,19,1,13,6,1,9,18,1,13,20,1,13,3,1,9,20,1,13,45,1,21,3,A,7,3,A,7,23.9,A,7,20.6,A,7,82,A,7,989,A,7,290,A,7,2.1,A,7,3200,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,07:00,319,1321,137,1,13,229,1,9,81,1,13,145,1,13,189,1,9,100,1,13,154,1,21,0,A,7,0,A,7,24.4,A,7,21.1,A,7,82,A,7,989,A,7,290,A,7,2.1,A,7,2400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,08:00,572,1321,289,1,13,244,1,9,182,1,13,306,1,13,246,1,9,199,1,13,395,1,21,4,A,7,3,A,7,27.8,A,7,22.2,A,7,72,A,7,989,A,7,280,A,7,3.1,A,7,2400,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,09:00,807,1321,457,1,13,364,1,9,234,1,13,495,1,13,388,1,9,258,1,13,581,1,21,4,A,7,4,A,7,29.4,A,7,22.8,A,7,67,A,7,989,A,7,290,A,7,3.1,A,7,2400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,10:00,1007,1321,587,1,13,413,1,9,271,1,13,627,1,13,430,1,9,299,1,13,880,1,21,3,A,7,3,A,7,31.1,A,7,22.8,A,7,61,A,7,989,A,7,290,A,7,5.2,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,11:00,1159,1321,849,1,9,686,1,9,245,1,13,897,1,9,697,1,9,285,1,13,1159,1,18,2,A,7,2,A,7,32.2,A,7,23.3,A,7,59,A,7,988,A,7,50,A,7,6.2,A,7,6400,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,12:00,1252,1321,885,1,9,684,1,9,235,1,13,948,1,9,700,1,9,283,1,13,1696,1,18,1,A,7,1,A,7,32.8,A,7,23.3,A,7,58,A,7,988,A,7,290,A,7,4.1,A,7,6400,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,13:00,1280,1321,919,1,13,629,1,9,308,1,13,968,1,13,635,1,9,351,1,13,2665,1,21,3,A,7,3,A,7,34.4,A,7,23.3,A,7,52,A,7,987,A,7,290,A,7,3.1,A,7,6400,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,14:00,1241,1321,845,1,13,473,1,9,399,1,13,897,1,13,494,1,9,432,1,13,2774,1,21,3,A,7,3,A,7,35.6,A,7,22.8,A,7,48,A,7,987,A,7,290,A,7,4.6,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,15:00,1138,1321,763,1,13,556,1,9,283,1,13,827,1,13,582,1,9,325,1,13,1271,1,21,3,A,7,3,A,7,35.6,A,7,22.2,A,7,46,A,7,986,A,7,280,A,7,2.1,A,7,6400,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,16:00,977,1321,668,1,9,623,1,9,207,1,13,701,1,9,629,1,9,235,1,13,620,1,18,1,A,7,1,A,7,35.6,A,7,22.2,A,7,46,A,7,986,A,7,280,A,7,2.6,A,7,8000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,17:00,770,1321,491,1,9,542,1,9,174,1,13,527,1,9,555,1,9,204,1,13,397,1,18,0,A,7,0,A,7,35.6,A,7,22.8,A,7,48,A,7,985,A,7,260,A,7,3.1,A,7,9700,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,18:00,530,1321,292,1,9,411,1,9,126,1,13,308,1,9,395,1,9,149,1,13,245,1,18,0,A,7,0,A,7,35.0,A,7,21.7,A,7,46,A,7,985,A,7,280,A,7,2.1,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/09/1981,19:00,276,1321,109,1,13,183,1,9,71,1,13,116,1,13,140,1,9,87,1,13,134,1,21,0,A,7,0,A,7,33.3,A,7,22.8,A,7,54,A,7,985,A,7,280,A,7,2.1,A,7,11300,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/09/1981,20:00,45,826,18,1,13,5,1,9,18,1,13,21,1,13,0,1,9,21,1,13,60,1,21,0,A,7,0,A,7,31.1,A,7,22.8,A,7,61,A,7,985,A,7,280,A,7,2.6,A,7,8000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/09/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,29.4,A,7,21.7,A,7,63,A,7,985,A,7,230,A,7,2.1,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/09/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,27.8,A,7,22.8,A,7,74,A,7,986,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,4.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/09/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,27.2,A,7,22.2,A,7,74,A,7,986,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/09/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,26.7,A,7,21.1,A,7,72,A,7,986,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/10/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,26.7,A,7,21.1,A,7,72,A,7,986,A,7,280,A,7,2.6,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/10/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,26.1,A,7,20.6,A,7,72,A,7,985,A,7,280,A,7,2.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/10/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.6,A,7,20.6,A,7,74,A,7,985,A,7,280,A,7,2.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/10/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,20.6,A,7,76,A,7,985,A,7,280,A,7,2.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/10/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,20.0,A,7,74,A,7,985,A,7,280,A,7,2.1,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/10/1981,06:00,72,1046,33,1,13,136,1,9,20,1,13,32,1,13,58,1,9,28,1,13,35,1,21,0,A,7,0,A,7,25.0,A,7,20.0,A,7,74,A,7,986,A,7,280,A,7,2.1,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/10/1981,07:00,317,1322,172,1,13,525,1,9,45,1,13,180,1,13,436,1,9,75,1,13,86,1,21,0,A,7,0,A,7,26.7,A,7,21.1,A,7,72,A,7,986,A,7,280,A,7,2.1,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,08:00,570,1322,373,1,9,703,1,9,68,1,13,392,1,9,678,1,9,99,1,13,146,1,18,0,A,7,0,A,7,29.4,A,7,22.2,A,7,65,A,7,987,A,7,280,A,7,2.6,A,7,8000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,09:00,806,1322,573,1,9,795,1,9,87,1,13,615,1,9,800,1,9,126,1,13,218,1,18,0,A,7,0,A,7,31.7,A,7,22.8,A,7,59,A,7,986,A,7,290,A,7,2.6,A,7,9700,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,10:00,1006,1322,747,1,9,844,1,9,102,1,13,773,1,9,844,1,9,129,1,13,284,1,18,0,A,7,0,A,7,32.8,A,7,23.3,A,7,58,A,7,986,A,7,290,A,7,2.6,A,7,6400,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,11:00,1158,1322,880,1,9,874,1,9,112,1,13,908,1,9,876,1,9,138,1,13,445,1,18,0,A,7,0,A,7,33.3,A,7,23.3,A,7,56,A,7,986,A,7,280,A,7,3.6,A,7,6400,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,12:00,1252,1322,902,1,9,843,1,9,101,1,13,932,1,9,847,1,9,128,1,13,622,1,18,1,A,7,1,A,7,34.4,A,7,23.3,A,7,52,A,7,985,A,7,290,A,7,3.6,A,7,6400,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,13:00,1280,1322,939,1,13,808,1,9,154,1,13,1012,1,13,822,1,9,215,1,13,1294,1,21,3,A,7,3,A,7,33.9,A,7,22.2,A,7,51,A,7,985,A,7,290,A,7,2.6,A,7,6400,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,14:00,1241,1322,773,1,13,548,1,9,257,1,13,821,1,13,558,1,9,297,1,13,1725,1,21,4,A,7,4,A,7,35.6,A,7,21.7,A,7,44,A,7,984,A,7,290,A,7,2.1,A,7,6400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,15:00,1137,1322,671,1,13,411,1,9,317,1,13,720,1,13,429,1,9,350,1,13,1430,1,21,6,A,7,6,A,7,35.6,A,7,22.8,A,7,48,A,7,983,A,7,280,A,7,4.1,A,7,6400,B,7,1220,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,16:00,976,1322,651,1,13,627,1,9,186,1,13,687,1,13,637,1,9,216,1,13,564,1,21,4,A,7,4,A,7,35.0,A,7,22.8,A,7,49,A,7,983,A,7,280,A,7,1.5,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,17:00,769,1322,447,1,13,442,1,9,189,1,13,476,1,13,452,1,9,213,1,13,434,1,21,4,A,7,4,A,7,35.0,A,7,23.3,A,7,51,A,7,983,A,7,280,A,7,2.6,A,7,6400,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,18:00,529,1322,284,1,13,422,1,9,114,1,13,303,1,13,406,1,9,140,1,13,220,1,21,3,A,7,3,A,7,33.3,A,7,23.9,A,7,58,A,7,983,A,7,180,A,7,2.1,A,7,6400,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,19:00,275,1322,124,1,13,332,1,9,55,1,13,132,1,13,254,1,9,79,1,13,98,1,21,1,A,7,1,A,7,32.2,A,7,23.9,A,7,61,A,7,984,A,7,170,A,7,2.6,A,7,6400,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,20:00,44,826,23,1,13,59,1,9,17,1,13,22,1,13,19,1,9,21,1,13,29,1,21,2,A,7,2,A,7,30.0,A,7,22.8,A,7,65,A,7,983,A,7,190,A,7,2.6,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,28.9,A,7,22.8,A,7,70,A,7,983,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/10/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,27.8,A,7,21.7,A,7,69,A,7,984,A,7,350,A,7,2.6,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/10/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,27.2,A,7,20.6,A,7,67,A,7,985,A,7,50,A,7,4.1,A,7,11300,B,7,1070,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/10/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,26.1,A,7,20.6,A,7,72,A,7,985,A,7,70,A,7,2.1,A,7,11300,B,7,1070,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,25.6,A,7,20.6,A,7,74,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -07/11/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,24.4,A,7,20.6,A,7,79,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,23.9,A,7,20.6,A,7,82,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,23.9,A,7,20.6,A,7,82,A,7,985,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,22.8,A,7,20.6,A,7,87,A,7,985,A,7,40,A,7,2.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,06:00,70,1024,23,1,13,8,1,9,22,1,13,25,1,13,5,1,9,24,1,13,53,1,21,8,A,7,6,A,7,23.9,A,7,20.6,A,7,82,A,7,986,A,7,0,A,7,0.0,A,7,6400,B,7,7620,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,07:00,315,1322,110,1,13,73,1,9,93,1,13,121,1,13,63,1,9,106,1,13,234,1,21,8,A,7,6,A,7,24.4,A,7,21.1,A,7,82,A,7,987,A,7,50,A,7,3.1,A,7,6400,B,7,7620,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,08:00,569,1322,356,1,13,516,1,9,133,1,13,377,1,13,503,1,9,160,1,13,263,1,21,4,A,7,3,A,7,25.6,A,7,21.7,A,7,79,A,7,987,A,7,70,A,7,3.6,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,09:00,804,1322,417,1,13,250,1,9,264,1,13,447,1,13,266,1,9,285,1,13,669,1,21,10,A,7,7,A,7,27.8,A,7,19.4,A,7,61,A,7,988,A,7,80,A,7,3.1,A,7,11300,B,7,7620,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,10:00,1005,1322,523,1,9,297,1,9,296,1,13,572,1,9,322,1,9,327,1,13,938,1,18,10,A,7,8,A,7,28.3,A,7,18.9,A,7,57,A,7,988,A,7,70,A,7,4.1,A,7,11300,B,7,7620,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,11:00,1157,1322,635,1,13,343,1,9,333,1,13,702,1,13,373,1,9,374,1,13,1472,1,21,10,A,7,7,A,7,29.4,A,7,20.0,A,7,57,A,7,988,A,7,60,A,7,4.1,A,7,11300,B,7,7620,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,12:00,1251,1322,854,1,13,589,1,9,295,1,13,899,1,13,595,1,9,335,1,13,2080,1,21,10,A,7,4,A,7,31.1,A,7,20.6,A,7,53,A,7,987,A,7,80,A,7,3.6,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -07/11/1981,13:00,1279,1322,979,1,9,822,1,9,181,1,13,1038,1,9,830,1,9,232,1,13,1486,1,18,0,A,7,0,A,7,31.1,A,7,21.1,A,7,55,A,7,987,A,7,60,A,7,3.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -07/11/1981,14:00,1240,1322,938,1,9,808,1,9,178,1,13,992,1,9,816,1,9,225,1,13,1126,1,18,0,A,7,0,A,7,33.3,A,7,21.7,A,7,50,A,7,987,A,7,50,A,7,2.6,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,15:00,1137,1322,849,1,9,790,1,9,168,1,13,892,1,9,795,1,9,206,1,13,688,1,18,0,A,7,0,A,7,32.8,A,7,21.7,A,7,52,A,7,986,A,7,40,A,7,4.6,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,16:00,976,1322,698,1,9,738,1,9,152,1,13,749,1,9,756,1,9,189,1,13,470,1,18,0,A,7,0,A,7,32.8,A,7,21.7,A,7,52,A,7,986,A,7,60,A,7,3.6,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,17:00,768,1322,476,1,9,539,1,9,161,1,13,515,1,9,552,1,9,193,1,13,364,1,18,3,A,7,2,A,7,32.2,A,7,22.2,A,7,56,A,7,986,A,7,80,A,7,4.1,A,7,8000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,18:00,529,1322,271,1,9,440,1,9,94,1,13,294,1,9,424,1,9,125,1,13,178,1,18,0,A,7,0,A,7,31.1,A,7,22.2,A,7,59,A,7,986,A,7,80,A,7,4.1,A,7,8000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,19:00,273,1322,117,1,13,245,1,9,66,1,13,122,1,13,186,1,9,83,1,13,120,1,21,3,A,7,2,A,7,29.4,A,7,21.7,A,7,63,A,7,987,A,7,70,A,7,2.6,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,20:00,44,826,16,1,13,11,1,9,15,1,13,17,1,13,6,1,9,17,1,13,37,1,21,5,A,7,4,A,7,28.9,A,7,21.1,A,7,63,A,7,987,A,7,80,A,7,2.6,A,7,8000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/11/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,27.8,A,7,21.1,A,7,67,A,7,988,A,7,80,A,7,2.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,27.8,A,7,21.1,A,7,67,A,7,988,A,7,190,A,7,3.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,26.7,A,7,20.6,A,7,69,A,7,987,A,7,180,A,7,2.1,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/11/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,25.6,A,7,20.6,A,7,74,A,7,987,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/12/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,24.4,A,7,20.6,A,7,79,A,7,987,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -07/12/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,24.4,A,7,20.6,A,7,79,A,7,987,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/12/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,24.4,A,7,20.6,A,7,79,A,7,987,A,7,190,A,7,3.1,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/12/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,23.9,A,7,20.6,A,7,82,A,7,988,A,7,190,A,7,2.6,A,7,8000,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,22.8,A,7,20.0,A,7,84,A,7,988,A,7,200,A,7,2.1,A,7,8000,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,06:00,69,1024,21,1,13,39,1,9,18,1,13,23,1,13,18,1,9,22,1,13,37,1,21,3,A,7,1,A,7,22.8,A,7,20.0,A,7,84,A,7,988,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,07:00,313,1322,147,1,13,340,1,9,66,1,13,155,1,13,275,1,9,90,1,13,119,1,21,3,A,7,1,A,7,23.9,A,7,20.6,A,7,82,A,7,988,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,08:00,567,1322,352,1,9,610,1,9,89,1,13,370,1,9,590,1,9,116,1,13,182,1,18,0,A,7,0,A,7,25.0,A,7,21.1,A,7,79,A,7,989,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,09:00,802,1322,556,1,9,721,1,9,116,1,13,593,1,9,732,1,9,148,1,13,285,1,18,0,A,7,0,A,7,26.7,A,7,21.1,A,7,72,A,7,989,A,7,190,A,7,2.1,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,10:00,1003,1322,393,1,9,133,1,9,292,1,13,436,1,9,142,1,9,328,1,13,969,1,18,8,A,7,8,A,7,28.3,A,7,21.7,A,7,67,A,7,989,A,7,180,A,7,3.1,A,7,9700,B,7,1830,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,11:00,1156,1322,802,1,9,717,1,9,173,1,13,841,1,9,722,1,9,209,1,13,753,1,18,1,A,7,1,A,7,28.9,A,7,22.2,A,7,67,A,7,989,A,7,140,A,7,3.1,A,7,8000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,12:00,1250,1322,922,1,13,691,1,9,266,1,13,977,1,13,702,1,9,312,1,13,1877,1,21,4,A,7,4,A,7,30.6,A,7,22.8,A,7,63,A,7,988,A,7,150,A,7,1.5,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,13:00,1278,1322,962,1,13,841,1,9,146,1,13,983,1,13,843,1,9,166,1,13,993,1,21,3,A,7,3,A,7,31.1,A,7,22.8,A,7,61,A,7,988,A,7,230,A,7,2.6,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,14:00,1240,1322,672,1,9,251,1,9,436,1,13,736,1,9,273,1,9,480,1,13,2665,1,18,8,A,7,8,A,7,31.1,A,7,22.8,A,7,61,A,7,987,A,7,0,A,7,0.0,A,7,4800,B,7,910,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,15:00,1136,1322,391,1,9,13,1,9,379,1,13,456,1,9,12,1,9,446,1,13,1643,1,18,10,A,7,10,A,7,30.6,A,7,22.8,A,7,63,A,7,987,A,7,170,A,7,3.6,A,7,6400,B,7,700,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,16:00,975,1322,559,1,13,323,1,9,320,1,13,606,1,13,349,1,9,348,1,13,984,1,21,9,A,7,6,A,7,32.2,A,7,23.9,A,7,61,A,7,986,A,7,180,A,7,2.6,A,7,6400,B,7,7620,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,17:00,768,1322,409,1,13,341,1,9,210,1,13,444,1,13,362,1,9,233,1,13,499,1,21,8,A,7,7,A,7,28.9,A,7,21.7,A,7,65,A,7,986,A,7,200,A,7,4.1,A,7,6400,B,7,7620,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,18:00,528,1322,320,1,9,580,1,9,88,1,13,335,1,9,552,1,9,114,1,13,175,1,18,2,A,7,2,A,7,30.0,A,7,22.2,A,7,63,A,7,986,A,7,200,A,7,2.1,A,7,6400,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,19:00,272,1322,122,1,13,335,1,9,53,1,13,130,1,13,255,1,9,78,1,13,94,1,21,0,A,7,0,A,7,28.3,A,7,22.8,A,7,72,A,7,986,A,7,200,A,7,2.6,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,20:00,43,804,17,1,13,28,1,9,14,1,13,18,1,13,12,1,9,17,1,13,29,1,21,2,A,7,2,A,7,27.2,A,7,21.7,A,7,72,A,7,986,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,26.7,A,7,21.7,A,7,74,A,7,986,A,7,200,A,7,1.5,A,7,9700,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.6,A,7,22.2,A,7,82,A,7,986,A,7,240,A,7,2.1,A,7,8000,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,22.8,A,7,88,A,7,986,A,7,210,A,7,2.6,A,7,8000,B,7,77777,A,7,4.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/12/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,22.8,A,7,88,A,7,986,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,4.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,22.2,A,7,85,A,7,986,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,21.7,A,7,82,A,7,985,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,21.7,A,7,82,A,7,985,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,24.4,A,7,21.7,A,7,85,A,7,984,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.9,A,7,21.1,A,7,85,A,7,984,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,06:00,67,1002,20,1,13,23,1,9,18,1,13,22,1,13,11,1,9,21,1,13,37,1,21,2,A,7,1,A,7,23.9,A,7,21.1,A,7,85,A,7,985,A,7,0,A,7,0.0,A,7,3200,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,07:00,310,1322,136,1,13,260,1,9,74,1,13,141,1,13,209,1,9,92,1,13,135,1,21,3,A,7,1,A,7,23.9,A,7,22.2,A,7,90,A,7,985,A,7,0,A,7,0.0,A,7,3200,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,08:00,565,1322,330,1,9,513,1,9,109,1,13,341,1,9,491,1,9,131,1,13,216,1,18,0,A,7,0,A,7,26.7,A,7,22.8,A,7,79,A,7,986,A,7,290,A,7,3.1,A,7,4000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,09:00,801,1322,426,1,13,356,1,9,209,1,13,464,1,13,380,1,9,234,1,13,507,1,21,6,A,7,4,A,7,28.9,A,7,22.8,A,7,70,A,7,985,A,7,280,A,7,2.1,A,7,4800,B,7,7620,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,10:00,1002,1322,647,1,13,554,1,9,226,1,13,704,1,13,578,1,9,265,1,13,717,1,21,4,A,7,3,A,7,31.1,A,7,22.2,A,7,59,A,7,985,A,7,280,A,7,4.1,A,7,4800,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,11:00,1155,1322,615,1,13,322,1,9,332,1,13,680,1,13,350,1,9,373,1,13,1457,1,21,7,A,7,3,A,7,32.8,A,7,20.6,A,7,49,A,7,985,A,7,290,A,7,5.2,A,7,8000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,12:00,1249,1322,878,1,13,557,1,9,350,1,13,946,1,13,583,1,9,394,1,13,2526,1,21,10,A,7,4,A,7,33.9,A,7,18.9,A,7,41,A,7,985,A,7,290,A,7,4.6,A,7,8000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,13:00,1278,1322,827,1,13,459,1,9,382,1,13,886,1,13,480,1,9,421,1,13,3349,1,21,10,A,7,5,A,7,33.9,A,7,19.4,A,7,43,A,7,985,A,7,300,A,7,5.2,A,7,8000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,14:00,1239,1322,763,1,13,444,1,9,346,1,13,822,1,13,465,1,9,386,1,13,2359,1,21,8,A,7,4,A,7,34.4,A,7,20.6,A,7,44,A,7,984,A,7,290,A,7,2.1,A,7,8000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,15:00,1136,1322,808,1,9,626,1,9,269,1,13,847,1,9,631,1,9,303,1,13,1163,1,18,7,A,7,2,A,7,34.4,A,7,20.6,A,7,44,A,7,984,A,7,80,A,7,2.1,A,7,8000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,16:00,974,1322,622,1,13,444,1,9,293,1,13,655,1,13,461,1,9,315,1,13,901,1,21,7,A,7,4,A,7,35.0,A,7,21.7,A,7,46,A,7,983,A,7,320,A,7,2.1,A,7,8000,B,7,7620,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,17:00,767,1322,433,1,13,392,1,9,205,1,13,457,1,13,400,1,9,225,1,13,474,1,21,7,A,7,4,A,7,33.9,A,7,21.7,A,7,49,A,7,982,A,7,360,A,7,2.6,A,7,8000,B,7,7620,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,18:00,527,1322,216,1,13,220,1,9,128,1,13,233,1,13,218,1,9,146,1,13,258,1,21,7,A,7,4,A,7,32.8,A,7,22.2,A,7,54,A,7,982,A,7,290,A,7,1.5,A,7,8000,B,7,7620,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,19:00,271,1322,70,1,13,62,1,9,58,1,13,78,1,13,49,1,9,68,1,13,125,1,21,8,A,7,5,A,7,32.8,A,7,22.2,A,7,54,A,7,982,A,7,0,A,7,0.0,A,7,8000,B,7,7620,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,20:00,42,804,13,1,13,5,1,9,12,1,13,14,1,13,3,1,9,13,1,13,30,1,21,8,A,7,4,A,7,31.1,A,7,21.7,A,7,57,A,7,983,A,7,260,A,7,2.6,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,30.0,A,7,21.7,A,7,61,A,7,983,A,7,250,A,7,2.1,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,28.9,A,7,21.1,A,7,63,A,7,982,A,7,250,A,7,3.1,A,7,8000,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,28.3,A,7,21.7,A,7,67,A,7,982,A,7,270,A,7,2.1,A,7,8000,B,7,7620,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/13/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,28.3,A,7,21.1,A,7,65,A,7,982,A,7,280,A,7,3.1,A,7,8000,B,7,7620,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,27.8,A,7,20.6,A,7,65,A,7,981,A,7,280,A,7,2.6,A,7,8000,B,7,7620,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,27.8,A,7,20.6,A,7,65,A,7,981,A,7,270,A,7,3.6,A,7,8000,B,7,7620,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,27.8,A,7,20.6,A,7,65,A,7,981,A,7,270,A,7,3.1,A,7,8000,B,7,7620,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,26.7,A,7,20.6,A,7,69,A,7,981,A,7,250,A,7,2.6,A,7,8000,B,7,7620,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,26.1,A,7,20.6,A,7,72,A,7,981,A,7,250,A,7,2.1,A,7,8000,B,7,7620,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,06:00,65,980,21,1,13,15,1,9,20,1,13,23,1,13,9,1,9,22,1,13,49,1,21,8,A,7,6,A,7,25.6,A,7,20.0,A,7,71,A,7,981,A,7,260,A,7,2.6,A,7,4800,B,7,7620,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,07:00,308,1322,106,1,13,108,1,9,81,1,13,116,1,13,90,1,9,95,1,13,176,1,21,8,A,7,7,A,7,26.7,A,7,20.6,A,7,69,A,7,981,A,7,250,A,7,2.6,A,7,4000,B,7,3050,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,08:00,563,1322,160,1,9,2,1,9,160,1,13,182,1,9,2,1,9,182,1,13,620,1,18,10,A,7,10,A,7,27.2,A,7,21.1,A,7,69,A,7,981,A,7,280,A,7,2.6,A,7,3200,B,7,3050,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,09:00,799,1322,276,1,9,16,1,9,266,1,13,314,1,9,15,1,9,305,1,13,1078,1,18,10,A,7,10,A,7,27.2,A,7,22.2,A,7,74,A,7,982,A,7,280,A,7,3.6,A,7,3200,B,7,3050,A,7,3.9,E,8,0.000,F,8,0.00,?,0,3,1,D,9,05,C,8 -07/14/1981,10:00,1001,1322,150,1,9,5,1,9,146,1,13,185,1,9,4,1,9,182,1,13,748,1,18,10,A,7,10,A,7,26.7,A,7,22.2,A,7,77,A,7,981,A,7,230,A,7,2.1,A,7,4000,B,7,2290,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,11:00,1154,1322,430,1,9,143,1,9,305,1,13,482,1,9,154,1,9,348,1,13,1322,1,18,8,A,7,8,A,7,26.7,A,7,23.3,A,7,82,A,7,981,A,7,0,A,7,0.0,A,7,4000,B,7,7620,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,12:00,1248,1322,876,1,13,626,1,9,283,1,13,925,1,13,634,1,9,325,1,13,1966,1,21,8,A,7,3,A,7,30.0,A,7,23.9,A,7,70,A,7,981,A,7,280,A,7,4.6,A,7,6400,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,13:00,1277,1322,858,1,9,626,1,9,252,1,13,917,1,9,639,1,9,298,1,13,2134,1,18,5,A,7,2,A,7,32.8,A,7,23.9,A,7,60,A,7,980,A,7,280,A,7,3.6,A,7,6400,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,14:00,1238,1322,882,1,13,664,1,9,258,1,13,936,1,13,676,1,9,302,1,13,1706,1,21,7,A,7,3,A,7,34.4,A,7,24.4,A,7,56,A,7,980,A,7,270,A,7,3.6,A,7,4800,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,15:00,1135,1322,565,1,13,300,1,9,307,1,13,628,1,13,327,1,9,347,1,13,1265,1,21,9,A,7,7,A,7,32.8,A,7,24.4,A,7,62,A,7,979,A,7,230,A,7,4.1,A,7,4800,B,7,7620,A,7,4.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,16:00,974,1322,271,1,9,89,1,9,206,1,13,307,1,9,95,1,9,237,1,13,658,1,18,9,A,7,9,A,7,33.9,A,7,23.3,A,7,54,A,7,979,A,7,280,A,7,5.2,A,7,4800,B,7,910,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,17:00,766,1322,454,1,13,407,1,9,218,1,13,477,1,13,415,1,9,236,1,13,506,1,21,7,A,7,6,A,7,32.2,A,7,22.2,A,7,56,A,7,979,A,7,280,A,7,7.2,A,7,8000,B,7,7620,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,18:00,525,1322,262,1,13,225,1,9,173,1,13,285,1,13,221,1,9,197,1,13,405,1,21,7,A,7,6,A,7,32.2,A,7,22.8,A,7,57,A,7,979,A,7,280,A,7,4.6,A,7,9700,B,7,7620,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,19:00,269,1322,98,1,13,112,1,9,75,1,13,107,1,13,88,1,9,89,1,13,162,1,21,7,A,7,5,A,7,29.4,A,7,22.2,A,7,65,A,7,979,A,7,280,A,7,3.6,A,7,11300,B,7,7620,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/14/1981,20:00,41,782,13,1,13,17,1,9,11,1,13,14,1,13,7,1,9,13,1,13,23,1,21,5,A,7,3,A,7,28.3,A,7,21.7,A,7,67,A,7,979,A,7,280,A,7,3.1,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/14/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,27.2,A,7,21.1,A,7,69,A,7,980,A,7,260,A,7,2.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/14/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,25.6,A,7,21.1,A,7,77,A,7,981,A,7,280,A,7,3.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/14/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,25.0,A,7,20.6,A,7,76,A,7,981,A,7,280,A,7,3.1,A,7,11300,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/14/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,25.0,A,7,20.0,A,7,74,A,7,981,A,7,280,A,7,3.6,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,23.9,A,7,19.4,A,7,76,A,7,981,A,7,290,A,7,2.6,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/15/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,23.3,A,7,18.3,A,7,74,A,7,981,A,7,300,A,7,4.1,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,22.8,A,7,18.3,A,7,76,A,7,981,A,7,60,A,7,2.6,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.7,A,7,18.3,A,7,81,A,7,982,A,7,300,A,7,3.1,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,21.1,A,7,17.8,A,7,81,A,7,982,A,7,310,A,7,2.1,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,06:00,63,980,31,1,13,109,1,9,20,1,13,29,1,13,45,1,9,26,1,13,35,1,21,2,A,7,0,A,7,20.6,A,7,17.8,A,7,84,A,7,982,A,7,40,A,7,2.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,07:00,306,1322,164,1,13,497,1,9,48,1,13,170,1,13,406,1,9,76,1,13,90,1,21,2,A,7,0,A,7,22.2,A,7,17.2,A,7,73,A,7,983,A,7,70,A,7,3.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/15/1981,08:00,561,1322,321,1,13,455,1,9,127,1,13,341,1,13,443,1,9,153,1,13,250,1,21,6,A,7,3,A,7,23.9,A,7,15.6,A,7,60,A,7,984,A,7,80,A,7,2.6,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,09:00,797,1322,518,1,9,641,1,9,130,1,13,549,1,9,647,1,9,158,1,13,314,1,18,4,A,7,2,A,7,24.4,A,7,15.6,A,7,58,A,7,984,A,7,80,A,7,2.6,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,10:00,999,1322,659,1,9,619,1,9,190,1,13,697,1,9,629,1,9,221,1,13,600,1,18,4,A,7,2,A,7,25.6,A,7,16.1,A,7,56,A,7,984,A,7,50,A,7,1.5,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,11:00,1153,1322,827,1,9,806,1,9,122,1,13,851,1,9,808,1,9,145,1,13,458,1,18,3,A,7,1,A,7,26.7,A,7,16.7,A,7,54,A,7,984,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,12:00,1247,1322,889,1,9,789,1,9,142,1,13,909,1,9,791,1,9,162,1,13,777,1,18,4,A,7,1,A,7,28.3,A,7,17.2,A,7,51,A,7,984,A,7,300,A,7,3.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,13:00,1276,1322,919,1,9,727,1,9,215,1,13,992,1,9,747,1,9,269,1,13,1820,1,18,3,A,7,1,A,7,29.4,A,7,17.2,A,7,48,A,7,983,A,7,340,A,7,3.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/15/1981,14:00,1238,1322,878,1,9,813,1,9,115,1,13,905,1,9,816,1,9,139,1,13,634,1,18,3,A,7,1,A,7,30.0,A,7,17.8,A,7,48,A,7,983,A,7,320,A,7,4.1,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,15:00,1134,1322,805,1,9,809,1,9,109,1,13,831,1,9,811,1,9,134,1,13,404,1,18,3,A,7,1,A,7,31.1,A,7,17.8,A,7,45,A,7,982,A,7,50,A,7,3.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,16:00,973,1322,719,1,9,838,1,9,100,1,13,744,1,9,837,1,9,127,1,13,263,1,18,0,A,7,0,A,7,32.2,A,7,17.8,A,7,42,A,7,982,A,7,290,A,7,2.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,17:00,765,1322,537,1,9,764,1,9,93,1,13,567,1,9,762,1,9,126,1,13,217,1,18,2,A,7,0,A,7,32.2,A,7,17.8,A,7,42,A,7,982,A,7,70,A,7,2.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,18:00,524,1322,334,1,9,663,1,9,70,1,13,346,1,9,628,1,9,97,1,13,142,1,18,2,A,7,0,A,7,29.4,A,7,18.9,A,7,53,A,7,982,A,7,140,A,7,3.6,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,19:00,268,1322,125,1,13,351,1,9,54,1,13,133,1,13,265,1,9,79,1,13,96,1,21,5,A,7,1,A,7,27.8,A,7,18.3,A,7,56,A,7,982,A,7,140,A,7,2.1,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/15/1981,20:00,40,782,19,1,13,41,1,9,15,1,13,19,1,13,12,1,9,18,1,13,26,1,21,5,A,7,4,A,7,26.1,A,7,18.3,A,7,62,A,7,982,A,7,150,A,7,3.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,25.0,A,7,18.3,A,7,67,A,7,982,A,7,150,A,7,2.6,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,24.4,A,7,17.8,A,7,66,A,7,982,A,7,130,A,7,2.1,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,23.9,A,7,17.2,A,7,66,A,7,983,A,7,140,A,7,2.1,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/15/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,17.2,A,7,66,A,7,982,A,7,130,A,7,2.1,A,7,16100,B,7,1220,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/16/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,16.7,A,7,64,A,7,982,A,7,160,A,7,2.6,A,7,16100,B,7,1070,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/16/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,16.7,A,7,66,A,7,982,A,7,200,A,7,2.1,A,7,16100,B,7,980,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/16/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,17.8,A,7,74,A,7,982,A,7,130,A,7,2.6,A,7,16100,B,7,980,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/16/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,16.1,A,7,66,A,7,983,A,7,280,A,7,5.2,A,7,16100,B,7,980,A,7,2.8,E,8,0.000,?,0,0.00,?,0,20,1,D,9,80,C,8 -07/16/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,19.4,A,7,16.7,A,7,84,A,7,982,A,7,140,A,7,3.6,A,7,11300,B,7,850,A,7,2.9,E,8,0.000,?,0,0.00,?,0,8,1,D,9,80,C,8 -07/16/1981,06:00,61,959,11,1,13,1,1,9,11,1,13,13,1,13,0,1,9,13,1,13,42,1,21,10,A,7,10,A,7,19.4,A,7,17.2,A,7,87,A,7,982,A,7,110,A,7,2.1,A,7,11300,B,7,790,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/16/1981,07:00,303,1322,48,1,13,3,1,9,48,1,13,57,1,13,1,1,9,57,1,13,190,1,21,10,A,7,10,A,7,20.0,A,7,17.2,A,7,84,A,7,982,A,7,140,A,7,2.6,A,7,11300,B,7,790,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/16/1981,08:00,558,1322,125,1,9,10,1,9,120,1,13,144,1,9,7,1,9,141,1,13,501,1,18,10,A,7,10,A,7,20.6,A,7,18.3,A,7,87,A,7,982,A,7,170,A,7,3.1,A,7,11300,B,7,790,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/16/1981,09:00,795,1322,259,1,9,6,1,9,255,1,13,296,1,9,5,1,9,292,1,13,1046,1,18,10,A,7,10,A,7,21.1,A,7,18.9,A,7,87,A,7,982,A,7,170,A,7,3.6,A,7,8000,B,7,520,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,10:00,998,1322,296,1,9,6,1,9,292,1,13,347,1,9,5,1,9,343,1,13,1306,1,18,10,A,7,10,A,7,22.8,A,7,20.0,A,7,84,A,7,982,A,7,190,A,7,2.6,A,7,8000,B,7,430,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,11:00,1152,1322,345,1,9,3,1,9,342,1,13,407,1,9,3,1,9,405,1,13,1538,1,18,10,A,7,10,A,7,23.9,A,7,21.1,A,7,85,A,7,982,A,7,230,A,7,2.1,A,7,6400,B,7,240,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,12:00,1246,1322,374,1,9,5,1,9,369,1,13,445,1,9,5,1,9,440,1,13,1661,1,18,10,A,7,10,A,7,23.9,A,7,21.1,A,7,85,A,7,982,A,7,290,A,7,1.5,A,7,4000,B,7,240,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,13:00,1275,1322,242,1,9,1,1,9,241,1,13,298,1,9,1,1,9,298,1,13,1199,1,18,10,A,7,10,A,7,25.0,A,7,22.8,A,7,88,A,7,982,A,7,210,A,7,2.1,A,7,4000,B,7,210,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,14:00,1237,1322,435,1,9,3,1,9,432,1,13,510,1,9,3,1,9,508,1,13,1843,1,18,10,A,7,10,A,7,26.7,A,7,23.9,A,7,85,A,7,981,A,7,170,A,7,2.6,A,7,3200,B,7,310,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,15:00,1133,1322,399,1,9,1,1,9,398,1,13,464,1,9,1,1,9,464,1,13,1695,1,18,10,A,7,10,A,7,26.7,A,7,23.9,A,7,85,A,7,981,A,7,180,A,7,3.6,A,7,3200,B,7,310,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,16:00,972,1322,376,1,13,179,1,9,243,1,13,415,1,13,194,1,9,272,1,13,715,1,21,8,A,7,7,A,7,28.3,A,7,24.4,A,7,80,A,7,980,A,7,180,A,7,2.6,A,7,3200,B,7,3350,A,7,4.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,17:00,764,1322,195,1,9,8,1,9,190,1,13,226,1,9,6,1,9,223,1,13,830,1,18,10,A,7,10,A,7,27.8,A,7,24.4,A,7,82,A,7,980,A,7,180,A,7,3.6,A,7,3200,B,7,340,A,7,4.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,18:00,523,1322,147,1,9,24,1,9,137,1,13,161,1,9,23,1,9,152,1,13,395,1,18,10,A,7,9,A,7,28.9,A,7,24.4,A,7,77,A,7,980,A,7,220,A,7,2.6,A,7,3200,B,7,370,A,7,4.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,19:00,266,1322,43,1,13,2,1,9,42,1,13,49,1,13,0,1,9,49,1,13,164,1,21,10,A,7,10,A,7,27.8,A,7,24.4,A,7,82,A,7,980,A,7,190,A,7,2.1,A,7,3200,B,7,370,A,7,4.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,20:00,39,760,11,1,13,1,1,9,11,1,13,13,1,13,0,1,9,13,1,13,40,1,21,10,A,7,10,A,7,26.7,A,7,24.4,A,7,88,A,7,980,A,7,160,A,7,2.6,A,7,2400,B,7,700,A,7,4.5,E,8,0.000,F,8,0.00,?,0,130,1,D,9,05,C,8 -07/16/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,24.4,A,7,22.2,A,7,87,A,7,981,A,7,200,A,7,5.2,A,7,4000,B,7,240,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/16/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,21.1,A,7,85,A,7,982,A,7,210,A,7,6.7,A,7,11300,B,7,460,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/16/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,20.6,A,7,87,A,7,981,A,7,0,A,7,0.0,A,7,16100,B,7,2290,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -07/16/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,22.2,A,7,21.1,A,7,93,A,7,981,A,7,0,A,7,0.0,A,7,11300,B,7,7620,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/17/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,21.7,A,7,21.1,A,7,97,A,7,981,A,7,240,A,7,2.1,A,7,11300,B,7,7620,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/17/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,21.7,A,7,97,A,7,981,A,7,0,A,7,0.0,A,7,6400,B,7,90,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/17/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,22.2,A,7,97,A,7,981,A,7,30,A,7,3.1,A,7,200,B,7,30,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/17/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,21.7,A,7,93,A,7,982,A,7,310,A,7,3.6,A,7,2400,B,7,270,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/17/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,22.2,A,7,21.1,A,7,93,A,7,982,A,7,300,A,7,3.6,A,7,800,B,7,180,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/17/1981,06:00,59,937,30,1,13,48,1,9,25,1,13,31,1,13,21,1,9,29,1,13,52,1,21,7,A,7,2,A,7,22.2,A,7,21.1,A,7,93,A,7,982,A,7,50,A,7,2.6,A,7,1600,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/17/1981,07:00,301,1322,41,1,13,7,1,9,40,1,13,49,1,13,2,1,9,49,1,13,163,1,21,10,A,7,10,A,7,22.2,A,7,20.6,A,7,90,A,7,983,A,7,50,A,7,5.2,A,7,1600,B,7,90,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -07/17/1981,08:00,556,1322,301,1,13,443,1,9,114,1,13,323,1,13,431,1,9,142,1,13,221,1,21,8,A,7,4,A,7,23.9,A,7,21.1,A,7,85,A,7,983,A,7,60,A,7,4.1,A,7,3200,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,09:00,794,1322,264,1,9,96,1,9,206,1,13,293,1,9,101,1,9,232,1,13,556,1,18,8,A,7,8,A,7,25.0,A,7,21.1,A,7,79,A,7,983,A,7,30,A,7,5.2,A,7,4000,B,7,310,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,10:00,996,1322,570,1,9,373,1,9,288,1,13,625,1,9,404,1,9,320,1,13,897,1,18,8,A,7,8,A,7,25.6,A,7,21.1,A,7,77,A,7,984,A,7,40,A,7,4.1,A,7,4000,B,7,340,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,11:00,1150,1322,646,1,13,441,1,9,260,1,13,706,1,13,462,1,9,303,1,13,1209,1,21,6,A,7,6,A,7,27.2,A,7,21.1,A,7,69,A,7,984,A,7,20,A,7,4.6,A,7,6400,B,7,460,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,12:00,1245,1322,752,1,13,507,1,9,273,1,13,830,1,13,532,1,9,327,1,13,1908,1,21,6,A,7,6,A,7,27.8,A,7,20.6,A,7,65,A,7,984,A,7,70,A,7,3.6,A,7,6400,B,7,760,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,13:00,1274,1322,741,1,13,439,1,9,316,1,13,808,1,13,460,1,9,364,1,13,2679,1,21,6,A,7,6,A,7,28.9,A,7,20.0,A,7,59,A,7,983,A,7,120,A,7,3.6,A,7,6400,B,7,910,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,14:00,1236,1322,755,1,13,535,1,9,253,1,13,802,1,13,545,1,9,292,1,13,1651,1,21,5,A,7,5,A,7,30.0,A,7,20.6,A,7,57,A,7,983,A,7,70,A,7,3.1,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,15:00,1132,1322,870,1,13,777,1,9,203,1,13,930,1,13,795,1,9,247,1,13,889,1,21,5,A,7,5,A,7,30.6,A,7,20.0,A,7,53,A,7,983,A,7,60,A,7,2.1,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,16:00,971,1322,607,1,13,509,1,9,232,1,13,655,1,13,530,1,9,265,1,13,696,1,21,5,A,7,5,A,7,29.4,A,7,20.0,A,7,57,A,7,982,A,7,60,A,7,3.6,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,17:00,762,1322,502,1,9,659,1,9,120,1,13,532,1,9,664,1,9,148,1,13,281,1,18,2,A,7,2,A,7,30.0,A,7,20.0,A,7,55,A,7,982,A,7,70,A,7,2.6,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,18:00,521,1322,319,1,9,626,1,9,70,1,13,337,1,9,599,1,9,101,1,13,143,1,18,1,A,7,1,A,7,29.4,A,7,19.4,A,7,55,A,7,982,A,7,80,A,7,3.6,A,7,6400,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,19:00,264,1322,114,1,13,219,1,9,70,1,13,120,1,13,164,1,9,88,1,13,132,1,21,3,A,7,3,A,7,27.2,A,7,19.4,A,7,63,A,7,982,A,7,70,A,7,2.6,A,7,6400,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,20:00,38,760,14,1,13,13,1,9,13,1,13,15,1,13,7,1,9,15,1,13,32,1,21,3,A,7,3,A,7,25.6,A,7,19.4,A,7,69,A,7,983,A,7,70,A,7,1.5,A,7,8000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,25.0,A,7,18.9,A,7,69,A,7,984,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,23.9,A,7,19.4,A,7,76,A,7,984,A,7,50,A,7,1.5,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,22.8,A,7,19.4,A,7,82,A,7,984,A,7,50,A,7,1.5,A,7,9700,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/17/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.7,A,7,18.9,A,7,84,A,7,984,A,7,40,A,7,2.1,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/18/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.7,A,7,19.4,A,7,87,A,7,984,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/18/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,21.1,A,7,18.9,A,7,87,A,7,984,A,7,360,A,7,2.1,A,7,11300,B,7,1070,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/18/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,21.1,A,7,19.4,A,7,90,A,7,984,A,7,40,A,7,2.6,A,7,8000,B,7,1070,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/18/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,20.6,A,7,18.9,A,7,90,A,7,984,A,7,0,A,7,0.0,A,7,6400,B,7,1070,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/18/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,20.6,A,7,18.9,A,7,90,A,7,985,A,7,0,A,7,0.0,A,7,6400,B,7,980,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/18/1981,06:00,58,937,19,1,13,19,1,9,17,1,13,20,1,13,9,1,9,20,1,13,35,1,21,2,A,7,2,A,7,19.4,A,7,18.3,A,7,93,A,7,985,A,7,60,A,7,2.6,A,7,3200,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/18/1981,07:00,298,1322,138,1,13,290,1,9,72,1,13,144,1,13,229,1,9,92,1,13,131,1,21,2,A,7,2,A,7,21.1,A,7,19.4,A,7,90,A,7,986,A,7,360,A,7,2.6,A,7,3200,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -07/18/1981,08:00,554,1322,309,1,9,439,1,9,124,1,13,328,1,9,426,1,9,149,1,13,243,1,18,6,A,7,2,A,7,23.3,A,7,20.0,A,7,82,A,7,987,A,7,40,A,7,1.5,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,09:00,792,1322,494,1,9,575,1,9,147,1,13,517,1,9,577,1,9,171,1,13,347,1,18,5,A,7,1,A,7,25.0,A,7,20.0,A,7,74,A,7,987,A,7,90,A,7,2.6,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,10:00,995,1322,685,1,9,621,1,9,216,1,13,717,1,9,627,1,9,244,1,13,666,1,18,6,A,7,2,A,7,27.2,A,7,18.9,A,7,60,A,7,987,A,7,310,A,7,1.5,A,7,4800,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,11:00,1149,1322,821,1,9,643,1,9,260,1,13,863,1,9,650,1,9,296,1,13,1178,1,18,6,A,7,2,A,7,27.8,A,7,19.4,A,7,61,A,7,987,A,7,220,A,7,1.5,A,7,6400,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,12:00,1244,1322,553,1,9,209,1,9,356,1,13,616,1,9,228,1,9,401,1,13,2183,1,18,10,A,7,8,A,7,28.9,A,7,18.3,A,7,53,A,7,987,A,7,0,A,7,0.0,A,7,6400,B,7,1040,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,13:00,1274,1322,925,1,13,648,1,9,299,1,13,975,1,13,655,1,9,343,1,13,2439,1,21,10,A,7,5,A,7,29.4,A,7,18.9,A,7,53,A,7,987,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,14:00,1235,1322,891,1,13,644,1,9,287,1,13,938,1,13,651,1,9,328,1,13,1848,1,21,10,A,7,6,A,7,30.6,A,7,20.0,A,7,53,A,7,986,A,7,340,A,7,3.1,A,7,6400,B,7,7620,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,15:00,1132,1322,494,1,9,160,1,9,357,1,13,547,1,9,171,1,9,401,1,13,1469,1,18,8,A,7,8,A,7,31.1,A,7,20.0,A,7,52,A,7,985,A,7,340,A,7,2.1,A,7,6400,B,7,1070,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,16:00,970,1322,614,1,9,436,1,9,293,1,13,647,1,9,452,1,9,314,1,13,894,1,18,8,A,7,8,A,7,30.0,A,7,20.0,A,7,55,A,7,985,A,7,300,A,7,2.1,A,7,6400,B,7,1130,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,17:00,761,1322,414,1,13,238,1,9,276,1,13,449,1,13,248,1,9,306,1,13,730,1,21,5,A,7,5,A,7,30.6,A,7,20.0,A,7,53,A,7,985,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,18:00,520,1322,256,1,13,230,1,9,165,1,13,271,1,13,226,1,9,182,1,13,350,1,21,6,A,7,6,A,7,29.4,A,7,20.6,A,7,59,A,7,984,A,7,100,A,7,2.1,A,7,4800,B,7,850,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,19:00,263,1322,97,1,13,197,1,9,57,1,13,103,1,13,147,1,9,74,1,13,104,1,21,3,A,7,3,A,7,28.9,A,7,20.0,A,7,59,A,7,985,A,7,70,A,7,1.5,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,20:00,37,738,15,1,13,14,1,9,13,1,13,15,1,13,6,1,9,15,1,13,27,1,21,2,A,7,2,A,7,27.2,A,7,20.0,A,7,65,A,7,985,A,7,160,A,7,2.1,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,26.1,A,7,20.6,A,7,72,A,7,986,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,25.6,A,7,21.1,A,7,77,A,7,987,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,25.6,A,7,21.1,A,7,77,A,7,987,A,7,0,A,7,0.0,A,7,4800,B,7,910,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/18/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,25.0,A,7,20.6,A,7,76,A,7,987,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.9,A,7,21.1,A,7,85,A,7,987,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,23.3,A,7,21.1,A,7,87,A,7,987,A,7,0,A,7,0.0,A,7,4800,B,7,1070,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,21.1,A,7,87,A,7,986,A,7,0,A,7,0.0,A,7,4800,B,7,1070,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,21.1,A,7,87,A,7,986,A,7,0,A,7,0.0,A,7,4800,B,7,910,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,22.8,A,7,20.6,A,7,87,A,7,986,A,7,350,A,7,2.1,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,06:00,56,915,19,1,13,24,1,9,16,1,13,20,1,13,11,1,9,19,1,13,33,1,21,2,A,7,2,A,7,22.8,A,7,20.6,A,7,87,A,7,987,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,07:00,296,1323,136,1,13,312,1,9,66,1,13,143,1,13,246,1,9,88,1,13,119,1,21,2,A,7,0,A,7,23.9,A,7,21.1,A,7,85,A,7,987,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,08:00,552,1323,223,1,13,184,1,9,146,1,13,245,1,13,183,1,9,169,1,13,345,1,21,6,A,7,5,A,7,25.6,A,7,20.6,A,7,74,A,7,988,A,7,190,A,7,2.1,A,7,4800,B,7,3660,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,09:00,790,1323,524,1,13,550,1,9,195,1,13,559,1,13,564,1,9,222,1,13,457,1,21,5,A,7,3,A,7,27.2,A,7,20.6,A,7,67,A,7,988,A,7,200,A,7,2.1,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,10:00,993,1323,683,1,13,567,1,9,256,1,13,733,1,13,590,1,9,288,1,13,805,1,21,4,A,7,4,A,7,28.9,A,7,21.1,A,7,63,A,7,988,A,7,190,A,7,2.1,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,11:00,1148,1323,724,1,13,522,1,9,269,1,13,789,1,13,547,1,9,314,1,13,1242,1,21,5,A,7,4,A,7,30.6,A,7,21.1,A,7,57,A,7,988,A,7,180,A,7,2.6,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,12:00,1243,1323,933,1,13,694,1,9,278,1,13,985,1,13,703,1,9,322,1,13,1873,1,21,5,A,7,5,A,7,31.1,A,7,21.1,A,7,55,A,7,987,A,7,330,A,7,3.1,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,13:00,1273,1323,778,1,13,453,1,9,341,1,13,843,1,13,474,1,9,386,1,13,2851,1,21,7,A,7,6,A,7,31.1,A,7,22.2,A,7,59,A,7,987,A,7,180,A,7,4.6,A,7,4800,B,7,1070,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,14:00,1234,1323,489,1,9,121,1,9,375,1,13,544,1,9,130,1,9,422,1,13,2075,1,18,9,A,7,8,A,7,30.0,A,7,22.2,A,7,63,A,7,987,A,7,160,A,7,5.2,A,7,4800,B,7,1070,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,15:00,1131,1323,436,1,9,79,1,9,368,1,13,481,1,9,81,1,9,412,1,13,1620,1,18,9,A,7,9,A,7,30.0,A,7,22.2,A,7,63,A,7,986,A,7,160,A,7,4.1,A,7,4800,B,7,1070,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,16:00,969,1323,437,1,9,176,1,9,307,1,13,481,1,9,187,1,9,343,1,13,975,1,18,9,A,7,9,A,7,30.6,A,7,22.2,A,7,61,A,7,985,A,7,160,A,7,4.1,A,7,4800,B,7,1070,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,17:00,760,1323,254,1,9,72,1,9,213,1,13,280,1,9,72,1,9,239,1,13,695,1,18,9,A,7,9,A,7,28.9,A,7,22.2,A,7,67,A,7,985,A,7,190,A,7,5.7,A,7,4800,B,7,1220,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,18:00,518,1323,273,1,13,361,1,9,131,1,13,286,1,13,344,1,9,151,1,13,256,1,21,4,A,7,3,A,7,28.3,A,7,20.6,A,7,63,A,7,985,A,7,190,A,7,3.6,A,7,8000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,19:00,261,1323,110,1,13,191,1,9,72,1,13,116,1,13,142,1,9,88,1,13,137,1,21,7,A,7,2,A,7,27.8,A,7,21.7,A,7,69,A,7,985,A,7,170,A,7,2.1,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,20:00,35,738,15,1,13,8,1,9,14,1,13,16,1,13,4,1,9,16,1,13,34,1,21,6,A,7,3,A,7,27.2,A,7,21.1,A,7,69,A,7,985,A,7,190,A,7,2.1,A,7,8000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,26.1,A,7,21.1,A,7,74,A,7,986,A,7,180,A,7,2.6,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,25.6,A,7,21.7,A,7,79,A,7,986,A,7,190,A,7,2.6,A,7,4800,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,25.6,A,7,21.7,A,7,79,A,7,985,A,7,190,A,7,2.6,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/19/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,25.6,A,7,22.2,A,7,82,A,7,985,A,7,180,A,7,2.1,A,7,4800,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,22.2,A,7,85,A,7,984,A,7,170,A,7,3.6,A,7,4800,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,22.2,A,7,85,A,7,984,A,7,190,A,7,3.6,A,7,4800,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,24.4,A,7,22.2,A,7,87,A,7,984,A,7,190,A,7,3.6,A,7,4800,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,24.4,A,7,22.2,A,7,87,A,7,984,A,7,190,A,7,2.6,A,7,4800,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,24.4,A,7,22.2,A,7,87,A,7,984,A,7,190,A,7,2.6,A,7,4800,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,06:00,54,893,11,1,13,1,1,9,11,1,13,13,1,13,0,1,9,13,1,13,41,1,21,10,A,7,10,A,7,24.4,A,7,22.8,A,7,90,A,7,984,A,7,190,A,7,3.6,A,7,3200,B,7,90,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,07:00,293,1323,86,1,13,14,1,9,83,1,13,96,1,13,6,1,9,94,1,13,282,1,21,7,A,7,7,A,7,24.4,A,7,22.8,A,7,90,A,7,984,A,7,190,A,7,3.6,A,7,3200,B,7,120,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,08:00,550,1323,271,1,13,294,1,9,148,1,13,290,1,13,294,1,9,168,1,13,307,1,21,7,A,7,6,A,7,25.6,A,7,23.3,A,7,88,A,7,984,A,7,190,A,7,3.6,A,7,3200,B,7,910,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,09:00,788,1323,507,1,13,588,1,9,155,1,13,529,1,13,588,1,9,178,1,13,361,1,21,3,A,7,3,A,7,27.8,A,7,23.9,A,7,79,A,7,984,A,7,200,A,7,4.1,A,7,6400,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,10:00,992,1323,631,1,9,614,1,9,168,1,13,671,1,9,627,1,9,200,1,13,529,1,18,2,A,7,2,A,7,29.4,A,7,23.9,A,7,72,A,7,983,A,7,190,A,7,4.1,A,7,6400,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,11:00,1147,1323,682,1,13,497,1,9,250,1,13,750,1,13,521,1,9,297,1,13,1145,1,21,5,A,7,5,A,7,31.1,A,7,24.4,A,7,68,A,7,983,A,7,200,A,7,4.6,A,7,6400,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,12:00,1242,1323,804,1,13,463,1,9,368,1,13,861,1,13,484,1,9,405,1,13,2546,1,21,7,A,7,7,A,7,31.7,A,7,23.9,A,7,63,A,7,983,A,7,200,A,7,5.7,A,7,6400,B,7,790,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,13:00,1272,1323,736,1,13,383,1,9,367,1,13,792,1,13,401,1,9,406,1,13,3050,1,21,7,A,7,7,A,7,33.9,A,7,25.0,A,7,60,A,7,982,A,7,180,A,7,5.2,A,7,6400,B,7,790,A,7,4.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,14:00,1233,1323,629,1,9,303,1,9,346,1,13,701,1,9,330,1,9,392,1,13,2007,1,18,9,A,7,9,A,7,33.3,A,7,23.9,A,7,58,A,7,981,A,7,190,A,7,5.2,A,7,6400,B,7,760,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,15:00,1130,1323,228,1,9,111,1,9,133,1,13,269,1,9,122,1,9,165,1,13,509,1,18,10,A,7,10,A,7,22.2,A,7,21.1,A,7,93,A,7,982,A,7,330,A,7,9.3,A,7,1600,B,7,370,A,7,3.7,E,8,0.000,F,8,0.00,?,0,5,1,D,9,95,C,8 -07/20/1981,16:00,968,1323,279,1,9,12,1,9,270,1,13,326,1,9,10,1,9,319,1,13,1216,1,18,10,A,7,10,A,7,23.9,A,7,21.1,A,7,85,A,7,981,A,7,180,A,7,2.1,A,7,11300,B,7,1070,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/20/1981,17:00,758,1323,521,1,13,628,1,9,159,1,13,540,1,13,624,1,9,182,1,13,356,1,21,5,A,7,5,A,7,25.0,A,7,23.3,A,7,91,A,7,979,A,7,180,A,7,3.1,A,7,11300,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/20/1981,18:00,516,1323,291,1,13,424,1,9,125,1,13,307,1,13,404,1,9,148,1,13,242,1,21,8,A,7,4,A,7,27.2,A,7,23.9,A,7,82,A,7,979,A,7,180,A,7,5.7,A,7,11300,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/20/1981,19:00,258,1323,107,1,13,150,1,9,77,1,13,111,1,13,111,1,9,90,1,13,149,1,21,8,A,7,4,A,7,26.1,A,7,21.1,A,7,74,A,7,979,A,7,180,A,7,3.1,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/20/1981,20:00,34,717,18,1,13,24,1,9,16,1,13,19,1,13,9,1,9,19,1,13,33,1,21,8,A,7,2,A,7,24.4,A,7,21.1,A,7,82,A,7,980,A,7,180,A,7,2.1,A,7,8000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,23.9,A,7,21.7,A,7,87,A,7,981,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/20/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,23.9,A,7,21.7,A,7,87,A,7,981,A,7,180,A,7,2.1,A,7,16100,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,3,1,D,9,00,C,8 -07/20/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,22.8,A,7,94,A,7,981,A,7,190,A,7,2.6,A,7,16100,B,7,1070,A,7,4.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/20/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,24.4,A,7,22.8,A,7,90,A,7,979,A,7,190,A,7,3.1,A,7,9700,B,7,1070,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/21/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.3,A,7,22.2,A,7,94,A,7,979,A,7,180,A,7,1.0,A,7,4800,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -07/21/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.3,A,7,21.7,A,7,90,A,7,979,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/21/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.8,A,7,21.1,A,7,90,A,7,979,A,7,190,A,7,2.1,A,7,9700,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/21/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.8,A,7,21.1,A,7,90,A,7,978,A,7,180,A,7,3.1,A,7,9700,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/21/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.2,A,7,21.1,A,7,93,A,7,978,A,7,200,A,7,2.1,A,7,9700,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/21/1981,06:00,52,893,21,1,13,15,1,9,19,1,13,22,1,13,8,1,9,21,1,13,46,1,21,0,A,7,0,A,7,22.8,A,7,21.1,A,7,90,A,7,978,A,7,190,A,7,2.1,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/21/1981,07:00,291,1323,126,1,13,254,1,9,69,1,13,131,1,13,199,1,9,87,1,13,126,1,21,1,A,7,0,A,7,23.3,A,7,21.7,A,7,90,A,7,978,A,7,180,A,7,2.1,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/21/1981,08:00,548,1323,318,1,9,491,1,9,114,1,13,341,1,9,476,1,9,143,1,13,221,1,18,0,A,7,0,A,7,25.6,A,7,22.2,A,7,82,A,7,978,A,7,190,A,7,3.6,A,7,6400,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/21/1981,09:00,786,1323,521,1,9,618,1,9,152,1,13,545,1,9,618,1,9,176,1,13,354,1,18,0,A,7,0,A,7,27.8,A,7,24.4,A,7,82,A,7,978,A,7,190,A,7,3.6,A,7,6400,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/21/1981,10:00,990,1323,707,1,9,700,1,9,181,1,13,749,1,9,713,1,9,214,1,13,564,1,18,0,A,7,0,A,7,28.9,A,7,23.9,A,7,74,A,7,978,A,7,220,A,7,3.1,A,7,6400,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/21/1981,11:00,1145,1323,845,1,9,737,1,9,205,1,13,903,1,9,754,1,9,249,1,13,934,1,18,1,A,7,0,A,7,30.6,A,7,22.8,A,7,63,A,7,978,A,7,340,A,7,3.1,A,7,11300,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,12:00,1241,1323,860,1,9,663,1,9,236,1,13,919,1,9,678,1,9,282,1,13,1583,1,18,3,A,7,2,A,7,31.1,A,7,21.7,A,7,57,A,7,978,A,7,190,A,7,3.6,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,13:00,1271,1323,770,1,13,380,1,9,404,1,13,851,1,13,414,1,9,453,1,13,2888,1,21,7,A,7,5,A,7,32.8,A,7,21.7,A,7,52,A,7,978,A,7,200,A,7,5.2,A,7,11300,B,7,4570,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/21/1981,14:00,1232,1323,897,1,13,654,1,9,286,1,13,945,1,13,661,1,9,327,1,13,1810,1,21,5,A,7,5,A,7,33.9,A,7,20.0,A,7,44,A,7,977,A,7,220,A,7,6.7,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,15:00,1128,1323,675,1,13,436,1,9,301,1,13,725,1,13,456,1,9,336,1,13,1313,1,21,4,A,7,4,A,7,33.9,A,7,20.0,A,7,44,A,7,977,A,7,260,A,7,5.2,A,7,11300,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,16:00,966,1323,616,1,13,488,1,9,258,1,13,657,1,13,507,1,9,286,1,13,773,1,21,3,A,7,3,A,7,33.3,A,7,18.9,A,7,42,A,7,977,A,7,340,A,7,5.2,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,17:00,757,1323,485,1,13,543,1,9,173,1,13,520,1,13,555,1,9,202,1,13,390,1,21,3,A,7,3,A,7,32.8,A,7,17.8,A,7,41,A,7,977,A,7,340,A,7,4.6,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,18:00,514,1323,288,1,9,431,1,9,120,1,13,305,1,9,411,1,9,145,1,13,232,1,18,2,A,7,2,A,7,31.7,A,7,16.7,A,7,41,A,7,977,A,7,330,A,7,4.6,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,19:00,256,1323,102,1,13,196,1,9,63,1,13,107,1,13,145,1,9,79,1,13,117,1,21,2,A,7,2,A,7,30.0,A,7,17.2,A,7,46,A,7,978,A,7,300,A,7,2.6,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/21/1981,20:00,33,695,11,1,13,5,1,9,10,1,13,11,1,13,3,1,9,11,1,13,26,1,21,2,A,7,1,A,7,27.2,A,7,17.2,A,7,54,A,7,979,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,26.7,A,7,17.2,A,7,56,A,7,979,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,26.1,A,7,17.2,A,7,58,A,7,980,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.6,A,7,16.7,A,7,58,A,7,980,A,7,340,A,7,3.1,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/21/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,24.4,A,7,16.7,A,7,62,A,7,980,A,7,350,A,7,2.6,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.9,A,7,16.7,A,7,64,A,7,980,A,7,350,A,7,3.1,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.3,A,7,16.7,A,7,66,A,7,979,A,7,350,A,7,1.5,A,7,24100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.2,A,7,16.7,A,7,71,A,7,979,A,7,330,A,7,2.6,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.1,A,7,16.7,A,7,76,A,7,980,A,7,190,A,7,1.5,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.6,A,7,16.7,A,7,79,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,06:00,50,871,16,1,13,12,1,9,15,1,13,17,1,13,7,1,9,17,1,13,38,1,21,2,A,7,2,A,7,18.9,A,7,16.7,A,7,87,A,7,980,A,7,350,A,7,2.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/22/1981,07:00,288,1323,121,1,13,280,1,9,60,1,13,128,1,13,219,1,9,81,1,13,108,1,21,1,A,7,1,A,7,22.8,A,7,17.8,A,7,74,A,7,981,A,7,20,A,7,1.5,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/22/1981,08:00,545,1323,323,1,9,520,1,9,108,1,13,334,1,9,494,1,9,130,1,13,210,1,18,0,A,7,0,A,7,24.4,A,7,18.3,A,7,69,A,7,982,A,7,10,A,7,3.6,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,09:00,784,1323,529,1,9,646,1,9,144,1,13,555,1,9,648,1,9,170,1,13,337,1,18,0,A,7,0,A,7,26.1,A,7,18.3,A,7,62,A,7,982,A,7,350,A,7,3.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,10:00,989,1323,710,1,9,712,1,9,175,1,13,753,1,9,726,1,9,209,1,13,545,1,18,1,A,7,0,A,7,27.8,A,7,18.3,A,7,56,A,7,983,A,7,360,A,7,4.1,A,7,9700,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/22/1981,11:00,1144,1323,819,1,9,734,1,9,182,1,13,852,1,9,736,1,9,214,1,13,746,1,18,2,A,7,2,A,7,28.9,A,7,18.9,A,7,55,A,7,982,A,7,20,A,7,3.1,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/22/1981,12:00,1240,1323,829,1,13,546,1,9,315,1,13,900,1,13,572,1,9,363,1,13,2137,1,21,4,A,7,4,A,7,28.9,A,7,18.9,A,7,55,A,7,982,A,7,50,A,7,4.1,A,7,9700,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/22/1981,13:00,1270,1323,857,1,13,559,1,9,318,1,13,933,1,13,586,1,9,370,1,13,2587,1,21,5,A,7,4,A,7,30.0,A,7,18.9,A,7,51,A,7,982,A,7,50,A,7,4.1,A,7,9700,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/22/1981,14:00,1231,1323,567,1,13,227,1,9,355,1,13,630,1,13,247,1,9,399,1,13,2041,1,21,6,A,7,6,A,7,31.7,A,7,19.4,A,7,48,A,7,982,A,7,350,A,7,3.1,A,7,9700,B,7,1070,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/22/1981,15:00,1127,1323,547,1,13,225,1,9,354,1,13,599,1,13,244,1,9,391,1,13,1449,1,21,7,A,7,7,A,7,31.7,A,7,18.9,A,7,47,A,7,982,A,7,40,A,7,2.6,A,7,9700,B,7,1070,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/22/1981,16:00,965,1323,413,1,13,106,1,9,335,1,13,454,1,13,109,1,9,375,1,13,1218,1,21,7,A,7,7,A,7,31.1,A,7,18.9,A,7,48,A,7,982,A,7,0,A,7,0.0,A,7,9700,B,7,1070,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/22/1981,17:00,755,1323,447,1,13,420,1,9,206,1,13,470,1,13,428,1,9,226,1,13,471,1,21,6,A,7,6,A,7,31.1,A,7,18.9,A,7,48,A,7,982,A,7,30,A,7,3.1,A,7,9700,B,7,1220,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/22/1981,18:00,512,1323,258,1,13,304,1,9,139,1,13,275,1,13,298,1,9,160,1,13,285,1,21,3,A,7,3,A,7,29.4,A,7,18.9,A,7,53,A,7,982,A,7,50,A,7,3.6,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,19:00,254,1323,108,1,13,247,1,9,60,1,13,112,1,13,182,1,9,77,1,13,109,1,21,0,A,7,0,A,7,28.3,A,7,19.4,A,7,59,A,7,983,A,7,80,A,7,2.1,A,7,19300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,20:00,32,695,12,1,13,9,1,9,11,1,13,13,1,13,5,1,9,12,1,13,28,1,21,1,A,7,1,A,7,26.7,A,7,19.4,A,7,65,A,7,984,A,7,0,A,7,0.0,A,7,19300,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,19.4,A,7,71,A,7,984,A,7,0,A,7,0.0,A,7,19300,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,23.9,A,7,18.9,A,7,74,A,7,985,A,7,350,A,7,3.1,A,7,19300,B,7,1310,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.9,A,7,16.7,A,7,64,A,7,985,A,7,360,A,7,3.1,A,7,19300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/22/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,22.8,A,7,16.1,A,7,66,A,7,986,A,7,10,A,7,2.6,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/23/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,22.2,A,7,16.7,A,7,71,A,7,986,A,7,10,A,7,4.1,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -07/23/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,21.7,A,7,17.2,A,7,76,A,7,986,A,7,20,A,7,2.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/23/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,20.6,A,7,17.2,A,7,81,A,7,986,A,7,10,A,7,2.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/23/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,20.6,A,7,17.2,A,7,81,A,7,987,A,7,30,A,7,2.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/23/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,19.4,A,7,17.8,A,7,90,A,7,987,A,7,40,A,7,2.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/23/1981,06:00,48,849,15,1,13,1,1,9,14,1,13,16,1,13,0,1,9,16,1,13,50,1,21,6,A,7,6,A,7,21.1,A,7,18.3,A,7,84,A,7,987,A,7,40,A,7,3.6,A,7,4800,B,7,270,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/23/1981,07:00,285,1323,97,1,13,104,1,9,74,1,13,106,1,13,84,1,9,87,1,13,160,1,21,3,A,7,2,A,7,21.7,A,7,18.9,A,7,84,A,7,988,A,7,50,A,7,3.6,A,7,4800,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,08:00,543,1323,202,1,13,129,1,9,148,1,13,221,1,13,128,1,9,168,1,13,349,1,21,8,A,7,7,A,7,22.8,A,7,19.4,A,7,82,A,7,989,A,7,70,A,7,5.2,A,7,4800,B,7,790,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,09:00,783,1323,457,1,13,338,1,9,257,1,13,490,1,13,358,1,9,278,1,13,639,1,21,6,A,7,3,A,7,25.0,A,7,20.0,A,7,74,A,7,989,A,7,60,A,7,5.2,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,10:00,987,1323,644,1,13,469,1,9,293,1,13,680,1,13,487,1,9,316,1,13,919,1,21,3,A,7,3,A,7,26.7,A,7,20.0,A,7,67,A,7,988,A,7,80,A,7,4.6,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,11:00,1143,1323,749,1,13,488,1,9,326,1,13,801,1,13,510,1,9,360,1,13,1491,1,21,5,A,7,5,A,7,26.7,A,7,20.0,A,7,67,A,7,989,A,7,90,A,7,4.6,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,12:00,1239,1323,688,1,13,215,1,9,486,1,13,754,1,13,229,1,9,539,1,13,2731,1,21,7,A,7,7,A,7,27.8,A,7,20.0,A,7,63,A,7,989,A,7,60,A,7,3.6,A,7,8000,B,7,910,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,13:00,1269,1323,897,1,13,561,1,9,357,1,13,966,1,13,587,1,9,402,1,13,2888,1,21,4,A,7,4,A,7,28.3,A,7,20.0,A,7,61,A,7,989,A,7,90,A,7,4.6,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,14:00,1230,1323,771,1,13,413,1,9,386,1,13,820,1,13,431,1,9,418,1,13,2506,1,21,5,A,7,5,A,7,29.4,A,7,20.0,A,7,57,A,7,989,A,7,60,A,7,2.6,A,7,8000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,15:00,1126,1323,599,1,13,256,1,9,380,1,13,653,1,13,278,1,9,416,1,13,1563,1,21,6,A,7,6,A,7,28.9,A,7,19.4,A,7,57,A,7,988,A,7,150,A,7,2.1,A,7,8000,B,7,1070,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,16:00,963,1323,676,1,13,539,1,9,282,1,13,714,1,13,559,1,9,306,1,13,847,1,21,6,A,7,6,A,7,28.9,A,7,19.4,A,7,57,A,7,988,A,7,120,A,7,2.6,A,7,8000,B,7,1070,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,17:00,753,1323,364,1,13,217,1,9,240,1,13,398,1,13,226,1,9,269,1,13,631,1,21,6,A,7,6,A,7,28.3,A,7,19.4,A,7,59,A,7,988,A,7,90,A,7,2.6,A,7,8000,B,7,1070,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,18:00,510,1323,221,1,13,171,1,9,155,1,13,241,1,13,167,1,9,176,1,13,360,1,21,6,A,7,6,A,7,28.3,A,7,18.9,A,7,57,A,7,988,A,7,120,A,7,2.1,A,7,8000,B,7,1220,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/23/1981,19:00,251,1323,79,1,13,51,1,9,69,1,13,86,1,13,41,1,9,78,1,13,171,1,21,10,A,7,3,A,7,27.8,A,7,19.4,A,7,61,A,7,988,A,7,80,A,7,2.1,A,7,8000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -07/23/1981,20:00,30,673,7,1,13,1,1,9,7,1,13,8,1,13,0,1,9,8,1,13,27,1,21,3,A,7,2,A,7,25.0,A,7,19.4,A,7,71,A,7,988,A,7,50,A,7,2.6,A,7,12900,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/23/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,25.0,A,7,19.4,A,7,71,A,7,988,A,7,60,A,7,2.1,A,7,12900,B,7,77777,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/23/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,25.0,A,7,18.9,A,7,69,A,7,989,A,7,170,A,7,3.1,A,7,16100,B,7,77777,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/23/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,25.6,A,7,18.9,A,7,67,A,7,989,A,7,90,A,7,3.1,A,7,16100,B,7,1070,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/23/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,24.4,A,7,18.9,A,7,71,A,7,989,A,7,190,A,7,2.6,A,7,11300,B,7,1830,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/24/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,19.4,A,7,76,A,7,989,A,7,0,A,7,0.0,A,7,11300,B,7,1680,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/24/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,20.6,A,7,84,A,7,989,A,7,190,A,7,1.5,A,7,6400,B,7,310,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.9,A,7,21.1,A,7,85,A,7,989,A,7,0,A,7,0.0,A,7,4800,B,7,310,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,21.1,A,7,93,A,7,989,A,7,340,A,7,2.6,A,7,2400,B,7,120,A,7,3.7,E,8,0.000,?,0,0.00,?,0,30,1,D,9,45,C,8 -07/24/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,2400,B,7,150,A,7,3.7,E,8,0.000,?,0,0.00,?,0,58,1,D,9,45,C,8 -07/24/1981,06:00,47,827,3,1,13,2,1,9,3,1,13,3,1,13,1,1,9,3,1,13,8,1,21,10,A,7,10,A,7,22.2,A,7,21.1,A,7,93,A,7,990,A,7,0,A,7,0.0,A,7,1300,B,7,150,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,07:00,283,1324,39,1,13,2,1,9,38,1,13,45,1,13,0,1,9,45,1,13,153,1,21,10,A,7,10,A,7,23.3,A,7,21.1,A,7,87,A,7,990,A,7,120,A,7,1.5,A,7,1600,B,7,90,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,08:00,541,1324,137,1,9,12,1,9,132,1,13,157,1,9,8,1,9,153,1,13,530,1,18,10,A,7,10,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,120,A,7,2.6,A,7,1600,B,7,120,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,09:00,781,1324,292,1,9,7,1,9,288,1,13,330,1,9,7,1,9,326,1,13,1113,1,18,10,A,7,10,A,7,23.3,A,7,22.2,A,7,94,A,7,990,A,7,150,A,7,2.6,A,7,2400,B,7,90,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,10:00,986,1324,281,1,9,4,1,9,278,1,13,329,1,9,4,1,9,326,1,13,1253,1,18,10,A,7,10,A,7,23.9,A,7,22.8,A,7,94,A,7,990,A,7,140,A,7,3.6,A,7,4800,B,7,180,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,11:00,1141,1324,420,1,9,5,1,9,416,1,13,488,1,9,5,1,9,484,1,13,1746,1,18,10,A,7,10,A,7,25.0,A,7,22.2,A,7,85,A,7,990,A,7,150,A,7,2.6,A,7,4800,B,7,270,A,7,4.0,E,8,0.000,F,8,0.00,?,0,74,1,D,9,05,C,8 -07/24/1981,12:00,1238,1324,235,1,9,3,1,9,232,1,13,289,1,9,2,1,9,287,1,13,1155,1,18,10,A,7,10,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,160,A,7,1.5,A,7,6400,B,7,370,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,13:00,1267,1324,974,1,13,714,1,9,288,1,13,1029,1,13,723,1,9,335,1,13,2234,1,21,7,A,7,7,A,7,26.7,A,7,23.9,A,7,85,A,7,989,A,7,140,A,7,4.1,A,7,6400,B,7,1220,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/24/1981,14:00,1229,1324,602,1,13,292,1,9,330,1,13,672,1,13,318,1,9,376,1,13,1865,1,21,7,A,7,7,A,7,28.3,A,7,24.4,A,7,80,A,7,989,A,7,140,A,7,3.6,A,7,8000,B,7,370,A,7,4.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/24/1981,15:00,1125,1324,495,1,9,322,1,9,220,1,13,549,1,9,338,1,9,261,1,13,934,1,18,9,A,7,9,A,7,28.3,A,7,23.9,A,7,77,A,7,988,A,7,130,A,7,4.1,A,7,8000,B,7,1220,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/24/1981,16:00,962,1324,407,1,9,187,1,9,271,1,13,452,1,9,199,1,9,307,1,13,853,1,18,9,A,7,9,A,7,27.8,A,7,22.8,A,7,74,A,7,988,A,7,60,A,7,4.1,A,7,8000,B,7,1220,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/24/1981,17:00,752,1324,480,1,13,657,1,9,105,1,13,512,1,13,664,1,9,135,1,13,247,1,21,6,A,7,6,A,7,27.2,A,7,21.1,A,7,69,A,7,988,A,7,90,A,7,4.1,A,7,11300,B,7,1220,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/24/1981,18:00,508,1324,163,1,9,85,1,9,130,1,13,179,1,9,83,1,9,147,1,13,302,1,18,8,A,7,8,A,7,25.6,A,7,20.0,A,7,71,A,7,988,A,7,140,A,7,3.6,A,7,11300,B,7,760,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/24/1981,19:00,249,1324,71,1,13,37,1,9,64,1,13,78,1,13,29,1,9,72,1,13,161,1,21,9,A,7,9,A,7,25.6,A,7,21.1,A,7,77,A,7,988,A,7,120,A,7,3.1,A,7,8000,B,7,640,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/24/1981,20:00,29,651,4,1,13,1,1,9,4,1,13,5,1,13,0,1,9,5,1,13,16,1,21,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,989,A,7,350,A,7,15.4,A,7,1600,B,7,310,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/24/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,21.1,A,7,90,A,7,989,A,7,140,A,7,3.6,A,7,6400,B,7,610,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,21.7,A,7,93,A,7,989,A,7,80,A,7,2.6,A,7,6400,B,7,120,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/24/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,21.7,A,7,90,A,7,990,A,7,160,A,7,2.6,A,7,6400,B,7,120,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/24/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,150,A,7,1.5,A,7,6400,B,7,120,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,21.1,A,7,90,A,7,989,A,7,0,A,7,0.0,A,7,4800,B,7,120,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -07/25/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,23.3,A,7,21.7,A,7,90,A,7,989,A,7,50,A,7,1.5,A,7,4000,B,7,120,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.8,A,7,21.7,A,7,93,A,7,989,A,7,0,A,7,0.0,A,7,2400,B,7,30,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,21.7,A,7,97,A,7,989,A,7,30,A,7,1.5,A,7,2400,B,7,30,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,21.1,A,7,93,A,7,989,A,7,30,A,7,1.5,A,7,2400,B,7,30,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,06:00,45,827,12,1,13,1,1,9,12,1,13,14,1,13,0,1,9,14,1,13,44,1,21,10,A,7,10,A,7,22.2,A,7,21.1,A,7,93,A,7,989,A,7,70,A,7,1.5,A,7,1300,B,7,0,A,7,3.7,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -07/25/1981,07:00,280,1324,32,1,13,6,1,9,31,1,13,39,1,13,1,1,9,38,1,13,128,1,21,10,A,7,10,A,7,22.2,A,7,21.7,A,7,97,A,7,990,A,7,70,A,7,2.6,A,7,200,B,7,0,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,08:00,538,1324,139,1,9,8,1,9,136,1,13,159,1,9,6,1,9,157,1,13,540,1,18,10,A,7,10,A,7,22.2,A,7,21.1,A,7,93,A,7,990,A,7,40,A,7,2.1,A,7,400,B,7,30,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,09:00,779,1324,292,1,9,6,1,9,289,1,13,330,1,9,6,1,9,327,1,13,1113,1,18,10,A,7,10,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,10,A,7,2.1,A,7,400,B,7,30,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,10:00,984,1324,298,1,9,2,1,9,297,1,13,348,1,9,2,1,9,346,1,13,1312,1,18,10,A,7,10,A,7,22.2,A,7,21.1,A,7,93,A,7,991,A,7,10,A,7,3.1,A,7,1600,B,7,30,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,11:00,1140,1324,351,1,9,4,1,9,348,1,13,414,1,9,4,1,9,411,1,13,1552,1,18,10,A,7,10,A,7,22.8,A,7,21.1,A,7,90,A,7,991,A,7,20,A,7,2.6,A,7,2400,B,7,90,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/25/1981,12:00,1236,1324,392,1,9,0,1,9,392,1,13,463,1,9,0,1,9,463,1,13,1727,1,18,10,A,7,10,A,7,25.0,A,7,21.7,A,7,82,A,7,991,A,7,20,A,7,1.0,A,7,3200,B,7,370,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/25/1981,13:00,1266,1324,594,1,9,104,1,9,494,1,13,656,1,9,108,1,9,552,1,13,2830,1,18,9,A,7,9,A,7,26.1,A,7,22.2,A,7,79,A,7,990,A,7,40,A,7,1.5,A,7,4800,B,7,610,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/25/1981,14:00,1228,1324,515,1,9,133,1,9,392,1,13,572,1,9,142,1,9,440,1,13,2106,1,18,9,A,7,9,A,7,27.2,A,7,22.2,A,7,74,A,7,990,A,7,10,A,7,1.5,A,7,4800,B,7,730,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/25/1981,15:00,1123,1324,314,1,9,2,1,9,312,1,13,372,1,9,2,1,9,370,1,13,1429,1,18,10,A,7,10,A,7,27.8,A,7,21.7,A,7,69,A,7,990,A,7,340,A,7,1.5,A,7,4800,B,7,760,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/25/1981,16:00,960,1324,655,1,9,694,1,9,149,1,13,700,1,9,711,1,9,184,1,13,447,1,18,3,A,7,2,A,7,28.9,A,7,21.7,A,7,65,A,7,990,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/25/1981,17:00,750,1324,484,1,9,538,1,9,178,1,13,516,1,9,549,1,9,205,1,13,400,1,18,7,A,7,2,A,7,28.9,A,7,21.7,A,7,65,A,7,989,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/25/1981,18:00,506,1324,286,1,9,475,1,9,103,1,13,305,1,9,452,1,9,133,1,13,195,1,18,4,A,7,2,A,7,28.9,A,7,21.7,A,7,65,A,7,989,A,7,20,A,7,2.1,A,7,11300,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/25/1981,19:00,246,1324,103,1,13,225,1,9,61,1,13,107,1,13,163,1,9,77,1,13,111,1,21,4,A,7,2,A,7,27.8,A,7,21.7,A,7,69,A,7,989,A,7,20,A,7,2.1,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/25/1981,20:00,27,651,14,1,13,19,1,9,11,1,13,13,1,13,7,1,9,13,1,13,23,1,21,4,A,7,3,A,7,26.1,A,7,21.7,A,7,77,A,7,989,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/25/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,25.6,A,7,21.7,A,7,79,A,7,990,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/25/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,23.9,A,7,21.1,A,7,85,A,7,990,A,7,20,A,7,1.5,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/25/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,23.3,A,7,21.1,A,7,87,A,7,991,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/25/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,23.3,A,7,21.7,A,7,90,A,7,991,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/26/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/26/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/26/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/26/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,3.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/26/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,21.7,A,7,20.6,A,7,93,A,7,990,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/26/1981,06:00,43,806,19,1,13,56,1,9,14,1,13,19,1,13,18,1,9,18,1,13,23,1,21,2,A,7,2,A,7,21.7,A,7,20.6,A,7,93,A,7,991,A,7,0,A,7,0.0,A,7,3200,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/26/1981,07:00,277,1324,74,1,13,44,1,9,65,1,13,81,1,13,36,1,9,74,1,13,169,1,21,8,A,7,8,A,7,22.2,A,7,21.7,A,7,97,A,7,991,A,7,20,A,7,1.5,A,7,3200,B,7,910,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -07/26/1981,08:00,536,1324,260,1,13,352,1,9,117,1,13,277,1,13,339,1,9,140,1,13,226,1,21,3,A,7,3,A,7,25.6,A,7,22.8,A,7,85,A,7,991,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,09:00,777,1324,524,1,9,724,1,9,97,1,13,552,1,9,722,1,9,127,1,13,226,1,18,3,A,7,1,A,7,27.2,A,7,23.3,A,7,79,A,7,991,A,7,130,A,7,1.5,A,7,6400,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,10:00,982,1324,518,1,13,398,1,9,222,1,13,563,1,13,415,1,9,254,1,13,676,1,21,7,A,7,6,A,7,28.3,A,7,23.3,A,7,74,A,7,991,A,7,180,A,7,2.6,A,7,4800,B,7,760,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,11:00,1139,1324,727,1,9,516,1,9,281,1,13,788,1,9,540,1,9,322,1,13,1256,1,18,10,A,7,8,A,7,29.4,A,7,23.9,A,7,72,A,7,991,A,7,220,A,7,2.6,A,7,4800,B,7,6710,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,12:00,1235,1324,859,1,13,646,1,9,254,1,13,912,1,13,658,1,9,297,1,13,1634,1,21,10,A,7,5,A,7,30.6,A,7,23.9,A,7,68,A,7,991,A,7,220,A,7,3.1,A,7,4800,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,13:00,1265,1324,761,1,13,511,1,9,271,1,13,807,1,13,519,1,9,310,1,13,2069,1,21,7,A,7,4,A,7,31.1,A,7,23.9,A,7,65,A,7,990,A,7,210,A,7,2.6,A,7,4800,B,7,7620,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,14:00,1226,1324,783,1,13,475,1,9,342,1,13,843,1,13,497,1,9,382,1,13,2163,1,21,6,A,7,6,A,7,32.2,A,7,22.8,A,7,57,A,7,990,A,7,200,A,7,2.1,A,7,6400,B,7,1070,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,15:00,1122,1324,762,1,13,625,1,9,230,1,13,805,1,13,635,1,9,265,1,13,961,1,21,3,A,7,3,A,7,32.8,A,7,22.8,A,7,56,A,7,990,A,7,230,A,7,2.6,A,7,9700,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,16:00,959,1324,665,1,13,680,1,9,170,1,13,704,1,13,692,1,9,202,1,13,502,1,21,4,A,7,4,A,7,33.3,A,7,22.8,A,7,54,A,7,989,A,7,180,A,7,2.6,A,7,9700,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,17:00,748,1324,505,1,9,718,1,9,97,1,13,529,1,9,713,1,9,125,1,13,218,1,18,2,A,7,2,A,7,32.8,A,7,23.9,A,7,60,A,7,989,A,7,180,A,7,2.6,A,7,9700,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,18:00,503,1324,294,1,9,575,1,9,74,1,13,309,1,9,544,1,9,102,1,13,148,1,18,3,A,7,1,A,7,31.7,A,7,23.9,A,7,63,A,7,989,A,7,210,A,7,2.6,A,7,9700,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,19:00,243,1324,108,1,13,262,1,9,59,1,13,112,1,13,188,1,9,77,1,13,107,1,21,6,A,7,4,A,7,30.0,A,7,23.3,A,7,68,A,7,989,A,7,220,A,7,2.1,A,7,8000,B,7,7620,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,20:00,26,629,16,1,13,20,1,9,14,1,13,17,1,13,7,1,9,16,1,13,29,1,21,4,A,7,2,A,7,28.9,A,7,23.3,A,7,72,A,7,990,A,7,200,A,7,2.1,A,7,8000,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,28.3,A,7,23.3,A,7,74,A,7,990,A,7,210,A,7,2.1,A,7,9700,B,7,77777,A,7,4.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,27.8,A,7,23.3,A,7,77,A,7,990,A,7,220,A,7,2.6,A,7,9700,B,7,77777,A,7,4.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,27.2,A,7,23.3,A,7,79,A,7,990,A,7,240,A,7,2.1,A,7,9700,B,7,77777,A,7,4.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/26/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,25.6,A,7,22.2,A,7,82,A,7,990,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,4.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,25.0,A,7,21.7,A,7,82,A,7,990,A,7,200,A,7,1.5,A,7,24100,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -07/27/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,24.4,A,7,21.7,A,7,85,A,7,989,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/27/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,24.4,A,7,21.7,A,7,85,A,7,989,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,3.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/27/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,23.3,A,7,21.7,A,7,90,A,7,990,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/27/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,23.9,A,7,21.7,A,7,87,A,7,990,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,3.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/27/1981,06:00,41,784,17,1,13,5,1,9,17,1,13,20,1,13,0,1,9,20,1,13,58,1,21,8,A,7,2,A,7,22.8,A,7,21.1,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,07:00,275,1324,102,1,13,106,1,9,80,1,13,111,1,13,84,1,9,93,1,13,173,1,21,9,A,7,2,A,7,25.0,A,7,22.2,A,7,85,A,7,990,A,7,270,A,7,2.1,A,7,6400,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,08:00,534,1324,267,1,13,279,1,9,154,1,13,285,1,13,276,1,9,173,1,13,322,1,21,8,A,7,3,A,7,27.8,A,7,23.3,A,7,77,A,7,991,A,7,230,A,7,2.1,A,7,6400,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,09:00,775,1324,487,1,9,598,1,9,136,1,13,513,1,9,600,1,9,161,1,13,317,1,18,1,A,7,1,A,7,30.0,A,7,23.9,A,7,70,A,7,991,A,7,270,A,7,1.5,A,7,6400,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,10:00,981,1324,671,1,9,650,1,9,189,1,13,709,1,9,660,1,9,219,1,13,574,1,18,2,A,7,1,A,7,31.7,A,7,23.9,A,7,63,A,7,991,A,7,310,A,7,2.6,A,7,6400,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,11:00,1137,1324,783,1,9,646,1,9,226,1,13,830,1,9,658,1,9,264,1,13,991,1,18,4,A,7,1,A,7,32.8,A,7,23.9,A,7,60,A,7,991,A,7,320,A,7,3.1,A,7,8000,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,12:00,1234,1324,881,1,9,723,1,9,204,1,13,949,1,9,743,1,9,255,1,13,1318,1,18,3,A,7,1,A,7,31.7,A,7,21.7,A,7,55,A,7,991,A,7,310,A,7,3.1,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,13:00,1264,1324,888,1,9,710,1,9,207,1,13,958,1,9,731,1,9,260,1,13,1584,1,18,3,A,7,2,A,7,32.8,A,7,21.7,A,7,52,A,7,991,A,7,330,A,7,1.5,A,7,9700,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,14:00,1225,1324,865,1,13,569,1,9,337,1,13,932,1,13,595,1,9,380,1,13,2114,1,21,5,A,7,3,A,7,32.8,A,7,21.7,A,7,52,A,7,991,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,15:00,1120,1324,764,1,13,611,1,9,244,1,13,803,1,13,619,1,9,278,1,13,1009,1,21,4,A,7,4,A,7,33.3,A,7,21.1,A,7,49,A,7,990,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,16:00,957,1324,643,1,13,538,1,9,252,1,13,685,1,13,559,1,9,281,1,13,741,1,21,3,A,7,3,A,7,33.3,A,7,21.7,A,7,50,A,7,990,A,7,0,A,7,0.0,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,17:00,745,1324,399,1,9,384,1,9,181,1,13,424,1,9,391,1,9,203,1,13,406,1,18,2,A,7,2,A,7,33.3,A,7,21.7,A,7,50,A,7,989,A,7,250,A,7,2.1,A,7,9700,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,18:00,501,1324,198,1,9,93,1,9,163,1,13,217,1,9,89,1,9,184,1,13,443,1,18,8,A,7,8,A,7,31.7,A,7,21.1,A,7,54,A,7,989,A,7,180,A,7,2.1,A,7,9700,B,7,1520,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/27/1981,19:00,240,1324,42,1,13,14,1,9,40,1,13,47,1,13,11,1,9,45,1,13,107,1,21,9,A,7,9,A,7,27.8,A,7,17.8,A,7,55,A,7,989,A,7,90,A,7,3.1,A,7,11300,B,7,1220,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,17,C,8 -07/27/1981,20:00,25,607,7,1,13,0,1,9,7,1,13,8,1,13,0,1,9,8,1,13,26,1,21,10,A,7,10,A,7,22.8,A,7,18.9,A,7,79,A,7,990,A,7,80,A,7,2.1,A,7,11300,B,7,1220,A,7,3.3,E,8,0.000,F,8,0.00,?,0,3,1,D,9,80,C,8 -07/27/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,22.2,A,7,18.9,A,7,82,A,7,991,A,7,50,A,7,1.5,A,7,11300,B,7,1220,A,7,3.3,E,8,0.000,?,0,0.00,?,0,150,1,D,9,80,C,8 -07/27/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,18.9,A,7,87,A,7,993,A,7,270,A,7,1.5,A,7,8000,B,7,1220,A,7,3.3,E,8,0.000,?,0,0.00,?,0,38,1,D,9,81,C,8 -07/27/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.7,A,7,16.1,A,7,71,A,7,991,A,7,190,A,7,5.2,A,7,11300,B,7,1220,A,7,2.8,E,8,0.000,?,0,0.00,?,0,3,1,D,9,80,C,8 -07/27/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,16.7,A,7,76,A,7,991,A,7,160,A,7,4.1,A,7,16100,B,7,1220,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,95,C,8 -07/28/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,20.6,A,7,17.2,A,7,81,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,1830,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,29,C,8 -07/28/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,20.0,A,7,17.2,A,7,84,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/28/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,20.6,A,7,17.8,A,7,84,A,7,989,A,7,270,A,7,2.1,A,7,24100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/28/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.0,A,7,17.8,A,7,87,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/28/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,20.0,A,7,17.8,A,7,87,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,3050,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/28/1981,06:00,40,762,11,1,13,1,1,9,11,1,13,13,1,13,0,1,9,13,1,13,40,1,21,7,A,7,7,A,7,20.6,A,7,18.3,A,7,87,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,3050,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/28/1981,07:00,272,1325,101,1,13,161,1,9,68,1,13,107,1,13,122,1,9,82,1,13,127,1,21,3,A,7,2,A,7,21.1,A,7,18.3,A,7,84,A,7,990,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/28/1981,08:00,531,1325,287,1,9,367,1,9,139,1,13,300,1,9,352,1,9,158,1,13,274,1,18,2,A,7,2,A,7,23.9,A,7,19.4,A,7,76,A,7,990,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/28/1981,09:00,773,1325,407,1,9,364,1,9,194,1,13,433,1,9,372,1,9,215,1,13,447,1,18,2,A,7,2,A,7,25.6,A,7,21.1,A,7,77,A,7,990,A,7,210,A,7,2.1,A,7,6400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/28/1981,10:00,979,1325,619,1,9,562,1,9,202,1,13,650,1,9,569,1,9,229,1,13,606,1,18,0,A,7,0,A,7,27.2,A,7,21.7,A,7,72,A,7,990,A,7,180,A,7,2.6,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/28/1981,11:00,1136,1325,829,1,9,701,1,9,225,1,13,878,1,9,714,1,9,265,1,13,981,1,18,0,A,7,0,A,7,29.4,A,7,22.8,A,7,67,A,7,989,A,7,200,A,7,3.1,A,7,6400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/28/1981,12:00,1232,1325,911,1,9,720,1,9,238,1,13,971,1,9,735,1,9,285,1,13,1513,1,18,0,A,7,0,A,7,31.1,A,7,23.3,A,7,63,A,7,989,A,7,190,A,7,3.1,A,7,8000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/28/1981,13:00,1262,1325,896,1,9,614,1,9,309,1,13,941,1,9,619,1,9,350,1,13,2295,1,18,2,A,7,2,A,7,32.2,A,7,22.8,A,7,57,A,7,988,A,7,190,A,7,3.1,A,7,8000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/28/1981,14:00,1224,1325,785,1,9,527,1,9,296,1,13,856,1,9,552,1,9,345,1,13,1834,1,18,2,A,7,2,A,7,32.2,A,7,23.3,A,7,59,A,7,987,A,7,180,A,7,3.6,A,7,8000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/28/1981,15:00,1119,1325,758,1,13,532,1,9,307,1,13,812,1,13,556,1,9,342,1,13,1298,1,21,5,A,7,5,A,7,32.2,A,7,22.8,A,7,57,A,7,986,A,7,180,A,7,3.6,A,7,8000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -07/28/1981,16:00,955,1325,514,1,13,312,1,9,289,1,13,561,1,13,337,1,9,317,1,13,851,1,21,6,A,7,6,A,7,30.6,A,7,22.8,A,7,63,A,7,985,A,7,190,A,7,5.2,A,7,8000,B,7,2130,A,7,4.1,E,8,0.000,F,8,0.00,?,0,89,1,D,9,05,C,8 -07/28/1981,17:00,743,1325,109,1,9,7,1,9,105,1,13,132,1,9,5,1,9,130,1,13,505,1,18,10,A,7,10,A,7,29.4,A,7,21.7,A,7,63,A,7,985,A,7,300,A,7,4.1,A,7,8000,B,7,1070,A,7,3.8,E,8,0.000,F,8,0.00,?,0,300,1,D,9,05,C,8 -07/28/1981,18:00,498,1325,56,1,9,5,1,9,55,1,13,69,1,9,3,1,9,68,1,13,249,1,18,10,A,7,10,A,7,22.2,A,7,18.3,A,7,79,A,7,986,A,7,360,A,7,2.6,A,7,6400,B,7,910,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/28/1981,19:00,237,1325,31,1,13,3,1,9,30,1,13,36,1,13,0,1,9,36,1,13,119,1,21,10,A,7,10,A,7,21.7,A,7,18.9,A,7,84,A,7,986,A,7,130,A,7,2.6,A,7,6400,B,7,910,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/28/1981,20:00,23,585,9,1,13,0,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,21.1,A,7,18.9,A,7,87,A,7,985,A,7,180,A,7,2.1,A,7,3200,B,7,910,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -07/28/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,18.9,A,7,87,A,7,986,A,7,200,A,7,2.1,A,7,3200,B,7,910,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/28/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,21.1,A,7,18.9,A,7,87,A,7,986,A,7,300,A,7,2.1,A,7,3200,B,7,3660,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/28/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.7,A,7,19.4,A,7,87,A,7,986,A,7,190,A,7,2.1,A,7,6400,B,7,3660,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -07/28/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,6,A,7,21.7,A,7,19.4,A,7,87,A,7,986,A,7,0,A,7,0.0,A,7,16100,B,7,3660,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.7,A,7,19.4,A,7,87,A,7,985,A,7,210,A,7,2.1,A,7,16100,B,7,1830,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -07/29/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.7,A,7,19.4,A,7,87,A,7,984,A,7,0,A,7,0.0,A,7,16100,B,7,1520,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,18.9,A,7,87,A,7,984,A,7,230,A,7,2.6,A,7,16100,B,7,1520,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.7,A,7,18.9,A,7,84,A,7,984,A,7,240,A,7,2.1,A,7,16100,B,7,1520,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,80,C,8 -07/29/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,21.7,A,7,18.9,A,7,84,A,7,984,A,7,260,A,7,4.1,A,7,16100,B,7,1520,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,06:00,38,762,14,1,13,12,1,9,13,1,13,15,1,13,6,1,9,15,1,13,33,1,21,9,A,7,9,A,7,21.7,A,7,18.9,A,7,84,A,7,984,A,7,260,A,7,3.6,A,7,16100,B,7,1520,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,07:00,269,1325,58,1,13,34,1,9,51,1,13,64,1,13,27,1,9,58,1,13,136,1,21,9,A,7,9,A,7,21.7,A,7,19.4,A,7,87,A,7,984,A,7,220,A,7,2.1,A,7,16100,B,7,1830,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/29/1981,08:00,529,1325,143,1,9,1,1,9,143,1,13,163,1,9,1,1,9,163,1,13,554,1,18,9,A,7,9,A,7,22.8,A,7,20.0,A,7,84,A,7,984,A,7,260,A,7,2.6,A,7,11300,B,7,1830,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,09:00,771,1325,288,1,9,70,1,9,247,1,13,317,1,9,71,1,9,275,1,13,790,1,18,8,A,7,8,A,7,24.4,A,7,20.6,A,7,79,A,7,985,A,7,260,A,7,3.6,A,7,16100,B,7,1830,A,7,3.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,10:00,977,1325,641,1,13,556,1,9,230,1,13,693,1,13,579,1,9,265,1,13,695,1,21,6,A,7,6,A,7,26.7,A,7,21.7,A,7,74,A,7,985,A,7,260,A,7,4.1,A,7,16100,B,7,4270,A,7,3.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,11:00,1134,1325,676,1,13,544,1,9,208,1,13,720,1,13,556,1,9,243,1,13,908,1,21,6,A,7,5,A,7,27.8,A,7,21.1,A,7,67,A,7,985,A,7,300,A,7,6.2,A,7,16100,B,7,3660,A,7,3.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,12:00,1231,1325,647,1,9,276,1,9,389,1,13,713,1,9,300,1,9,433,1,13,2236,1,18,8,A,7,8,A,7,27.8,A,7,19.4,A,7,61,A,7,985,A,7,330,A,7,4.1,A,7,16100,B,7,580,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,13:00,1261,1325,844,1,13,597,1,9,274,1,13,894,1,13,606,1,9,316,1,13,2028,1,21,7,A,7,5,A,7,29.4,A,7,19.4,A,7,55,A,7,984,A,7,330,A,7,3.6,A,7,16100,B,7,7620,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/29/1981,14:00,1222,1325,861,1,13,697,1,9,215,1,13,923,1,13,715,1,9,262,1,13,1306,1,21,5,A,7,3,A,7,30.6,A,7,18.3,A,7,48,A,7,984,A,7,280,A,7,4.6,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,15:00,1117,1325,771,1,13,683,1,9,192,1,13,824,1,13,700,1,9,232,1,13,802,1,21,5,A,7,4,A,7,30.6,A,7,17.8,A,7,46,A,7,983,A,7,340,A,7,4.1,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,16:00,953,1325,631,1,13,635,1,9,173,1,13,668,1,13,646,1,9,203,1,13,504,1,21,7,A,7,3,A,7,31.1,A,7,17.2,A,7,43,A,7,983,A,7,310,A,7,5.2,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,17:00,741,1325,488,1,9,611,1,9,144,1,13,508,1,9,608,1,9,168,1,13,321,1,18,7,A,7,2,A,7,29.4,A,7,17.2,A,7,48,A,7,983,A,7,340,A,7,2.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,18:00,496,1325,283,1,13,399,1,9,132,1,13,293,1,13,376,1,9,153,1,13,257,1,21,6,A,7,3,A,7,28.9,A,7,17.8,A,7,51,A,7,983,A,7,360,A,7,3.6,A,7,11300,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,19:00,234,1325,94,1,13,146,1,9,67,1,13,98,1,13,102,1,9,79,1,13,128,1,21,7,A,7,4,A,7,26.1,A,7,17.8,A,7,60,A,7,983,A,7,20,A,7,3.1,A,7,11300,B,7,7620,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,20:00,22,563,9,1,13,2,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,7,A,7,6,A,7,25.0,A,7,17.2,A,7,62,A,7,984,A,7,30,A,7,4.1,A,7,11300,B,7,1520,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,3,A,7,22.8,A,7,15.0,A,7,62,A,7,985,A,7,30,A,7,6.2,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,20.6,A,7,13.3,A,7,63,A,7,987,A,7,40,A,7,6.2,A,7,11300,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,5,A,7,19.4,A,7,12.2,A,7,63,A,7,987,A,7,40,A,7,6.2,A,7,11300,B,7,7620,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/29/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,18.3,A,7,11.7,A,7,65,A,7,987,A,7,10,A,7,4.6,A,7,19300,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,11.1,A,7,70,A,7,987,A,7,30,A,7,5.7,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -07/30/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,16.1,A,7,11.7,A,7,75,A,7,987,A,7,40,A,7,4.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.1,A,7,11.1,A,7,72,A,7,987,A,7,30,A,7,4.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,11.1,A,7,78,A,7,988,A,7,40,A,7,6.2,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,15.6,A,7,11.1,A,7,75,A,7,989,A,7,50,A,7,5.7,A,7,24100,B,7,4570,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,06:00,36,740,5,1,13,0,1,9,5,1,13,6,1,13,0,1,9,6,1,13,20,1,21,9,A,7,9,A,7,17.8,A,7,11.7,A,7,68,A,7,989,A,7,50,A,7,5.2,A,7,16100,B,7,520,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,07:00,266,1325,72,1,13,8,1,9,70,1,13,80,1,13,3,1,9,79,1,13,240,1,21,9,A,7,9,A,7,17.2,A,7,12.2,A,7,73,A,7,990,A,7,50,A,7,6.7,A,7,16100,B,7,580,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,08:00,527,1325,198,1,9,91,1,9,161,1,13,216,1,9,88,1,9,181,1,13,450,1,18,8,A,7,8,A,7,17.8,A,7,12.2,A,7,70,A,7,991,A,7,60,A,7,5.2,A,7,16100,B,7,580,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,09:00,769,1325,417,1,13,215,1,9,292,1,13,451,1,13,223,1,9,322,1,13,775,1,21,5,A,7,5,A,7,19.4,A,7,12.8,A,7,66,A,7,991,A,7,50,A,7,6.7,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,10:00,975,1325,689,1,13,508,1,9,313,1,13,721,1,13,526,1,9,332,1,13,966,1,21,5,A,7,5,A,7,20.0,A,7,11.7,A,7,59,A,7,991,A,7,50,A,7,7.2,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,11:00,1133,1325,666,1,13,355,1,9,361,1,13,729,1,13,386,1,9,399,1,13,1495,1,21,8,A,7,4,A,7,21.1,A,7,11.7,A,7,55,A,7,991,A,7,30,A,7,6.2,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,12:00,1230,1325,834,1,13,460,1,9,406,1,13,882,1,13,480,1,9,436,1,13,2614,1,21,8,A,7,4,A,7,22.2,A,7,11.7,A,7,51,A,7,991,A,7,30,A,7,6.7,A,7,16100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/30/1981,13:00,1260,1325,902,1,9,592,1,9,337,1,13,976,1,9,620,1,9,385,1,13,2539,1,18,3,A,7,1,A,7,22.8,A,7,11.7,A,7,50,A,7,990,A,7,30,A,7,6.7,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/30/1981,14:00,1221,1325,841,1,13,503,1,9,375,1,13,894,1,13,525,1,9,410,1,13,2307,1,21,3,A,7,3,A,7,23.9,A,7,12.8,A,7,50,A,7,990,A,7,50,A,7,4.1,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,15:00,1115,1325,793,1,13,550,1,9,327,1,13,842,1,13,574,1,9,358,1,13,1373,1,21,3,A,7,3,A,7,23.9,A,7,12.8,A,7,50,A,7,990,A,7,50,A,7,5.2,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,16:00,951,1325,627,1,9,446,1,9,305,1,13,655,1,9,462,1,9,323,1,13,903,1,18,8,A,7,2,A,7,24.4,A,7,12.2,A,7,47,A,7,990,A,7,10,A,7,5.2,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,17:00,738,1325,437,1,9,351,1,9,240,1,13,467,1,9,370,1,9,260,1,13,576,1,18,8,A,7,2,A,7,24.4,A,7,12.2,A,7,47,A,7,990,A,7,40,A,7,3.6,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,18:00,493,1325,236,1,9,246,1,9,143,1,13,250,1,9,238,1,9,161,1,13,295,1,18,3,A,7,2,A,7,24.4,A,7,10.6,A,7,42,A,7,990,A,7,60,A,7,3.6,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,19:00,231,1325,65,1,13,30,1,9,60,1,13,71,1,13,23,1,9,67,1,13,149,1,21,6,A,7,2,A,7,23.9,A,7,12.8,A,7,50,A,7,991,A,7,60,A,7,3.6,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -07/30/1981,20:00,20,563,8,1,13,0,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,2,A,7,2,A,7,21.1,A,7,15.0,A,7,68,A,7,991,A,7,50,A,7,2.1,A,7,24100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,4,A,7,20.0,A,7,15.0,A,7,73,A,7,992,A,7,10,A,7,2.1,A,7,24100,B,7,7620,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,4,A,7,18.3,A,7,15.0,A,7,81,A,7,992,A,7,30,A,7,2.1,A,7,24100,B,7,7620,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,18.3,A,7,15.0,A,7,81,A,7,993,A,7,60,A,7,1.5,A,7,24100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/30/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,7,A,7,18.9,A,7,13.9,A,7,73,A,7,993,A,7,50,A,7,2.6,A,7,24100,B,7,3660,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,18.9,A,7,13.9,A,7,73,A,7,993,A,7,60,A,7,3.1,A,7,24100,B,7,3660,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -07/31/1981,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,18.3,A,7,14.4,A,7,78,A,7,992,A,7,50,A,7,2.6,A,7,24100,B,7,3660,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,17.8,A,7,15.0,A,7,84,A,7,992,A,7,50,A,7,2.6,A,7,24100,B,7,3660,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,15.0,A,7,84,A,7,992,A,7,40,A,7,2.1,A,7,24100,B,7,760,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,17.2,A,7,15.0,A,7,87,A,7,993,A,7,360,A,7,2.1,A,7,24100,B,7,760,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,06:00,35,718,12,1,13,9,1,9,11,1,13,13,1,13,5,1,9,12,1,13,28,1,21,9,A,7,9,A,7,17.8,A,7,14.4,A,7,81,A,7,993,A,7,50,A,7,1.5,A,7,24100,B,7,2440,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,07:00,263,1326,33,1,13,20,1,9,29,1,13,36,1,13,16,1,9,33,1,13,82,1,21,9,A,7,9,A,7,17.2,A,7,14.4,A,7,84,A,7,994,A,7,30,A,7,3.1,A,7,24100,B,7,2440,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/31/1981,08:00,524,1326,208,1,9,98,1,9,169,1,13,228,1,9,95,1,9,190,1,13,466,1,18,9,A,7,9,A,7,17.8,A,7,13.9,A,7,78,A,7,995,A,7,40,A,7,2.6,A,7,24100,B,7,3050,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,09:00,767,1326,403,1,13,331,1,9,211,1,13,437,1,13,351,1,9,234,1,13,501,1,21,7,A,7,7,A,7,20.6,A,7,13.3,A,7,63,A,7,995,A,7,70,A,7,4.6,A,7,24100,B,7,3050,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,10:00,974,1326,613,1,13,523,1,9,227,1,13,662,1,13,545,1,9,262,1,13,681,1,21,4,A,7,4,A,7,22.8,A,7,11.7,A,7,50,A,7,995,A,7,70,A,7,6.7,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,11:00,1131,1326,774,1,9,674,1,9,197,1,13,828,1,9,691,1,9,238,1,13,854,1,18,2,A,7,2,A,7,23.9,A,7,12.8,A,7,50,A,7,995,A,7,100,A,7,5.2,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,12:00,1228,1326,808,1,13,623,1,9,229,1,13,864,1,13,637,1,9,272,1,13,1423,1,21,5,A,7,5,A,7,24.4,A,7,12.8,A,7,48,A,7,995,A,7,60,A,7,2.6,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,13:00,1258,1326,750,1,13,505,1,9,269,1,13,795,1,13,513,1,9,307,1,13,1951,1,21,5,A,7,5,A,7,26.1,A,7,12.8,A,7,44,A,7,994,A,7,130,A,7,6.2,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -07/31/1981,14:00,1219,1326,828,1,13,622,1,9,253,1,13,877,1,13,633,1,9,294,1,13,1497,1,21,7,A,7,4,A,7,26.7,A,7,12.8,A,7,42,A,7,994,A,7,110,A,7,3.6,A,7,24100,B,7,3660,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,15:00,1114,1326,618,1,13,423,1,9,262,1,13,673,1,13,443,1,9,300,1,13,1080,1,21,7,A,7,5,A,7,27.2,A,7,13.3,A,7,42,A,7,993,A,7,90,A,7,3.1,A,7,24100,B,7,3660,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,16:00,949,1326,479,1,9,282,1,9,275,1,13,522,1,9,304,1,9,303,1,13,797,1,18,8,A,7,8,A,7,26.7,A,7,12.8,A,7,42,A,7,993,A,7,60,A,7,4.6,A,7,24100,B,7,3660,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,17:00,736,1326,382,1,9,220,1,9,259,1,13,414,1,9,228,1,9,288,1,13,673,1,18,9,A,7,9,A,7,25.6,A,7,13.3,A,7,47,A,7,993,A,7,60,A,7,3.1,A,7,24100,B,7,1220,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,18:00,490,1326,168,1,9,45,1,9,151,1,13,184,1,9,43,1,9,168,1,13,413,1,18,9,A,7,9,A,7,24.4,A,7,14.4,A,7,54,A,7,993,A,7,50,A,7,3.6,A,7,24100,B,7,1220,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,19:00,228,1326,28,1,13,18,1,9,25,1,13,31,1,13,14,1,9,29,1,13,69,1,21,9,A,7,9,A,7,22.8,A,7,15.0,A,7,62,A,7,993,A,7,360,A,7,3.6,A,7,24100,B,7,1830,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -07/31/1981,20:00,19,541,9,1,13,5,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,7,A,7,7,A,7,21.7,A,7,14.4,A,7,64,A,7,993,A,7,80,A,7,1.5,A,7,24100,B,7,1830,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,19.4,A,7,14.4,A,7,73,A,7,994,A,7,50,A,7,2.1,A,7,24100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,19.6,A,7,14.9,A,7,73,A,7,995,A,7,30,A,7,2.1,A,7,24100,B,7,3050,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,19.7,A,7,15.4,A,7,70,A,7,995,A,7,0,A,7,2.1,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -07/31/1981,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,19.9,A,7,15.9,A,7,73,A,7,995,A,7,80,A,7,2.1,A,7,24100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -08/01/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,1,E,9,20.1,A,7,16.3,A,7,84,A,7,993,A,7,150,A,7,2.1,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,20.3,A,7,16.8,A,7,84,A,7,993,A,7,160,A,7,2.1,A,7,16000,B,7,2896,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,20.4,A,7,17.3,A,7,84,A,7,993,A,7,160,A,7,2.1,A,7,16000,B,7,2896,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,20.6,A,7,17.8,A,7,84,A,7,994,A,7,140,A,7,2.1,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,20.6,A,7,17.8,A,7,84,A,7,994,A,7,170,A,7,3.1,A,7,16000,B,7,2743,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,06:00,33,696,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,20.6,A,7,17.8,A,7,84,A,7,994,A,7,150,A,7,2.6,A,7,16000,B,7,1097,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,07:00,260,1326,57,2,8,0,2,15,57,2,8,65,2,8,0,2,15,65,2,8,206,2,19,7,E,9,7,E,9,20.6,A,7,17.8,A,7,84,A,7,995,A,7,150,A,7,3.1,A,7,14400,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,08:00,521,1326,173,2,8,25,2,15,163,2,8,194,2,8,19,2,15,186,2,8,599,2,19,10,E,9,10,E,9,21.1,A,7,18.3,A,7,84,A,7,996,A,7,160,A,7,2.6,A,7,12800,B,7,1250,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,09:00,764,1326,319,2,8,98,2,15,262,2,8,350,2,8,99,2,15,293,2,8,822,2,19,10,E,9,10,E,9,21.1,A,7,18.3,A,7,84,A,7,996,A,7,160,A,7,2.6,A,7,12800,B,7,1189,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,10:00,971,1326,166,2,8,0,2,15,166,2,8,202,2,8,0,2,15,202,2,8,827,2,19,10,E,9,10,E,9,20.6,A,7,18.9,A,7,90,A,7,997,A,7,150,A,7,2.6,A,7,6400,B,7,1189,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/01/2001,11:00,1129,1326,149,2,8,0,2,15,149,2,8,187,2,8,0,2,15,187,2,8,778,2,19,10,E,9,10,E,9,20.0,A,7,18.9,A,7,93,A,7,997,A,7,0,A,7,0.0,A,7,1600,B,7,732,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/01/2001,12:00,1226,1326,147,2,8,0,2,15,147,2,8,187,2,8,0,2,15,187,2,8,776,2,19,10,E,9,10,E,9,20.6,A,7,19.4,A,7,93,A,7,997,A,7,0,A,7,0.0,A,7,6400,B,7,1981,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/01/2001,13:00,1256,1326,150,2,8,0,2,15,150,2,8,191,2,8,0,2,15,191,2,8,792,2,19,10,E,9,10,E,9,20.6,A,7,20.0,A,7,96,A,7,996,A,7,20,A,7,2.6,A,7,4800,B,7,2134,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/01/2001,14:00,1217,1326,159,2,8,6,2,15,154,2,8,202,2,8,4,2,15,198,2,8,808,2,19,8,E,9,8,E,9,21.7,A,7,20.0,A,7,90,A,7,996,A,7,320,A,7,2.1,A,7,9600,B,7,2134,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/01/2001,15:00,1111,1326,603,2,8,304,2,15,347,2,8,661,2,8,330,2,15,383,2,8,1358,2,19,3,E,9,3,E,9,23.3,A,7,19.4,A,7,79,A,7,996,A,7,90,A,7,3.1,A,7,9600,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,16:00,946,1326,611,2,8,540,2,15,225,2,8,659,2,8,561,2,15,258,2,8,644,2,19,5,E,9,5,E,9,24.4,A,7,19.4,A,7,74,A,7,995,A,7,80,A,7,3.6,A,7,11200,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/01/2001,17:00,733,1326,442,2,8,482,2,15,175,2,8,472,2,8,490,2,15,200,2,8,387,2,19,0,E,9,0,E,9,24.4,A,7,18.9,A,7,71,A,7,995,A,7,90,A,7,3.1,A,7,11200,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,18:00,486,1326,254,2,8,356,2,15,123,2,8,266,2,8,334,2,15,143,2,8,237,2,19,0,E,9,0,E,9,24.4,A,7,18.9,A,7,71,A,7,995,A,7,100,A,7,3.6,A,7,9600,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/01/2001,19:00,224,1326,92,2,8,214,2,15,56,2,8,96,2,8,147,2,15,71,2,8,102,2,19,5,E,9,5,A,7,23.3,A,7,18.9,A,7,76,A,7,994,A,7,80,A,7,1.5,A,7,9600,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/01/2001,20:00,17,519,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,1,E,9,0,E,9,22.2,A,7,18.9,A,7,82,A,7,995,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/01/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,0,E,9,21.1,A,7,18.9,A,7,87,A,7,995,A,7,0,A,7,0.0,A,7,9600,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/01/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.0,A,7,18.9,A,7,93,A,7,996,A,7,0,A,7,0.0,A,7,6400,B,7,7620,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/01/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.9,A,7,17.8,A,7,93,A,7,996,A,7,0,A,7,0.0,A,7,6400,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/01/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,17.2,A,7,93,A,7,995,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/02/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,17.2,A,7,96,A,7,995,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/02/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,17.8,A,7,17.2,A,7,96,A,7,995,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/02/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.0,A,7,16.0,A,7,100,A,7,995,A,7,70,A,7,2.1,A,7,2000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,3,1,D,9,10,C,8 -08/02/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,16.1,A,7,15.6,A,7,97,A,7,994,A,7,0,A,7,0.0,A,7,4000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/02/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,16.1,A,7,15.6,A,7,97,A,7,994,A,7,0,A,7,0.0,A,7,4000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/02/2001,06:00,31,674,0,2,8,37,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,3,E,9,1,E,9,16.1,A,7,15.6,A,7,97,A,7,995,A,7,0,A,7,0.0,A,7,1600,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,33,1,D,9,10,C,8 -08/02/2001,07:00,257,1326,134,2,8,235,2,15,89,2,8,139,2,8,172,2,15,106,2,8,179,2,19,1,E,9,0,E,9,18.3,A,7,17.2,A,7,93,A,7,995,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/02/2001,08:00,518,1326,317,2,8,498,2,15,122,2,8,335,2,8,475,2,15,149,2,8,236,2,19,1,E,9,1,E,9,21.1,A,7,17.8,A,7,81,A,7,995,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/02/2001,09:00,762,1326,492,2,8,540,2,15,181,2,8,526,2,8,551,2,15,208,2,8,411,2,19,0,E,9,0,E,9,23.3,A,7,16.1,A,7,64,A,7,995,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,10:00,970,1326,645,2,8,589,2,15,214,2,8,675,2,8,593,2,15,240,2,8,625,2,19,0,E,9,0,E,9,23.9,A,7,16.7,A,7,64,A,7,995,A,7,60,A,7,2.6,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,11:00,1128,1326,784,2,8,640,2,15,239,2,8,828,2,8,649,2,15,275,2,8,1007,2,19,3,E,9,3,E,9,24.4,A,7,16.1,A,7,60,A,7,995,A,7,130,A,7,1.5,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,12:00,1225,1326,879,2,8,704,2,15,228,2,8,941,2,8,720,2,15,275,2,8,1390,2,19,3,E,9,3,E,9,25.6,A,7,16.1,A,7,56,A,7,995,A,7,120,B,8,1.5,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,13:00,1255,1326,919,2,8,756,2,15,202,2,8,960,2,8,759,2,15,240,2,8,1333,2,19,3,E,9,3,E,9,26.7,A,7,16.1,A,7,52,A,7,994,A,7,110,B,8,2.6,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,14:00,1216,1326,886,2,8,754,2,15,193,2,8,925,2,8,757,2,15,230,2,8,1036,2,19,3,E,9,3,E,9,27.2,A,7,15.0,A,7,47,A,7,994,A,7,90,B,8,1.5,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,15:00,1109,1326,783,2,8,692,2,15,202,2,8,834,2,8,707,2,15,241,2,8,819,2,19,3,E,9,3,E,9,27.8,A,7,15.6,A,7,47,A,7,993,A,7,80,A,7,3.6,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,16:00,944,1326,645,2,8,665,2,15,171,2,8,683,2,8,676,2,15,201,2,8,490,2,19,3,E,9,3,E,9,27.2,A,7,15.6,A,7,49,A,7,993,A,7,100,B,8,2.6,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,17:00,730,1326,463,2,8,582,2,15,142,2,8,483,2,8,578,2,15,165,2,8,313,2,19,3,E,9,3,E,9,27.2,A,7,15.6,A,7,49,A,7,993,A,7,120,A,7,2.6,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,18:00,483,1326,268,2,8,436,2,15,109,2,8,284,2,8,409,2,15,135,2,8,207,2,19,3,E,9,3,E,9,26.7,A,7,15.0,A,7,49,A,7,992,A,7,120,A,7,3.6,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,19:00,220,1326,92,2,8,244,2,15,51,2,8,96,2,8,167,2,15,68,2,8,92,2,19,0,E,9,0,A,7,24.4,A,7,15.6,A,7,58,A,7,991,A,7,150,A,7,3.6,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,20:00,16,497,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,22.8,A,7,16.1,A,7,66,A,7,991,A,7,150,A,7,2.6,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,15.6,A,7,66,A,7,992,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.7,A,7,16.1,A,7,70,A,7,992,A,7,160,A,7,1.5,A,7,16000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,16.1,A,7,75,A,7,991,A,7,230,A,7,1.5,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/02/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.0,A,7,16.1,A,7,78,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.0,A,7,16.1,A,7,78,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.9,A,7,15.6,A,7,81,A,7,990,A,7,230,A,7,1.5,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,15.6,A,7,87,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,15.6,A,7,87,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.7,A,7,15.0,A,7,90,A,7,989,A,7,280,A,7,2.1,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,06:00,30,652,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,17.2,A,7,15.6,A,7,90,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,07:00,254,1327,126,2,8,193,2,15,89,2,8,130,2,8,141,2,15,103,2,8,179,2,19,0,E,9,0,E,9,18.3,A,7,16.1,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,08:00,516,1327,296,2,8,423,2,15,131,2,8,310,2,8,403,2,15,153,2,8,255,2,19,0,E,9,0,E,9,20.6,A,7,17.8,A,7,84,A,7,989,A,7,240,A,7,2.6,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,09:00,760,1327,472,2,8,491,2,15,190,2,8,502,2,8,501,2,15,214,2,8,432,2,19,0,E,9,0,E,9,22.8,A,7,18.3,A,7,76,A,7,989,A,7,200,A,7,2.6,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,10:00,968,1327,651,2,8,625,2,15,194,2,8,685,2,8,633,2,15,222,2,8,571,2,19,0,E,9,0,E,9,25.6,A,7,18.3,A,7,64,A,7,989,A,7,230,A,7,3.6,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,11:00,1126,1327,791,2,8,676,2,15,216,2,8,841,2,8,689,2,15,254,2,8,913,2,19,3,E,9,3,E,9,26.7,A,7,17.2,A,7,56,A,7,988,A,7,250,A,7,4.1,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,12:00,1223,1327,873,2,8,674,2,15,251,2,8,928,2,8,686,2,15,294,2,8,1508,2,19,3,E,9,3,E,9,27.8,A,7,17.8,A,7,55,A,7,987,A,7,250,A,7,5.2,A,7,16000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,13:00,1253,1327,859,2,8,612,2,15,279,2,8,908,2,8,620,2,15,321,2,8,1949,2,19,3,E,9,3,E,9,28.3,A,7,17.8,A,7,53,A,7,986,A,7,180,A,7,2.6,A,7,16000,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,14:00,1214,1327,768,2,8,509,2,15,301,2,8,836,2,8,533,2,15,347,2,8,1768,2,19,8,E,9,8,E,9,28.9,A,7,17.8,A,7,51,A,7,986,A,7,200,B,8,2.1,A,7,16000,B,7,1981,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,15:00,1107,1327,753,2,8,591,2,15,259,2,8,789,2,8,596,2,15,290,2,8,1019,2,19,8,E,9,8,E,9,28.9,A,7,17.8,A,7,51,A,7,985,A,7,220,A,7,3.6,A,7,16000,B,7,1829,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,16:00,942,1327,549,2,8,362,2,15,291,2,8,596,2,8,390,2,15,319,2,8,843,2,19,7,E,9,6,E,9,28.9,A,7,17.8,A,7,51,A,7,985,A,7,200,A,7,3.6,A,7,14400,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,17:00,727,1327,409,2,8,341,2,15,221,2,8,439,2,8,359,2,15,242,2,8,519,2,19,6,E,9,5,E,9,27.8,A,7,17.2,A,7,53,A,7,984,A,7,180,A,7,4.6,A,7,14400,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,18:00,480,1327,177,2,8,86,2,15,146,2,8,194,2,8,81,2,15,165,2,8,398,2,19,6,E,9,6,E,9,28.3,A,7,17.2,A,7,51,A,7,984,A,7,190,A,7,4.1,A,7,14400,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,19:00,216,1327,87,2,8,176,2,15,58,2,8,91,2,8,117,2,15,72,2,8,109,2,19,5,E,9,5,A,7,26.7,A,7,17.8,A,7,58,A,7,983,A,7,170,A,7,3.1,A,7,14400,B,7,77777,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,20:00,15,475,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,25.6,A,7,17.8,A,7,62,A,7,984,A,7,190,A,7,2.6,A,7,16000,B,7,2743,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,24.4,A,7,17.2,A,7,64,A,7,984,A,7,160,A,7,2.6,A,7,14400,B,7,2743,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,23.9,A,7,17.2,A,7,66,A,7,984,A,7,160,A,7,3.6,A,7,16000,B,7,77777,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,23.3,A,7,17.2,A,7,69,A,7,983,A,7,180,A,7,4.1,A,7,16000,B,7,1829,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/03/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,6,E,9,22.2,A,7,17.2,A,7,73,A,7,983,A,7,200,A,7,3.1,A,7,14400,B,7,77777,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,7,E,9,21.7,A,7,17.8,A,7,79,A,7,982,A,7,190,A,7,2.1,A,7,12800,B,7,4572,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,7,E,9,21.7,A,7,18.3,A,7,81,A,7,982,A,7,190,A,7,2.6,A,7,12800,B,7,4572,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,21.7,A,7,18.3,A,7,81,A,7,982,A,7,200,A,7,2.1,A,7,12800,B,7,4572,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,21.1,A,7,18.3,A,7,84,A,7,982,A,7,210,A,7,2.6,A,7,12800,B,7,4572,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,3,E,9,20.6,A,7,17.8,A,7,84,A,7,982,A,7,210,A,7,2.1,A,7,12800,B,7,4572,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,06:00,28,652,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,5,E,9,4,E,9,20.0,A,7,17.8,A,7,87,A,7,982,A,7,210,A,7,2.1,A,7,9600,B,7,7620,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/04/2001,07:00,251,1327,78,2,8,7,2,15,77,2,8,86,2,8,3,2,15,86,2,8,248,2,19,7,E,9,5,E,9,21.1,A,7,18.3,A,7,84,A,7,983,A,7,190,A,7,2.6,A,7,12800,B,7,7620,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,08:00,513,1327,152,2,8,13,2,15,147,2,8,172,2,8,9,2,15,168,2,8,555,2,19,6,E,9,5,E,9,23.9,A,7,19.4,A,7,76,A,7,983,A,7,220,A,7,3.6,A,7,12800,B,7,7620,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,09:00,758,1327,339,2,8,123,2,15,269,2,8,369,2,8,128,2,15,296,2,8,708,2,19,5,E,9,5,E,9,25.6,A,7,21.1,A,7,76,A,7,984,A,7,220,A,7,3.6,A,7,11200,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,10:00,966,1327,562,2,8,334,2,15,319,2,8,609,2,8,360,2,15,346,2,8,965,2,19,6,E,9,5,E,9,26.1,A,7,21.1,A,7,74,A,7,984,A,7,230,A,7,4.1,A,7,9600,B,7,7620,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/04/2001,11:00,1124,1327,704,2,8,435,2,15,335,2,8,749,2,8,454,2,15,364,2,8,1438,2,19,10,E,9,10,E,9,26.7,A,7,20.6,A,7,69,A,7,984,A,7,240,A,7,4.1,A,7,9600,B,7,3048,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/04/2001,12:00,1222,1327,360,2,8,48,2,15,316,2,8,399,2,8,49,2,15,354,2,8,1665,2,19,10,E,9,10,E,9,27.8,A,7,20.6,A,7,65,A,7,984,A,7,220,A,7,3.6,A,7,9600,B,7,853,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/04/2001,13:00,1252,1327,168,2,8,12,2,15,157,2,8,188,2,8,12,2,15,177,2,8,934,2,19,10,E,9,10,E,9,28.3,A,7,19.4,A,7,59,A,7,983,A,7,240,A,7,5.7,A,7,8000,B,7,3048,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/04/2001,14:00,1212,1327,821,2,8,551,2,15,317,2,8,889,2,8,577,2,15,361,2,8,1848,2,19,8,E,9,8,E,9,28.9,A,7,20.0,A,7,59,A,7,984,A,7,200,A,7,3.6,A,7,8000,B,7,3048,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/04/2001,15:00,1105,1327,707,2,8,513,2,15,279,2,8,764,2,8,536,2,15,317,2,8,1124,2,19,8,E,9,8,E,9,29.4,A,7,20.6,A,7,59,A,7,983,A,7,250,A,7,5.2,A,7,11200,B,7,2743,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,16:00,939,1327,594,2,8,516,2,15,228,2,8,639,2,8,536,2,15,259,2,8,645,2,19,10,E,9,10,E,9,28.9,A,7,20.0,A,7,59,A,7,983,A,7,260,A,7,5.2,A,7,11200,B,7,3048,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,17:00,725,1327,436,2,8,476,2,15,175,2,8,464,2,8,483,2,15,200,2,8,385,2,19,8,E,9,8,E,9,28.3,A,7,19.4,A,7,59,A,7,983,A,7,250,A,7,5.2,A,7,11200,B,7,3048,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,18:00,476,1327,237,2,8,309,2,15,126,2,8,254,2,8,297,2,15,147,2,8,253,2,19,5,E,9,5,E,9,27.8,A,7,19.4,A,7,60,A,7,983,A,7,240,A,7,4.1,A,7,12800,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,19:00,213,1327,82,2,8,180,2,15,54,2,8,88,2,8,119,2,15,69,2,8,100,2,19,9,E,9,7,A,7,26.7,A,7,19.4,A,7,64,A,7,983,A,7,240,A,7,3.6,A,7,11200,B,7,3353,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,20:00,13,453,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,8,E,9,8,E,9,25.6,A,7,19.4,A,7,69,A,7,984,A,7,220,A,7,3.6,A,7,14400,B,7,3048,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,25.0,A,7,20.0,A,7,74,A,7,985,A,7,240,A,7,3.1,A,7,12800,B,7,3048,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,E,9,24.4,A,7,20.6,A,7,79,A,7,985,A,7,220,A,7,3.6,A,7,11200,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,23.3,A,7,19.4,A,7,79,A,7,986,A,7,240,A,7,3.1,A,7,9600,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/04/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,22.2,A,7,19.4,A,7,84,A,7,986,A,7,230,A,7,3.1,A,7,8000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/05/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.7,A,7,19.4,A,7,87,A,7,985,A,7,230,A,7,2.1,A,7,8000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/05/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,19.4,A,7,90,A,7,985,A,7,240,A,7,1.5,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/05/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,19.4,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/05/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.0,A,7,18.9,A,7,93,A,7,986,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/05/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.0,A,7,18.9,A,7,93,A,7,987,A,7,210,A,7,1.5,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/05/2001,06:00,27,631,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,19.4,A,7,18.9,A,7,97,A,7,987,A,7,0,A,7,0.0,A,7,4000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/05/2001,07:00,248,1327,118,2,8,166,2,15,87,2,8,122,2,8,119,2,15,100,2,8,175,2,19,0,E,9,0,E,9,21.1,A,7,20.0,A,7,93,A,7,987,A,7,210,A,7,1.5,A,7,4000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/05/2001,08:00,511,1327,282,2,8,373,2,15,139,2,8,294,2,8,354,2,15,158,2,8,273,2,19,0,E,9,0,E,9,23.9,A,7,18.9,A,7,74,A,7,988,A,7,230,A,7,3.6,A,7,14400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/05/2001,09:00,755,1327,472,2,8,509,2,15,182,2,8,504,2,8,519,2,15,208,2,8,411,2,19,0,E,9,0,E,9,25.6,A,7,19.4,A,7,69,A,7,989,A,7,280,A,7,2.6,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,10:00,964,1327,645,2,8,613,2,15,199,2,8,677,2,8,620,2,15,226,2,8,580,2,19,3,E,9,3,E,9,26.7,A,7,19.4,A,7,64,A,7,989,A,7,310,B,8,2.1,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,11:00,1123,1327,778,2,8,646,2,15,231,2,8,823,2,8,656,2,15,267,2,8,959,2,19,4,E,9,4,E,9,28.3,A,7,19.4,A,7,59,A,7,990,A,7,330,B,8,3.1,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,12:00,1220,1327,837,2,8,626,2,15,260,2,8,886,2,8,636,2,15,301,2,8,1530,2,19,8,E,9,8,E,9,27.8,A,7,18.9,A,7,58,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,1219,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,13:00,1250,1327,763,2,8,426,2,15,361,2,8,819,2,8,445,2,15,399,2,8,2545,2,19,8,E,9,8,E,9,29.4,A,7,18.9,A,7,53,A,7,989,A,7,280,B,8,2.6,A,7,16000,B,7,1433,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,14:00,1210,1327,679,2,8,311,2,15,395,2,8,747,2,8,338,2,15,438,2,8,2073,2,19,4,E,9,4,E,9,30.6,A,7,18.3,A,7,48,A,7,989,A,7,190,A,7,3.1,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,15:00,1103,1327,730,2,8,549,2,15,273,2,8,791,2,8,574,2,15,313,2,8,1091,2,19,4,E,9,4,E,9,30.6,A,7,18.9,A,7,50,A,7,989,A,7,160,A,7,3.1,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,16:00,937,1327,520,2,8,273,2,15,327,2,8,560,2,8,294,2,15,352,2,8,960,2,19,4,E,9,4,E,9,30.6,A,7,18.9,A,7,50,A,7,989,A,7,150,A,7,3.6,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,17:00,722,1327,234,2,8,29,2,15,218,2,8,257,2,8,29,2,15,241,2,8,684,2,19,3,E,9,3,E,9,30.0,A,7,18.3,A,7,50,A,7,989,A,7,130,A,7,3.1,A,7,16000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,18:00,473,1327,146,2,8,29,2,15,136,2,8,161,2,8,27,2,15,151,2,8,374,2,19,3,E,9,3,E,9,29.4,A,7,19.4,A,7,55,A,7,989,A,7,100,A,7,3.6,A,7,16000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,19:00,209,1327,82,2,8,164,2,15,56,2,8,86,2,8,107,2,15,69,2,8,105,2,19,3,E,9,3,A,7,27.8,A,7,19.4,A,7,60,A,7,989,A,7,120,A,7,3.6,A,7,16000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,20:00,12,431,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,26.7,A,7,20.0,A,7,67,A,7,989,A,7,150,A,7,2.6,A,7,14400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.6,A,7,19.4,A,7,69,A,7,990,A,7,150,A,7,2.6,A,7,14400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.6,A,7,19.4,A,7,69,A,7,990,A,7,130,A,7,2.6,A,7,14400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,24.4,A,7,18.9,A,7,71,A,7,990,A,7,160,A,7,2.6,A,7,14400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/05/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.9,A,7,18.9,A,7,74,A,7,991,A,7,170,A,7,4.6,A,7,14400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,E,9,23.3,A,7,19.4,A,7,79,A,7,990,A,7,180,A,7,2.1,A,7,12800,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,18.9,A,7,82,A,7,990,A,7,190,A,7,1.5,A,7,12800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,18.9,A,7,87,A,7,990,A,7,210,A,7,1.5,A,7,11200,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,18.9,A,7,87,A,7,990,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/06/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,21.1,A,7,19.4,A,7,90,A,7,991,A,7,0,A,7,0.0,A,7,11200,B,7,1524,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,06:00,25,609,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,20.6,A,7,18.9,A,7,90,A,7,991,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/06/2001,07:00,245,1328,119,2,8,181,2,15,86,2,8,123,2,8,129,2,15,100,2,8,173,2,19,0,E,9,0,E,9,22.8,A,7,20.0,A,7,84,A,7,991,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/06/2001,08:00,508,1328,290,2,8,411,2,15,132,2,8,303,2,8,390,2,15,153,2,8,257,2,19,0,E,9,0,E,9,25.0,A,7,21.7,A,7,82,A,7,992,A,7,310,A,7,2.1,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/06/2001,09:00,753,1328,479,2,8,546,2,15,169,2,8,515,2,8,557,2,15,198,2,8,378,2,19,0,E,9,0,E,9,26.1,A,7,20.6,A,7,72,A,7,992,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,10:00,962,1328,620,2,8,546,2,15,223,2,8,670,2,8,568,2,15,258,2,8,653,2,19,8,E,9,8,E,9,27.8,A,7,20.6,A,7,65,A,7,992,A,7,0,A,7,0.0,A,7,16000,B,7,914,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,11:00,1121,1328,785,2,8,628,2,15,254,2,8,825,2,8,635,2,15,288,2,8,1038,2,19,4,E,9,4,E,9,28.3,A,7,19.4,A,7,59,A,7,992,A,7,330,B,8,1.5,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,12:00,1218,1328,757,2,8,433,2,15,359,2,8,810,2,8,452,2,15,394,2,8,2158,2,19,5,E,9,5,E,9,28.9,A,7,18.9,A,7,55,A,7,992,A,7,290,A,7,2.1,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,13:00,1248,1328,871,2,8,648,2,15,260,2,8,925,2,8,659,2,15,304,2,8,1760,2,19,1,E,9,0,E,9,30.0,A,7,18.9,A,7,51,A,7,991,A,7,180,A,7,2.1,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,14:00,1208,1328,850,2,8,652,2,15,255,2,8,900,2,8,662,2,15,296,2,8,1423,2,19,3,E,9,3,E,9,31.1,A,7,18.9,A,7,48,A,7,992,A,7,200,B,8,2.1,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,15:00,1101,1328,776,2,8,698,2,15,196,2,8,828,2,8,714,2,15,235,2,8,776,2,19,3,E,9,3,E,9,30.0,A,7,17.8,A,7,48,A,7,991,A,7,210,A,7,2.1,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,16:00,934,1328,633,2,8,635,2,15,185,2,8,665,2,8,642,2,15,213,2,8,515,2,19,3,E,9,3,E,9,31.1,A,7,18.9,A,7,48,A,7,991,A,7,160,B,8,2.1,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,17:00,718,1328,446,2,8,546,2,15,150,2,8,482,2,8,554,2,15,181,2,8,324,2,19,8,E,9,8,E,9,30.0,A,7,18.9,A,7,51,A,7,990,A,7,100,A,7,2.6,A,7,16000,B,7,1676,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,18:00,469,1328,256,2,8,418,2,15,109,2,8,271,2,8,389,2,15,134,2,8,207,2,19,3,E,9,3,E,9,30.6,A,7,17.8,A,7,46,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,19:00,205,1328,81,2,8,215,2,15,48,2,8,85,2,8,141,2,15,63,2,8,86,2,19,1,E,9,0,A,7,28.3,A,7,20.6,A,7,63,A,7,989,A,7,80,A,7,2.1,A,7,16000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,20:00,11,409,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,27.8,A,7,20.6,A,7,65,A,7,990,A,7,140,A,7,1.5,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,26.7,A,7,20.6,A,7,69,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.6,A,7,20.6,A,7,74,A,7,991,A,7,180,A,7,2.1,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,24.4,A,7,20.6,A,7,79,A,7,990,A,7,270,A,7,1.5,A,7,14400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/06/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.9,A,7,20.6,A,7,82,A,7,990,A,7,230,A,7,1.5,A,7,14400,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.3,A,7,20.0,A,7,82,A,7,990,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.8,A,7,20.0,A,7,84,A,7,990,A,7,250,A,7,1.5,A,7,14400,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.8,A,7,20.0,A,7,84,A,7,989,A,7,280,A,7,1.5,A,7,14400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,20.0,A,7,87,A,7,989,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,19.4,A,7,84,A,7,989,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/07/2001,06:00,24,587,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,21.1,A,7,19.4,A,7,90,A,7,989,A,7,220,A,7,1.5,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/07/2001,07:00,242,1328,120,2,8,189,2,15,86,2,8,124,2,8,134,2,15,100,2,8,174,2,19,0,E,9,0,E,9,23.3,A,7,21.1,A,7,87,A,7,990,A,7,260,A,7,2.6,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/07/2001,08:00,506,1328,290,2,8,424,2,15,129,2,8,305,2,8,402,2,15,151,2,8,251,2,19,0,E,9,0,E,9,26.1,A,7,21.1,A,7,74,A,7,990,A,7,260,A,7,2.6,A,7,11200,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/07/2001,09:00,751,1328,473,2,8,522,2,15,177,2,8,505,2,8,532,2,15,204,2,8,397,2,19,1,E,9,0,E,9,28.3,A,7,21.7,A,7,67,A,7,990,A,7,290,A,7,4.6,A,7,16000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,10:00,960,1328,639,2,8,607,2,15,199,2,8,670,2,8,613,2,15,226,2,8,575,2,19,0,E,9,0,E,9,29.4,A,7,21.1,A,7,61,A,7,990,A,7,290,A,7,4.1,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,11:00,1119,1328,791,2,8,694,2,15,205,2,8,843,2,8,709,2,15,244,2,8,850,2,19,0,E,9,0,E,9,31.1,A,7,21.1,A,7,55,A,7,990,A,7,320,A,7,3.1,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,12:00,1217,1328,867,2,8,686,2,15,238,2,8,925,2,8,700,2,15,282,2,8,1383,2,19,0,E,9,0,E,9,31.7,A,7,20.6,A,7,52,A,7,990,A,7,170,A,7,1.5,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,13:00,1246,1328,919,2,8,738,2,15,225,2,8,986,2,8,756,2,15,275,2,8,1517,2,19,0,E,9,0,E,9,32.8,A,7,20.6,A,7,49,A,7,988,A,7,90,B,8,1.5,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,14:00,1206,1328,785,2,8,557,2,15,279,2,8,827,2,8,563,2,15,315,2,8,1530,2,19,5,E,9,5,E,9,33.3,A,7,18.9,A,7,43,A,7,989,A,7,10,A,7,2.6,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,15:00,1098,1328,782,2,8,680,2,15,218,2,8,828,2,8,692,2,15,254,2,8,848,2,19,3,E,9,3,E,9,33.3,A,7,18.9,A,7,43,A,7,988,A,7,20,B,8,1.5,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,16:00,931,1328,616,2,8,605,2,15,191,2,8,646,2,8,611,2,15,217,2,8,527,2,19,3,E,9,3,E,9,33.3,A,7,17.8,A,7,40,A,7,988,A,7,30,A,7,2.6,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,17:00,715,1328,440,2,8,529,2,15,155,2,8,474,2,8,537,2,15,185,2,8,335,2,19,3,E,9,3,E,9,32.8,A,7,18.3,A,7,42,A,7,987,A,7,360,A,7,1.5,A,7,14400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,18:00,466,1328,251,2,8,406,2,15,108,2,8,265,2,8,377,2,15,132,2,8,205,2,19,0,E,9,0,E,9,32.2,A,7,20.0,A,7,49,A,7,987,A,7,360,A,7,1.5,A,7,12800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,19:00,201,1328,80,2,8,204,2,15,49,2,8,83,2,8,133,2,15,63,2,8,88,2,19,0,E,9,0,A,7,31.1,A,7,19.4,A,7,50,A,7,986,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,20:00,10,387,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,29.4,A,7,20.0,A,7,57,A,7,987,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,28.9,A,7,21.1,A,7,63,A,7,987,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,27.2,A,7,22.2,A,7,74,A,7,987,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,26.7,A,7,21.1,A,7,71,A,7,987,A,7,260,A,7,1.5,A,7,11200,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/07/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.0,A,7,21.1,A,7,79,A,7,987,A,7,320,A,7,1.5,A,7,11200,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/08/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.0,A,7,21.1,A,7,79,A,7,986,A,7,300,A,7,2.6,A,7,12800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/08/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.0,A,7,21.7,A,7,82,A,7,986,A,7,300,A,7,1.5,A,7,11200,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/08/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,24.4,A,7,21.1,A,7,82,A,7,986,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/08/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.3,A,7,21.1,A,7,87,A,7,986,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/08/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.8,A,7,21.1,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/08/2001,06:00,22,587,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,23.9,A,7,21.1,A,7,84,A,7,987,A,7,30,A,7,1.5,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,07:00,239,1329,111,2,8,153,2,15,84,2,8,120,2,8,113,2,15,99,2,8,180,2,19,0,E,9,0,E,9,25.0,A,7,22.2,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,08:00,503,1329,269,2,8,335,2,15,142,2,8,287,2,8,326,2,15,163,2,8,292,2,19,0,E,9,0,E,9,27.2,A,7,21.7,A,7,72,A,7,988,A,7,360,B,8,2.1,A,7,9600,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,09:00,749,1329,440,2,8,411,2,15,207,2,8,462,2,8,418,2,15,226,2,8,471,2,19,0,E,9,0,E,9,29.4,A,7,22.8,A,7,68,A,7,988,A,7,360,B,8,3.1,A,7,6400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,10:00,958,1329,620,2,8,553,2,15,221,2,8,672,2,8,575,2,15,256,2,8,642,2,19,0,E,9,0,E,9,30.0,A,7,21.7,A,7,61,A,7,988,A,7,360,A,7,3.1,A,7,4800,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,11:00,1117,1329,766,2,8,628,2,15,237,2,8,808,2,8,637,2,15,271,2,8,964,2,19,0,E,9,0,A,7,31.7,A,7,21.7,A,7,56,A,7,988,A,7,10,A,7,2.1,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,12:00,1215,1329,861,2,8,656,2,15,260,2,8,912,2,8,666,2,15,301,2,8,1488,2,19,0,E,9,0,E,9,32.2,A,7,21.1,A,7,52,A,7,987,A,7,10,B,8,2.6,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,13:00,1244,1329,901,2,8,726,2,15,219,2,8,968,2,8,745,2,15,269,2,8,1461,2,19,3,E,9,3,E,9,32.8,A,7,21.1,A,7,50,A,7,986,A,7,360,B,8,3.1,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,14:00,1204,1329,850,2,8,664,2,15,247,2,8,902,2,8,676,2,15,289,2,8,1353,2,19,3,E,9,3,E,9,33.3,A,7,20.6,A,7,47,A,7,987,A,7,360,A,7,2.6,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,15:00,1096,1329,753,2,8,662,2,15,205,2,8,800,2,8,675,2,15,242,2,8,796,2,19,3,E,9,3,E,9,33.3,A,7,20.0,A,7,46,A,7,986,A,7,10,B,8,2.6,A,7,6400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,16:00,928,1329,615,2,8,611,2,15,188,2,8,646,2,8,617,2,15,214,2,8,517,2,19,3,E,9,3,E,9,33.3,A,7,21.1,A,7,49,A,7,985,A,7,10,A,7,3.1,A,7,6400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,17:00,712,1329,434,2,8,511,2,15,160,2,8,466,2,8,518,2,15,188,2,8,346,2,19,3,E,9,3,E,9,32.8,A,7,20.6,A,7,49,A,7,985,A,7,360,A,7,2.1,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,18:00,462,1329,245,2,8,388,2,15,110,2,8,258,2,8,359,2,15,133,2,8,209,2,19,0,E,9,0,E,9,32.2,A,7,20.6,A,7,50,A,7,985,A,7,20,A,7,1.5,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,19:00,196,1329,76,2,8,203,2,15,46,2,8,79,2,8,130,2,15,60,2,8,83,2,19,0,E,9,0,A,7,30.6,A,7,21.7,A,7,59,A,7,984,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,20:00,9,365,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,28.9,A,7,21.7,A,7,65,A,7,985,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,26.7,A,7,21.7,A,7,74,A,7,985,A,7,200,A,7,1.5,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,26.7,A,7,21.7,A,7,74,A,7,986,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.0,A,7,21.7,A,7,82,A,7,985,A,7,220,A,7,3.1,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/08/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,26.1,A,7,21.7,A,7,77,A,7,985,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.0,A,7,21.7,A,7,82,A,7,984,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,24.4,A,7,21.1,A,7,82,A,7,985,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.3,A,7,21.1,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/09/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.3,A,7,21.1,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/09/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,20.6,A,7,91,A,7,985,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/09/2001,06:00,21,565,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,22.8,A,7,20.6,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,4000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/09/2001,07:00,236,1329,102,2,8,103,2,15,84,2,8,110,2,8,76,2,15,96,2,8,180,2,19,0,E,9,0,E,9,25.0,A,7,21.1,A,7,79,A,7,985,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,08:00,501,1329,277,2,8,380,2,15,133,2,8,288,2,8,359,2,15,153,2,8,259,2,19,0,E,9,0,E,9,27.0,A,7,23.0,A,7,79,A,7,986,A,7,20,A,7,1.5,A,7,4000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,09:00,746,1329,447,2,8,436,2,15,201,2,8,471,2,8,443,2,15,221,2,8,455,2,19,0,E,9,0,A,7,30.0,A,7,22.2,A,7,63,A,7,987,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,10:00,956,1329,627,2,8,577,2,15,211,2,8,655,2,8,581,2,15,236,2,8,600,2,19,1,E,9,0,E,9,31.7,A,7,21.1,A,7,54,A,7,987,A,7,160,A,7,2.1,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,11:00,1115,1329,754,2,8,628,2,15,226,2,8,798,2,8,638,2,15,261,2,8,917,2,19,0,E,9,0,E,9,32.8,A,7,21.1,A,7,50,A,7,987,A,7,160,B,8,1.5,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,12:00,1213,1329,831,2,8,596,2,15,286,2,8,874,2,8,602,2,15,323,2,8,1609,2,19,4,E,9,4,E,9,32.2,A,7,20.6,A,7,50,A,7,986,A,7,160,A,7,3.1,A,7,4800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,13:00,1242,1329,811,2,8,558,2,15,288,2,8,855,2,8,564,2,15,326,2,8,1868,2,19,8,E,9,8,E,9,33.9,A,7,21.1,A,7,47,A,7,984,A,7,230,A,7,4.1,A,7,4800,B,7,1829,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,14:00,1202,1329,797,2,8,581,2,15,271,2,8,841,2,8,588,2,15,308,2,8,1459,2,19,1,E,9,1,E,9,33.3,A,7,20.0,A,7,46,A,7,985,A,7,190,A,7,3.6,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,15:00,1094,1329,573,2,8,251,2,15,367,2,8,625,2,8,272,2,15,401,2,8,1385,2,19,2,E,9,1,E,9,33.9,A,7,21.1,A,7,47,A,7,983,A,7,210,B,8,2.6,A,7,4800,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,16:00,925,1329,514,2,8,308,2,15,298,2,8,555,2,8,331,2,15,324,2,8,850,2,19,2,E,9,1,E,9,33.9,A,7,20.6,A,7,46,A,7,984,A,7,220,A,7,3.1,A,7,4800,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,17:00,708,1329,396,2,8,370,2,15,199,2,8,428,2,8,388,2,15,221,2,8,454,2,19,3,E,9,3,E,9,33.3,A,7,20.6,A,7,47,A,7,983,A,7,310,A,7,3.1,A,7,4800,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,18:00,458,1329,225,2,8,285,2,15,126,2,8,239,2,8,270,2,15,146,2,8,254,2,19,0,E,9,0,E,9,32.8,A,7,21.1,A,7,50,A,7,983,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,19:00,192,1329,71,2,8,161,2,15,48,2,8,75,2,8,100,2,15,61,2,8,88,2,19,0,E,9,0,A,7,31.1,A,7,21.7,A,7,57,A,7,982,A,7,100,A,7,1.5,A,7,4800,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,20:00,7,343,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,6,E,9,5,E,9,30.6,A,7,22.2,A,7,61,A,7,983,A,7,140,A,7,3.1,A,7,4800,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,28.9,A,7,20.6,A,7,61,A,7,984,A,7,0,A,7,0.0,A,7,4800,B,7,1829,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,3,E,9,27.8,A,7,20.0,A,7,63,A,7,984,A,7,150,A,7,1.5,A,7,12800,B,7,77777,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/09/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,27.8,A,7,21.7,A,7,69,A,7,984,A,7,190,A,7,4.1,A,7,11200,B,7,77777,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/09/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,26.1,A,7,22.2,A,7,79,A,7,983,A,7,210,A,7,3.1,A,7,11200,B,7,77777,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,25.6,A,7,21.1,A,7,76,A,7,983,A,7,210,A,7,2.6,A,7,12800,B,7,77777,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.0,A,7,20.6,A,7,77,A,7,983,A,7,200,A,7,3.1,A,7,14400,B,7,77777,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,24.4,A,7,21.1,A,7,82,A,7,983,A,7,230,A,7,3.1,A,7,11200,B,7,77777,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,0,E,9,23.9,A,7,21.7,A,7,88,A,7,983,A,7,220,A,7,3.1,A,7,11200,B,7,77777,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,23.3,A,7,21.7,A,7,91,A,7,983,A,7,260,A,7,2.6,A,7,9600,B,7,77777,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/10/2001,06:00,20,543,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,5,E,9,5,E,9,23.0,A,7,22.0,A,7,94,A,7,983,A,7,230,A,7,2.1,A,7,4000,B,7,7500,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/10/2001,07:00,233,1330,114,2,8,155,2,15,87,2,8,122,2,8,113,2,15,102,2,8,186,2,19,0,E,9,0,E,9,25.0,A,7,22.2,A,7,84,A,7,983,A,7,250,A,7,1.5,A,7,4000,B,7,77777,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/10/2001,08:00,498,1330,277,2,8,380,2,15,135,2,8,289,2,8,358,2,15,154,2,8,263,2,19,0,E,9,0,E,9,26.7,A,7,22.8,A,7,79,A,7,984,A,7,330,A,7,1.5,A,7,8000,B,7,77777,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/10/2001,09:00,744,1330,460,2,8,485,2,15,188,2,8,488,2,8,493,2,15,211,2,8,422,2,19,0,E,9,0,E,9,28.9,A,7,22.2,A,7,67,A,7,984,A,7,20,A,7,2.6,A,7,11200,B,7,77777,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,10:00,954,1330,646,2,8,638,2,15,187,2,8,680,2,8,646,2,15,216,2,8,538,2,19,0,E,9,0,E,9,30.0,A,7,22.2,A,7,63,A,7,984,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,11:00,1113,1330,785,2,8,688,2,15,207,2,8,835,2,8,702,2,15,246,2,8,841,2,19,0,E,9,0,E,9,31.1,A,7,21.7,A,7,57,A,7,984,A,7,340,B,8,1.5,A,7,14400,B,7,77777,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,12:00,1211,1330,861,2,8,644,2,15,273,2,8,908,2,8,652,2,15,313,2,8,1526,2,19,8,E,9,8,E,9,31.7,A,7,22.2,A,7,57,A,7,984,A,7,320,A,7,3.1,A,7,16000,B,7,1341,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,13:00,1240,1330,745,2,8,402,2,15,369,2,8,797,2,8,420,2,15,404,2,8,2451,2,19,8,E,9,8,E,9,32.8,A,7,22.2,A,7,54,A,7,982,A,7,330,B,8,3.1,A,7,16000,B,7,1463,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,14:00,1199,1330,797,2,8,580,2,15,272,2,8,839,2,8,587,2,15,308,2,8,1448,2,19,8,E,9,8,E,9,32.8,A,7,22.2,A,7,54,A,7,983,A,7,350,B,8,3.1,A,7,16000,B,7,1981,A,7,5.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,17,C,8 -08/10/2001,15:00,1091,1330,469,2,8,125,2,15,366,2,8,516,2,8,133,2,15,407,2,8,1376,2,19,8,E,9,6,E,9,32.2,A,7,21.7,A,7,54,A,7,983,A,7,360,A,7,4.1,A,7,16000,B,7,7620,A,7,5.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,17,C,8 -08/10/2001,16:00,922,1330,135,2,8,0,2,15,135,2,8,165,2,8,0,2,15,165,2,8,679,2,19,7,E,9,6,E,9,29.4,A,7,22.8,A,7,68,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,5486,A,7,5.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,17,C,8 -08/10/2001,17:00,705,1330,130,2,8,0,2,15,130,2,8,154,2,8,0,2,15,154,2,8,591,2,19,4,E,9,3,E,9,30.0,A,7,22.2,A,7,63,A,7,982,A,7,260,A,7,2.6,A,7,16000,B,7,7620,A,7,5.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,18:00,454,1330,224,2,8,194,2,15,158,2,8,242,2,8,183,2,15,179,2,8,360,2,19,1,E,9,1,E,9,30.0,A,7,22.8,A,7,65,A,7,982,A,7,220,A,7,1.5,A,7,16000,B,7,6096,A,7,5.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,19:00,187,1330,41,2,8,5,2,15,40,2,8,46,2,8,0,2,15,46,2,8,141,2,19,5,E,9,5,A,7,30.0,A,7,22.8,A,7,65,A,7,981,A,7,280,A,7,2.1,A,7,14400,B,7,77777,A,7,5.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,20:00,6,321,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,6,E,9,3,E,9,28.9,A,7,23.3,A,7,72,A,7,983,A,7,260,A,7,1.5,A,7,16000,B,7,77777,A,7,5.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,4,E,9,27.2,A,7,24.4,A,7,85,A,7,983,A,7,150,A,7,2.1,A,7,12800,B,7,7620,A,7,5.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,6,E,9,27.8,A,7,23.9,A,7,79,A,7,984,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,5.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,5,E,9,27.2,A,7,22.8,A,7,77,A,7,984,A,7,170,A,7,2.1,A,7,12800,B,7,77777,A,7,5.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/10/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,26.7,A,7,22.8,A,7,79,A,7,984,A,7,180,A,7,3.1,A,7,12800,B,7,2134,A,7,6.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/11/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,25.6,A,7,22.2,A,7,82,A,7,982,A,7,160,A,7,2.1,A,7,11200,B,7,19873,A,7,6.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/11/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,25.0,A,7,22.8,A,7,88,A,7,983,A,7,210,A,7,2.6,A,7,11200,B,7,1402,A,7,5.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/11/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,B,8,10,B,8,25.0,A,7,22.8,A,7,88,A,7,984,A,7,210,A,7,2.1,A,7,9600,B,7,77777,A,7,5.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -08/11/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.0,A,7,20.0,A,7,88,A,7,984,A,7,150,A,7,5.1,A,7,800,B,7,180,A,7,5.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -08/11/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.1,A,7,20.6,A,7,97,A,7,983,A,7,80,A,7,4.1,A,7,8400,C,8,18471,A,7,5.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/11/2001,06:00,19,521,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,B,8,9,B,8,21.7,A,7,20.6,A,7,93,A,7,983,A,7,300,A,7,1.5,A,7,16000,B,7,1676,A,7,5.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/11/2001,07:00,230,1330,21,2,8,0,2,15,21,2,8,25,2,8,0,2,15,25,2,8,86,2,19,9,E,9,8,E,9,21.7,A,7,20.6,A,7,93,A,7,984,A,7,230,A,7,3.6,A,7,14400,B,7,12984,A,7,5.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/11/2001,08:00,495,1330,44,2,8,0,2,15,44,2,8,54,2,8,0,2,15,54,2,8,203,2,19,9,E,9,9,E,9,22.2,A,7,21.1,A,7,93,A,7,985,A,7,260,A,7,3.1,A,7,11200,B,7,975,A,7,5.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/11/2001,09:00,742,1330,174,2,8,0,2,15,174,2,8,203,2,8,0,2,15,203,2,8,763,2,19,7,E,9,6,E,9,24.4,A,7,22.8,A,7,91,A,7,985,A,7,230,A,7,2.6,A,7,11200,B,7,5486,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/11/2001,10:00,952,1330,576,2,8,364,2,15,314,2,8,622,2,8,392,2,15,341,2,8,930,2,19,5,B,8,5,B,8,25.6,A,7,23.3,A,7,87,A,7,986,A,7,190,B,8,1.5,A,7,9600,B,7,305,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/11/2001,11:00,1112,1330,573,2,8,229,2,15,381,2,8,624,2,8,248,2,15,416,2,8,1499,2,19,4,E,9,3,E,9,26.7,A,7,23.9,A,7,85,A,7,986,A,7,150,A,7,3.1,A,7,9600,B,7,5486,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -08/11/2001,12:00,1209,1330,849,2,8,596,2,15,306,2,8,888,2,8,599,2,15,342,2,8,1678,2,19,5,E,9,5,E,9,28.9,A,7,23.9,A,7,74,A,7,985,A,7,210,A,7,2.1,A,7,12800,B,7,5486,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/11/2001,13:00,1238,1330,811,2,8,552,2,15,295,2,8,886,2,8,579,2,15,346,2,8,1920,2,19,8,E,9,8,E,9,30.0,A,7,24.4,A,7,72,A,7,984,A,7,170,A,7,4.6,A,7,14400,B,7,1372,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/11/2001,14:00,1197,1330,838,2,8,569,2,15,325,2,8,903,2,8,595,2,15,366,2,8,1766,2,19,7,E,9,6,E,9,31.1,A,7,23.9,A,7,66,A,7,984,A,7,180,A,7,4.1,A,7,16000,B,7,7620,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,17,C,8 -08/11/2001,15:00,1088,1330,226,2,8,12,2,15,216,2,8,274,2,8,9,2,15,266,2,8,1064,2,19,9,E,9,8,E,9,28.3,A,7,24.4,A,7,79,A,7,984,A,7,60,A,7,1.5,A,7,14400,B,7,11643,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,17,C,8 -08/11/2001,16:00,919,1330,254,2,8,18,2,15,241,2,8,297,2,8,15,2,15,286,2,8,1088,2,19,9,E,9,8,E,9,23.3,A,7,21.1,A,7,87,A,7,985,A,7,360,A,7,6.2,A,7,12800,B,7,1067,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/11/2001,17:00,701,1330,70,2,8,0,2,15,70,2,8,87,2,8,0,2,15,87,2,8,344,2,19,10,E,9,10,E,9,22.2,A,7,21.7,A,7,97,A,7,985,A,7,10,A,7,6.2,A,7,8000,B,7,1311,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/11/2001,18:00,450,1330,55,2,8,0,2,15,55,2,8,66,2,8,0,2,15,66,2,8,241,2,19,10,E,9,8,E,9,22.2,A,7,21.7,A,7,97,A,7,984,A,7,10,A,7,3.1,A,7,11200,B,7,1219,A,7,5.5,E,8,0.000,F,8,0.00,F,8,3,1,D,9,61,C,8 -08/11/2001,19:00,183,1330,11,2,8,0,2,15,11,2,8,14,2,8,0,2,15,14,2,8,46,2,19,10,E,9,8,A,7,22.2,A,7,21.7,A,7,97,A,7,985,A,7,190,A,7,5.7,A,7,16000,B,7,884,A,7,5.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/11/2001,20:00,5,277,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,8,E,9,22.8,A,7,21.7,A,7,94,A,7,987,A,7,120,A,7,3.1,A,7,12800,B,7,1829,A,7,5.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/11/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,E,9,22.2,A,7,21.1,A,7,93,A,7,987,A,7,180,A,7,1.5,A,7,14400,B,7,3300,A,7,5.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,17,C,8 -08/11/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,E,9,21.7,A,7,21.7,A,7,100,A,7,987,A,7,0,A,7,0.0,A,7,11200,B,7,1829,A,7,5.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/11/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,8,E,9,21.7,A,7,21.1,A,7,96,A,7,987,A,7,180,A,7,3.6,A,7,14400,B,7,3048,A,7,5.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/11/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,E,9,21.7,A,7,21.1,A,7,96,A,7,987,A,7,180,A,7,2.1,A,7,16000,B,7,1524,A,7,6.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,7,E,9,21.7,A,7,20.6,A,7,93,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,6.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,7,E,9,21.7,A,7,21.1,A,7,96,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,5.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,6,E,9,21.7,A,7,21.1,A,7,96,A,7,987,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,5.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,6,E,9,21.7,A,7,21.1,A,7,96,A,7,987,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,5.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,4,E,9,21.1,A,7,20.6,A,7,97,A,7,987,A,7,200,A,7,1.5,A,7,14400,B,7,77777,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,06:00,17,499,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,9,E,9,8,E,9,21.1,A,7,20.6,A,7,97,A,7,988,A,7,190,A,7,2.6,A,7,11200,B,7,122,A,7,5.3,E,8,0.000,F,8,0.00,F,8,3,1,D,9,00,C,8 -08/12/2001,07:00,227,1330,106,2,8,141,2,15,82,2,8,113,2,8,101,2,15,96,2,8,175,2,19,10,E,9,10,E,9,21.7,A,7,21.7,A,7,100,A,7,988,A,7,200,A,7,3.1,A,7,3200,B,7,732,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/12/2001,08:00,493,1330,220,2,8,146,2,15,165,2,8,237,2,8,141,2,15,185,2,8,381,2,19,8,E,9,8,E,9,23.3,A,7,22.2,A,7,94,A,7,988,A,7,200,A,7,4.1,A,7,3200,B,7,122,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/12/2001,09:00,740,1330,461,2,8,442,2,15,214,2,8,481,2,8,448,2,15,232,2,8,485,2,19,3,E,9,3,E,9,25.0,A,7,22.8,A,7,88,A,7,989,A,7,200,A,7,4.1,A,7,11200,B,7,7620,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/12/2001,10:00,950,1330,595,2,8,480,2,15,252,2,8,635,2,8,498,2,15,279,2,8,729,2,19,0,E,9,0,E,9,26.1,A,7,23.3,A,7,85,A,7,989,A,7,210,A,7,3.6,A,7,11200,B,7,7620,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,11:00,1110,1330,698,2,8,483,2,15,294,2,8,750,2,8,505,2,15,329,2,8,1193,2,19,5,E,9,5,E,9,27.8,A,7,23.3,A,7,77,A,7,989,A,7,200,A,7,4.1,A,7,14400,B,7,7620,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,12:00,1207,1330,715,2,8,361,2,15,386,2,8,786,2,8,393,2,15,429,2,8,1982,2,19,8,E,9,8,E,9,28.9,A,7,23.3,A,7,72,A,7,989,A,7,190,A,7,4.6,A,7,16000,B,7,975,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,13:00,1236,1330,762,2,8,456,2,15,338,2,8,823,2,8,477,2,15,378,2,8,2182,2,19,8,E,9,8,E,9,30.0,A,7,22.2,A,7,63,A,7,987,A,7,220,A,7,5.7,A,7,16000,B,7,1311,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,14:00,1195,1330,844,2,8,634,2,15,273,2,8,888,2,8,641,2,15,311,2,8,1421,2,19,5,E,9,5,E,9,31.1,A,7,21.7,A,7,57,A,7,988,A,7,220,A,7,5.7,A,7,16000,B,7,7620,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,15:00,1085,1330,741,2,8,626,2,15,228,2,8,780,2,8,635,2,15,261,2,8,849,2,19,8,E,9,8,E,9,30.6,A,7,21.1,A,7,57,A,7,987,A,7,220,A,7,5.7,A,7,16000,B,7,1676,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,16:00,916,1330,502,2,8,261,2,15,322,2,8,539,2,8,280,2,15,346,2,8,922,2,19,7,E,9,5,E,9,29.4,A,7,21.1,A,7,61,A,7,986,A,7,220,A,7,4.6,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,17:00,698,1330,206,2,8,23,2,15,193,2,8,235,2,8,19,2,15,225,2,8,797,2,19,8,E,9,5,E,9,30.0,A,7,21.1,A,7,59,A,7,987,A,7,230,A,7,6.2,A,7,16000,B,7,7620,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,18:00,446,1330,149,2,8,51,2,15,132,2,8,163,2,8,48,2,15,148,2,8,355,2,19,8,E,9,5,E,9,30.0,A,7,20.0,A,7,55,A,7,986,A,7,230,A,7,4.1,A,7,16000,B,7,7620,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,19:00,178,1330,54,2,8,74,2,15,44,2,8,59,2,8,48,2,15,53,2,8,93,2,19,10,E,9,10,A,7,28.9,A,7,20.6,A,7,61,A,7,985,A,7,250,A,7,3.1,A,7,16000,B,7,2286,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,20:00,4,255,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,9,E,9,8,E,9,27.2,A,7,21.1,A,7,69,A,7,987,A,7,280,A,7,2.1,A,7,16000,B,7,1981,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,26.7,A,7,20.0,A,7,67,A,7,987,A,7,260,A,7,2.6,A,7,16000,B,7,2286,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,26.1,A,7,20.0,A,7,69,A,7,988,A,7,240,A,7,2.6,A,7,16000,B,7,2591,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,24.4,A,7,20.0,A,7,76,A,7,987,A,7,230,A,7,2.6,A,7,16000,B,7,77777,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/12/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,5,E,9,23.9,A,7,20.0,A,7,79,A,7,987,A,7,220,A,7,3.1,A,7,16000,B,7,77777,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,7,E,9,24.4,A,7,20.0,A,7,76,A,7,986,A,7,230,A,7,3.1,A,7,16000,B,7,77777,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,23.9,A,7,20.6,A,7,82,A,7,986,A,7,190,A,7,2.1,A,7,16000,B,7,1981,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,23.3,A,7,20.6,A,7,85,A,7,986,A,7,200,A,7,1.5,A,7,16000,B,7,2438,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,6,E,9,23.3,A,7,20.6,A,7,85,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,7,E,9,22.8,A,7,20.6,A,7,87,A,7,986,A,7,210,A,7,2.6,A,7,16000,B,7,77777,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,06:00,16,499,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,8,E,9,7,E,9,22.8,A,7,20.6,A,7,87,A,7,986,A,7,230,A,7,1.5,A,7,16000,B,7,6096,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,07:00,224,1331,32,2,8,0,2,15,32,2,8,37,2,8,0,2,15,37,2,8,124,2,19,10,E,9,9,E,9,23.9,A,7,21.1,A,7,84,A,7,986,A,7,230,A,7,3.1,A,7,16000,B,7,2591,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,08:00,490,1331,125,2,8,0,2,15,125,2,8,142,2,8,0,2,15,142,2,8,483,2,19,9,E,9,6,E,9,24.4,A,7,21.1,A,7,82,A,7,987,A,7,260,A,7,3.6,A,7,16000,B,7,4572,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,09:00,737,1331,140,2,8,0,2,15,140,2,8,166,2,8,0,2,15,166,2,8,641,2,19,10,E,9,10,E,9,24.4,A,7,21.7,A,7,85,A,7,987,A,7,280,A,7,2.6,A,7,16000,B,7,1829,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,10:00,948,1331,115,2,8,0,2,15,115,2,8,143,2,8,0,2,15,143,2,8,595,2,19,10,E,9,9,E,9,23.9,A,7,22.2,A,7,90,A,7,987,A,7,290,A,7,2.1,A,7,6400,B,7,427,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/13/2001,11:00,1108,1331,131,2,8,0,2,15,131,2,8,165,2,8,0,2,15,165,2,8,692,2,19,8,E,9,6,E,9,23.3,A,7,22.2,A,7,94,A,7,987,A,7,280,A,7,2.6,A,7,12800,B,7,3962,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/13/2001,12:00,1205,1331,318,2,8,12,2,15,307,2,8,381,2,8,10,2,15,372,2,8,1436,2,19,9,E,9,8,E,9,24.4,A,7,22.8,A,7,91,A,7,986,A,7,280,A,7,2.1,A,7,16000,B,7,3962,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/13/2001,13:00,1234,1331,270,2,8,6,2,15,265,2,8,329,2,8,5,2,15,325,2,8,1286,2,19,7,E,9,6,E,9,25.0,A,7,22.8,A,7,88,A,7,985,A,7,260,A,7,3.1,A,7,16000,B,7,77777,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/13/2001,14:00,1192,1331,283,2,8,6,2,15,278,2,8,342,2,8,5,2,15,337,2,8,1327,2,19,6,E,9,6,E,9,25.6,A,7,22.2,A,7,82,A,7,985,A,7,230,A,7,3.6,A,7,16000,B,7,3962,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/13/2001,15:00,1083,1331,532,2,8,215,2,15,357,2,8,587,2,8,229,2,15,400,2,8,1320,2,19,5,E,9,5,E,9,26.7,A,7,22.8,A,7,79,A,7,984,A,7,220,A,7,3.1,A,7,16000,B,7,3962,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,16:00,913,1331,237,2,8,18,2,15,224,2,8,278,2,8,15,2,15,268,2,8,1026,2,19,6,E,9,6,E,9,27.2,A,7,22.2,A,7,74,A,7,984,A,7,250,A,7,1.5,A,7,16000,B,7,7620,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,17:00,694,1331,335,2,8,199,2,15,231,2,8,365,2,8,205,2,15,258,2,8,584,2,19,9,E,9,8,E,9,27.2,A,7,22.2,A,7,74,A,7,984,A,7,270,A,7,2.6,A,7,16000,B,7,914,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,18:00,441,1331,218,2,8,256,2,15,133,2,8,231,2,8,239,2,15,151,2,8,272,2,19,9,E,9,8,E,9,23.9,A,7,21.7,A,7,88,A,7,983,A,7,310,A,7,3.1,A,7,12800,B,7,1433,A,7,4.4,E,8,0.000,F,8,0.00,F,8,5,1,D,9,00,C,8 -08/13/2001,19:00,174,1331,21,2,8,0,2,15,21,2,8,25,2,8,0,2,15,25,2,8,82,2,19,8,E,9,8,A,7,22.8,A,7,21.7,A,7,94,A,7,983,A,7,220,A,7,3.1,A,7,14400,B,7,701,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,80,C,8 -08/13/2001,20:00,4,233,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,9,E,9,8,E,9,22.8,A,7,21.7,A,7,94,A,7,984,A,7,260,A,7,1.5,A,7,16000,B,7,3300,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/13/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,22.2,A,7,21.7,A,7,97,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,2896,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,80,C,8 -08/13/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,22.8,A,7,21.7,A,7,94,A,7,983,A,7,0,A,7,0.0,A,7,16000,B,7,2438,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.8,A,7,21.7,A,7,94,A,7,983,A,7,300,A,7,1.5,A,7,16000,B,7,2896,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/13/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.2,A,7,21.7,A,7,97,A,7,983,A,7,290,A,7,2.1,A,7,16000,B,7,3353,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,7,E,9,22.8,A,7,21.1,A,7,90,A,7,982,A,7,340,A,7,2.1,A,7,16000,B,7,3962,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,22.2,A,7,21.7,A,7,97,A,7,982,A,7,360,A,7,1.5,A,7,14400,B,7,3962,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,22.2,A,7,21.1,A,7,93,A,7,982,A,7,10,B,8,2.1,A,7,11200,B,7,1829,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,21.7,A,7,21.1,A,7,96,A,7,982,A,7,20,A,7,2.6,A,7,8000,B,7,1829,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/14/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.7,A,7,21.7,A,7,100,A,7,982,A,7,40,A,7,3.6,A,7,6400,B,7,91,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/14/2001,06:00,15,477,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,4,E,9,4,E,9,21.7,A,7,21.1,A,7,96,A,7,983,A,7,30,A,7,2.1,A,7,4000,B,7,7620,A,7,3.9,E,8,0.000,F,8,0.00,F,8,28,1,D,9,10,C,8 -08/14/2001,07:00,221,1331,108,2,8,165,2,15,81,2,8,112,2,8,110,2,15,93,2,8,164,2,19,0,E,9,0,E,9,21.7,A,7,21.1,A,7,96,A,7,983,A,7,20,A,7,2.1,A,7,4800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/14/2001,08:00,487,1331,257,2,8,324,2,15,138,2,8,274,2,8,313,2,15,159,2,8,282,2,19,0,E,9,0,E,9,23.3,A,7,20.0,A,7,82,A,7,983,A,7,30,A,7,3.1,A,7,11200,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/14/2001,09:00,735,1331,455,2,8,467,2,15,196,2,8,479,2,8,474,2,15,217,2,8,438,2,19,0,E,9,0,E,9,25.0,A,7,19.4,A,7,71,A,7,983,A,7,20,A,7,3.1,A,7,11200,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,10:00,946,1331,627,2,8,601,2,15,199,2,8,657,2,8,606,2,15,225,2,8,558,2,19,0,E,9,0,E,9,26.1,A,7,18.9,A,7,65,A,7,984,A,7,30,A,7,4.6,A,7,12800,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,11:00,1106,1331,785,2,8,694,2,15,207,2,8,835,2,8,708,2,15,245,2,8,820,2,19,0,E,9,0,E,9,27.2,A,7,18.9,A,7,61,A,7,983,A,7,40,A,7,3.6,A,7,11200,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,12:00,1203,1331,855,2,8,668,2,15,250,2,8,907,2,8,679,2,15,291,2,8,1350,2,19,0,E,9,0,E,9,28.3,A,7,19.4,A,7,59,A,7,984,A,7,40,B,8,2.6,A,7,11200,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,13:00,1232,1331,834,2,8,600,2,15,278,2,8,881,2,8,607,2,15,317,2,8,1695,2,19,4,E,9,4,E,9,28.3,A,7,18.3,A,7,55,A,7,982,A,7,40,A,7,3.6,A,7,11200,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,14:00,1190,1331,726,2,8,437,2,15,334,2,8,779,2,8,457,2,15,369,2,8,1757,2,19,3,E,9,3,A,7,29.4,A,7,18.3,A,7,51,A,7,983,A,7,50,B,8,2.1,A,7,12800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,15:00,1080,1331,723,2,8,596,2,15,238,2,8,759,2,8,603,2,15,269,2,8,868,2,19,2,E,9,2,A,7,30.0,A,7,18.3,A,7,50,A,7,982,A,7,60,A,7,5.2,A,7,12800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,16:00,909,1331,603,2,8,617,2,15,181,2,8,633,2,8,623,2,15,207,2,8,484,2,19,3,E,9,3,E,9,29.4,A,7,17.2,A,7,48,A,7,982,A,7,30,A,7,4.1,A,7,12800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,17:00,690,1331,421,2,8,504,2,15,160,2,8,450,2,8,508,2,15,186,2,8,340,2,19,3,E,9,3,E,9,28.9,A,7,17.8,A,7,51,A,7,982,A,7,10,A,7,2.1,A,7,12800,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,18:00,437,1331,217,2,8,324,2,15,111,2,8,227,2,8,294,2,15,130,2,8,210,2,19,3,E,9,3,E,9,28.3,A,7,18.9,A,7,57,A,7,982,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,19:00,169,1331,59,2,8,147,2,15,41,2,8,63,2,8,83,2,15,53,2,8,75,2,19,5,E,9,5,A,7,27.2,A,7,18.3,A,7,58,A,7,981,A,7,10,A,7,1.5,A,7,11200,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,20:00,3,211,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,8,E,9,8,E,9,25.6,A,7,18.9,A,7,67,A,7,983,A,7,60,A,7,2.1,A,7,12800,B,7,3048,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,23.9,A,7,20.0,A,7,79,A,7,983,A,7,30,A,7,2.1,A,7,9600,B,7,3048,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/14/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,24.4,A,7,20.0,A,7,76,A,7,983,A,7,10,A,7,1.5,A,7,9600,B,7,3048,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/14/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,23.9,A,7,19.4,A,7,76,A,7,983,A,7,50,A,7,2.1,A,7,11200,B,7,3353,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/14/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,22.8,A,7,19.4,A,7,81,A,7,984,A,7,30,A,7,1.5,A,7,9600,B,7,3353,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,6,E,9,22.2,A,7,18.9,A,7,82,A,7,983,A,7,40,A,7,2.1,A,7,11200,B,7,3658,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/15/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,21.7,A,7,18.3,A,7,81,A,7,983,A,7,20,A,7,2.6,A,7,12800,B,7,3353,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,21.1,A,7,18.3,A,7,84,A,7,983,A,7,50,A,7,1.5,A,7,11200,B,7,4572,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,21.1,A,7,18.3,A,7,84,A,7,984,A,7,40,A,7,2.1,A,7,11200,B,7,2743,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,20.6,A,7,18.3,A,7,87,A,7,984,A,7,360,A,7,2.1,A,7,11200,B,7,3048,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,06:00,14,455,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,20.6,A,7,17.8,A,7,84,A,7,985,A,7,350,A,7,1.5,A,7,9600,B,7,1981,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/15/2001,07:00,218,1332,66,2,8,0,2,15,66,2,8,73,2,8,0,2,15,73,2,8,209,2,19,10,E,9,10,E,9,21.1,A,7,18.3,A,7,84,A,7,985,A,7,40,A,7,2.1,A,7,9600,B,7,3048,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/15/2001,08:00,485,1332,110,2,8,0,2,15,110,2,8,126,2,8,0,2,15,126,2,8,438,2,19,10,E,9,10,E,9,21.7,A,7,18.9,A,7,84,A,7,986,A,7,80,A,7,2.6,A,7,9600,B,7,2896,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/15/2001,09:00,733,1332,127,2,8,0,2,15,127,2,8,152,2,8,0,2,15,152,2,8,589,2,19,10,E,9,10,E,9,22.2,A,7,18.9,A,7,82,A,7,986,A,7,70,A,7,2.1,A,7,11200,B,7,2896,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,10:00,944,1332,346,2,8,49,2,15,311,2,8,381,2,8,50,2,15,345,2,8,1115,2,19,8,E,9,8,E,9,23.9,A,7,19.4,A,7,76,A,7,986,A,7,60,A,7,2.6,A,7,11200,B,7,3048,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,11:00,1104,1332,393,2,8,66,2,15,338,2,8,434,2,8,68,2,15,378,2,8,1434,2,19,3,E,9,3,E,9,25.6,A,7,20.0,A,7,71,A,7,986,A,7,30,B,8,2.1,A,7,11200,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,12:00,1201,1332,843,2,8,566,2,15,332,2,8,907,2,8,592,2,15,372,2,8,1821,2,19,5,E,9,5,E,9,26.1,A,7,18.9,A,7,65,A,7,986,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,13:00,1230,1332,864,2,8,648,2,15,265,2,8,915,2,8,658,2,15,307,2,8,1599,2,19,3,E,9,3,E,9,27.8,A,7,18.3,A,7,56,A,7,985,A,7,60,A,7,3.6,A,7,14400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,14:00,1187,1332,849,2,8,694,2,15,229,2,8,904,2,8,708,2,15,272,2,8,1167,2,19,4,E,9,4,E,9,27.8,A,7,18.9,A,7,58,A,7,986,A,7,110,A,7,2.6,A,7,11200,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,15:00,1077,1332,717,2,8,566,2,15,258,2,8,777,2,8,592,2,15,298,2,8,953,2,19,4,E,9,4,E,9,28.9,A,7,18.3,A,7,53,A,7,985,A,7,100,B,8,1.5,A,7,12800,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,16:00,906,1332,484,2,8,267,2,15,302,2,8,522,2,8,287,2,15,326,2,8,845,2,19,4,E,9,4,E,9,27.8,A,7,18.3,A,7,56,A,7,985,A,7,90,B,8,2.1,A,7,11200,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,17:00,686,1332,410,2,8,422,2,15,193,2,8,430,2,8,424,2,15,211,2,8,418,2,19,3,E,9,3,E,9,27.8,A,7,18.3,A,7,56,A,7,985,A,7,80,A,7,2.6,A,7,11200,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,18:00,432,1332,207,2,8,273,2,15,118,2,8,220,2,8,254,2,15,138,2,8,235,2,19,3,E,9,3,E,9,27.8,A,7,18.3,A,7,56,A,7,985,A,7,150,A,7,3.6,A,7,12800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,19:00,164,1332,55,2,8,122,2,15,40,2,8,58,2,8,68,2,15,50,2,8,73,2,19,0,E,9,0,A,7,25.6,A,7,18.9,A,7,67,A,7,985,A,7,140,A,7,3.1,A,7,11200,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,20:00,2,189,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,25.0,A,7,18.9,A,7,69,A,7,986,A,7,130,A,7,2.1,A,7,12800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.9,A,7,19.4,A,7,76,A,7,987,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,23.9,A,7,18.3,A,7,71,A,7,987,A,7,140,A,7,3.6,A,7,12800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.3,A,7,17.8,A,7,71,A,7,987,A,7,160,A,7,3.1,A,7,14400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/15/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,22.8,A,7,17.8,A,7,73,A,7,987,A,7,160,A,7,2.6,A,7,12800,B,7,3048,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,18.3,A,7,79,A,7,986,A,7,160,A,7,2.6,A,7,12800,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,E,9,22.2,A,7,17.8,A,7,76,A,7,986,A,7,180,A,7,3.1,A,7,12800,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,18.3,A,7,84,A,7,986,A,7,190,A,7,2.1,A,7,11200,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,18.3,A,7,87,A,7,986,A,7,160,A,7,2.1,A,7,9600,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/16/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,18.9,A,7,90,A,7,987,A,7,200,A,7,3.1,A,7,8000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/16/2001,06:00,13,433,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,20.0,A,7,18.9,A,7,93,A,7,987,A,7,210,A,7,2.1,A,7,4000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/16/2001,07:00,215,1332,78,2,8,23,2,15,74,2,8,85,2,8,18,2,15,82,2,8,170,2,19,0,E,9,0,E,9,21.7,A,7,19.4,A,7,87,A,7,988,A,7,220,A,7,3.6,A,7,6400,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/16/2001,08:00,482,1332,206,2,8,102,2,15,170,2,8,227,2,8,97,2,15,191,2,8,447,2,19,4,E,9,4,E,9,23.9,A,7,19.4,A,7,76,A,7,989,A,7,230,A,7,4.1,A,7,9600,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/16/2001,09:00,730,1332,408,2,8,307,2,15,239,2,8,436,2,8,322,2,15,258,2,8,570,2,19,0,E,9,0,E,9,25.0,A,7,17.8,A,7,64,A,7,989,A,7,240,A,7,5.7,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,10:00,942,1332,634,2,8,614,2,15,200,2,8,664,2,8,619,2,15,226,2,8,556,2,19,3,E,9,3,E,9,26.7,A,7,19.4,A,7,64,A,7,989,A,7,220,A,7,5.2,A,7,12800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,11:00,1101,1332,754,2,8,664,2,15,204,2,8,803,2,8,678,2,15,241,2,8,798,2,19,3,E,9,3,E,9,27.8,A,7,20.0,A,7,63,A,7,989,A,7,240,A,7,4.6,A,7,14400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,12:00,1199,1332,855,2,8,698,2,15,226,2,8,913,2,8,713,2,15,270,2,8,1204,2,19,3,E,9,3,E,9,28.3,A,7,20.0,A,7,61,A,7,989,A,7,200,A,7,3.6,A,7,14400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,13:00,1227,1332,876,2,8,690,2,15,239,2,8,934,2,8,704,2,15,284,2,8,1433,2,19,8,E,9,8,E,9,27.8,A,7,19.4,A,7,60,A,7,988,A,7,180,A,7,2.6,A,7,14400,B,7,1463,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,14:00,1184,1332,843,2,8,682,2,15,235,2,8,896,2,8,695,2,15,276,2,8,1181,2,19,8,E,9,8,E,9,29.4,A,7,18.9,A,7,53,A,7,988,A,7,160,A,7,4.1,A,7,16000,B,7,1494,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,15:00,1074,1332,723,2,8,602,2,15,236,2,8,758,2,8,609,2,15,267,2,8,846,2,19,4,E,9,4,E,9,30.0,A,7,18.3,A,7,50,A,7,988,A,7,170,A,7,6.2,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,16:00,902,1332,602,2,8,634,2,15,172,2,8,634,2,8,641,2,15,199,2,8,457,2,19,5,E,9,4,E,9,30.0,A,7,18.3,A,7,50,A,7,987,A,7,170,A,7,5.2,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,17:00,682,1332,404,2,8,445,2,15,176,2,8,426,2,8,447,2,15,197,2,8,376,2,19,3,E,9,3,E,9,29.4,A,7,18.3,A,7,51,A,7,987,A,7,170,A,7,4.1,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,18:00,428,1332,211,2,8,318,2,15,109,2,8,220,2,8,287,2,15,128,2,8,206,2,19,3,E,9,3,E,9,28.9,A,7,18.9,A,7,55,A,7,987,A,7,180,A,7,3.6,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,19:00,159,1332,54,2,8,130,2,15,39,2,8,58,2,8,71,2,15,49,2,8,71,2,19,2,E,9,2,A,7,27.2,A,7,18.9,A,7,61,A,7,986,A,7,160,A,7,3.6,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,20:00,2,167,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,26.1,A,7,18.9,A,7,65,A,7,987,A,7,160,A,7,3.6,A,7,16000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,24.4,A,7,19.4,A,7,74,A,7,988,A,7,160,A,7,2.6,A,7,16000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,24.4,A,7,18.9,A,7,71,A,7,988,A,7,190,A,7,3.6,A,7,14400,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,24.4,A,7,17.8,A,7,67,A,7,988,A,7,190,A,7,5.2,A,7,16000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/16/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,23.9,A,7,18.3,A,7,71,A,7,988,A,7,200,A,7,5.7,A,7,16000,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/17/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.8,A,7,18.9,A,7,79,A,7,987,A,7,200,A,7,3.6,A,7,16000,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/17/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,19.4,A,7,84,A,7,987,A,7,200,A,7,2.1,A,7,16000,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/17/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.2,A,7,20.0,A,7,87,A,7,987,A,7,190,A,7,3.1,A,7,14400,B,7,366,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/17/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.2,A,7,21.1,A,7,93,A,7,987,A,7,210,A,7,4.6,A,7,12800,B,7,305,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/17/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.8,A,7,21.7,A,7,94,A,7,988,A,7,210,A,7,6.7,A,7,11200,B,7,244,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/17/2001,06:00,12,411,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,22.8,A,7,21.7,A,7,94,A,7,988,A,7,220,A,7,4.6,A,7,6400,B,7,244,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/17/2001,07:00,211,1333,79,2,8,31,2,15,74,2,8,86,2,8,24,2,15,82,2,8,168,2,19,10,E,9,10,E,9,23.3,A,7,21.7,A,7,91,A,7,988,A,7,210,A,7,4.6,A,7,6400,B,7,244,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/17/2001,08:00,479,1333,177,2,8,51,2,15,159,2,8,194,2,8,48,2,15,177,2,8,424,2,19,10,E,9,10,E,9,24.4,A,7,22.2,A,7,88,A,7,989,A,7,220,A,7,4.6,A,7,8000,B,7,305,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/17/2001,09:00,728,1333,288,2,8,62,2,15,254,2,8,316,2,8,62,2,15,282,2,8,773,2,19,10,E,9,10,E,9,25.0,A,7,22.2,A,7,84,A,7,989,A,7,240,A,7,3.6,A,7,8000,B,7,427,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/17/2001,10:00,939,1333,481,2,8,219,2,15,326,2,8,526,2,8,232,2,15,362,2,8,994,2,19,9,E,9,8,E,9,27.2,A,7,22.8,A,7,77,A,7,989,A,7,230,A,7,4.6,A,7,8000,B,7,549,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,11:00,1099,1333,380,2,8,36,2,15,350,2,8,419,2,8,37,2,15,389,2,8,1467,2,19,7,E,9,6,E,9,27.2,A,7,22.2,A,7,74,A,7,989,A,7,220,A,7,3.6,A,7,9600,B,7,5486,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,12:00,1197,1333,275,2,8,6,2,15,270,2,8,333,2,8,5,2,15,328,2,8,1297,2,19,7,E,9,7,E,9,28.3,A,7,22.8,A,7,72,A,7,988,A,7,230,A,7,5.2,A,7,11200,B,7,5486,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/17/2001,13:00,1225,1333,282,2,8,6,2,15,277,2,8,342,2,8,5,2,15,338,2,8,1330,2,19,9,E,9,9,E,9,28.3,A,7,22.2,A,7,70,A,7,987,A,7,260,A,7,3.6,A,7,9600,B,7,2743,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,14:00,1182,1333,189,2,8,0,2,15,189,2,8,234,2,8,0,2,15,234,2,8,963,2,19,8,E,9,8,E,9,25.6,A,7,22.2,A,7,82,A,7,987,A,7,300,A,7,3.1,A,7,8000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,15:00,1070,1333,150,2,8,0,2,15,150,2,8,186,2,8,0,2,15,186,2,8,777,2,19,7,E,9,7,E,9,27.8,A,7,23.9,A,7,79,A,7,987,A,7,270,A,7,2.6,A,7,8000,B,7,5486,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,16:00,898,1333,506,2,8,302,2,15,302,2,8,545,2,8,324,2,15,326,2,8,839,2,19,8,E,9,7,E,9,27.2,A,7,23.3,A,7,79,A,7,986,A,7,250,A,7,2.6,A,7,8000,B,7,4572,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,17:00,677,1333,102,2,8,0,2,15,102,2,8,123,2,8,0,2,15,123,2,8,474,2,19,2,E,9,1,E,9,28.3,A,7,22.8,A,7,72,A,7,986,A,7,280,A,7,2.6,A,7,9600,B,7,7620,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,18:00,423,1333,64,2,8,0,2,15,64,2,8,75,2,8,0,2,15,75,2,8,269,2,19,5,E,9,5,E,9,27.8,A,7,22.8,A,7,74,A,7,986,A,7,230,A,7,2.6,A,7,9600,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,13,1,D,9,05,C,8 -08/17/2001,19:00,154,1333,53,2,8,81,2,15,44,2,8,58,2,8,48,2,15,52,2,8,92,2,19,5,E,9,5,A,7,26.7,A,7,22.8,A,7,79,A,7,985,A,7,230,A,7,1.5,A,7,9600,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,20:00,1,122,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,7,E,9,6,E,9,26.1,A,7,22.8,A,7,82,A,7,986,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,25.0,A,7,22.8,A,7,88,A,7,986,A,7,0,A,7,0.0,A,7,9600,B,7,2743,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,B,8,9,B,8,25.6,A,7,22.8,A,7,85,A,7,986,A,7,0,A,7,0.0,A,7,9600,B,7,3048,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/17/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,25.0,A,7,22.8,A,7,88,A,7,986,A,7,0,A,7,0.0,A,7,9600,B,7,1981,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/17/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,25.0,A,7,23.3,A,7,90,A,7,986,A,7,200,A,7,4.6,A,7,8000,B,7,1524,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/18/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,6,E,9,23.3,A,7,22.2,A,7,94,A,7,985,A,7,140,A,7,1.5,A,7,8000,B,7,77777,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/18/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,23.0,A,7,23.0,A,7,100,A,7,985,A,7,0,A,7,0.0,A,7,4000,B,7,1800,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/18/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,22.8,A,7,22.2,A,7,96,A,7,985,A,7,0,A,7,0.0,A,7,4800,B,7,1981,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/18/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,8,E,9,23.0,A,7,22.0,A,7,94,A,7,985,A,7,0,A,7,0.0,A,7,2800,B,7,2100,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/18/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,3,E,9,22.8,A,7,22.2,A,7,96,A,7,985,A,7,0,A,7,0.0,A,7,2800,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/18/2001,06:00,11,411,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,22.2,A,7,22.2,A,7,100,A,7,985,A,7,30,A,7,3.1,A,7,2400,B,7,732,A,7,4.3,E,8,0.000,F,8,0.00,F,8,23,1,D,9,10,C,8 -08/18/2001,07:00,208,1333,91,2,8,61,2,15,82,2,8,100,2,8,47,2,15,92,2,8,179,2,19,8,E,9,8,E,9,21.1,A,7,20.6,A,7,97,A,7,985,A,7,30,A,7,2.6,A,7,4800,B,7,1676,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/18/2001,08:00,476,1333,229,2,8,134,2,15,181,2,8,246,2,8,128,2,15,200,2,8,415,2,19,10,E,9,10,E,9,21.7,A,7,20.6,A,7,93,A,7,986,A,7,50,A,7,2.6,A,7,4800,B,7,610,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/18/2001,09:00,725,1333,375,2,8,172,2,15,281,2,8,404,2,8,177,2,15,308,2,8,724,2,19,8,E,9,8,E,9,23.3,A,7,20.6,A,7,85,A,7,986,A,7,60,A,7,2.6,A,7,4800,B,7,610,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,10:00,937,1333,506,2,8,219,2,15,352,2,8,551,2,8,231,2,15,388,2,8,1071,2,19,10,E,9,10,E,9,24.4,A,7,20.6,A,7,79,A,7,986,A,7,0,A,7,0.0,A,7,12800,B,7,610,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,11:00,1097,1333,605,2,8,260,2,15,391,2,8,656,2,8,282,2,15,424,2,8,1489,2,19,8,E,9,8,E,9,25.6,A,7,21.1,A,7,76,A,7,986,A,7,50,A,7,1.5,A,7,12800,B,7,671,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,12:00,1194,1333,660,2,8,253,2,15,433,2,8,719,2,8,275,2,15,472,2,8,2135,2,19,5,E,9,5,E,9,27.2,A,7,22.2,A,7,74,A,7,985,A,7,30,A,7,2.6,A,7,12800,B,7,4572,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,13:00,1222,1333,678,2,8,330,2,15,375,2,8,749,2,8,359,2,15,419,2,8,2011,2,19,5,E,9,5,E,9,26.7,A,7,22.8,A,7,79,A,7,983,A,7,20,A,7,3.1,A,7,11200,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,14:00,1179,1333,649,2,8,251,2,15,426,2,8,706,2,8,272,2,15,464,2,8,2000,2,19,5,E,9,5,E,9,27.2,A,7,22.2,A,7,74,A,7,984,A,7,50,A,7,2.1,A,7,9600,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/18/2001,15:00,1067,1333,584,2,8,256,2,15,378,2,8,632,2,8,277,2,15,409,2,8,1354,2,19,5,E,9,5,E,9,28.3,A,7,22.8,A,7,72,A,7,983,A,7,80,A,7,2.6,A,7,6400,B,7,4572,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/18/2001,16:00,895,1333,472,2,8,213,2,15,329,2,8,514,2,8,224,2,15,363,2,8,960,2,19,9,E,9,8,E,9,27.8,A,7,21.7,A,7,69,A,7,983,A,7,70,A,7,1.5,A,7,6400,B,7,914,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/18/2001,17:00,673,1333,339,2,8,170,2,15,253,2,8,366,2,8,174,2,15,278,2,8,633,2,19,7,E,9,4,E,9,26.7,A,7,22.8,A,7,79,A,7,984,A,7,160,A,7,5.2,A,7,6400,B,7,6096,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/18/2001,18:00,418,1333,186,2,8,141,2,15,141,2,8,200,2,8,130,2,15,159,2,8,317,2,19,10,E,9,10,E,9,23.9,A,7,21.7,A,7,88,A,7,983,A,7,200,A,7,4.6,A,7,12800,B,7,2438,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,19:00,149,1333,45,2,8,95,2,15,35,2,8,48,2,8,49,2,15,43,2,8,63,2,19,6,E,9,5,A,7,23.3,A,7,21.1,A,7,87,A,7,982,A,7,210,A,7,2.6,A,7,12800,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,20:00,1,100,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,9,E,9,5,E,9,22.2,A,7,21.1,A,7,93,A,7,983,A,7,170,A,7,2.1,A,7,12800,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,6,E,9,22.2,A,7,21.1,A,7,93,A,7,983,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,2,E,9,21.7,A,7,20.0,A,7,90,A,7,983,A,7,260,A,7,2.1,A,7,11200,B,7,77777,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,21.7,A,7,20.6,A,7,93,A,7,983,A,7,220,A,7,2.6,A,7,11200,B,7,3048,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/18/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,21.7,A,7,20.6,A,7,93,A,7,982,A,7,160,A,7,2.6,A,7,11200,B,7,3048,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.7,A,7,20.6,A,7,93,A,7,982,A,7,180,A,7,2.6,A,7,11200,B,7,183,A,7,5.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.7,A,7,21.1,A,7,96,A,7,982,A,7,190,A,7,3.6,A,7,6400,B,7,122,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/19/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.7,A,7,21.1,A,7,96,A,7,982,A,7,210,A,7,2.1,A,7,6400,B,7,122,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/19/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.7,A,7,21.7,A,7,100,A,7,981,A,7,240,A,7,2.1,A,7,4000,B,7,122,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/19/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.2,A,7,21.7,A,7,97,A,7,981,A,7,180,A,7,2.1,A,7,4800,B,7,183,A,7,5.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/19/2001,06:00,10,389,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,9,E,9,8,E,9,21.7,A,7,21.1,A,7,96,A,7,981,A,7,200,A,7,2.1,A,7,3200,B,7,183,A,7,5.2,E,8,0.000,F,8,0.00,F,8,18,1,D,9,10,C,8 -08/19/2001,07:00,205,1334,92,2,8,108,2,15,76,2,8,99,2,8,74,2,15,88,2,8,161,2,19,9,E,9,8,E,9,22.2,A,7,21.7,A,7,97,A,7,981,A,7,220,A,7,2.1,A,7,3200,B,7,183,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/19/2001,08:00,474,1334,230,2,8,223,2,15,150,2,8,242,2,8,213,2,15,166,2,8,313,2,19,10,E,9,10,E,9,22.2,A,7,21.7,A,7,97,A,7,982,A,7,190,A,7,2.6,A,7,3200,B,7,183,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/19/2001,09:00,723,1334,107,2,8,0,2,15,107,2,8,129,2,8,0,2,15,129,2,8,507,2,19,10,E,9,10,E,9,22.8,A,7,22.2,A,7,96,A,7,982,A,7,200,A,7,4.6,A,7,3200,B,7,213,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/19/2001,10:00,935,1334,250,2,8,12,2,15,241,2,8,293,2,8,10,2,15,286,2,8,1096,2,19,5,E,9,4,E,9,24.4,A,7,22.2,A,7,88,A,7,982,A,7,210,A,7,5.2,A,7,9600,B,7,5486,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/19/2001,11:00,1095,1334,399,2,8,72,2,15,339,2,8,440,2,8,74,2,15,379,2,8,1418,2,19,10,E,9,10,E,9,25.6,A,7,21.7,A,7,79,A,7,982,A,7,220,A,7,3.1,A,7,9600,B,7,610,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/19/2001,12:00,1192,1334,776,2,8,493,2,15,334,2,8,832,2,8,515,2,15,371,2,8,1758,2,19,8,E,9,5,E,9,27.2,A,7,21.7,A,7,72,A,7,982,A,7,200,A,7,3.1,A,7,9600,B,7,5486,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/19/2001,13:00,1220,1334,492,2,8,90,2,15,410,2,8,544,2,8,93,2,15,459,2,8,2057,2,19,9,E,9,8,E,9,27.8,A,7,21.7,A,7,69,A,7,980,A,7,240,A,7,4.6,A,7,11200,B,7,1097,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,14:00,1176,1334,472,2,8,84,2,15,398,2,8,522,2,8,86,2,15,445,2,8,1838,2,19,9,E,9,8,E,9,28.3,A,7,21.7,A,7,67,A,7,981,A,7,210,A,7,5.2,A,7,14400,B,7,2438,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,15:00,1064,1334,289,2,8,12,2,15,279,2,8,341,2,8,10,2,15,333,2,8,1292,2,19,7,E,9,5,E,9,28.3,A,7,21.1,A,7,65,A,7,980,A,7,210,A,7,6.2,A,7,16000,B,7,6096,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,16:00,891,1334,236,2,8,18,2,15,224,2,8,277,2,8,15,2,15,267,2,8,1013,2,19,6,E,9,5,E,9,28.9,A,7,21.7,A,7,65,A,7,980,A,7,230,A,7,5.2,A,7,16000,B,7,7620,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,17:00,669,1334,371,2,8,304,2,15,218,2,8,395,2,8,315,2,15,237,2,8,500,2,19,8,E,9,8,E,9,28.9,A,7,21.7,A,7,65,A,7,980,A,7,210,A,7,5.2,A,7,16000,B,7,1829,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,18:00,413,1334,166,2,8,102,2,15,134,2,8,179,2,8,94,2,15,150,2,8,301,2,19,3,E,9,3,E,9,28.3,A,7,19.4,A,7,59,A,7,980,A,7,240,A,7,4.6,A,7,16000,B,7,7620,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,19:00,143,1334,38,2,8,42,2,15,34,2,8,42,2,8,24,2,15,40,2,8,71,2,19,5,E,9,5,A,7,26.1,A,7,20.0,A,7,69,A,7,980,A,7,200,A,7,2.6,A,7,16000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,20:00,0,78,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,3,B,8,3,B,8,25.0,A,7,20.6,A,7,77,A,7,981,A,7,200,A,7,2.1,A,7,16000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.0,A,7,21.7,A,7,82,A,7,981,A,7,190,A,7,3.6,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,24.4,A,7,21.7,A,7,85,A,7,981,A,7,200,A,7,4.1,A,7,14400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,4,E,9,23.9,A,7,21.7,A,7,88,A,7,982,A,7,230,A,7,2.6,A,7,14400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/19/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,2,A,7,23.3,A,7,21.1,A,7,87,A,7,982,A,7,350,A,7,4.6,A,7,14400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,22.2,A,7,18.9,A,7,82,A,7,982,A,7,20,A,7,1.5,A,7,16000,B,7,3962,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,18.9,A,7,87,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,3962,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,18.9,A,7,87,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,18.9,A,7,87,A,7,981,A,7,350,A,7,1.5,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.0,A,7,18.3,A,7,90,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,06:00,9,367,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,20.0,A,7,18.9,A,7,93,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,07:00,202,1334,82,2,8,47,2,15,75,2,8,90,2,8,36,2,15,84,2,8,167,2,19,2,E,9,1,E,9,21.1,A,7,19.4,A,7,90,A,7,982,A,7,0,A,7,0.0,A,7,14400,B,7,7620,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,08:00,471,1334,208,2,8,96,2,15,174,2,8,227,2,8,91,2,15,195,2,8,448,2,19,4,E,9,3,E,9,22.8,A,7,19.4,A,7,81,A,7,983,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,09:00,720,1334,335,2,8,148,2,15,256,2,8,365,2,8,153,2,15,282,2,8,657,2,19,10,E,9,10,E,9,24.4,A,7,18.9,A,7,71,A,7,984,A,7,70,A,7,1.5,A,7,16000,B,7,1676,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,10:00,932,1334,609,2,8,535,2,15,235,2,8,653,2,8,555,2,15,264,2,8,655,2,19,3,E,9,3,E,9,25.6,A,7,19.4,A,7,69,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,11:00,1093,1334,761,2,8,604,2,15,265,2,8,793,2,8,607,2,15,295,2,8,980,2,19,5,E,9,5,E,9,26.7,A,7,18.9,A,7,62,A,7,985,A,7,290,A,7,2.1,A,7,16000,B,7,6096,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,12:00,1190,1334,562,2,8,175,2,15,406,2,8,620,2,8,187,2,15,454,2,8,1878,2,19,10,E,9,10,E,9,26.7,A,7,18.9,A,7,62,A,7,984,A,7,360,A,7,2.1,A,7,16000,B,7,1067,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,13:00,1217,1334,828,2,8,558,2,15,318,2,8,896,2,8,584,2,15,362,2,8,1844,2,19,10,E,9,10,E,9,27.2,A,7,18.3,A,7,58,A,7,983,A,7,300,A,7,3.6,A,7,16000,B,7,1250,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,14:00,1173,1334,507,2,8,120,2,15,401,2,8,559,2,8,128,2,15,446,2,8,1776,2,19,4,E,9,4,E,9,28.3,A,7,18.9,A,7,57,A,7,984,A,7,330,A,7,3.1,A,7,16000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,15:00,1060,1334,733,2,8,560,2,15,287,2,8,784,2,8,584,2,15,319,2,8,1023,2,19,5,E,9,5,E,9,28.9,A,7,18.3,A,7,53,A,7,983,A,7,310,A,7,4.1,A,7,16000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,16:00,887,1334,410,2,8,166,2,15,300,2,8,449,2,8,175,2,15,332,2,8,869,2,19,4,E,9,4,E,9,28.3,A,7,17.2,A,7,51,A,7,983,A,7,360,A,7,1.5,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,17:00,664,1334,408,2,8,480,2,15,169,2,8,431,2,8,480,2,15,192,2,8,356,2,19,5,E,9,5,E,9,28.9,A,7,17.8,A,7,51,A,7,983,A,7,360,B,8,3.1,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,18:00,408,1334,214,2,8,378,2,15,98,2,8,224,2,8,336,2,15,121,2,8,183,2,19,4,E,9,4,E,9,27.2,A,7,17.8,A,7,56,A,7,984,A,7,350,A,7,2.1,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,19:00,138,1334,43,2,8,135,2,15,30,2,8,46,2,8,71,2,15,39,2,8,53,2,19,2,E,9,2,A,7,25.6,A,7,17.2,A,7,60,A,7,983,A,7,350,A,7,2.1,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,20:00,0,56,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,8,E,9,8,E,9,24.4,A,7,17.2,A,7,64,A,7,984,A,7,350,A,7,1.5,A,7,16000,B,7,2134,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,E,9,23.3,A,7,17.2,A,7,69,A,7,985,A,7,360,A,7,2.1,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,2,E,9,22.2,A,7,16.7,A,7,71,A,7,986,A,7,20,A,7,2.1,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,21.1,A,7,15.6,A,7,71,A,7,986,A,7,20,A,7,2.1,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/20/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,20.0,A,7,15.0,A,7,73,A,7,986,A,7,10,A,7,1.5,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,19.4,A,7,15.0,A,7,76,A,7,985,A,7,20,A,7,1.5,A,7,16000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,18.9,A,7,14.4,A,7,75,A,7,986,A,7,10,A,7,2.1,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,18.3,A,7,14.4,A,7,78,A,7,985,A,7,360,A,7,1.5,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,17.8,A,7,13.9,A,7,78,A,7,985,A,7,30,A,7,2.1,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.8,A,7,13.9,A,7,78,A,7,986,A,7,350,A,7,2.1,A,7,16000,B,7,1524,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,06:00,8,345,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,17.2,A,7,13.9,A,7,81,A,7,986,A,7,360,A,7,2.1,A,7,16000,B,7,3962,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,07:00,199,1335,95,2,8,133,2,15,75,2,8,101,2,8,89,2,15,88,2,8,159,2,19,3,E,9,3,E,9,18.9,A,7,14.4,A,7,75,A,7,987,A,7,10,A,7,2.1,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,08:00,468,1335,260,2,8,390,2,15,124,2,8,272,2,8,361,2,15,145,2,8,239,2,19,0,E,9,0,E,9,21.1,A,7,15.0,A,7,68,A,7,987,A,7,360,A,7,2.6,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,09:00,718,1335,463,2,8,579,2,15,151,2,8,480,2,8,571,2,15,173,2,8,323,2,19,8,E,9,8,E,9,22.8,A,7,15.0,A,7,61,A,7,988,A,7,30,A,7,3.6,A,7,16000,B,7,1524,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,10:00,930,1335,622,2,8,608,2,15,198,2,8,651,2,8,612,2,15,223,2,8,539,2,19,1,E,9,1,E,9,23.3,A,7,15.0,A,7,60,A,7,988,A,7,10,A,7,3.1,A,7,16000,B,7,7620,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,11:00,1090,1335,773,2,8,695,2,15,205,2,8,822,2,8,709,2,15,242,2,8,774,2,19,3,E,9,3,E,9,25.0,A,7,15.6,A,7,56,A,7,989,A,7,30,A,7,4.1,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,12:00,1187,1335,861,2,8,752,2,15,191,2,8,897,2,8,754,2,15,225,2,8,877,2,19,3,E,9,3,E,9,25.6,A,7,15.0,A,7,52,A,7,988,A,7,40,A,7,4.1,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,13:00,1214,1335,888,2,8,768,2,15,188,2,8,930,2,8,772,2,15,226,2,8,973,2,19,10,E,9,5,A,7,26.7,A,7,13.9,A,7,45,A,7,987,A,7,40,B,8,3.1,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,14:00,1170,1335,843,2,8,736,2,15,196,2,8,905,2,8,755,2,15,242,2,8,940,2,19,10,E,9,5,A,7,26.7,A,7,13.9,A,7,45,A,7,988,A,7,50,B,8,1.5,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,15:00,1057,1335,750,2,8,715,2,15,183,2,8,801,2,8,731,2,15,220,2,8,644,2,19,10,E,9,5,A,7,27.2,A,7,15.0,A,7,47,A,7,987,A,7,50,B,8,2.1,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,16:00,883,1335,584,2,8,622,2,15,172,2,8,614,2,8,627,2,15,198,2,8,443,2,19,10,E,9,5,A,7,27.2,A,7,13.9,A,7,44,A,7,987,A,7,50,A,7,3.6,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,17:00,660,1335,402,2,8,526,2,15,142,2,8,432,2,8,527,2,15,171,2,8,293,2,19,10,E,9,3,A,7,27.2,A,7,13.9,A,7,44,A,7,987,A,7,10,A,7,2.1,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,18:00,403,1335,203,2,8,350,2,15,98,2,8,213,2,8,310,2,15,120,2,8,183,2,19,10,E,9,2,A,7,26.1,A,7,13.9,A,7,47,A,7,987,A,7,10,A,7,2.1,A,7,16000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,19:00,133,1335,42,2,8,120,2,15,31,2,8,46,2,8,57,2,15,40,2,8,56,2,19,10,E,9,3,A,7,25.0,A,7,14.4,A,7,52,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,20:00,0,11,0,2,0,0,2,0,0,2,0,0,2,1,0,2,2,0,2,2,0,2,1,2,E,9,0,A,7,22.8,A,7,16.1,A,7,66,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,0,A,7,21.1,A,7,16.7,A,7,76,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,0,A,7,20.0,A,7,15.6,A,7,76,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,0,A,7,19.4,A,7,15.6,A,7,79,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/21/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,2,A,7,18.9,A,7,15.6,A,7,81,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.9,A,7,15.0,A,7,78,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,A,7,18.3,A,7,15.0,A,7,81,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,17.8,A,7,15.6,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,2134,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,15.6,A,7,87,A,7,988,A,7,340,A,7,1.5,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,17.2,A,7,15.0,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,06:00,7,323,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,8,E,9,8,E,9,17.2,A,7,15.6,A,7,90,A,7,989,A,7,360,A,7,1.5,A,7,16000,B,7,1981,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,07:00,196,1336,85,2,8,79,2,15,73,2,8,90,2,8,53,2,15,83,2,8,155,2,19,3,E,9,3,E,9,19.4,A,7,15.0,A,7,76,A,7,989,A,7,10,A,7,2.1,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,08:00,465,1336,261,2,8,396,2,15,123,2,8,272,2,8,366,2,15,144,2,8,236,2,19,4,E,9,4,E,9,20.6,A,7,15.0,A,7,70,A,7,989,A,7,30,A,7,2.1,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,09:00,715,1336,450,2,8,529,2,15,166,2,8,481,2,8,536,2,15,193,2,8,360,2,19,0,E,9,0,E,9,23.3,A,7,15.6,A,7,62,A,7,990,A,7,50,A,7,2.6,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,10:00,928,1336,622,2,8,632,2,15,182,2,8,654,2,8,639,2,15,209,2,8,499,2,19,0,E,9,0,E,9,25.0,A,7,16.7,A,7,60,A,7,991,A,7,10,B,8,2.1,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,11:00,1088,1336,761,2,8,683,2,15,204,2,8,809,2,8,696,2,15,240,2,8,765,2,19,0,E,9,0,E,9,26.7,A,7,15.6,A,7,51,A,7,991,A,7,330,A,7,2.1,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,12:00,1185,1336,837,2,8,680,2,15,232,2,8,890,2,8,693,2,15,273,2,8,1156,2,19,8,E,9,8,E,9,27.8,A,7,15.0,A,7,46,A,7,991,A,7,360,B,8,2.6,A,7,16000,B,7,1676,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,13:00,1212,1336,864,2,8,696,2,15,231,2,8,922,2,8,711,2,15,275,2,8,1280,2,19,3,E,9,3,E,9,27.8,A,7,13.3,A,7,41,A,7,989,A,7,30,B,8,2.6,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,14:00,1167,1336,843,2,8,748,2,15,188,2,8,877,2,8,750,2,15,220,2,8,799,2,19,3,E,9,3,E,9,28.3,A,7,14.4,A,7,43,A,7,990,A,7,60,A,7,2.6,A,7,16000,B,7,6096,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,15:00,1053,1336,750,2,8,745,2,15,161,2,8,781,2,8,747,2,15,191,2,8,506,2,19,0,E,9,0,E,9,28.3,A,7,13.9,A,7,41,A,7,989,A,7,60,B,8,2.1,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,16:00,879,1336,589,2,8,634,2,15,171,2,8,619,2,8,639,2,15,197,2,8,438,2,19,0,E,9,0,E,9,28.3,A,7,15.0,A,7,44,A,7,989,A,7,50,A,7,3.1,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,17:00,655,1336,402,2,8,544,2,15,135,2,8,417,2,8,530,2,15,156,2,8,277,2,19,0,E,9,0,E,9,28.3,A,7,14.4,A,7,43,A,7,988,A,7,80,B,8,1.5,A,7,16000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,18:00,398,1336,207,2,8,377,2,15,95,2,8,218,2,8,332,2,15,118,2,8,177,2,19,0,E,9,0,E,9,27.2,A,7,15.0,A,7,47,A,7,987,A,7,100,A,7,4.1,A,7,16000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,19:00,127,1324,38,2,8,123,2,15,27,2,8,42,2,8,63,2,15,35,2,8,47,2,19,0,E,9,0,A,7,25.6,A,7,15.0,A,7,52,A,7,987,A,7,140,A,7,3.1,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,24.4,A,7,15.6,A,7,58,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.3,A,7,16.1,A,7,64,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,16.1,A,7,68,A,7,988,A,7,190,A,7,2.1,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,21.7,A,7,16.7,A,7,73,A,7,988,A,7,210,A,7,2.1,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/22/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,21.1,A,7,16.1,A,7,73,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.0,A,7,16.7,A,7,81,A,7,988,A,7,210,A,7,2.1,A,7,14400,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,20.0,A,7,16.1,A,7,78,A,7,987,A,7,240,A,7,2.1,A,7,14400,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,1,E,9,18.9,A,7,16.1,A,7,84,A,7,987,A,7,230,A,7,1.5,A,7,14400,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,2,E,9,18.3,A,7,15.6,A,7,84,A,7,987,A,7,230,A,7,2.1,A,7,14400,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,1,E,9,18.3,A,7,15.6,A,7,84,A,7,987,A,7,210,A,7,2.6,A,7,12800,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,06:00,7,323,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,1,E,9,1,E,9,17.8,A,7,15.6,A,7,87,A,7,987,A,7,240,A,7,2.1,A,7,9600,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/23/2001,07:00,192,1336,86,2,8,87,2,15,74,2,8,92,2,8,57,2,15,84,2,8,157,2,19,1,E,9,1,E,9,19.4,A,7,17.2,A,7,87,A,7,987,A,7,220,A,7,3.6,A,7,9600,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/23/2001,08:00,462,1336,232,2,8,275,2,15,136,2,8,245,2,8,261,2,15,155,2,8,278,2,19,1,E,9,1,E,9,22.2,A,7,17.2,A,7,73,A,7,988,A,7,220,A,7,4.6,A,7,14400,B,7,7620,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/23/2001,09:00,713,1336,444,2,8,486,2,15,184,2,8,469,2,8,491,2,15,206,2,8,402,2,19,0,E,9,0,E,9,24.4,A,7,16.7,A,7,62,A,7,988,A,7,230,A,7,5.2,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,10:00,925,1336,616,2,8,602,2,15,198,2,8,644,2,8,606,2,15,223,2,8,534,2,19,0,E,9,0,E,9,26.7,A,7,17.8,A,7,58,A,7,989,A,7,240,A,7,4.6,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,11:00,1085,1336,742,2,8,634,2,15,226,2,8,783,2,8,643,2,15,259,2,8,833,2,19,0,E,9,0,E,9,27.8,A,7,17.2,A,7,53,A,7,988,A,7,230,A,7,4.6,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,12:00,1182,1336,849,2,8,728,2,15,203,2,8,911,2,8,747,2,15,249,2,8,1010,2,19,3,E,9,3,E,9,29.4,A,7,18.3,A,7,51,A,7,988,A,7,240,A,7,4.6,A,7,16000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,13:00,1209,1336,870,2,8,720,2,15,217,2,8,932,2,8,737,2,15,263,2,8,1190,2,19,5,E,9,5,E,9,30.0,A,7,18.3,A,7,50,A,7,987,A,7,220,A,7,4.1,A,7,16000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,14:00,1164,1336,842,2,8,742,2,15,195,2,8,905,2,8,762,2,15,240,2,8,912,2,19,2,E,9,1,E,9,30.6,A,7,19.4,A,7,51,A,7,987,A,7,220,A,7,3.6,A,7,16000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,15:00,1050,1336,721,2,8,638,2,15,219,2,8,759,2,8,646,2,15,250,2,8,742,2,19,1,E,9,1,E,9,31.1,A,7,19.4,A,7,50,A,7,986,A,7,200,A,7,3.6,A,7,16000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,16:00,874,1336,578,2,8,628,2,15,166,2,8,608,2,8,634,2,15,192,2,8,424,2,19,3,E,9,2,E,9,31.1,A,7,18.9,A,7,48,A,7,986,A,7,210,A,7,4.1,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,17:00,650,1336,385,2,8,473,2,15,154,2,8,409,2,8,472,2,15,179,2,8,319,2,19,2,E,9,2,E,9,30.6,A,7,19.4,A,7,51,A,7,986,A,7,240,A,7,4.6,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,18:00,393,1336,197,2,8,349,2,15,94,2,8,206,2,8,306,2,15,116,2,8,175,2,19,2,E,9,1,E,9,29.4,A,7,20.0,A,7,57,A,7,985,A,7,210,A,7,4.6,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,19:00,122,1303,37,2,8,108,2,15,28,2,8,41,2,8,51,2,15,36,2,8,49,2,19,4,E,9,3,A,7,28.3,A,7,19.4,A,7,59,A,7,984,A,7,180,A,7,3.6,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,1,E,9,26.7,A,7,19.4,A,7,64,A,7,985,A,7,190,A,7,2.6,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,4,E,9,25.0,A,7,20.0,A,7,74,A,7,985,A,7,170,A,7,2.6,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,25.6,A,7,20.6,A,7,74,A,7,985,A,7,210,A,7,1.5,A,7,16000,B,7,2286,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/23/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.0,A,7,19.0,A,7,88,A,7,985,A,7,100,A,7,3.1,A,7,16100,B,7,1200,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,17,C,8 -08/23/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,21.1,A,7,19.4,A,7,90,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,1829,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/24/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,20.0,A,7,18.9,A,7,93,A,7,985,A,7,100,A,7,2.1,A,7,9600,B,7,1524,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,80,C,8 -08/24/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,8,E,9,20.0,A,7,19.4,A,7,96,A,7,984,A,7,60,A,7,1.5,A,7,16000,B,7,3048,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/24/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,20.0,A,7,19.4,A,7,96,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,2743,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,20.0,A,7,19.4,A,7,96,A,7,984,A,7,0,A,7,0.0,A,7,14400,B,7,2134,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,19.4,A,7,19.4,A,7,100,A,7,984,A,7,270,A,7,1.5,A,7,8000,B,7,1981,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/24/2001,06:00,6,301,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,8,E,9,8,E,9,19.4,A,7,19.4,A,7,100,A,7,985,A,7,280,A,7,2.1,A,7,11200,B,7,1981,A,7,3.5,E,8,0.000,F,8,0.00,F,8,3,1,D,9,00,C,8 -08/24/2001,07:00,189,1337,88,2,8,120,2,15,71,2,8,94,2,8,79,2,15,83,2,8,150,2,19,3,E,9,3,E,9,20.6,A,7,19.4,A,7,93,A,7,984,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,08:00,460,1337,255,2,8,378,2,15,124,2,8,264,2,8,348,2,15,144,2,8,238,2,19,4,E,9,4,E,9,22.8,A,7,20.6,A,7,87,A,7,985,A,7,330,A,7,2.6,A,7,14400,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,09:00,710,1337,424,2,8,419,2,15,201,2,8,444,2,8,423,2,15,219,2,8,443,2,19,4,E,9,4,E,9,23.9,A,7,20.6,A,7,82,A,7,986,A,7,350,A,7,4.1,A,7,16000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,10:00,923,1337,558,2,8,413,2,15,272,2,8,587,2,8,427,2,15,292,2,8,756,2,19,8,E,9,8,E,9,26.0,A,7,21.0,A,7,74,A,7,986,A,7,10,A,7,4.1,A,7,16100,B,7,630,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,11:00,1083,1337,605,2,8,302,2,15,360,2,8,659,2,8,327,2,15,393,2,8,1312,2,19,8,E,9,8,E,9,25.6,A,7,20.0,A,7,71,A,7,986,A,7,40,A,7,6.7,A,7,16000,B,7,1981,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,12:00,1180,1337,666,2,8,295,2,15,405,2,8,727,2,8,320,2,15,444,2,8,1878,2,19,8,E,9,8,E,9,26.1,A,7,20.0,A,7,69,A,7,986,A,7,30,A,7,5.7,A,7,16000,B,7,1676,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,13:00,1206,1337,372,2,8,36,2,15,339,2,8,411,2,8,37,2,15,378,2,8,1684,2,19,8,E,9,8,E,9,26.7,A,7,20.0,A,7,67,A,7,985,A,7,20,A,7,3.6,A,7,16000,B,7,2286,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,14:00,1160,1337,725,2,8,437,2,15,345,2,8,772,2,8,456,2,15,375,2,8,1615,2,19,4,E,9,4,E,9,27.2,A,7,19.4,A,7,62,A,7,986,A,7,30,A,7,3.6,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,15:00,1046,1337,709,2,8,632,2,15,214,2,8,748,2,8,641,2,15,245,2,8,720,2,19,3,E,9,3,E,9,28.3,A,7,19.4,A,7,59,A,7,986,A,7,30,A,7,4.1,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,16:00,870,1337,561,2,8,580,2,15,182,2,8,585,2,8,582,2,15,205,2,8,456,2,19,4,E,9,4,E,9,27.8,A,7,19.4,A,7,60,A,7,985,A,7,360,A,7,4.1,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,17:00,645,1337,380,2,8,432,2,15,170,2,8,398,2,8,430,2,15,190,2,8,355,2,19,4,E,9,4,E,9,28.3,A,7,19.4,A,7,59,A,7,985,A,7,10,B,8,2.6,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,18:00,387,1337,201,2,8,399,2,15,85,2,8,212,2,8,349,2,15,111,2,8,156,2,19,4,E,9,4,E,9,27.2,A,7,19.4,A,7,62,A,7,985,A,7,10,A,7,2.1,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,19:00,116,1259,33,2,8,111,2,15,24,2,8,37,2,8,56,2,15,32,2,8,42,2,19,7,E,9,5,A,7,25.6,A,7,20.6,A,7,74,A,7,985,A,7,70,A,7,2.6,A,7,12800,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,E,9,24.4,A,7,18.9,A,7,71,A,7,986,A,7,70,A,7,4.6,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.8,A,7,18.9,A,7,79,A,7,987,A,7,70,A,7,3.6,A,7,14400,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.7,A,7,18.3,A,7,81,A,7,987,A,7,70,A,7,4.1,A,7,11200,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.7,A,7,18.3,A,7,81,A,7,987,A,7,20,A,7,1.5,A,7,12800,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/24/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,20.6,A,7,18.3,A,7,87,A,7,987,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,20.0,A,7,17.8,A,7,87,A,7,986,A,7,10,A,7,2.6,A,7,9600,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,19.4,A,7,17.8,A,7,90,A,7,987,A,7,360,A,7,2.6,A,7,9600,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/25/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,19.4,A,7,17.8,A,7,90,A,7,987,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/25/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,6,E,9,18.9,A,7,17.8,A,7,93,A,7,987,A,7,360,A,7,2.1,A,7,8000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/25/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,18.9,A,7,17.8,A,7,93,A,7,987,A,7,20,A,7,2.1,A,7,8000,B,7,2896,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/25/2001,06:00,5,279,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,8,E,9,8,E,9,18.3,A,7,17.2,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,4800,B,7,2743,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/25/2001,07:00,186,1337,89,2,8,121,2,15,73,2,8,95,2,8,78,2,15,85,2,8,154,2,19,3,E,9,3,E,9,19.4,A,7,17.8,A,7,90,A,7,988,A,7,20,A,7,1.5,A,7,6400,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/25/2001,08:00,457,1337,255,2,8,384,2,15,124,2,8,265,2,8,353,2,15,144,2,8,238,2,19,0,E,9,0,E,9,21.7,A,7,18.9,A,7,84,A,7,988,A,7,40,A,7,3.6,A,7,8000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/25/2001,09:00,708,1337,417,2,8,425,2,15,192,2,8,438,2,8,429,2,15,211,2,8,420,2,19,0,E,9,0,E,9,23.9,A,7,18.9,A,7,74,A,7,989,A,7,20,A,7,2.6,A,7,11200,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,10:00,920,1337,597,2,8,571,2,15,203,2,8,622,2,8,573,2,15,227,2,8,540,2,19,3,E,9,3,E,9,25.6,A,7,17.8,A,7,62,A,7,989,A,7,10,A,7,3.1,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,11:00,1080,1337,736,2,8,658,2,15,203,2,8,781,2,8,671,2,15,238,2,8,745,2,19,4,E,9,4,E,9,26.7,A,7,17.2,A,7,56,A,7,989,A,7,80,A,7,5.2,A,7,16000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,12:00,1177,1337,813,2,8,656,2,15,234,2,8,863,2,8,668,2,15,274,2,8,1127,2,19,4,E,9,4,E,9,27.2,A,7,16.7,A,7,53,A,7,989,A,7,100,A,7,3.1,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,13:00,1203,1337,816,2,8,582,2,15,291,2,8,855,2,8,586,2,15,326,2,8,1519,2,19,3,E,9,3,E,9,27.8,A,7,17.2,A,7,53,A,7,988,A,7,60,A,7,3.6,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,14:00,1157,1337,807,2,8,640,2,15,252,2,8,851,2,8,648,2,15,288,2,8,1127,2,19,3,E,9,3,E,9,27.8,A,7,17.2,A,7,53,A,7,989,A,7,30,A,7,3.6,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,15:00,1042,1337,703,2,8,650,2,15,196,2,8,746,2,8,662,2,15,229,2,8,660,2,19,3,E,9,3,E,9,28.3,A,7,18.3,A,7,55,A,7,988,A,7,80,A,7,2.6,A,7,14400,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,16:00,866,1337,566,2,8,610,2,15,170,2,8,593,2,8,614,2,15,195,2,8,427,2,19,3,E,9,3,E,9,28.3,A,7,18.3,A,7,55,A,7,987,A,7,50,A,7,3.6,A,7,11200,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,17:00,640,1337,363,2,8,397,2,15,172,2,8,380,2,8,394,2,15,191,2,8,359,2,19,0,E,9,0,E,9,27.2,A,7,16.7,A,7,53,A,7,987,A,7,60,A,7,3.1,A,7,11200,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,18:00,382,1337,181,2,8,303,2,15,95,2,8,190,2,8,263,2,15,114,2,8,177,2,19,3,E,9,3,E,9,26.1,A,7,17.8,A,7,60,A,7,987,A,7,60,A,7,2.6,A,7,12800,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,19:00,111,1237,32,2,8,109,2,15,23,2,8,36,2,8,54,2,15,30,2,8,40,2,19,0,E,9,0,A,7,23.9,A,7,18.3,A,7,71,A,7,986,A,7,80,A,7,2.6,A,7,14400,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.3,A,7,17.8,A,7,71,A,7,987,A,7,100,A,7,2.1,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,23.3,A,7,17.8,A,7,71,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.7,A,7,17.8,A,7,79,A,7,988,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,17.8,A,7,84,A,7,988,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/25/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,21.7,A,7,17.8,A,7,79,A,7,988,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,17.8,A,7,81,A,7,987,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.0,A,7,17.2,A,7,84,A,7,987,A,7,140,A,7,2.1,A,7,16000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,19.4,A,7,16.7,A,7,84,A,7,987,A,7,160,A,7,1.5,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,19.4,A,7,16.1,A,7,81,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,16.1,A,7,87,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,06:00,5,256,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,17.8,A,7,16.1,A,7,90,A,7,988,A,7,290,A,7,2.6,A,7,12800,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,07:00,183,1338,78,2,8,41,2,15,73,2,8,86,2,8,30,2,15,82,2,8,157,2,19,0,E,9,0,E,9,18.3,A,7,17.2,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/26/2001,08:00,454,1338,233,2,8,192,2,15,168,2,8,250,2,8,180,2,15,189,2,8,382,2,19,3,E,9,3,E,9,21.1,A,7,17.8,A,7,81,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/26/2001,09:00,705,1338,168,2,8,0,2,15,168,2,8,195,2,8,0,2,15,195,2,8,722,2,19,8,E,9,8,E,9,22.2,A,7,17.2,A,7,73,A,7,989,A,7,320,B,8,1.5,A,7,16000,B,7,2286,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,10:00,918,1338,610,2,8,529,2,15,246,2,8,648,2,8,548,2,15,272,2,8,673,2,19,3,E,9,3,E,9,23.9,A,7,18.3,A,7,71,A,7,989,A,7,290,B,8,3.1,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,11:00,1078,1338,730,2,8,652,2,15,203,2,8,774,2,8,664,2,15,238,2,8,739,2,19,8,E,9,8,E,9,24.4,A,7,18.3,A,7,69,A,7,989,A,7,250,A,7,3.6,A,7,16000,B,7,1676,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,12:00,1174,1338,800,2,8,632,2,15,244,2,8,847,2,8,642,2,15,282,2,8,1158,2,19,4,E,9,4,E,9,26.1,A,7,18.9,A,7,65,A,7,988,A,7,250,A,7,3.6,A,7,16000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,13:00,1200,1338,822,2,8,630,2,15,255,2,8,869,2,8,639,2,15,294,2,8,1327,2,19,3,E,9,3,E,9,27.2,A,7,19.4,A,7,62,A,7,986,A,7,280,A,7,3.6,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,14:00,1153,1338,795,2,8,658,2,15,226,2,8,844,2,8,670,2,15,264,2,8,1007,2,19,8,E,9,8,E,9,27.2,A,7,18.9,A,7,61,A,7,986,A,7,240,A,7,4.1,A,7,16000,B,7,1524,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,15:00,1038,1338,709,2,8,602,2,15,241,2,8,740,2,8,606,2,15,269,2,8,784,2,19,0,E,9,0,E,9,27.8,A,7,20.0,A,7,63,A,7,986,A,7,210,A,7,2.6,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,16:00,861,1338,515,2,8,414,2,15,248,2,8,542,2,8,426,2,15,267,2,8,633,2,19,3,E,9,3,E,9,28.3,A,7,20.6,A,7,63,A,7,985,A,7,230,A,7,4.1,A,7,14400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,17:00,635,1338,357,2,8,379,2,15,177,2,8,384,2,8,390,2,15,199,2,8,386,2,19,4,E,9,4,E,9,28.3,A,7,20.0,A,7,61,A,7,985,A,7,230,B,8,2.1,A,7,14400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,18:00,376,1338,185,2,8,341,2,15,89,2,8,194,2,8,295,2,15,111,2,8,165,2,19,3,E,9,3,E,9,27.8,A,7,20.0,A,7,63,A,7,985,A,7,220,A,7,2.6,A,7,12800,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,19:00,106,1215,28,2,8,99,2,15,21,2,8,32,2,8,48,2,15,28,2,8,36,2,19,0,E,9,0,A,7,26.1,A,7,20.0,A,7,69,A,7,984,A,7,190,A,7,2.6,A,7,11200,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,25.0,A,7,20.6,A,7,77,A,7,985,A,7,190,A,7,2.6,A,7,12800,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,24.4,A,7,20.6,A,7,79,A,7,985,A,7,190,A,7,2.1,A,7,12800,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.3,A,7,20.6,A,7,85,A,7,985,A,7,200,A,7,2.6,A,7,11200,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.8,A,7,20.6,A,7,87,A,7,984,A,7,200,A,7,2.6,A,7,11200,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/26/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,22.8,A,7,20.0,A,7,84,A,7,984,A,7,180,A,7,2.6,A,7,11200,B,7,6096,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,19.4,A,7,84,A,7,983,A,7,200,A,7,3.1,A,7,11200,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,21.7,A,7,18.9,A,7,84,A,7,984,A,7,210,A,7,2.1,A,7,11200,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,18.9,A,7,87,A,7,983,A,7,210,A,7,2.1,A,7,11200,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,18.9,A,7,90,A,7,983,A,7,220,A,7,2.1,A,7,9600,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/27/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,18.9,A,7,90,A,7,983,A,7,210,A,7,2.1,A,7,9600,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/27/2001,06:00,4,234,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,20.0,A,7,18.9,A,7,93,A,7,983,A,7,220,A,7,3.1,A,7,8000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/27/2001,07:00,180,1338,80,2,8,90,2,15,68,2,8,85,2,8,57,2,15,78,2,8,143,2,19,0,E,9,0,E,9,21.7,A,7,19.4,A,7,87,A,7,983,A,7,230,A,7,2.1,A,7,6400,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/27/2001,08:00,451,1338,241,2,8,302,2,15,139,2,8,254,2,8,284,2,15,159,2,8,286,2,19,0,E,9,0,E,9,23.3,A,7,20.0,A,7,82,A,7,983,A,7,250,A,7,3.1,A,7,8000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/27/2001,09:00,702,1338,411,2,8,419,2,15,191,2,8,432,2,8,422,2,15,210,2,8,416,2,19,0,E,9,0,E,9,26.1,A,7,21.1,A,7,74,A,7,984,A,7,260,A,7,3.6,A,7,8000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/27/2001,10:00,915,1338,591,2,8,559,2,15,207,2,8,638,2,8,580,2,15,241,2,8,556,2,19,0,E,9,0,E,9,27.8,A,7,21.7,A,7,69,A,7,984,A,7,280,A,7,3.6,A,7,9600,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/27/2001,11:00,1075,1338,736,2,8,640,2,15,221,2,8,777,2,8,649,2,15,254,2,8,792,2,19,0,E,9,0,E,9,28.9,A,7,21.1,A,7,63,A,7,984,A,7,290,B,8,2.6,A,7,9600,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -08/27/2001,12:00,1171,1338,819,2,8,620,2,15,275,2,8,859,2,8,625,2,15,310,2,8,1276,2,19,7,E,9,2,A,7,30.0,A,7,20.6,A,7,57,A,7,983,A,7,310,B,8,1.5,A,7,11200,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,13:00,1197,1338,690,2,8,318,2,15,405,2,8,755,2,8,346,2,15,445,2,8,1970,2,19,0,E,9,0,E,9,30.6,A,7,20.0,A,7,53,A,7,982,A,7,320,A,7,3.1,A,7,11200,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,14:00,1150,1338,801,2,8,592,2,15,291,2,8,866,2,8,619,2,15,333,2,8,1301,2,19,3,E,9,3,E,9,30.6,A,7,20.0,A,7,53,A,7,982,A,7,300,B,8,2.1,A,7,11200,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,15:00,1034,1338,686,2,8,578,2,15,238,2,8,716,2,8,582,2,15,265,2,8,768,2,19,3,E,9,3,E,9,31.7,A,7,20.0,A,7,50,A,7,981,A,7,270,A,7,3.1,A,7,11200,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,16:00,857,1338,442,2,8,255,2,15,279,2,8,476,2,8,273,2,15,301,2,8,736,2,19,7,E,9,5,E,9,30.6,A,7,19.4,A,7,51,A,7,981,A,7,250,A,7,3.1,A,7,11200,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,17:00,630,1338,213,2,8,53,2,15,188,2,8,234,2,8,52,2,15,209,2,8,558,2,19,10,E,9,10,E,9,23.3,A,7,20.0,A,7,82,A,7,981,A,7,60,A,7,2.6,A,7,6400,B,7,792,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/27/2001,18:00,371,1338,47,2,8,0,2,15,47,2,8,56,2,8,0,2,15,56,2,8,198,2,19,8,E,9,7,E,9,23.9,A,7,21.1,A,7,84,A,7,982,A,7,30,A,7,2.1,A,7,12800,B,7,3962,A,7,4.1,E,8,0.000,F,8,0.00,F,8,46,1,D,9,17,C,8 -08/27/2001,19:00,101,1171,5,2,8,0,2,15,5,2,8,6,2,8,0,2,15,6,2,8,21,2,19,0,E,9,0,A,7,23.3,A,7,21.7,A,7,91,A,7,981,A,7,70,A,7,2.6,A,7,11200,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,6,E,9,23.3,A,7,21.1,A,7,87,A,7,982,A,7,40,A,7,2.1,A,7,12800,B,7,3962,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,2,E,9,22.2,A,7,21.7,A,7,97,A,7,982,A,7,0,A,7,0.0,A,7,11200,B,7,4572,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,22.8,A,7,20.0,A,7,84,A,7,982,A,7,170,A,7,1.5,A,7,16000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,6,E,9,22.8,A,7,19.4,A,7,81,A,7,983,A,7,0,A,7,0.0,A,7,14400,B,7,3962,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/27/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,21.7,A,7,20.0,A,7,90,A,7,983,A,7,280,A,7,1.5,A,7,11200,B,7,3962,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,21.7,A,7,20.0,A,7,90,A,7,982,A,7,300,A,7,1.5,A,7,12800,B,7,2134,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.2,A,7,20.6,A,7,91,A,7,982,A,7,0,A,7,0.0,A,7,11200,B,7,3353,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,4,E,9,21.1,A,7,19.4,A,7,90,A,7,982,A,7,320,A,7,2.6,A,7,12800,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,6,E,9,20.6,A,7,19.4,A,7,93,A,7,982,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,6,E,9,21.1,A,7,20.0,A,7,93,A,7,983,A,7,210,A,7,1.5,A,7,11200,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,06:00,3,234,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,1,E,9,1,E,9,21.1,A,7,19.4,A,7,90,A,7,983,A,7,0,A,7,0.0,A,7,8000,B,7,3962,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/28/2001,07:00,176,1339,81,2,8,75,2,15,72,2,8,87,2,8,47,2,15,81,2,8,152,2,19,6,E,9,3,E,9,22.2,A,7,20.6,A,7,91,A,7,983,A,7,280,A,7,2.1,A,7,8000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/28/2001,08:00,448,1339,136,2,8,19,2,15,129,2,8,152,2,8,13,2,15,148,2,8,469,2,19,6,E,9,4,E,9,23.3,A,7,21.7,A,7,91,A,7,984,A,7,280,A,7,1.5,A,7,9600,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/28/2001,09:00,699,1339,405,2,8,351,2,15,221,2,8,433,2,8,366,2,15,241,2,8,512,2,19,2,E,9,2,E,9,26.1,A,7,21.1,A,7,74,A,7,985,A,7,310,A,7,4.1,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,10:00,913,1339,546,2,8,401,2,15,272,2,8,593,2,8,431,2,15,299,2,8,749,2,19,1,E,9,1,E,9,27.2,A,7,20.6,A,7,67,A,7,985,A,7,310,A,7,2.6,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,11:00,1073,1339,680,2,8,507,2,15,273,2,8,732,2,8,529,2,15,307,2,8,989,2,19,6,E,9,4,E,9,27.8,A,7,20.6,A,7,65,A,7,985,A,7,250,A,7,3.6,A,7,16000,B,7,7620,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,12:00,1168,1339,739,2,8,493,2,15,308,2,8,797,2,8,516,2,15,346,2,8,1462,2,19,8,E,9,5,E,9,28.9,A,7,21.1,A,7,63,A,7,985,A,7,270,A,7,3.6,A,7,16000,B,7,7620,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,13:00,1194,1339,612,2,8,216,2,15,419,2,8,674,2,8,230,2,15,468,2,8,1937,2,19,9,E,9,7,E,9,29.4,A,7,20.6,A,7,59,A,7,983,A,7,270,B,8,3.1,A,7,16000,B,7,7620,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,14:00,1146,1339,677,2,8,359,2,15,369,2,8,742,2,8,390,2,15,407,2,8,1540,2,19,5,E,9,4,E,9,29.4,A,7,20.6,A,7,59,A,7,984,A,7,260,B,8,2.6,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,15:00,1030,1339,685,2,8,584,2,15,235,2,8,716,2,8,588,2,15,262,2,8,752,2,19,4,E,9,4,E,9,30.0,A,7,20.6,A,7,57,A,7,983,A,7,260,A,7,2.6,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,16:00,852,1339,391,2,8,154,2,15,293,2,8,427,2,8,162,2,15,324,2,8,822,2,19,5,E,9,4,E,9,30.6,A,7,20.0,A,7,53,A,7,983,A,7,240,A,7,3.6,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,17:00,625,1339,223,2,8,58,2,15,196,2,8,245,2,8,57,2,15,218,2,8,573,2,19,7,E,9,6,E,9,29.4,A,7,19.4,A,7,55,A,7,983,A,7,260,A,7,2.6,A,7,16000,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,18:00,365,1339,89,2,8,6,2,15,88,2,8,101,2,8,3,2,15,101,2,8,325,2,19,8,E,9,6,E,9,28.9,A,7,20.0,A,7,59,A,7,983,A,7,280,A,7,2.1,A,7,16000,B,7,6706,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,19:00,96,1149,17,2,8,8,2,15,16,2,8,18,2,8,5,2,15,18,2,8,42,2,19,2,E,9,2,A,7,28.3,A,7,21.1,A,7,65,A,7,982,A,7,350,A,7,1.5,A,7,16000,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,26.1,A,7,21.1,A,7,74,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,3962,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,26.7,A,7,21.7,A,7,74,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,3962,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,24.4,A,7,21.7,A,7,85,A,7,985,A,7,360,A,7,3.1,A,7,14400,B,7,6096,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,25.6,A,7,20.6,A,7,74,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/28/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,24.4,A,7,21.1,A,7,82,A,7,985,A,7,10,A,7,2.1,A,7,16000,B,7,6096,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,A,7,23.9,A,7,20.6,A,7,82,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,A,7,23.3,A,7,20.6,A,7,85,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,22.8,A,7,20.6,A,7,87,A,7,984,A,7,0,A,7,0.0,A,7,14400,B,7,6096,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,22.8,A,7,20.6,A,7,87,A,7,984,A,7,0,A,7,0.0,A,7,14400,B,7,6096,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,22.2,A,7,20.6,A,7,91,A,7,984,A,7,210,A,7,2.1,A,7,12800,B,7,77777,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,06:00,3,212,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,9,A,7,21.7,A,7,20.6,A,7,93,A,7,985,A,7,220,A,7,2.1,A,7,11200,B,7,6096,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,07:00,173,1340,55,2,8,0,2,15,55,2,8,60,2,8,0,2,15,60,2,8,167,2,19,8,E,9,8,A,7,21.7,A,7,20.0,A,7,90,A,7,985,A,7,270,A,7,1.5,A,7,9600,B,7,6096,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/29/2001,08:00,445,1340,242,2,8,354,2,15,125,2,8,251,2,8,322,2,15,144,2,8,241,2,19,5,E,9,5,A,7,25.6,A,7,20.6,A,7,74,A,7,986,A,7,350,A,7,1.5,A,7,12800,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/29/2001,09:00,697,1340,418,2,8,456,2,15,180,2,8,441,2,8,459,2,15,201,2,8,388,2,19,3,E,9,3,A,7,27.2,A,7,21.1,A,7,69,A,7,986,A,7,20,A,7,2.6,A,7,16000,B,7,77777,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,10:00,910,1340,604,2,8,596,2,15,198,2,8,630,2,8,598,2,15,222,2,8,518,2,19,2,E,9,2,A,7,28.3,A,7,20.6,A,7,63,A,7,987,A,7,310,A,7,3.1,A,7,16000,B,7,77777,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,11:00,1070,1340,637,2,8,387,2,15,327,2,8,697,2,8,420,2,15,361,2,8,1143,2,19,3,E,9,3,A,7,28.3,A,7,21.7,A,7,67,A,7,986,A,7,320,B,8,2.6,A,7,14400,B,7,77777,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,12:00,1166,1340,703,2,8,391,2,15,361,2,8,744,2,8,408,2,15,389,2,8,1709,2,19,2,E,9,2,A,7,28.9,A,7,20.6,A,7,61,A,7,986,A,7,320,A,7,1.5,A,7,16000,B,7,77777,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,13:00,1190,1340,684,2,8,318,2,15,400,2,8,748,2,8,346,2,15,440,2,8,1898,2,19,5,E,9,5,A,7,29.4,A,7,21.1,A,7,61,A,7,985,A,7,140,A,7,4.6,A,7,16000,B,7,77777,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,14:00,1143,1340,800,2,8,610,2,15,279,2,8,836,2,8,614,2,15,311,2,8,1172,2,19,10,E,9,10,A,7,28.3,A,7,20.0,A,7,61,A,7,985,A,7,60,A,7,2.6,A,7,16000,B,7,1311,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,15:00,1026,1340,582,2,8,322,2,15,335,2,8,632,2,8,348,2,15,365,2,8,1093,2,19,10,E,9,10,A,7,29.4,A,7,20.0,A,7,57,A,7,985,A,7,80,A,7,2.1,A,7,16000,B,7,1402,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,16:00,847,1340,536,2,8,509,2,15,214,2,8,572,2,8,524,2,15,240,2,8,530,2,19,5,E,9,5,A,7,30.0,A,7,19.4,A,7,53,A,7,985,A,7,60,A,7,1.5,A,7,16000,B,7,77777,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,17:00,620,1340,340,2,8,303,2,15,199,2,8,361,2,8,309,2,15,217,2,8,443,2,19,3,E,9,3,A,7,29.4,A,7,20.0,A,7,57,A,7,985,A,7,150,A,7,3.1,A,7,16000,B,7,77777,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,18:00,359,1340,61,2,8,0,2,15,61,2,8,71,2,8,0,2,15,71,2,8,244,2,19,10,E,9,9,A,7,28.3,A,7,19.4,A,7,59,A,7,985,A,7,160,A,7,3.1,A,7,16000,B,7,6096,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,19:00,91,1128,20,2,8,32,2,15,18,2,8,23,2,8,16,2,15,22,2,8,37,2,19,8,E,9,8,A,7,27.2,A,7,20.0,A,7,65,A,7,984,A,7,160,A,7,3.1,A,7,16000,B,7,6096,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,25.6,A,7,20.6,A,7,74,A,7,985,A,7,170,A,7,2.6,A,7,16000,B,7,6096,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,25.0,A,7,20.6,A,7,77,A,7,985,A,7,150,A,7,2.6,A,7,16000,B,7,6096,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,2,A,7,24.4,A,7,20.6,A,7,79,A,7,986,A,7,190,A,7,3.1,A,7,16000,B,7,77777,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,23.9,A,7,20.6,A,7,82,A,7,986,A,7,200,A,7,4.1,A,7,16000,B,7,6096,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/29/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,23.3,A,7,21.1,A,7,87,A,7,986,A,7,200,A,7,3.1,A,7,14400,B,7,6096,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,22.8,A,7,21.1,A,7,90,A,7,985,A,7,200,A,7,2.6,A,7,11200,B,7,6096,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,22.2,A,7,21.1,A,7,93,A,7,985,A,7,210,A,7,2.1,A,7,9600,B,7,6096,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,22.2,A,7,21.1,A,7,93,A,7,984,A,7,190,A,7,3.1,A,7,9600,B,7,6096,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,22.2,A,7,21.1,A,7,93,A,7,984,A,7,200,A,7,3.1,A,7,8000,B,7,77777,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,21.7,A,7,20.6,A,7,93,A,7,985,A,7,210,A,7,2.1,A,7,8000,B,7,77777,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,06:00,2,190,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,5,E,9,5,A,7,21.7,A,7,20.6,A,7,93,A,7,985,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,07:00,170,1340,71,2,8,51,2,15,64,2,8,77,2,8,36,2,15,72,2,8,139,2,19,7,E,9,7,A,7,22.8,A,7,21.1,A,7,90,A,7,985,A,7,0,A,7,0.0,A,7,6400,B,7,7620,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,08:00,442,1340,114,2,8,0,2,15,114,2,8,129,2,8,0,2,15,129,2,8,428,2,19,10,E,9,10,A,7,22.8,A,7,21.1,A,7,90,A,7,986,A,7,250,A,7,2.6,A,7,6400,B,7,4572,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,09:00,694,1340,203,2,8,12,2,15,196,2,8,231,2,8,10,2,15,226,2,8,800,2,19,10,E,9,10,A,7,23.3,A,7,21.1,A,7,87,A,7,986,A,7,250,A,7,2.1,A,7,8000,B,7,4267,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,10:00,907,1340,129,2,8,0,2,15,129,2,8,158,2,8,0,2,15,158,2,8,647,2,19,10,E,9,10,A,7,23.9,A,7,21.7,A,7,88,A,7,987,A,7,270,A,7,2.1,A,7,9600,B,7,4267,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,11:00,1067,1340,156,2,8,0,2,15,156,2,8,193,2,8,0,2,15,193,2,8,803,2,19,10,E,9,10,A,7,23.9,A,7,21.7,A,7,88,A,7,987,A,7,240,A,7,3.1,A,7,8000,B,7,4572,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/30/2001,12:00,1163,1340,336,2,8,30,2,15,310,2,8,372,2,8,31,2,15,345,2,8,1435,2,19,10,E,9,10,A,7,25.6,A,7,21.7,A,7,79,A,7,986,A,7,230,A,7,2.6,A,7,11200,B,7,4267,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,13:00,1187,1340,713,2,8,360,2,15,394,2,8,781,2,8,391,2,15,434,2,8,1845,2,19,10,E,9,10,A,7,27.2,A,7,20.6,A,7,67,A,7,985,A,7,230,A,7,3.6,A,7,16000,B,7,4267,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,14:00,1139,1340,506,2,8,126,2,15,399,2,8,557,2,8,134,2,15,442,2,8,1617,2,19,9,E,9,9,A,7,28.3,A,7,20.6,A,7,63,A,7,985,A,7,290,A,7,3.1,A,7,16000,B,7,4267,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,15:00,1021,1340,466,2,8,149,2,15,352,2,8,511,2,8,158,2,15,390,2,8,1175,2,19,9,E,9,9,A,7,25.6,A,7,19.4,A,7,69,A,7,985,A,7,240,A,7,6.2,A,7,16000,B,7,2591,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,16:00,842,1340,151,2,8,0,2,15,151,2,8,181,2,8,0,2,15,181,2,8,720,2,19,9,E,9,9,A,7,26.1,A,7,21.7,A,7,77,A,7,984,A,7,230,A,7,3.6,A,7,16000,B,7,4267,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -08/30/2001,17:00,614,1340,228,2,8,76,2,15,193,2,8,250,2,8,75,2,15,216,2,8,561,2,19,9,E,9,9,A,7,26.7,A,7,20.6,A,7,69,A,7,985,A,7,250,A,7,3.6,A,7,16000,B,7,7620,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,18:00,353,1340,135,2,8,133,2,15,100,2,8,147,2,8,116,2,15,116,2,8,220,2,19,9,E,9,9,A,7,24.4,A,7,20.6,A,7,79,A,7,985,A,7,130,A,7,4.1,A,7,16000,B,7,762,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,19:00,86,1083,8,2,8,0,2,15,8,2,8,10,2,8,0,2,15,10,2,8,32,2,19,7,E,9,7,A,7,23.3,A,7,21.1,A,7,87,A,7,984,A,7,170,A,7,2.6,A,7,14400,B,7,3353,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,22.8,A,7,20.6,A,7,87,A,7,985,A,7,170,A,7,2.6,A,7,16000,B,7,3048,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.8,A,7,21.1,A,7,90,A,7,985,A,7,160,A,7,2.6,A,7,14400,B,7,2438,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,5,E,9,22.8,A,7,21.1,A,7,90,A,7,985,A,7,200,A,7,3.1,A,7,12800,B,7,4572,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,4,E,9,22.2,A,7,20.6,A,7,91,A,7,985,A,7,200,A,7,2.6,A,7,16000,B,7,4572,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/30/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,22.2,A,7,21.1,A,7,93,A,7,985,A,7,210,A,7,3.1,A,7,14400,B,7,1981,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,21.7,A,7,21.1,A,7,96,A,7,984,A,7,200,A,7,3.1,A,7,12800,B,7,2286,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.7,A,7,20.6,A,7,93,A,7,984,A,7,230,A,7,3.1,A,7,9600,B,7,732,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/31/2001,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,20.0,A,7,93,A,7,983,A,7,240,A,7,2.6,A,7,11200,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/31/2001,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,20.0,A,7,96,A,7,983,A,7,220,A,7,3.1,A,7,8000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/31/2001,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,20.0,A,7,96,A,7,983,A,7,240,A,7,3.6,A,7,9600,B,7,77777,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/31/2001,06:00,2,168,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,1,E,9,1,E,9,20.0,A,7,19.4,A,7,96,A,7,984,A,7,230,A,7,2.6,A,7,6400,B,7,77777,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/31/2001,07:00,167,1341,44,2,8,0,2,15,44,2,8,49,2,8,0,2,15,49,2,8,143,2,19,7,E,9,6,E,9,21.1,A,7,20.0,A,7,93,A,7,984,A,7,250,A,7,3.1,A,7,6400,B,7,6096,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/31/2001,08:00,439,1341,106,2,8,0,2,15,106,2,8,121,2,8,0,2,15,121,2,8,405,2,19,6,E,9,3,E,9,22.8,A,7,20.6,A,7,87,A,7,984,A,7,260,A,7,3.6,A,7,12800,B,7,6096,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/31/2001,09:00,691,1341,345,2,8,216,2,15,233,2,8,375,2,8,222,2,15,260,2,8,587,2,19,3,E,9,2,E,9,23.9,A,7,20.6,A,7,82,A,7,984,A,7,240,A,7,2.6,A,7,16000,B,7,7620,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,10:00,904,1341,379,2,8,103,2,15,309,2,8,417,2,8,105,2,15,346,2,8,1061,2,19,7,E,9,6,E,9,26.7,A,7,20.6,A,7,69,A,7,985,A,7,270,A,7,3.1,A,7,16000,B,7,6096,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,11:00,1064,1341,499,2,8,163,2,15,370,2,8,548,2,8,173,2,15,410,2,8,1312,2,19,7,E,9,5,E,9,27.2,A,7,19.4,A,7,62,A,7,985,A,7,290,A,7,4.1,A,7,16000,B,7,7620,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,12:00,1159,1341,703,2,8,385,2,15,369,2,8,771,2,8,418,2,15,408,2,8,1586,2,19,8,E,9,5,E,9,28.3,A,7,18.9,A,7,57,A,7,984,A,7,270,B,8,3.1,A,7,16000,B,7,4572,A,7,5.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,13:00,1184,1341,731,2,8,414,2,15,365,2,8,776,2,8,432,2,15,394,2,8,1831,2,19,9,E,9,6,E,9,28.3,A,7,20.0,A,7,61,A,7,984,A,7,250,A,7,2.1,A,7,16000,B,7,4572,A,7,5.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,14:00,1135,1341,359,2,8,42,2,15,323,2,8,397,2,8,43,2,15,360,2,8,1426,2,19,9,E,9,8,E,9,28.3,A,7,18.9,A,7,57,A,7,983,A,7,250,A,7,3.6,A,7,16000,B,7,1219,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,15:00,1017,1341,270,2,8,12,2,15,261,2,8,319,2,8,10,2,15,311,2,8,1206,2,19,10,E,9,10,E,9,24.0,A,7,20.0,A,7,78,A,7,983,A,7,210,A,7,2.1,A,7,2400,B,7,360,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -08/31/2001,16:00,838,1341,162,2,8,0,2,15,162,2,8,193,2,8,0,2,15,193,2,8,761,2,19,10,E,9,8,E,9,24.4,A,7,22.2,A,7,88,A,7,982,A,7,300,A,7,2.1,A,7,11200,B,7,1219,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,81,C,8 -08/31/2001,17:00,609,1341,148,2,8,6,2,15,146,2,8,171,2,8,4,2,15,169,2,8,603,2,19,10,E,9,9,E,9,25.6,A,7,22.8,A,7,85,A,7,982,A,7,270,A,7,3.1,A,7,16000,B,7,2743,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,18:00,347,1341,79,2,8,0,2,15,79,2,8,90,2,8,0,2,15,90,2,8,294,2,19,8,E,9,6,E,9,24.4,A,7,21.1,A,7,82,A,7,982,A,7,260,A,7,3.1,A,7,16000,B,7,4572,A,7,4.6,E,8,0.000,F,8,0.00,F,8,97,1,D,9,00,C,8 -08/31/2001,19:00,81,1062,16,2,8,46,2,15,13,2,8,19,2,8,19,2,15,17,2,8,21,2,19,8,E,9,8,A,7,23.3,A,7,21.1,A,7,87,A,7,981,A,7,220,A,7,2.6,A,7,16000,B,7,1829,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,22.8,A,7,20.6,A,7,87,A,7,983,A,7,230,A,7,3.1,A,7,16000,B,7,2438,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,6,E,9,22.8,A,7,20.6,A,7,87,A,7,983,A,7,250,A,7,2.6,A,7,16000,B,7,7620,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.7,A,7,20.8,A,7,87,A,7,983,A,7,250,A,7,2.2,A,7,16000,B,7,3353,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,22.6,A,7,20.9,A,7,84,A,7,983,A,7,240,A,7,1.9,A,7,16000,B,7,3658,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -08/31/2001,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,22.5,A,7,21.1,A,7,84,A,7,982,A,7,240,A,7,1.5,A,7,16000,B,7,2743,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.5,A,7,21.2,A,7,97,A,7,992,A,7,190,A,7,1.1,A,7,8000,B,7,91,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/01/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.4,A,7,21.4,A,7,97,A,7,992,A,7,260,A,7,0.7,A,7,9600,B,7,91,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/01/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.3,A,7,21.5,A,7,100,A,7,992,A,7,160,A,7,0.4,A,7,11300,B,7,90,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/01/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.2,A,7,21.7,A,7,97,A,7,992,A,7,0,A,7,0.0,A,7,9600,B,7,305,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.2,A,7,21.7,A,7,97,A,7,992,A,7,250,A,7,1.5,A,7,8000,B,7,183,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/01/2003,06:00,2,168,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,22.2,A,7,21.7,A,7,97,A,7,992,A,7,230,A,7,2.6,A,7,8000,B,7,213,A,7,4.8,E,8,0.000,F,8,0.00,F,8,5,1,D,9,10,C,8 -09/01/2003,07:00,165,1342,74,2,8,60,2,15,66,2,8,80,2,8,43,2,15,75,2,8,140,2,19,10,E,9,10,E,9,22.8,A,7,22.2,A,7,96,A,7,992,A,7,210,A,7,2.6,A,7,6400,B,7,122,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/01/2003,08:00,437,1342,152,2,8,19,2,15,146,2,8,168,2,8,13,2,15,164,2,8,497,2,19,10,E,9,10,E,9,22.8,A,7,22.2,A,7,96,A,7,992,A,7,200,A,7,2.6,A,7,6400,B,7,122,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/01/2003,09:00,690,1342,230,2,8,25,2,15,217,2,8,261,2,8,21,2,15,250,2,8,852,2,19,10,E,9,10,E,9,23.3,A,7,22.2,A,7,94,A,7,992,A,7,230,A,7,3.1,A,7,6400,B,7,244,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/01/2003,10:00,903,1342,148,2,8,0,2,15,148,2,8,179,2,8,0,2,15,179,2,8,728,2,19,8,E,9,8,E,9,24.4,A,7,22.8,A,7,91,A,7,993,A,7,240,A,7,3.1,A,7,6400,B,7,549,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/01/2003,11:00,1063,1342,487,2,8,157,2,15,362,2,8,535,2,8,167,2,15,402,2,8,1280,2,19,4,E,9,4,E,9,26.1,A,7,22.8,A,7,82,A,7,992,A,7,210,A,7,4.1,A,7,8000,B,7,7620,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/01/2003,12:00,1158,1342,660,2,8,307,2,15,394,2,8,720,2,8,333,2,15,431,2,8,1698,2,19,4,E,9,4,E,9,28.3,A,7,22.8,A,7,72,A,7,992,A,7,220,A,7,2.1,A,7,14400,B,7,7620,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,13:00,1182,1342,839,2,8,618,2,15,293,2,8,877,2,8,621,2,15,328,2,8,1391,2,19,4,E,9,4,E,9,28.9,A,7,21.7,A,7,65,A,7,991,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,14:00,1133,1342,812,2,8,724,2,15,199,2,8,868,2,8,741,2,15,240,2,8,835,2,19,4,E,9,4,E,9,29.4,A,7,20.6,A,7,59,A,7,990,A,7,200,A,7,4.6,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,15:00,1015,1342,713,2,8,727,2,15,162,2,8,764,2,8,745,2,15,199,2,8,522,2,19,4,E,9,4,E,9,29.4,A,7,20.6,A,7,59,A,7,990,A,7,190,A,7,6.2,A,7,16000,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,16:00,835,1342,569,2,8,698,2,15,134,2,8,605,2,8,707,2,15,164,2,8,333,2,19,4,E,9,4,E,9,28.3,A,7,20.6,A,7,63,A,7,989,A,7,200,A,7,2.1,A,7,16000,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,17:00,606,1342,376,2,8,600,2,15,104,2,8,393,2,8,583,2,15,129,2,8,213,2,19,4,E,9,4,E,9,28.3,A,7,21.1,A,7,65,A,7,989,A,7,200,A,7,3.1,A,7,14400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,18:00,344,1342,180,2,8,415,2,15,74,2,8,191,2,8,347,2,15,102,2,8,135,2,19,0,E,9,0,E,9,27.8,A,7,21.1,A,7,67,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,19:00,78,1040,17,2,8,84,2,15,13,2,8,22,2,8,38,2,15,19,2,8,22,2,19,5,E,9,5,A,7,26.1,A,7,21.1,A,7,74,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.0,A,7,21.7,A,7,82,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,24.4,A,7,22.2,A,7,88,A,7,990,A,7,180,A,7,2.6,A,7,14400,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,23.9,A,7,21.7,A,7,88,A,7,990,A,7,200,A,7,3.6,A,7,14400,B,7,77777,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,23.3,A,7,20.6,A,7,85,A,7,990,A,7,200,A,7,3.6,A,7,16000,B,7,77777,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/01/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,A,7,23.3,A,7,21.1,A,7,87,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,23.3,A,7,21.1,A,7,87,A,7,990,A,7,210,A,7,3.6,A,7,16000,B,7,2896,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,21.1,A,7,93,A,7,989,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.7,A,7,21.1,A,7,96,A,7,989,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,21.1,A,7,20.6,A,7,97,A,7,989,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,21.1,A,7,20.6,A,7,97,A,7,989,A,7,190,A,7,3.1,A,7,12800,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,06:00,1,145,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,9,A,7,21.1,A,7,20.0,A,7,93,A,7,989,A,7,0,A,7,0.0,A,7,8000,B,7,7620,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/02/2003,07:00,162,1342,76,2,8,95,2,15,64,2,8,80,2,8,57,2,15,73,2,8,134,2,19,8,E,9,8,A,7,21.7,A,7,20.6,A,7,93,A,7,989,A,7,220,A,7,3.1,A,7,9600,B,7,7620,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/02/2003,08:00,434,1342,260,2,8,490,2,15,101,2,8,274,2,8,444,2,15,130,2,8,189,2,19,10,E,9,9,A,7,23.9,A,7,21.1,A,7,84,A,7,989,A,7,190,A,7,4.1,A,7,16000,B,7,7620,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/02/2003,09:00,687,1342,453,2,8,636,2,15,127,2,8,474,2,8,627,2,15,152,2,8,271,2,19,10,E,9,9,A,7,25.6,A,7,21.1,A,7,76,A,7,989,A,7,200,A,7,1.5,A,7,16000,B,7,7620,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,10:00,900,1342,624,2,8,657,2,15,182,2,8,654,2,8,662,2,15,209,2,8,474,2,19,4,E,9,4,E,9,26.7,A,7,21.1,A,7,71,A,7,989,A,7,220,A,7,5.2,A,7,16000,B,7,7620,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,11:00,1060,1342,649,2,8,411,2,15,324,2,8,686,2,8,428,2,15,347,2,8,1149,2,19,8,E,9,8,E,9,26.7,A,7,20.6,A,7,69,A,7,989,A,7,230,A,7,4.1,A,7,16000,B,7,792,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,12:00,1155,1342,739,2,8,499,2,15,308,2,8,794,2,8,522,2,15,344,2,8,1389,2,19,8,E,9,8,E,9,28.3,A,7,20.6,A,7,63,A,7,989,A,7,200,A,7,3.1,A,7,16000,B,7,914,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,13:00,1179,1342,533,2,8,144,2,15,407,2,8,588,2,8,154,2,15,453,2,8,1797,2,19,8,E,9,8,E,9,28.3,A,7,21.1,A,7,65,A,7,988,A,7,240,A,7,4.6,A,7,16000,B,7,1036,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,14:00,1129,1342,812,2,8,628,2,15,282,2,8,846,2,8,630,2,15,314,2,8,1129,2,19,9,E,9,9,E,9,28.9,A,7,21.1,A,7,63,A,7,987,A,7,200,A,7,5.7,A,7,16000,B,7,1067,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,15:00,1010,1342,690,2,8,661,2,15,191,2,8,730,2,8,672,2,15,223,2,8,599,2,19,8,E,9,8,E,9,29.4,A,7,21.1,A,7,61,A,7,987,A,7,220,A,7,4.6,A,7,16000,B,7,7620,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,16:00,830,1342,524,2,8,550,2,15,183,2,8,566,2,8,566,2,15,214,2,8,439,2,19,7,E,9,6,E,9,28.9,A,7,21.1,A,7,63,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,17:00,601,1342,322,2,8,349,2,15,166,2,8,346,2,8,354,2,15,187,2,8,355,2,19,8,E,9,7,E,9,28.9,A,7,21.1,A,7,63,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,18:00,338,1342,166,2,8,309,2,15,88,2,8,172,2,8,256,2,15,107,2,8,163,2,19,5,E,9,4,E,9,28.3,A,7,21.1,A,7,65,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,19:00,74,1018,9,2,8,0,2,15,9,2,8,11,2,8,0,2,15,11,2,8,35,2,19,0,E,9,0,A,7,26.1,A,7,21.1,A,7,74,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.6,A,7,21.7,A,7,79,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,25.0,A,7,21.7,A,7,82,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1,E,9,1,E,9,24.4,A,7,22.2,A,7,88,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,5,E,9,23.9,A,7,21.7,A,7,88,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/02/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,A,7,23.9,A,7,21.7,A,7,88,A,7,988,A,7,190,A,7,3.1,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,23.3,A,7,21.7,A,7,91,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.8,A,7,21.1,A,7,90,A,7,987,A,7,200,A,7,2.6,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,21.1,A,7,93,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.7,A,7,21.1,A,7,96,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,2,E,9,21.7,A,7,21.1,A,7,96,A,7,986,A,7,200,A,7,2.6,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,06:00,1,123,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,2,B,8,2,B,8,21.7,A,7,21.1,A,7,96,A,7,986,A,7,190,A,7,2.6,A,7,12800,B,7,4572,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,07:00,159,1343,78,2,8,123,2,15,63,2,8,82,2,8,73,2,15,74,2,8,132,2,19,2,E,9,2,E,9,22.2,A,7,21.7,A,7,97,A,7,987,A,7,200,A,7,2.6,A,7,12800,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,08:00,431,1343,252,2,8,420,2,15,117,2,8,261,2,8,379,2,15,139,2,8,223,2,19,5,E,9,5,E,9,23.9,A,7,22.2,A,7,90,A,7,987,A,7,220,A,7,2.6,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,09:00,684,1343,440,2,8,543,2,15,163,2,8,468,2,8,546,2,15,189,2,8,345,2,19,7,E,9,7,E,9,25.6,A,7,22.2,A,7,82,A,7,987,A,7,230,A,7,3.6,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,10:00,898,1343,592,2,8,566,2,15,213,2,8,636,2,8,586,2,15,244,2,8,558,2,19,10,E,9,9,E,9,28.0,A,7,23.0,A,7,74,A,7,987,A,7,180,A,7,4.6,A,7,16100,B,7,630,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,11:00,1057,1343,500,2,8,151,2,15,380,2,8,546,2,8,160,2,15,420,2,8,1330,2,19,8,E,9,7,E,9,27.2,A,7,22.2,A,7,74,A,7,987,A,7,200,A,7,1.5,A,7,16000,B,7,77777,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,12:00,1152,1343,599,2,8,235,2,15,397,2,8,653,2,8,255,2,15,433,2,8,1681,2,19,10,E,9,9,E,9,28.9,A,7,22.2,A,7,67,A,7,986,A,7,200,A,7,5.2,A,7,16000,B,7,1006,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,13:00,1175,1343,737,2,8,432,2,15,358,2,8,783,2,8,451,2,15,387,2,8,1732,2,19,6,E,9,6,E,9,28.9,A,7,22.2,A,7,67,A,7,985,A,7,190,A,7,6.2,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,14:00,1125,1343,400,2,8,60,2,15,350,2,8,442,2,8,62,2,15,391,2,8,1504,2,19,8,E,9,8,E,9,29.4,A,7,21.7,A,7,63,A,7,985,A,7,210,A,7,5.7,A,7,16000,B,7,77777,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,15:00,1006,1343,448,2,8,143,2,15,341,2,8,492,2,8,152,2,15,378,2,8,1113,2,19,8,E,9,7,E,9,28.9,A,7,21.7,A,7,65,A,7,984,A,7,210,A,7,3.6,A,7,16000,B,7,77777,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,16:00,825,1343,479,2,8,372,2,15,250,2,8,517,2,8,396,2,15,273,2,8,631,2,19,9,E,9,8,E,9,28.9,A,7,21.7,A,7,65,A,7,984,A,7,220,A,7,4.6,A,7,16000,B,7,1524,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,17:00,595,1343,369,2,8,500,2,15,147,2,8,389,2,8,490,2,15,171,2,8,296,2,19,9,E,9,6,E,9,28.3,A,7,21.7,A,7,67,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,18:00,332,1343,92,2,8,28,2,15,85,2,8,101,2,8,24,2,15,95,2,8,222,2,19,9,E,9,7,E,9,27.2,A,7,22.8,A,7,77,A,7,983,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,19:00,69,974,8,2,8,0,2,15,8,2,8,10,2,8,0,2,15,10,2,8,31,2,19,0,E,9,0,A,7,26.1,A,7,22.8,A,7,82,A,7,983,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,E,9,26.1,A,7,22.8,A,7,82,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,3353,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,25.6,A,7,23.3,A,7,87,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,1219,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,23.0,A,7,23.0,A,7,100,A,7,984,A,7,200,A,7,4.6,A,7,16100,B,7,990,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/03/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.0,A,7,22.0,A,7,100,A,7,984,A,7,180,A,7,6.7,A,7,8000,B,7,1410,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/03/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,22.8,A,7,21.7,A,7,94,A,7,984,A,7,180,A,7,3.6,A,7,16000,B,7,1280,A,7,4.9,E,8,0.000,F,8,0.00,F,8,37,1,D,9,17,C,8 -09/04/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,A,7,22.8,A,7,22.2,A,7,96,A,7,983,A,7,180,A,7,3.1,A,7,16000,B,7,77777,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/04/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.8,A,7,22.2,A,7,96,A,7,983,A,7,180,A,7,3.1,A,7,12800,B,7,335,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,95,C,8 -09/04/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.8,A,7,22.2,A,7,96,A,7,983,A,7,0,A,7,0.0,A,7,16000,B,7,274,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.8,A,7,22.2,A,7,96,A,7,982,A,7,220,A,7,3.1,A,7,11200,B,7,213,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.8,A,7,22.2,A,7,96,A,7,982,A,7,210,A,7,3.1,A,7,9600,B,7,152,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/04/2003,06:00,1,123,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,22.8,A,7,22.8,A,7,100,A,7,982,A,7,190,A,7,3.1,A,7,9600,B,7,274,A,7,4.6,E,8,0.000,F,8,0.00,F,8,171,1,D,9,10,C,8 -09/04/2003,07:00,155,1344,48,2,8,0,2,15,48,2,8,53,2,8,0,2,15,53,2,8,146,2,19,10,E,9,10,E,9,23.3,A,7,22.8,A,7,97,A,7,982,A,7,200,A,7,3.6,A,7,8000,B,7,427,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/04/2003,08:00,428,1344,46,2,8,0,2,15,46,2,8,56,2,8,0,2,15,56,2,8,202,2,19,10,E,9,10,E,9,23.9,A,7,22.8,A,7,94,A,7,982,A,7,200,A,7,4.1,A,7,9600,B,7,305,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/04/2003,09:00,681,1344,196,2,8,6,2,15,193,2,8,224,2,8,5,2,15,221,2,8,781,2,19,10,E,9,10,E,9,24.4,A,7,23.3,A,7,94,A,7,982,A,7,220,A,7,4.1,A,7,11200,B,7,366,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,10:00,895,1344,251,2,8,12,2,15,243,2,8,292,2,8,10,2,15,285,2,8,1074,2,19,8,E,9,8,E,9,26.1,A,7,23.3,A,7,85,A,7,982,A,7,200,A,7,4.1,A,7,12800,B,7,457,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,11:00,1054,1344,356,2,8,30,2,15,332,2,8,392,2,8,31,2,15,368,2,8,1313,2,19,9,E,9,9,E,9,27.2,A,7,23.3,A,7,79,A,7,981,A,7,190,A,7,4.1,A,7,14400,B,7,823,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,12:00,1149,1344,140,2,8,0,2,15,140,2,8,176,2,8,0,2,15,176,2,8,737,2,19,10,E,9,9,E,9,26.7,A,7,23.3,A,7,82,A,7,981,A,7,180,A,7,6.7,A,7,16000,B,7,671,A,7,4.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,17,C,8 -09/04/2003,13:00,1171,1344,138,2,8,0,2,15,138,2,8,175,2,8,0,2,15,175,2,8,729,2,19,10,E,9,9,E,9,26.7,A,7,23.3,A,7,82,A,7,980,A,7,210,A,7,6.7,A,7,14400,B,7,762,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,14:00,1121,1344,141,2,8,0,2,15,141,2,8,177,2,8,0,2,15,177,2,8,739,2,19,10,E,9,9,E,9,20.6,A,7,18.9,A,7,90,A,7,980,A,7,10,A,7,5.2,A,7,16000,B,7,792,A,7,4.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/04/2003,15:00,1001,1344,115,2,8,0,2,15,115,2,8,144,2,8,0,2,15,144,2,8,602,2,19,10,E,9,10,E,9,19.4,A,7,18.9,A,7,97,A,7,980,A,7,0,A,7,0.0,A,7,11200,B,7,183,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/04/2003,16:00,820,1344,89,2,8,0,2,15,89,2,8,111,2,8,0,2,15,111,2,8,449,2,19,10,E,9,10,E,9,20.0,A,7,19.0,A,7,94,A,7,981,A,7,0,A,7,0.0,A,7,16100,B,7,180,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/04/2003,17:00,589,1344,58,2,8,0,2,15,58,2,8,71,2,8,0,2,15,71,2,8,274,2,19,8,E,9,6,E,9,20.0,A,7,19.0,A,7,94,A,7,980,A,7,340,A,7,1.5,A,7,16100,B,7,1200,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,17,C,8 -09/04/2003,18:00,326,1344,136,2,8,181,2,15,92,2,8,144,2,8,149,2,15,107,2,8,179,2,19,6,E,9,6,E,9,20.0,A,7,19.4,A,7,96,A,7,980,A,7,350,B,8,1.5,A,7,16000,B,7,6096,A,7,3.7,E,8,0.000,F,8,0.00,F,8,193,1,D,9,00,C,8 -09/04/2003,19:00,65,952,10,2,8,59,2,15,8,2,8,14,2,8,25,2,15,12,2,8,13,2,19,0,E,9,0,A,7,20.0,A,7,18.9,A,7,93,A,7,981,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,19.4,A,7,18.9,A,7,97,A,7,981,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.9,A,7,18.9,A,7,100,A,7,981,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,18.3,A,7,100,A,7,981,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,17.8,A,7,97,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/04/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.3,A,7,17.8,A,7,97,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.3,A,7,17.8,A,7,97,A,7,981,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,19.4,A,7,18.9,A,7,97,A,7,982,A,7,310,A,7,4.1,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.9,A,7,17.8,A,7,93,A,7,982,A,7,320,A,7,2.1,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,17.2,A,7,93,A,7,982,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,16.1,A,7,90,A,7,982,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,06:00,1,101,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,17.2,A,7,15.6,A,7,90,A,7,983,A,7,20,A,7,3.6,A,7,12800,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,3,1,D,9,00,C,8 -09/05/2003,07:00,152,1344,66,2,8,45,2,15,61,2,8,72,2,8,31,2,15,68,2,8,129,2,19,0,E,9,0,E,9,17.8,A,7,16.1,A,7,90,A,7,984,A,7,20,A,7,3.1,A,7,9600,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/05/2003,08:00,425,1344,246,2,8,446,2,15,105,2,8,258,2,8,401,2,15,131,2,8,198,2,19,4,E,9,4,E,9,18.9,A,7,16.7,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,11200,B,7,7620,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/05/2003,09:00,678,1344,447,2,8,636,2,15,126,2,8,467,2,8,626,2,15,151,2,8,266,2,19,3,E,9,3,E,9,21.1,A,7,17.2,A,7,78,A,7,985,A,7,40,A,7,6.2,A,7,14400,B,7,7620,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,10:00,892,1344,611,2,8,681,2,15,158,2,8,646,2,8,690,2,15,187,2,8,414,2,19,3,E,9,3,E,9,22.2,A,7,17.2,A,7,73,A,7,985,A,7,30,A,7,4.1,A,7,16000,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,11:00,1051,1344,749,2,8,725,2,15,181,2,8,799,2,8,741,2,15,218,2,8,619,2,19,4,E,9,4,E,9,23.3,A,7,17.8,A,7,71,A,7,985,A,7,60,A,7,1.5,A,7,16000,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,12:00,1145,1344,788,2,8,632,2,15,248,2,8,830,2,8,640,2,15,283,2,8,1050,2,19,4,E,9,4,E,9,24.4,A,7,17.8,A,7,67,A,7,985,A,7,50,A,7,4.6,A,7,16000,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,13:00,1168,1344,701,2,8,384,2,15,367,2,8,770,2,8,417,2,15,407,2,8,1599,2,19,8,E,9,8,E,9,25.0,A,7,16.1,A,7,58,A,7,984,A,7,50,A,7,3.6,A,7,16000,B,7,914,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,14:00,1117,1344,629,2,8,305,2,15,375,2,8,685,2,8,331,2,15,410,2,8,1453,2,19,8,E,9,8,E,9,24.4,A,7,17.2,A,7,64,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,1097,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,15:00,997,1344,483,2,8,202,2,15,332,2,8,529,2,8,215,2,15,370,2,8,1070,2,19,8,E,9,8,E,9,25.0,A,7,17.2,A,7,62,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,1158,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,16:00,815,1344,462,2,8,343,2,15,254,2,8,498,2,8,365,2,15,276,2,8,638,2,19,8,E,9,8,E,9,25.0,A,7,17.2,A,7,62,A,7,984,A,7,20,A,7,1.5,A,7,16000,B,7,1981,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,17:00,584,1344,363,2,8,546,2,15,125,2,8,388,2,8,534,2,15,155,2,8,246,2,19,3,E,9,3,E,9,24.4,A,7,17.2,A,7,64,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,18:00,320,1344,158,2,8,362,2,15,72,2,8,166,2,8,293,2,15,96,2,8,131,2,19,3,E,9,3,E,9,23.3,A,7,17.2,A,7,69,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,19:00,60,907,9,2,8,57,2,15,7,2,8,12,2,8,29,2,15,10,2,8,14,2,19,7,E,9,7,A,7,21.7,A,7,17.8,A,7,79,A,7,984,A,7,0,A,7,0.0,A,7,14400,B,7,1829,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,21.1,A,7,17.8,A,7,81,A,7,985,A,7,0,A,7,0.0,A,7,14400,B,7,1829,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,20.6,A,7,17.8,A,7,84,A,7,986,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,19.4,A,7,16.7,A,7,84,A,7,986,A,7,0,A,7,0.0,A,7,14400,B,7,7620,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,18.3,A,7,15.6,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/05/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,18.9,A,7,15.0,A,7,78,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,A,7,17.8,A,7,15.0,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,6,E,9,16.7,A,7,15.0,A,7,90,A,7,987,A,7,0,A,7,0.0,A,7,14400,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,16.1,A,7,13.9,A,7,87,A,7,987,A,7,30,A,7,3.1,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,7,E,9,15.6,A,7,13.3,A,7,86,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,15.0,A,7,13.3,A,7,90,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,06:00,0,78,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,7,E,9,4,E,9,14.4,A,7,12.8,A,7,90,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,07:00,149,1345,68,2,8,46,2,15,63,2,8,74,2,8,32,2,15,71,2,8,130,2,19,10,E,9,7,E,9,14.4,A,7,13.3,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,12800,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,08:00,422,1345,147,2,8,26,2,15,138,2,8,162,2,8,18,2,15,156,2,8,470,2,19,9,E,9,5,E,9,16.1,A,7,13.3,A,7,83,A,7,989,A,7,10,A,7,1.5,A,7,16000,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,09:00,675,1345,197,2,8,6,2,15,194,2,8,225,2,8,5,2,15,222,2,8,780,2,19,10,E,9,4,E,9,17.2,A,7,12.8,A,7,75,A,7,989,A,7,40,A,7,4.6,A,7,16000,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,10:00,889,1345,251,2,8,12,2,15,243,2,8,292,2,8,10,2,15,285,2,8,1070,2,19,10,E,9,4,E,9,18.3,A,7,12.8,A,7,70,A,7,989,A,7,40,A,7,4.6,A,7,16000,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,11:00,1048,1345,350,2,8,30,2,15,326,2,8,386,2,8,31,2,15,362,2,8,1283,2,19,9,E,9,6,E,9,18.9,A,7,12.2,A,7,65,A,7,989,A,7,50,A,7,5.2,A,7,16000,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,12:00,1142,1345,501,2,8,120,2,15,398,2,8,550,2,8,128,2,15,441,2,8,1610,2,19,8,E,9,5,E,9,20.0,A,7,12.8,A,7,63,A,7,988,A,7,40,A,7,1.5,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,13:00,1164,1345,377,2,8,24,2,15,357,2,8,444,2,8,22,2,15,425,2,8,1582,2,19,8,E,9,6,E,9,20.6,A,7,12.8,A,7,61,A,7,987,A,7,40,A,7,2.1,A,7,16000,B,7,5486,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,14:00,1113,1345,400,2,8,36,2,15,370,2,8,441,2,8,37,2,15,411,2,8,1545,2,19,9,E,9,8,E,9,21.1,A,7,13.3,A,7,61,A,7,987,A,7,40,A,7,1.5,A,7,16000,B,7,4572,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,15:00,992,1345,408,2,8,107,2,15,328,2,8,449,2,8,110,2,15,368,2,8,1212,2,19,9,E,9,8,E,9,21.7,A,7,13.9,A,7,61,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,4572,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,16:00,809,1345,356,2,8,124,2,15,281,2,8,387,2,8,130,2,15,309,2,8,761,2,19,9,E,9,9,E,9,21.1,A,7,13.9,A,7,63,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,4572,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,17:00,578,1345,215,2,8,58,2,15,190,2,8,236,2,8,57,2,15,211,2,8,534,2,19,10,E,9,8,E,9,20.0,A,7,13.9,A,7,68,A,7,987,A,7,50,A,7,4.1,A,7,16000,B,7,4572,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,18:00,313,1345,112,2,8,104,2,15,88,2,8,122,2,8,87,2,15,102,2,8,192,2,19,10,E,9,7,E,9,19.4,A,7,14.4,A,7,73,A,7,987,A,7,50,A,7,3.6,A,7,16000,B,7,4572,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,19:00,56,885,7,2,8,41,2,15,6,2,8,10,2,8,17,2,15,9,2,8,10,2,19,8,E,9,8,A,7,18.3,A,7,14.4,A,7,78,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,6706,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,7,E,9,17.8,A,7,15.0,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,6706,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,6,E,9,17.8,A,7,15.0,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,6706,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,E,9,17.2,A,7,14.4,A,7,84,A,7,987,A,7,30,A,7,1.5,A,7,16000,B,7,6706,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,16.7,A,7,15.0,A,7,90,A,7,987,A,7,0,A,7,0.0,A,7,14400,B,7,6706,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/06/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,16.7,A,7,14.4,A,7,86,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,6706,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,7,A,7,16.1,A,7,14.4,A,7,90,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,6706,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,E,9,15.6,A,7,14.4,A,7,93,A,7,986,A,7,10,A,7,2.1,A,7,14400,B,7,6706,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,E,9,15.6,A,7,14.4,A,7,93,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,6706,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,15.6,A,7,14.4,A,7,93,A,7,986,A,7,0,A,7,0.0,A,7,14400,B,7,6706,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,15.6,A,7,13.9,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,14400,B,7,6706,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,06:00,0,56,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,9,E,9,15.6,A,7,13.9,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,12800,B,7,6096,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,07:00,145,1346,53,2,8,0,2,15,53,2,8,57,2,8,0,2,15,57,2,8,149,2,19,10,E,9,9,E,9,15.6,A,7,13.9,A,7,90,A,7,986,A,7,10,A,7,2.1,A,7,14400,B,7,6096,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,08:00,419,1346,116,2,8,0,2,15,116,2,8,130,2,8,0,2,15,130,2,8,420,2,19,7,E,9,7,E,9,16.7,A,7,15.0,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,09:00,672,1346,217,2,8,19,2,15,208,2,8,246,2,8,16,2,15,238,2,8,814,2,19,8,E,9,8,E,9,18.9,A,7,15.6,A,7,81,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,10:00,886,1346,290,2,8,18,2,15,278,2,8,333,2,8,16,2,15,323,2,8,1172,2,19,10,E,9,9,E,9,20.0,A,7,15.0,A,7,73,A,7,987,A,7,40,A,7,5.2,A,7,16000,B,7,6096,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,11:00,1045,1346,344,2,8,18,2,15,329,2,8,399,2,8,17,2,15,386,2,8,1438,2,19,9,E,9,8,E,9,22.2,A,7,15.0,A,7,64,A,7,986,A,7,10,A,7,5.2,A,7,16000,B,7,6096,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,12:00,1138,1346,342,2,8,18,2,15,327,2,8,404,2,8,16,2,15,390,2,8,1477,2,19,10,E,9,10,E,9,21.7,A,7,15.0,A,7,66,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,13:00,1160,1346,515,2,8,120,2,15,412,2,8,567,2,8,128,2,15,456,2,8,1731,2,19,10,E,9,9,E,9,22.2,A,7,14.4,A,7,61,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,14:00,1108,1346,611,2,8,323,2,15,344,2,8,669,2,8,351,2,15,379,2,8,1292,2,19,9,E,9,6,E,9,21.7,A,7,15.0,A,7,66,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,5486,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,15:00,987,1346,241,2,8,18,2,15,228,2,8,286,2,8,15,2,15,275,2,8,1072,2,19,9,E,9,6,E,9,21.7,A,7,15.6,A,7,68,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,5486,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,16:00,804,1346,244,2,8,35,2,15,223,2,8,269,2,8,35,2,15,248,2,8,741,2,19,9,E,9,8,E,9,22.8,A,7,16.1,A,7,66,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,17:00,572,1346,283,2,8,249,2,15,176,2,8,300,2,8,250,2,15,193,2,8,379,2,19,9,E,9,9,E,9,21.7,A,7,15.6,A,7,68,A,7,985,A,7,20,A,7,1.5,A,7,16000,B,7,6096,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,18:00,307,1346,94,2,8,49,2,15,82,2,8,102,2,8,41,2,15,93,2,8,209,2,19,10,E,9,7,E,9,21.7,A,7,15.6,A,7,68,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,19:00,52,841,5,2,8,21,2,15,4,2,8,7,2,8,8,2,15,6,2,8,6,2,19,10,E,9,7,A,7,20.6,A,7,16.7,A,7,78,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,5486,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,8,E,9,20.0,A,7,16.1,A,7,78,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,5486,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,6,E,9,19.4,A,7,16.1,A,7,81,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,5486,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,7,E,9,18.9,A,7,16.1,A,7,84,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,5486,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,A,7,18.9,A,7,16.1,A,7,84,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,5486,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/07/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.3,A,7,16.1,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,A,7,18.3,A,7,16.1,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,4572,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,18.3,A,7,16.1,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,3048,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,9,E,9,17.8,A,7,16.1,A,7,90,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,B,8,8,B,8,17.8,A,7,16.1,A,7,90,A,7,984,A,7,0,A,7,0.0,A,7,14400,B,7,3962,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,8,E,9,17.2,A,7,16.1,A,7,93,A,7,984,A,7,0,A,7,0.0,A,7,12800,B,7,3962,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,06:00,0,56,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,9,E,9,17.2,A,7,16.1,A,7,93,A,7,985,A,7,0,A,7,0.0,A,7,11200,B,7,1829,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/08/2003,07:00,142,1346,55,2,8,0,2,15,55,2,8,59,2,8,0,2,15,59,2,8,149,2,19,10,E,9,10,E,9,17.2,A,7,16.1,A,7,93,A,7,985,A,7,0,A,7,0.0,A,7,11200,B,7,1676,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/08/2003,08:00,416,1346,93,2,8,0,2,15,93,2,8,106,2,8,0,2,15,106,2,8,358,2,19,10,E,9,9,E,9,17.8,A,7,16.1,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/08/2003,09:00,669,1346,285,2,8,117,2,15,227,2,8,310,2,8,120,2,15,250,2,8,564,2,19,10,E,9,10,E,9,18.3,A,7,16.7,A,7,90,A,7,986,A,7,30,A,7,1.5,A,7,12800,B,7,2743,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/08/2003,10:00,883,1346,174,2,8,0,2,15,174,2,8,207,2,8,0,2,15,207,2,8,824,2,19,10,E,9,10,E,9,20.0,A,7,16.1,A,7,78,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,2286,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,11:00,1042,1346,206,2,8,6,2,15,201,2,8,248,2,8,5,2,15,245,2,8,988,2,19,9,E,9,9,E,9,21.1,A,7,17.2,A,7,78,A,7,986,A,7,50,A,7,3.1,A,7,16000,B,7,762,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,12:00,1135,1346,489,2,8,120,2,15,387,2,8,538,2,8,128,2,15,429,2,8,1540,2,19,8,E,9,8,E,9,21.7,A,7,15.6,A,7,68,A,7,986,A,7,60,A,7,2.6,A,7,16000,B,7,3048,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,13:00,1156,1346,587,2,8,210,2,15,406,2,8,645,2,8,224,2,15,452,2,8,1688,2,19,3,E,9,3,E,9,23.3,A,7,15.6,A,7,62,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,14:00,1104,1346,699,2,8,484,2,15,301,2,8,748,2,8,505,2,15,333,2,8,1167,2,19,3,E,9,3,E,9,23.9,A,7,15.6,A,7,60,A,7,985,A,7,50,A,7,1.5,A,7,16000,B,7,77777,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,15:00,982,1346,694,2,8,673,2,15,202,2,8,729,2,8,680,2,15,231,2,8,592,2,19,1,E,9,1,E,9,23.3,A,7,15.0,A,7,60,A,7,985,A,7,10,A,7,3.1,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,16:00,798,1346,388,2,8,218,2,15,259,2,8,425,2,8,228,2,15,289,2,8,696,2,19,0,E,9,0,E,9,23.9,A,7,15.0,A,7,57,A,7,985,A,7,40,A,7,2.1,A,7,16000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,17:00,566,1346,345,2,8,516,2,15,128,2,8,367,2,8,501,2,15,156,2,8,251,2,19,0,E,9,0,E,9,23.3,A,7,13.9,A,7,55,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,18:00,301,1346,151,2,8,381,2,15,65,2,8,158,2,8,301,2,15,91,2,8,117,2,19,2,B,8,2,B,8,22.8,A,7,15.6,A,7,64,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,6096,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,19:00,48,819,4,2,8,29,2,15,4,2,8,7,2,8,11,2,15,6,2,8,6,2,19,3,E,9,3,A,7,20.6,A,7,16.1,A,7,75,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,19.4,A,7,16.1,A,7,81,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,3048,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,15.6,A,7,84,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,15.6,A,7,87,A,7,987,A,7,40,A,7,2.6,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.2,A,7,15.6,A,7,90,A,7,987,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/08/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.2,A,7,15.6,A,7,90,A,7,987,A,7,30,A,7,2.1,A,7,12800,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,0,A,7,16.7,A,7,15.6,A,7,93,A,7,987,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.7,A,7,15.6,A,7,93,A,7,987,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/09/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.7,A,7,15.6,A,7,93,A,7,987,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/09/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.1,A,7,15.6,A,7,97,A,7,987,A,7,10,A,7,1.5,A,7,9600,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/09/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.1,A,7,15.0,A,7,93,A,7,987,A,7,360,A,7,1.5,A,7,9600,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/09/2003,06:00,0,34,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,4,E,9,4,E,9,15.6,A,7,15.0,A,7,96,A,7,987,A,7,20,A,7,2.6,A,7,4800,B,7,3962,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/09/2003,07:00,139,1347,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,8,E,9,8,E,9,16.1,A,7,15.6,A,7,97,A,7,988,A,7,0,A,7,0.0,A,7,4800,B,7,579,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/09/2003,08:00,413,1347,225,2,8,377,2,15,110,2,8,234,2,8,335,2,15,131,2,8,208,2,19,8,B,8,8,B,8,17.8,A,7,16.1,A,7,90,A,7,988,A,7,30,A,7,2.6,A,7,9600,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/09/2003,09:00,666,1347,435,2,8,501,2,15,187,2,8,454,2,8,500,2,15,207,2,8,398,2,19,9,B,8,9,B,8,19.4,A,7,17.2,A,7,87,A,7,989,A,7,30,A,7,2.6,A,7,16000,B,7,396,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/09/2003,10:00,880,1347,277,2,8,37,2,15,253,2,8,306,2,8,38,2,15,281,2,8,878,2,19,9,B,8,9,B,8,20.0,A,7,16.7,A,7,81,A,7,990,A,7,50,A,7,5.2,A,7,14400,B,7,457,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/09/2003,11:00,1038,1347,194,2,8,6,2,15,189,2,8,235,2,8,5,2,15,231,2,8,938,2,19,10,E,9,10,E,9,20.6,A,7,17.2,A,7,81,A,7,990,A,7,0,A,7,0.0,A,7,14400,B,7,549,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/09/2003,12:00,1131,1347,391,2,8,54,2,15,345,2,8,431,2,8,55,2,15,385,2,8,1491,2,19,10,E,9,10,E,9,20.6,A,7,17.2,A,7,81,A,7,990,A,7,50,A,7,4.6,A,7,9600,B,7,640,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/09/2003,13:00,1152,1347,222,2,8,6,2,15,216,2,8,270,2,8,5,2,15,266,2,8,1072,2,19,10,E,9,10,E,9,21.7,A,7,16.7,A,7,73,A,7,989,A,7,30,A,7,3.6,A,7,14400,B,7,1067,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,14:00,1100,1347,305,2,8,12,2,15,296,2,8,362,2,8,10,2,15,353,2,8,1361,2,19,10,E,9,10,E,9,21.1,A,7,16.7,A,7,76,A,7,989,A,7,20,A,7,1.5,A,7,14400,B,7,1219,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,15:00,977,1347,218,2,8,12,2,15,209,2,8,260,2,8,10,2,15,253,2,8,996,2,19,10,B,8,10,B,8,21.7,A,7,16.7,A,7,73,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,1463,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,16:00,793,1347,266,2,8,35,2,15,245,2,8,292,2,8,35,2,15,271,2,8,792,2,19,10,E,9,10,E,9,22.8,A,7,16.7,A,7,68,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,1676,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,17:00,560,1347,214,2,8,70,2,15,185,2,8,235,2,8,68,2,15,206,2,8,514,2,19,10,E,9,10,E,9,22.2,A,7,16.7,A,7,71,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,1676,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,18:00,294,1347,106,2,8,92,2,15,85,2,8,114,2,8,75,2,15,98,2,8,184,2,19,10,E,9,10,E,9,21.7,A,7,16.7,A,7,73,A,7,988,A,7,360,A,7,1.5,A,7,16000,B,7,1676,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,19:00,44,797,2,2,8,0,2,15,2,2,8,3,2,8,0,2,15,3,2,8,8,2,19,10,E,9,10,A,7,20.6,A,7,16.7,A,7,78,A,7,989,A,7,10,A,7,2.6,A,7,16000,B,7,1829,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,20.0,A,7,16.7,A,7,81,A,7,990,A,7,10,A,7,1.5,A,7,16000,B,7,3353,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,19.4,A,7,16.1,A,7,81,A,7,990,A,7,30,A,7,4.6,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.9,A,7,15.6,A,7,81,A,7,990,A,7,40,A,7,4.1,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,5,A,7,18.3,A,7,15.6,A,7,84,A,7,990,A,7,40,A,7,3.1,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/09/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,18.3,A,7,15.6,A,7,84,A,7,990,A,7,40,A,7,3.6,A,7,16000,B,7,823,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.7,A,7,15.6,A,7,93,A,7,990,A,7,10,A,7,1.5,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.1,A,7,15.0,A,7,93,A,7,990,A,7,20,A,7,3.1,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,3,E,9,15.6,A,7,14.4,A,7,93,A,7,990,A,7,10,A,7,3.6,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,15.0,A,7,13.9,A,7,93,A,7,990,A,7,10,A,7,4.6,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,E,9,14.4,A,7,13.3,A,7,93,A,7,990,A,7,360,A,7,4.1,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,06:00,0,11,0,2,0,0,2,0,0,2,0,0,2,1,0,2,2,0,2,2,0,2,1,10,E,9,10,E,9,14.0,A,7,13.0,A,7,94,A,7,991,A,7,10,A,7,3.1,A,7,16100,B,7,660,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,07:00,135,1348,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,14.4,A,7,12.8,A,7,90,A,7,991,A,7,10,A,7,4.1,A,7,16000,B,7,457,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,08:00,409,1348,156,2,8,65,2,15,136,2,8,170,2,8,60,2,15,152,2,8,347,2,19,10,E,9,10,E,9,15.0,A,7,13.3,A,7,90,A,7,992,A,7,10,A,7,3.1,A,7,16000,B,7,518,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,09:00,663,1348,354,2,8,284,2,15,213,2,8,376,2,8,293,2,15,231,2,8,485,2,19,10,E,9,10,E,9,16.7,A,7,13.9,A,7,84,A,7,992,A,7,20,A,7,4.6,A,7,16000,B,7,884,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,10:00,876,1348,535,2,8,414,2,15,265,2,8,579,2,8,444,2,15,290,2,8,700,2,19,8,E,9,8,E,9,18.3,A,7,13.9,A,7,76,A,7,992,A,7,10,A,7,6.2,A,7,16000,B,7,549,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,11:00,1035,1348,419,2,8,79,2,15,358,2,8,462,2,8,81,2,15,399,2,8,1362,2,19,4,E,9,4,E,9,20.0,A,7,13.9,A,7,68,A,7,992,A,7,30,A,7,3.6,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,12:00,1128,1348,794,2,8,584,2,15,304,2,8,851,2,8,610,2,15,340,2,8,1249,2,19,2,E,9,2,E,9,20.6,A,7,12.8,A,7,61,A,7,992,A,7,60,A,7,2.6,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,13:00,1148,1348,767,2,8,570,2,15,280,2,8,831,2,8,596,2,15,322,2,8,1214,2,19,0,E,9,0,E,9,22.2,A,7,12.8,A,7,55,A,7,991,A,7,50,B,8,3.1,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,14:00,1095,1348,781,2,8,616,2,15,279,2,8,841,2,8,643,2,15,317,2,8,1050,2,19,1,E,9,1,E,9,21.7,A,7,10.6,A,7,49,A,7,991,A,7,30,A,7,6.2,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,15:00,972,1348,172,2,8,12,2,15,163,2,8,209,2,8,9,2,15,202,2,8,810,2,19,1,E,9,1,E,9,22.2,A,7,12.2,A,7,53,A,7,990,A,7,30,A,7,5.2,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,16:00,787,1348,327,2,8,112,2,15,261,2,8,359,2,8,113,2,15,293,2,8,828,2,19,3,E,9,3,E,9,22.2,A,7,12.2,A,7,53,A,7,990,A,7,40,A,7,4.6,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,17:00,554,1348,333,2,8,492,2,15,130,2,8,352,2,8,475,2,15,156,2,8,255,2,19,0,E,9,0,E,9,22.2,A,7,12.2,A,7,53,A,7,990,A,7,20,A,7,4.6,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,18:00,288,1348,140,2,8,351,2,15,64,2,8,146,2,8,272,2,15,88,2,8,116,2,19,3,E,9,3,E,9,20.0,A,7,12.8,A,7,63,A,7,990,A,7,50,A,7,4.1,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,19:00,41,753,2,2,8,18,2,15,2,2,8,4,2,8,9,2,15,3,2,8,4,2,19,0,E,9,0,A,7,18.3,A,7,12.8,A,7,70,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,13.3,A,7,75,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.2,A,7,12.8,A,7,75,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.1,A,7,13.3,A,7,83,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,15.0,A,7,12.8,A,7,87,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/10/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,14.4,A,7,12.8,A,7,90,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,13.9,A,7,12.2,A,7,89,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.9,A,7,12.2,A,7,89,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.3,A,7,11.7,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.3,A,7,11.7,A,7,90,A,7,990,A,7,350,A,7,2.1,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.3,A,7,11.1,A,7,87,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,12.8,A,7,11.1,A,7,89,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,07:00,132,1337,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,13.9,A,7,11.7,A,7,87,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,08:00,406,1348,235,2,8,443,2,15,101,2,8,245,2,8,392,2,15,127,2,8,189,2,19,0,B,8,0,B,8,16.7,A,7,12.2,A,7,75,A,7,991,A,7,10,A,7,4.1,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,09:00,660,1348,436,2,8,637,2,15,123,2,8,454,2,8,624,2,15,148,2,8,256,2,19,0,E,9,0,E,9,19.4,A,7,12.8,A,7,66,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,10:00,873,1348,612,2,8,730,2,15,138,2,8,651,2,8,742,2,15,170,2,8,356,2,19,0,E,9,0,E,9,20.6,A,7,12.2,A,7,59,A,7,991,A,7,10,A,7,2.6,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,11:00,1031,1348,744,2,8,774,2,15,150,2,8,777,2,8,777,2,15,181,2,8,447,2,19,0,E,9,0,E,9,21.7,A,7,11.7,A,7,53,A,7,991,A,7,30,A,7,5.2,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,12:00,1124,1348,812,2,8,764,2,15,174,2,8,846,2,8,766,2,15,206,2,8,631,2,19,0,B,8,0,B,8,22.8,A,7,11.7,A,7,50,A,7,991,A,7,360,A,7,2.6,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,13:00,1144,1348,844,2,8,810,2,15,156,2,8,893,2,8,818,2,15,197,2,8,619,2,19,0,E,9,0,E,9,23.9,A,7,10.0,A,7,41,A,7,989,A,7,20,A,7,3.6,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,14:00,1090,1348,798,2,8,801,2,15,149,2,8,842,2,8,808,2,15,187,2,8,514,2,19,0,E,9,0,E,9,24.4,A,7,11.1,A,7,43,A,7,989,A,7,10,A,7,5.7,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,15:00,967,1348,688,2,8,756,2,15,144,2,8,715,2,8,756,2,15,172,2,8,380,2,19,0,E,9,0,E,9,24.4,A,7,11.7,A,7,45,A,7,988,A,7,20,A,7,1.5,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,16:00,782,1348,520,2,8,661,2,15,136,2,8,548,2,8,663,2,15,163,2,8,315,2,19,0,B,8,0,B,8,24.4,A,7,11.1,A,7,43,A,7,988,A,7,40,A,7,6.7,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,17:00,548,1348,332,2,8,584,2,15,95,2,8,347,2,8,556,2,15,121,2,8,188,2,19,0,E,9,0,E,9,23.9,A,7,10.6,A,7,43,A,7,988,A,7,40,A,7,6.2,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,18:00,281,1348,138,2,8,366,2,15,62,2,8,146,2,8,280,2,15,87,2,8,112,2,19,0,B,8,0,B,8,22.2,A,7,11.7,A,7,51,A,7,987,A,7,40,A,7,4.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,19:00,37,730,1,2,8,27,2,15,1,2,8,3,2,8,16,2,15,2,2,8,4,2,19,0,E,9,0,A,7,19.4,A,7,12.2,A,7,63,A,7,987,A,7,50,A,7,3.1,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.9,A,7,12.8,A,7,68,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.2,A,7,13.3,A,7,78,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,18.3,A,7,12.8,A,7,70,A,7,988,A,7,40,A,7,4.1,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.2,A,7,12.8,A,7,75,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/11/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.1,A,7,12.8,A,7,81,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,15.6,A,7,12.8,A,7,83,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,15.0,A,7,12.8,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,3962,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,14.4,A,7,12.2,A,7,87,A,7,987,A,7,360,A,7,4.6,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.9,A,7,12.2,A,7,89,A,7,987,A,7,360,A,7,3.6,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,14.4,A,7,12.8,A,7,90,A,7,987,A,7,10,A,7,4.1,A,7,16000,B,7,549,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,15.0,A,7,12.8,A,7,87,A,7,987,A,7,10,A,7,5.2,A,7,16000,B,7,335,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,07:00,129,1315,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,15.0,A,7,13.3,A,7,90,A,7,987,A,7,20,A,7,4.1,A,7,16000,B,7,335,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,08:00,403,1349,133,2,8,26,2,15,126,2,8,146,2,8,24,2,15,139,2,8,325,2,19,10,E,9,10,E,9,16.1,A,7,13.9,A,7,87,A,7,987,A,7,10,A,7,6.2,A,7,16000,B,7,335,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,09:00,657,1349,150,2,8,0,2,15,150,2,8,174,2,8,0,2,15,174,2,8,637,2,19,10,E,9,10,E,9,17.0,A,7,15.0,A,7,88,A,7,988,A,7,20,A,7,4.6,A,7,16100,B,7,270,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,10:00,870,1349,161,2,8,0,2,15,161,2,8,193,2,8,0,2,15,193,2,8,767,2,19,10,E,9,10,E,9,17.8,A,7,15.0,A,7,84,A,7,988,A,7,360,A,7,4.1,A,7,16000,B,7,335,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,11:00,1028,1349,231,2,8,6,2,15,227,2,8,277,2,8,5,2,15,273,2,8,1085,2,19,10,E,9,10,E,9,18.9,A,7,16.1,A,7,84,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,335,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,12:00,1120,1349,171,2,8,0,2,15,171,2,8,211,2,8,0,2,15,211,2,8,876,2,19,10,E,9,10,E,9,18.9,A,7,16.1,A,7,84,A,7,988,A,7,10,A,7,5.2,A,7,16000,B,7,396,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,13:00,1140,1349,192,2,8,6,2,15,187,2,8,236,2,8,5,2,15,233,2,8,948,2,19,10,E,9,10,E,9,20.0,A,7,16.7,A,7,81,A,7,987,A,7,10,B,8,2.6,A,7,16000,B,7,396,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,14:00,1086,1349,481,2,8,137,2,15,370,2,8,528,2,8,146,2,15,410,2,8,1343,2,19,8,E,9,8,E,9,21.7,A,7,17.2,A,7,76,A,7,986,A,7,360,A,7,3.1,A,7,16000,B,7,671,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,15:00,962,1349,361,2,8,54,2,15,323,2,8,398,2,8,55,2,15,359,2,8,1157,2,19,9,B,8,9,B,8,22.2,A,7,17.2,A,7,73,A,7,986,A,7,350,A,7,2.1,A,7,16000,B,7,884,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,16:00,776,1349,138,2,8,0,2,15,138,2,8,165,2,8,0,2,15,165,2,8,644,2,19,10,E,9,10,E,9,21.1,A,7,17.2,A,7,78,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,671,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,17:00,541,1349,161,2,8,17,2,15,154,2,8,182,2,8,13,2,15,177,2,8,585,2,19,10,E,9,10,E,9,20.6,A,7,17.2,A,7,81,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,762,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,18:00,275,1349,64,2,8,0,2,15,64,2,8,72,2,8,0,2,15,72,2,8,228,2,19,8,E,9,8,E,9,20.0,A,7,17.2,A,7,84,A,7,985,A,7,350,A,7,3.1,A,7,16000,B,7,853,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,19:00,34,686,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,8,E,9,8,A,7,19.4,A,7,16.7,A,7,84,A,7,985,A,7,360,A,7,3.1,A,7,16000,B,7,762,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,19.4,A,7,16.7,A,7,84,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,884,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,18.9,A,7,16.7,A,7,87,A,7,986,A,7,30,A,7,2.6,A,7,16000,B,7,884,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,18.3,A,7,17.2,A,7,93,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,732,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,18.3,A,7,16.1,A,7,87,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,732,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/12/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,A,7,17.2,A,7,15.6,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,17.8,A,7,15.6,A,7,87,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,640,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.8,A,7,15.6,A,7,87,A,7,985,A,7,340,A,7,2.1,A,7,16000,B,7,640,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,18.3,A,7,15.6,A,7,84,A,7,985,A,7,320,A,7,2.1,A,7,16000,B,7,640,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,18.3,A,7,15.6,A,7,84,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,579,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,17.8,A,7,16.1,A,7,90,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,579,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.8,A,7,16.1,A,7,90,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,579,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,07:00,125,1316,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,18.3,A,7,16.1,A,7,87,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,640,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,08:00,399,1350,79,2,8,0,2,15,79,2,8,91,2,8,0,2,15,91,2,8,311,2,19,10,E,9,10,E,9,18.9,A,7,16.1,A,7,84,A,7,987,A,7,280,A,7,1.5,A,7,16000,B,7,701,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,09:00,653,1350,218,2,8,31,2,15,203,2,8,239,2,8,31,2,15,225,2,8,602,2,19,10,E,9,10,E,9,21.0,A,7,17.0,A,7,78,A,7,987,A,7,0,A,7,0.0,A,7,16100,B,7,900,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,10:00,867,1350,587,2,8,585,2,15,211,2,8,628,2,8,603,2,15,240,2,8,530,2,19,10,E,9,10,E,9,22.2,A,7,16.7,A,7,71,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,1036,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,11:00,1024,1350,475,2,8,151,2,15,360,2,8,520,2,8,160,2,15,398,2,8,1195,2,19,8,E,9,8,E,9,23.3,A,7,17.2,A,7,69,A,7,987,A,7,310,A,7,2.6,A,7,16000,B,7,2286,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,12:00,1116,1350,611,2,8,319,2,15,346,2,8,669,2,8,346,2,15,381,2,8,1312,2,19,9,E,9,9,E,9,23.9,A,7,17.8,A,7,69,A,7,986,A,7,320,B,8,1.5,A,7,16000,B,7,853,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,13:00,1135,1350,299,2,8,24,2,15,279,2,8,331,2,8,24,2,15,311,2,8,1242,2,19,10,E,9,10,E,9,23.9,A,7,18.3,A,7,71,A,7,986,A,7,330,A,7,2.1,A,7,16000,B,7,792,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,14:00,1081,1350,370,2,8,30,2,15,346,2,8,408,2,8,31,2,15,384,2,8,1395,2,19,9,B,8,9,B,8,23.9,A,7,18.9,A,7,74,A,7,986,A,7,340,A,7,1.5,A,7,16000,B,7,914,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,15:00,956,1350,269,2,8,12,2,15,261,2,8,315,2,8,10,2,15,308,2,8,1168,2,19,9,E,9,9,E,9,23.3,A,7,18.9,A,7,76,A,7,985,A,7,20,A,7,1.5,A,7,16000,B,7,823,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,16:00,770,1350,265,2,8,41,2,15,242,2,8,292,2,8,41,2,15,268,2,8,767,2,19,9,E,9,9,E,9,22.8,A,7,19.4,A,7,81,A,7,986,A,7,40,A,7,2.1,A,7,16000,B,7,549,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,17:00,535,1350,202,2,8,75,2,15,172,2,8,221,2,8,72,2,15,192,2,8,474,2,19,8,E,9,8,E,9,22.8,A,7,18.9,A,7,79,A,7,986,A,7,40,A,7,1.5,A,7,16000,B,7,1219,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,18:00,268,1350,93,2,8,85,2,15,76,2,8,101,2,8,66,2,15,88,2,8,163,2,19,8,E,9,8,E,9,22.2,A,7,19.4,A,7,84,A,7,986,A,7,50,A,7,1.5,A,7,16000,B,7,1341,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,19:00,31,664,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,7,E,9,7,A,7,21.7,A,7,18.9,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,1158,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.1,A,7,19.4,A,7,90,A,7,987,A,7,360,B,8,1.5,A,7,16000,B,7,1097,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.1,A,7,19.4,A,7,90,A,7,988,A,7,360,B,8,1.5,A,7,16000,B,7,1219,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.1,A,7,19.4,A,7,90,A,7,988,A,7,360,B,8,1.5,A,7,16000,B,7,1372,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,20.6,A,7,19.4,A,7,93,A,7,989,A,7,360,B,8,1.5,A,7,16000,B,7,1372,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/13/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,20.6,A,7,19.4,A,7,93,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,1829,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/14/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,A,7,20.6,A,7,19.4,A,7,93,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,3353,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/14/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,20.0,A,7,19.4,A,7,96,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,2286,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/14/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,20.0,A,7,19.4,A,7,96,A,7,988,A,7,150,A,7,3.1,A,7,12800,B,7,183,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/14/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,20.0,A,7,18.9,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,9600,B,7,183,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,20.0,A,7,18.9,A,7,93,A,7,989,A,7,0,A,7,0.0,A,7,9600,B,7,183,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,19.4,A,7,18.9,A,7,97,A,7,989,A,7,160,A,7,2.6,A,7,8000,B,7,183,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,07:00,122,1294,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,19.4,A,7,18.3,A,7,93,A,7,989,A,7,0,A,7,0.0,A,7,6400,B,7,183,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,08:00,396,1351,71,2,8,0,2,15,71,2,8,82,2,8,0,2,15,82,2,8,285,2,19,10,E,9,10,E,9,19.4,A,7,18.9,A,7,97,A,7,990,A,7,0,A,7,0.0,A,7,4000,B,7,183,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,09:00,650,1351,130,2,8,0,2,15,130,2,8,152,2,8,0,2,15,152,2,8,567,2,19,10,E,9,10,E,9,20.0,A,7,18.9,A,7,93,A,7,990,A,7,200,A,7,1.5,A,7,4800,B,7,183,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,10:00,863,1351,129,2,8,0,2,15,129,2,8,157,2,8,0,2,15,157,2,8,634,2,19,10,E,9,10,E,9,20.6,A,7,18.9,A,7,90,A,7,991,A,7,0,A,7,0.0,A,7,6400,B,7,244,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,11:00,1021,1351,206,2,8,6,2,15,202,2,8,249,2,8,5,2,15,245,2,8,985,2,19,10,E,9,10,E,9,22.2,A,7,18.9,A,7,82,A,7,990,A,7,0,A,7,0.0,A,7,8000,B,7,366,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,12:00,1112,1351,330,2,8,18,2,15,315,2,8,389,2,8,16,2,15,375,2,8,1428,2,19,10,E,9,10,E,9,23.9,A,7,19.4,A,7,76,A,7,990,A,7,360,B,8,2.1,A,7,9600,B,7,610,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/14/2003,13:00,1131,1351,527,2,8,150,2,15,401,2,8,578,2,8,160,2,15,444,2,8,1573,2,19,8,E,9,8,E,9,25.0,A,7,19.4,A,7,71,A,7,989,A,7,0,A,7,0.0,A,7,11200,B,7,792,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/14/2003,14:00,1076,1351,522,2,8,185,2,15,374,2,8,572,2,8,197,2,15,415,2,8,1335,2,19,8,E,9,8,E,9,26.1,A,7,19.4,A,7,67,A,7,989,A,7,0,A,7,0.0,A,7,11200,B,7,1036,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/14/2003,15:00,951,1351,635,2,8,583,2,15,224,2,8,685,2,8,606,2,15,257,2,8,629,2,19,10,E,9,10,E,9,26.1,A,7,19.4,A,7,67,A,7,988,A,7,0,A,7,0.0,A,7,12800,B,7,914,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/14/2003,16:00,764,1351,431,2,8,348,2,15,233,2,8,463,2,8,367,2,15,254,2,8,559,2,19,8,E,9,8,E,9,24.4,A,7,20.0,A,7,76,A,7,988,A,7,0,A,7,0.0,A,7,9600,B,7,1219,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/14/2003,17:00,529,1351,310,2,8,462,2,15,128,2,8,326,2,8,441,2,15,152,2,8,249,2,19,5,E,9,5,E,9,25.0,A,7,20.0,A,7,74,A,7,988,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/14/2003,18:00,261,1351,93,2,8,122,2,15,69,2,8,101,2,8,94,2,15,83,2,8,148,2,19,5,E,9,5,E,9,24.4,A,7,20.0,A,7,76,A,7,988,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/14/2003,19:00,27,619,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,3,E,9,3,A,7,22.8,A,7,20.6,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/14/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,22.2,A,7,20.0,A,7,87,A,7,988,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,21.1,A,7,20.0,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,19.4,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,20.0,A,7,19.4,A,7,96,A,7,988,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/14/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,20.0,A,7,19.4,A,7,96,A,7,988,A,7,0,A,7,0.0,A,7,4800,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/15/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.9,A,7,18.9,A,7,100,A,7,988,A,7,0,A,7,0.0,A,7,4000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/15/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,19.0,A,7,19.0,A,7,100,A,7,987,A,7,0,A,7,0.0,A,7,3200,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/15/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,B,8,2,B,8,18.3,A,7,18.3,A,7,100,A,7,987,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,3.8,E,8,0.000,F,8,0.00,F,8,3,1,D,9,10,C,8 -09/15/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,B,8,4,B,8,18.3,A,7,18.3,A,7,100,A,7,986,A,7,0,A,7,0.0,A,7,300,B,7,30,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/15/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,B,8,6,B,8,18.3,A,7,18.3,A,7,100,A,7,986,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/15/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,B,8,8,B,8,18.3,A,7,18.3,A,7,100,A,7,986,A,7,0,A,7,0.0,A,7,400,B,7,30,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/15/2003,07:00,119,1273,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,A,7,18.9,A,7,18.9,A,7,100,A,7,986,A,7,0,A,7,0.0,A,7,300,B,7,30,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/15/2003,08:00,393,1351,135,2,8,26,2,15,127,2,8,149,2,8,17,2,15,144,2,8,427,2,19,9,B,8,9,B,8,18.9,A,7,18.9,A,7,100,A,7,987,A,7,0,A,7,0.0,A,7,300,B,7,30,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,41,C,8 -09/15/2003,09:00,647,1351,239,2,8,31,2,15,224,2,8,268,2,8,27,2,15,255,2,8,828,2,19,9,B,8,9,B,8,20.0,A,7,20.0,A,7,100,A,7,987,A,7,0,A,7,0.0,A,7,4150,C,8,30,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/15/2003,10:00,860,1351,284,2,8,24,2,15,268,2,8,325,2,8,22,2,15,311,2,8,1120,2,19,8,E,9,8,E,9,22.0,A,7,20.0,A,7,88,A,7,987,A,7,270,A,7,2.1,A,7,8000,B,7,90,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/15/2003,11:00,1017,1351,444,2,8,103,2,15,366,2,8,489,2,8,106,2,15,409,2,8,1354,2,19,2,E,9,2,A,7,24.0,A,7,20.0,A,7,78,A,7,987,A,7,0,A,7,0.0,A,7,14500,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/15/2003,12:00,1108,1351,690,2,8,433,2,15,334,2,8,730,2,8,451,2,15,360,2,8,1304,2,19,8,E,9,8,E,9,25.6,A,7,19.4,A,7,69,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,1250,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,13:00,1127,1351,563,2,8,222,2,15,377,2,8,620,2,8,237,2,15,422,2,8,1465,2,19,6,E,9,6,E,9,26.7,A,7,18.9,A,7,62,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,14:00,1071,1351,328,2,8,36,2,15,300,2,8,363,2,8,37,2,15,334,2,8,1221,2,19,6,E,9,6,E,9,28.3,A,7,18.9,A,7,57,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,15:00,946,1351,503,2,8,280,2,15,307,2,8,544,2,8,301,2,15,333,2,8,885,2,19,3,E,9,3,E,9,28.3,A,7,17.2,A,7,51,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,16:00,758,1351,485,2,8,595,2,15,150,2,8,505,2,8,591,2,15,173,2,8,333,2,19,5,E,9,5,E,9,28.3,A,7,17.2,A,7,51,A,7,984,A,7,280,A,7,1.5,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,17:00,522,1351,314,2,8,508,2,15,117,2,8,333,2,8,484,2,15,145,2,8,225,2,19,6,E,9,6,E,9,26.1,A,7,20.0,A,7,69,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,18:00,255,1351,92,2,8,138,2,15,66,2,8,97,2,8,100,2,15,79,2,8,124,2,19,8,E,9,8,E,9,23.3,A,7,17.2,A,7,69,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,2286,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,19:00,25,597,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,5,E,9,5,A,7,21.7,A,7,17.2,A,7,76,A,7,985,A,7,10,A,7,2.1,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.1,A,7,17.8,A,7,81,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,1981,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.1,A,7,17.8,A,7,81,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,2134,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,21.1,A,7,16.7,A,7,76,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,A,7,20.0,A,7,16.1,A,7,78,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/15/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,20.0,A,7,15.6,A,7,76,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,2134,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,A,7,18.9,A,7,15.0,A,7,78,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,1981,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,18.3,A,7,15.0,A,7,81,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,1981,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,17.8,A,7,14.4,A,7,80,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,1981,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,17.2,A,7,13.9,A,7,81,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,1676,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.2,A,7,12.8,A,7,75,A,7,988,A,7,10,A,7,2.1,A,7,16000,B,7,1829,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,16.1,A,7,12.8,A,7,81,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,07:00,116,1251,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,3,E,9,3,E,9,16.1,A,7,12.2,A,7,78,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,08:00,389,1352,206,2,8,256,2,15,133,2,8,216,2,8,227,2,15,150,2,8,276,2,19,8,E,9,8,E,9,18.3,A,7,12.2,A,7,68,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,2134,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,09:00,643,1352,232,2,8,56,2,15,206,2,8,255,2,8,55,2,15,229,2,8,603,2,19,8,E,9,8,E,9,20.0,A,7,11.1,A,7,57,A,7,990,A,7,20,A,7,6.2,A,7,16000,B,7,2134,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,10:00,856,1352,575,2,8,573,2,15,211,2,8,614,2,8,590,2,15,239,2,8,523,2,19,3,E,9,3,E,9,21.1,A,7,11.1,A,7,53,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,11:00,1013,1352,719,2,8,725,2,15,174,2,8,765,2,8,740,2,15,209,2,8,547,2,19,0,E,9,0,E,9,23.3,A,7,11.7,A,7,48,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,12:00,1104,1352,806,2,8,800,2,15,151,2,8,850,2,8,807,2,15,189,2,8,534,2,19,0,E,9,0,E,9,23.9,A,7,11.1,A,7,45,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,13:00,1122,1352,820,2,8,786,2,15,166,2,8,858,2,8,790,2,15,201,2,8,602,2,19,0,E,9,0,E,9,24.4,A,7,11.1,A,7,43,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,14:00,1066,1352,774,2,8,789,2,15,150,2,8,813,2,8,794,2,15,185,2,8,482,2,19,0,E,9,0,E,9,24.4,A,7,11.7,A,7,45,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,15:00,940,1352,663,2,8,761,2,15,133,2,8,693,2,8,762,2,15,162,2,8,343,2,19,0,E,9,0,E,9,25.0,A,7,11.7,A,7,43,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,16:00,752,1352,496,2,8,654,2,15,131,2,8,521,2,8,653,2,15,157,2,8,295,2,19,0,E,9,0,E,9,25.0,A,7,11.7,A,7,43,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,17:00,516,1352,308,2,8,565,2,15,92,2,8,320,2,8,530,2,15,117,2,8,179,2,19,0,E,9,0,E,9,24.4,A,7,11.1,A,7,43,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,18:00,248,1352,111,2,8,322,2,15,52,2,8,117,2,8,232,2,15,75,2,8,93,2,19,0,E,9,0,E,9,22.8,A,7,12.2,A,7,51,A,7,988,A,7,30,A,7,2.6,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,19:00,22,552,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,A,7,20.0,A,7,12.8,A,7,63,A,7,988,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,13.3,A,7,73,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,13.3,A,7,75,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.1,A,7,13.3,A,7,83,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,15.6,A,7,13.3,A,7,86,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/16/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,15.0,A,7,12.8,A,7,87,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,15.0,A,7,11.7,A,7,81,A,7,989,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.9,A,7,11.7,A,7,87,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.3,A,7,11.7,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.3,A,7,11.1,A,7,87,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,12.8,A,7,11.1,A,7,89,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,12.8,A,7,10.6,A,7,86,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,07:00,113,1251,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,13.9,A,7,11.1,A,7,83,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,08:00,386,1353,223,2,8,433,2,15,99,2,8,232,2,8,376,2,15,124,2,8,185,2,19,0,E,9,0,E,9,16.1,A,7,12.2,A,7,78,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,09:00,640,1353,417,2,8,607,2,15,129,2,8,432,2,8,589,2,15,152,2,8,261,2,19,0,E,9,0,E,9,18.9,A,7,11.7,A,7,63,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,10:00,853,1353,594,2,8,719,2,15,140,2,8,630,2,8,728,2,15,170,2,8,350,2,19,0,E,9,0,E,9,21.1,A,7,11.7,A,7,55,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,11:00,1010,1353,725,2,8,774,2,15,146,2,8,758,2,8,776,2,15,177,2,8,416,2,19,0,E,9,0,E,9,22.8,A,7,10.6,A,7,46,A,7,990,A,7,40,A,7,7.2,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,12:00,1100,1353,794,2,8,770,2,15,166,2,8,828,2,8,773,2,15,198,2,8,564,2,19,0,E,9,0,E,9,23.9,A,7,10.0,A,7,41,A,7,990,A,7,40,A,7,8.8,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,13:00,1118,1353,814,2,8,774,2,15,173,2,8,847,2,8,776,2,15,205,2,8,610,2,19,0,E,9,0,E,9,23.9,A,7,10.6,A,7,43,A,7,990,A,7,30,A,7,4.6,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,14:00,1061,1353,768,2,8,783,2,15,152,2,8,804,2,8,787,2,15,185,2,8,480,2,19,0,E,9,0,E,9,25.0,A,7,10.6,A,7,40,A,7,989,A,7,40,A,7,6.2,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,15:00,935,1353,657,2,8,755,2,15,134,2,8,685,2,8,755,2,15,162,2,8,341,2,19,0,E,9,0,E,9,25.0,A,7,10.6,A,7,40,A,7,988,A,7,20,A,7,6.2,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,16:00,746,1353,490,2,8,648,2,15,132,2,8,515,2,8,646,2,15,158,2,8,295,2,19,2,B,8,2,B,8,24.4,A,7,10.6,A,7,42,A,7,988,A,7,20,A,7,7.2,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,17:00,510,1353,302,2,8,484,2,15,120,2,8,319,2,8,458,2,15,146,2,8,231,2,19,5,E,9,4,E,9,23.9,A,7,11.7,A,7,46,A,7,988,A,7,50,A,7,4.6,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,18:00,241,1353,82,2,8,110,2,15,62,2,8,89,2,8,82,2,15,75,2,8,132,2,19,6,B,8,6,B,8,22.2,A,7,12.2,A,7,53,A,7,988,A,7,40,A,7,4.6,A,7,16000,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,19:00,19,530,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,7,E,9,7,A,7,20.6,A,7,12.8,A,7,61,A,7,988,A,7,40,A,7,4.1,A,7,16000,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,7,E,9,19.4,A,7,12.2,A,7,63,A,7,989,A,7,30,A,7,4.6,A,7,16000,B,7,6096,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,4,E,9,18.9,A,7,12.2,A,7,65,A,7,988,A,7,30,A,7,4.6,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,18.3,A,7,12.2,A,7,68,A,7,988,A,7,30,A,7,5.7,A,7,16000,B,7,1524,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,A,7,17.8,A,7,12.2,A,7,70,A,7,988,A,7,20,A,7,5.2,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/17/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,A,7,17.2,A,7,11.7,A,7,70,A,7,987,A,7,20,A,7,4.1,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,A,7,17.2,A,7,12.2,A,7,72,A,7,986,A,7,30,A,7,4.6,A,7,16000,B,7,4572,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,E,9,17.8,A,7,11.7,A,7,67,A,7,986,A,7,20,A,7,5.7,A,7,16000,B,7,1676,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,E,9,17.8,A,7,11.1,A,7,65,A,7,985,A,7,20,A,7,4.6,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.8,A,7,11.1,A,7,65,A,7,985,A,7,30,A,7,6.2,A,7,16000,B,7,579,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.8,A,7,11.7,A,7,67,A,7,984,A,7,20,A,7,6.2,A,7,16000,B,7,579,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,6,E,9,17.8,A,7,12.2,A,7,70,A,7,984,A,7,20,A,7,6.7,A,7,16000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,07:00,109,1230,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,9,E,9,17.8,A,7,12.8,A,7,73,A,7,984,A,7,20,A,7,4.6,A,7,16000,B,7,884,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,08:00,382,1354,64,2,8,0,2,15,64,2,8,75,2,8,0,2,15,75,2,8,258,2,19,10,E,9,9,E,9,17.8,A,7,12.8,A,7,73,A,7,983,A,7,30,A,7,4.6,A,7,16000,B,7,640,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,09:00,636,1354,82,2,8,0,2,15,82,2,8,99,2,8,0,2,15,99,2,8,382,2,19,10,E,9,10,E,9,18.3,A,7,13.9,A,7,76,A,7,982,A,7,10,A,7,7.2,A,7,16000,B,7,640,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/18/2003,10:00,849,1354,129,2,8,0,2,15,129,2,8,156,2,8,0,2,15,156,2,8,630,2,19,10,E,9,7,E,9,18.9,A,7,15.0,A,7,78,A,7,981,A,7,20,A,7,6.7,A,7,16000,B,7,6096,A,7,4.2,E,8,0.000,F,8,0.00,F,8,6,1,D,9,00,C,8 -09/18/2003,11:00,1006,1354,113,2,8,0,2,15,113,2,8,142,2,8,0,2,15,142,2,8,593,2,19,10,E,9,10,E,9,17.2,A,7,16.1,A,7,93,A,7,980,A,7,360,A,7,5.2,A,7,6400,B,7,518,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/18/2003,12:00,1096,1354,128,2,8,0,2,15,128,2,8,161,2,8,0,2,15,161,2,8,676,2,19,10,E,9,10,E,9,17.2,A,7,16.7,A,7,97,A,7,979,A,7,10,A,7,6.2,A,7,8000,B,7,457,A,7,4.5,E,8,0.000,F,8,0.00,F,8,1,1,D,9,10,C,8 -09/18/2003,13:00,1113,1354,132,2,8,0,2,15,132,2,8,166,2,8,0,2,15,166,2,8,696,2,19,10,E,9,10,E,9,17.2,A,7,16.7,A,7,97,A,7,977,A,7,360,A,7,7.7,A,7,8000,B,7,335,A,7,4.6,E,8,0.000,F,8,0.00,F,8,25,1,D,9,10,C,8 -09/18/2003,14:00,1056,1354,123,2,8,0,2,15,123,2,8,154,2,8,0,2,15,154,2,8,647,2,19,10,E,9,10,E,9,17.2,A,7,16.7,A,7,97,A,7,975,A,7,350,A,7,6.2,A,7,4800,B,7,671,A,7,5.0,E,8,0.000,F,8,0.00,F,8,49,1,D,9,45,C,8 -09/18/2003,15:00,929,1354,103,2,8,0,2,15,103,2,8,129,2,8,0,2,15,129,2,8,533,2,19,10,E,9,9,E,9,17.8,A,7,16.7,A,7,93,A,7,973,A,7,350,A,7,10.3,A,7,4800,B,7,671,A,7,5.3,E,8,0.000,F,8,0.00,F,8,175,1,D,9,10,C,8 -09/18/2003,16:00,740,1354,83,2,8,0,2,15,83,2,8,102,2,8,0,2,15,102,2,8,407,2,19,10,E,9,10,A,7,18.0,A,7,17.0,A,7,94,A,7,970,A,7,330,A,7,11.8,A,7,1600,B,7,510,A,7,5.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/18/2003,17:00,503,1354,46,2,8,0,2,15,46,2,8,57,2,8,0,2,15,57,2,8,211,2,19,10,B,8,10,B,8,17.2,A,7,16.7,A,7,97,A,7,969,A,7,320,A,7,11.3,A,7,1200,B,7,610,A,7,5.6,E,8,0.000,F,8,0.00,F,8,500,1,D,9,10,C,8 -09/18/2003,18:00,234,1354,52,2,8,5,2,15,51,2,8,59,2,8,1,2,15,58,2,8,181,2,19,10,E,9,10,E,9,17.8,A,7,16.7,A,7,93,A,7,967,A,7,310,A,7,10.3,A,7,2400,B,7,1372,A,7,5.6,E,8,0.000,F,8,0.00,F,8,46,1,D,9,45,C,8 -09/18/2003,19:00,17,485,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,A,7,17.2,A,7,16.7,A,7,97,A,7,966,A,7,300,A,7,8.8,A,7,8000,B,7,1433,A,7,5.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/18/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.2,A,7,16.1,A,7,93,A,7,965,A,7,300,A,7,10.3,A,7,6400,B,7,1189,A,7,5.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/18/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.2,A,7,16.1,A,7,93,A,7,965,A,7,280,A,7,9.8,A,7,16000,B,7,1829,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/18/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.2,A,7,16.1,A,7,93,A,7,966,A,7,270,A,7,8.2,A,7,9600,B,7,1189,A,7,5.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/18/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,17.2,A,7,16.1,A,7,93,A,7,968,A,7,230,A,7,6.7,A,7,11200,B,7,1829,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/18/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,17.8,A,7,15.6,A,7,87,A,7,969,A,7,240,A,7,6.7,A,7,16000,B,7,1829,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/19/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,18.9,A,7,15.0,A,7,78,A,7,970,A,7,230,A,7,6.2,A,7,16000,B,7,1372,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,B,8,10,B,8,18.9,A,7,14.4,A,7,75,A,7,972,A,7,230,B,8,6.2,B,8,16000,B,7,1372,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,19.4,A,7,14.4,A,7,73,A,7,973,A,7,230,A,7,6.2,A,7,16000,B,7,1494,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,7,E,9,19.4,A,7,13.9,A,7,70,A,7,975,A,7,230,A,7,6.7,A,7,16000,B,7,3658,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,4,E,9,18.9,A,7,14.4,A,7,75,A,7,976,A,7,230,A,7,5.7,A,7,16000,B,7,4572,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,7,E,9,17.8,A,7,14.4,A,7,80,A,7,978,A,7,230,A,7,4.1,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,07:00,106,1208,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,6,E,9,6,E,9,18.3,A,7,14.4,A,7,78,A,7,979,A,7,220,A,7,3.1,A,7,16000,B,7,4877,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,08:00,379,1354,217,2,8,408,2,15,102,2,8,224,2,8,351,2,15,125,2,8,192,2,19,5,E,9,5,E,9,20.0,A,7,14.4,A,7,70,A,7,980,A,7,220,A,7,5.2,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,09:00,633,1354,411,2,8,601,2,15,129,2,8,425,2,8,582,2,15,152,2,8,259,2,19,0,E,9,0,E,9,22.2,A,7,15.0,A,7,64,A,7,981,A,7,220,A,7,4.6,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,10:00,845,1354,588,2,8,719,2,15,138,2,8,624,2,8,727,2,15,168,2,8,342,2,19,0,E,9,0,E,9,23.9,A,7,13.9,A,7,54,A,7,983,A,7,230,A,7,6.2,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,11:00,1002,1354,707,2,8,732,2,15,164,2,8,754,2,8,748,2,15,200,2,8,506,2,19,0,E,9,0,E,9,25.0,A,7,13.9,A,7,50,A,7,984,A,7,210,A,7,5.7,A,7,16000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,12:00,1092,1354,788,2,8,776,2,15,160,2,8,823,2,8,780,2,15,193,2,8,536,2,19,0,E,9,0,E,9,25.6,A,7,13.3,A,7,47,A,7,984,A,7,220,A,7,5.7,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,13:00,1108,1354,796,2,8,738,2,15,190,2,8,850,2,8,755,2,15,230,2,8,727,2,19,0,E,9,0,E,9,26.1,A,7,12.8,A,7,44,A,7,984,A,7,240,A,7,4.1,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,14:00,1051,1354,761,2,8,789,2,15,148,2,8,799,2,8,793,2,15,182,2,8,459,2,19,0,E,9,0,E,9,26.7,A,7,12.8,A,7,42,A,7,984,A,7,270,A,7,3.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,15:00,923,1354,651,2,8,749,2,15,139,2,8,697,2,8,765,2,15,174,2,8,383,2,19,0,E,9,0,E,9,27.2,A,7,12.8,A,7,41,A,7,984,A,7,190,A,7,2.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,16:00,734,1354,478,2,8,636,2,15,132,2,8,501,2,8,632,2,15,157,2,8,291,2,19,0,E,9,0,E,9,27.2,A,7,12.8,A,7,41,A,7,984,A,7,250,A,7,2.6,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,17:00,496,1354,291,2,8,534,2,15,94,2,8,300,2,8,495,2,15,118,2,8,179,2,19,0,E,9,0,E,9,26.7,A,7,12.8,A,7,42,A,7,985,A,7,270,A,7,3.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,18:00,227,1354,99,2,8,280,2,15,52,2,8,104,2,8,193,2,15,71,2,8,94,2,19,0,E,9,0,E,9,25.0,A,7,13.9,A,7,50,A,7,985,A,7,230,A,7,2.1,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,19:00,15,463,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,2,E,9,2,A,7,22.2,A,7,15.6,A,7,66,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,15.6,A,7,73,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,15.6,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,16.1,A,7,90,A,7,988,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.2,A,7,15.6,A,7,90,A,7,988,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/19/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.7,A,7,15.0,A,7,90,A,7,988,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.1,A,7,15.0,A,7,93,A,7,987,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,15.0,A,7,14.4,A,7,96,A,7,988,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,15.6,A,7,14.4,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,15.0,A,7,13.9,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,14.4,A,7,13.9,A,7,97,A,7,988,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,14.4,A,7,13.3,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,07:00,103,1186,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,15.6,A,7,13.9,A,7,90,A,7,989,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/20/2003,08:00,375,1355,217,2,8,429,2,15,98,2,8,225,2,8,368,2,15,123,2,8,184,2,19,0,E,9,0,E,9,18.9,A,7,15.6,A,7,81,A,7,990,A,7,40,A,7,1.5,A,7,12800,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/20/2003,09:00,629,1355,412,2,8,620,2,15,123,2,8,427,2,8,601,2,15,147,2,8,249,2,19,0,E,9,0,E,9,21.7,A,7,16.7,A,7,73,A,7,990,A,7,20,B,8,1.5,A,7,14400,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,10:00,842,1355,582,2,8,719,2,15,134,2,8,618,2,8,728,2,15,164,2,8,332,2,19,0,E,9,0,E,9,25.0,A,7,15.6,A,7,56,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,11:00,998,1355,707,2,8,738,2,15,162,2,8,755,2,8,754,2,15,198,2,8,496,2,19,0,E,9,0,E,9,26.7,A,7,15.0,A,7,49,A,7,990,A,7,160,A,7,3.1,A,7,16000,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,12:00,1087,1355,788,2,8,788,2,15,153,2,8,827,2,8,793,2,15,189,2,8,512,2,19,0,E,9,0,E,9,27.2,A,7,15.0,A,7,47,A,7,990,A,7,170,B,8,2.6,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,13:00,1104,1355,795,2,8,756,2,15,178,2,8,853,2,8,776,2,15,220,2,8,676,2,19,3,E,9,3,E,9,27.8,A,7,15.6,A,7,47,A,7,989,A,7,190,B,8,1.5,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,14:00,1046,1355,749,2,8,759,2,15,162,2,8,778,2,8,759,2,15,190,2,8,481,2,19,4,B,8,4,B,8,28.9,A,7,16.1,A,7,46,A,7,990,A,7,200,A,7,2.6,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,15:00,918,1355,645,2,8,743,2,15,140,2,8,689,2,8,758,2,15,174,2,8,382,2,19,4,E,9,4,E,9,28.3,A,7,15.6,A,7,46,A,7,988,A,7,120,A,7,2.6,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,16:00,728,1355,467,2,8,630,2,15,127,2,8,490,2,8,626,2,15,152,2,8,280,2,19,4,E,9,4,E,9,28.3,A,7,16.1,A,7,48,A,7,988,A,7,150,B,8,3.1,A,7,16000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,17:00,490,1355,285,2,8,505,2,15,102,2,8,304,2,8,473,2,15,132,2,8,192,2,19,4,E,9,4,E,9,27.2,A,7,16.7,A,7,53,A,7,988,A,7,170,A,7,2.6,A,7,16000,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,18:00,221,1355,86,2,8,201,2,15,54,2,8,90,2,8,136,2,15,68,2,8,98,2,19,0,E,9,0,E,9,25.6,A,7,17.2,A,7,60,A,7,989,A,7,150,A,7,2.1,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,19:00,12,418,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,5,E,9,5,A,7,24.4,A,7,17.2,A,7,64,A,7,989,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,B,8,3,B,8,21.7,A,7,18.9,A,7,84,A,7,990,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,20.0,A,7,18.3,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,20.6,A,7,17.8,A,7,84,A,7,990,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,19.4,A,7,17.8,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/20/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,18.9,A,7,17.2,A,7,90,A,7,990,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/21/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.3,A,7,17.2,A,7,93,A,7,990,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/21/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.8,A,7,16.7,A,7,93,A,7,990,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/21/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,17.8,A,7,16.7,A,7,93,A,7,990,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/21/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.8,A,7,16.7,A,7,93,A,7,991,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/21/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.2,A,7,16.1,A,7,93,A,7,991,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/21/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,16.7,A,7,16.1,A,7,96,A,7,992,A,7,0,A,7,0.0,A,7,4000,B,7,7620,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/21/2003,07:00,100,1186,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,7,E,9,7,A,7,17.2,A,7,16.7,A,7,97,A,7,991,A,7,0,A,7,0.0,A,7,3200,B,7,7620,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/21/2003,08:00,372,1356,170,2,8,165,2,15,124,2,8,182,2,8,145,2,15,143,2,8,274,2,19,9,E,9,9,A,7,19.4,A,7,17.8,A,7,90,A,7,992,A,7,0,A,7,0.0,A,7,3200,B,7,7620,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/21/2003,09:00,626,1356,398,2,8,496,2,15,168,2,8,416,2,8,490,2,15,189,2,8,346,2,19,10,E,9,10,A,7,22.2,A,7,18.9,A,7,82,A,7,993,A,7,20,B,8,1.5,A,7,8000,B,7,7620,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/21/2003,10:00,838,1356,569,2,8,664,2,15,157,2,8,597,2,8,667,2,15,183,2,8,379,2,19,10,E,9,10,A,7,24.4,A,7,17.2,A,7,64,A,7,992,A,7,40,A,7,2.6,A,7,12800,B,7,7620,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,11:00,994,1356,625,2,8,453,2,15,292,2,8,659,2,8,470,2,15,314,2,8,891,2,19,10,E,9,10,A,7,26.1,A,7,16.7,A,7,56,A,7,992,A,7,60,B,8,2.6,A,7,16000,B,7,7620,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,12:00,1083,1356,775,2,8,710,2,15,207,2,8,821,2,8,722,2,15,243,2,8,736,2,19,9,E,9,9,A,7,27.2,A,7,16.1,A,7,51,A,7,991,A,7,80,A,7,6.2,A,7,16000,B,7,7620,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,13:00,1099,1356,742,2,8,588,2,15,264,2,8,803,2,8,614,2,15,304,2,8,984,2,19,10,E,9,10,A,7,27.8,A,7,16.7,A,7,51,A,7,991,A,7,60,A,7,3.6,A,7,16000,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,14:00,1040,1356,574,2,8,287,2,15,353,2,8,621,2,8,310,2,15,382,2,8,1166,2,19,10,E,9,10,A,7,27.8,A,7,16.7,A,7,51,A,7,990,A,7,90,A,7,3.6,A,7,16000,B,7,7620,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,15:00,912,1356,468,2,8,238,2,15,307,2,8,511,2,8,251,2,15,342,2,8,898,2,19,10,E,9,10,A,7,26.7,A,7,16.7,A,7,54,A,7,990,A,7,90,A,7,4.6,A,7,14400,B,7,7620,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,16:00,722,1356,439,2,8,459,2,15,194,2,8,461,2,8,463,2,15,214,2,8,426,2,19,9,E,9,9,A,7,26.1,A,7,15.6,A,7,52,A,7,989,A,7,100,A,7,4.6,A,7,16000,B,7,7620,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,17:00,483,1356,238,2,8,264,2,15,144,2,8,252,2,8,253,2,15,162,2,8,298,2,19,10,E,9,10,A,7,26.1,A,7,16.7,A,7,56,A,7,990,A,7,110,A,7,3.6,A,7,14400,B,7,7620,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,18:00,214,1356,66,2,8,72,2,15,54,2,8,71,2,8,51,2,15,63,2,8,115,2,19,9,B,8,9,B,8,24.4,A,7,16.1,A,7,60,A,7,991,A,7,90,A,7,2.6,A,7,12800,B,7,7620,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,19:00,11,395,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,7,E,9,7,A,7,22.8,A,7,17.2,A,7,71,A,7,990,A,7,90,A,7,2.6,A,7,12800,B,7,1981,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,4,E,9,3,E,9,21.1,A,7,17.8,A,7,81,A,7,990,A,7,0,A,7,0.0,A,7,12800,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,5,E,9,21.7,A,7,17.8,A,7,79,A,7,990,A,7,60,A,7,2.1,A,7,11200,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,6,E,9,6,E,9,21.1,A,7,17.8,A,7,81,A,7,990,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/21/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,A,7,20.6,A,7,17.8,A,7,84,A,7,990,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/21/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,20.6,A,7,17.8,A,7,84,A,7,990,A,7,0,A,7,0.0,A,7,9600,B,7,1676,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/22/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,A,7,21.1,A,7,18.3,A,7,84,A,7,989,A,7,150,A,7,1.5,A,7,9600,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/22/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,5,E,9,19.4,A,7,18.3,A,7,93,A,7,989,A,7,140,A,7,2.1,A,7,8000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/22/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,4,E,9,20.0,A,7,18.3,A,7,90,A,7,988,A,7,140,A,7,3.1,A,7,8000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,6,E,9,19.4,A,7,17.8,A,7,90,A,7,989,A,7,170,A,7,2.6,A,7,9600,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,4,E,9,19.4,A,7,17.8,A,7,90,A,7,988,A,7,170,A,7,2.6,A,7,8000,B,7,77777,A,7,3.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,6,E,9,19.4,A,7,18.9,A,7,97,A,7,988,A,7,160,A,7,2.6,A,7,8000,B,7,77777,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,07:00,97,1165,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,20.0,A,7,19.4,A,7,96,A,7,988,A,7,140,A,7,3.1,A,7,2400,B,7,61,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,08:00,368,1357,122,2,8,40,2,15,111,2,8,133,2,8,36,2,15,124,2,8,283,2,19,10,E,9,10,E,9,20.6,A,7,20.0,A,7,96,A,7,988,A,7,160,A,7,5.2,A,7,9600,B,7,183,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,09:00,622,1357,76,2,8,0,2,15,76,2,8,92,2,8,0,2,15,92,2,8,354,2,19,10,B,8,9,B,8,21.7,A,7,19.4,A,7,87,A,7,988,A,7,160,A,7,6.2,A,7,12800,B,7,274,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,10:00,834,1357,272,2,8,43,2,15,245,2,8,299,2,8,43,2,15,272,2,8,817,2,19,10,E,9,9,E,9,22.2,A,7,18.9,A,7,82,A,7,988,A,7,140,A,7,6.2,A,7,16000,B,7,488,A,7,4.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/22/2003,11:00,990,1357,206,2,8,6,2,15,202,2,8,247,2,8,5,2,15,244,2,8,972,2,19,10,E,9,10,E,9,22.8,A,7,19.4,A,7,81,A,7,987,A,7,160,A,7,5.7,A,7,16000,B,7,579,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/22/2003,12:00,1079,1357,140,2,8,0,2,15,140,2,8,174,2,8,0,2,15,174,2,8,730,2,19,10,E,9,7,E,9,23.3,A,7,20.0,A,7,82,A,7,987,A,7,160,A,7,6.2,A,7,16000,B,7,732,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/22/2003,13:00,1094,1357,293,2,8,12,2,15,283,2,8,347,2,8,10,2,15,338,2,8,1311,2,19,9,E,9,8,E,9,24.4,A,7,19.4,A,7,74,A,7,985,A,7,160,A,7,6.2,A,7,16000,B,7,1097,A,7,4.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/22/2003,14:00,1035,1357,205,2,8,0,2,15,205,2,8,247,2,8,0,2,15,247,2,8,1000,2,19,9,E,9,6,E,9,24.4,A,7,20.6,A,7,79,A,7,984,A,7,150,A,7,5.7,A,7,16000,B,7,77777,A,7,4.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/22/2003,15:00,906,1357,137,2,8,0,2,15,137,2,8,167,2,8,0,2,15,167,2,8,679,2,19,10,E,9,9,E,9,25.0,A,7,20.6,A,7,77,A,7,984,A,7,160,A,7,5.7,A,7,16000,B,7,1402,A,7,4.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/22/2003,16:00,716,1357,164,2,8,0,2,15,164,2,8,191,2,8,0,2,15,191,2,8,710,2,19,9,E,9,5,E,9,24.4,A,7,20.6,A,7,79,A,7,983,A,7,160,A,7,4.1,A,7,16000,B,7,77777,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/22/2003,17:00,477,1357,91,2,8,0,2,15,91,2,8,106,2,8,0,2,15,106,2,8,373,2,19,9,E,9,7,E,9,23.3,A,7,21.7,A,7,91,A,7,982,A,7,150,A,7,3.1,A,7,16000,B,7,77777,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/22/2003,18:00,207,1357,31,2,8,0,2,15,31,2,8,36,2,8,0,2,15,36,2,8,118,2,19,10,B,8,8,B,8,22.8,A,7,21.7,A,7,94,A,7,982,A,7,130,A,7,3.6,A,7,12800,B,7,2438,A,7,5.0,E,8,0.000,F,8,0.00,F,8,66,1,D,9,61,C,8 -09/22/2003,19:00,9,350,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,A,7,22.8,A,7,22.2,A,7,96,A,7,982,A,7,160,A,7,7.2,A,7,2400,B,7,335,A,7,5.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.2,A,7,21.7,A,7,97,A,7,982,A,7,180,A,7,5.2,A,7,9600,B,7,305,A,7,5.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/22/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,22.2,A,7,21.7,A,7,97,A,7,982,A,7,180,A,7,5.2,A,7,6400,B,7,366,A,7,4.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/22/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,21.7,A,7,21.1,A,7,96,A,7,981,A,7,170,A,7,6.2,A,7,11200,B,7,1036,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,21.0,A,7,21.0,A,7,100,A,7,981,A,7,190,A,7,5.1,A,7,9700,B,7,900,A,7,4.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/22/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,21.0,A,7,21.0,A,7,100,A,7,980,A,7,170,A,7,5.1,A,7,4000,B,7,720,A,7,4.7,E,8,0.000,F,8,0.00,F,8,90,1,D,9,10,C,8 -09/23/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,21.1,A,7,20.6,A,7,97,A,7,977,A,7,220,A,7,4.1,A,7,2400,B,7,732,A,7,4.8,E,8,0.000,F,8,0.00,F,8,500,1,D,9,10,C,8 -09/23/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,19.0,A,7,18.0,A,7,94,A,7,979,A,7,290,A,7,4.6,A,7,14500,B,7,720,A,7,4.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/23/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,18.9,A,7,18.3,A,7,96,A,7,980,A,7,240,A,7,2.6,A,7,16000,B,7,1829,A,7,4.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/23/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,18.9,A,7,18.3,A,7,96,A,7,980,A,7,260,A,7,3.1,A,7,16000,B,7,1981,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.8,A,7,16.1,A,7,90,A,7,981,A,7,300,A,7,3.6,A,7,16000,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,16.7,A,7,16.1,A,7,96,A,7,981,A,7,280,A,7,2.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,07:00,94,1143,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,15.6,A,7,15.0,A,7,96,A,7,982,A,7,260,A,7,2.1,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,08:00,365,1357,212,2,8,431,2,15,96,2,8,220,2,8,366,2,15,121,2,8,180,2,19,0,B,8,0,B,8,18.3,A,7,15.0,A,7,81,A,7,983,A,7,290,A,7,3.1,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,09:00,618,1357,399,2,8,596,2,15,127,2,8,412,2,8,574,2,15,150,2,8,252,2,19,0,E,9,0,E,9,20.6,A,7,15.0,A,7,70,A,7,983,A,7,300,A,7,3.1,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,10:00,830,1357,569,2,8,695,2,15,143,2,8,601,2,8,700,2,15,171,2,8,346,2,19,0,E,9,0,E,9,22.2,A,7,13.3,A,7,57,A,7,984,A,7,300,A,7,4.6,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,11:00,986,1357,701,2,8,756,2,15,150,2,8,751,2,8,774,2,15,187,2,8,452,2,19,0,E,9,0,E,9,22.8,A,7,12.8,A,7,53,A,7,983,A,7,290,A,7,4.1,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,12:00,1074,1357,763,2,8,740,2,15,176,2,8,817,2,8,758,2,15,215,2,8,621,2,19,3,E,9,3,E,9,23.9,A,7,12.8,A,7,50,A,7,983,A,7,280,A,7,6.7,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,13:00,1089,1357,771,2,8,708,2,15,202,2,8,819,2,8,721,2,15,238,2,8,729,2,19,4,E,9,4,E,9,24.4,A,7,12.8,A,7,48,A,7,983,A,7,270,A,7,4.1,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,14:00,1030,1357,737,2,8,765,2,15,156,2,8,767,2,8,766,2,15,185,2,8,450,2,19,0,E,9,0,E,9,25.0,A,7,10.0,A,7,39,A,7,982,A,7,300,A,7,4.6,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,15:00,900,1357,621,2,8,743,2,15,127,2,8,648,2,8,742,2,15,154,2,8,309,2,19,3,E,9,3,E,9,25.6,A,7,10.0,A,7,37,A,7,982,A,7,300,A,7,4.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,16:00,709,1357,460,2,8,635,2,15,127,2,8,481,2,8,628,2,15,152,2,8,274,2,19,3,E,9,3,E,9,25.6,A,7,10.6,A,7,39,A,7,982,A,7,300,A,7,4.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,17:00,470,1357,272,2,8,526,2,15,89,2,8,280,2,8,481,2,15,113,2,8,168,2,19,3,E,9,3,E,9,24.4,A,7,10.6,A,7,42,A,7,983,A,7,290,A,7,3.1,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,18:00,200,1357,83,2,8,273,2,15,42,2,8,87,2,8,176,2,15,61,2,8,75,2,19,3,E,9,3,E,9,22.8,A,7,11.7,A,7,50,A,7,983,A,7,290,A,7,1.5,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,19:00,7,328,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,A,7,20.0,A,7,15.0,A,7,73,A,7,983,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,14.4,A,7,78,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.2,A,7,13.9,A,7,81,A,7,985,A,7,310,A,7,2.1,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,18.3,A,7,11.7,A,7,65,A,7,985,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.7,A,7,12.2,A,7,75,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/23/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.7,A,7,12.8,A,7,78,A,7,986,A,7,340,A,7,2.1,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.1,A,7,12.2,A,7,78,A,7,986,A,7,340,A,7,2.1,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,15.0,A,7,12.2,A,7,83,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,14.4,A,7,11.7,A,7,84,A,7,987,A,7,20,A,7,1.5,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.9,A,7,11.7,A,7,87,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,12.8,A,7,11.1,A,7,89,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.3,A,7,11.1,A,7,87,A,7,988,A,7,10,A,7,2.1,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,07:00,91,1121,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,13.9,A,7,11.7,A,7,87,A,7,988,A,7,20,A,7,2.6,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,08:00,361,1358,204,2,8,398,2,15,98,2,8,210,2,8,336,2,15,121,2,8,184,2,19,0,E,9,0,E,9,16.1,A,7,12.2,A,7,78,A,7,989,A,7,40,A,7,3.1,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,09:00,615,1358,399,2,8,603,2,15,126,2,8,413,2,8,580,2,15,149,2,8,250,2,19,0,E,9,0,E,9,18.9,A,7,12.8,A,7,68,A,7,989,A,7,50,A,7,4.1,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,10:00,826,1358,563,2,8,695,2,15,139,2,8,595,2,8,701,2,15,168,2,8,336,2,19,0,E,9,0,E,9,21.1,A,7,11.1,A,7,53,A,7,989,A,7,40,A,7,5.2,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,11:00,982,1358,688,2,8,726,2,15,162,2,8,733,2,8,741,2,15,196,2,8,480,2,19,0,E,9,0,E,9,22.2,A,7,11.1,A,7,49,A,7,989,A,7,80,A,7,3.6,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,12:00,1070,1358,745,2,8,686,2,15,203,2,8,788,2,8,698,2,15,237,2,8,699,2,19,0,E,9,0,E,9,23.3,A,7,11.7,A,7,48,A,7,989,A,7,80,B,8,2.6,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,13:00,1084,1358,771,2,8,726,2,15,190,2,8,821,2,8,742,2,15,228,2,8,680,2,19,0,E,9,0,E,9,23.3,A,7,11.1,A,7,46,A,7,988,A,7,70,A,7,2.6,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,14:00,1024,1358,731,2,8,759,2,15,157,2,8,759,2,8,759,2,15,185,2,8,446,2,19,0,E,9,0,E,9,23.9,A,7,11.7,A,7,46,A,7,988,A,7,110,B,8,1.5,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,15:00,894,1358,615,2,8,737,2,15,129,2,8,660,2,8,752,2,15,163,2,8,343,2,19,0,E,9,0,E,9,24.4,A,7,11.1,A,7,43,A,7,987,A,7,150,B,8,1.5,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,16:00,703,1358,454,2,8,629,2,15,127,2,8,474,2,8,621,2,15,152,2,8,273,2,19,0,E,9,0,E,9,23.9,A,7,11.7,A,7,46,A,7,988,A,7,190,A,7,2.1,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,17:00,463,1358,266,2,8,520,2,15,88,2,8,274,2,8,474,2,15,112,2,8,166,2,19,0,E,9,0,E,9,23.9,A,7,12.2,A,7,48,A,7,987,A,7,180,B,8,1.5,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,18:00,193,1358,78,2,8,256,2,15,41,2,8,82,2,8,162,2,15,59,2,8,73,2,19,0,E,9,0,E,9,22.2,A,7,12.8,A,7,55,A,7,987,A,7,170,A,7,1.5,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,19:00,6,283,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,A,7,20.6,A,7,13.9,A,7,65,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,15.0,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,15.0,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,3,E,9,3,E,9,17.2,A,7,14.4,A,7,84,A,7,987,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.7,A,7,14.4,A,7,86,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/24/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.7,A,7,14.4,A,7,86,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,16.7,A,7,13.9,A,7,84,A,7,986,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.1,A,7,14.4,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,15.0,A,7,13.9,A,7,93,A,7,986,A,7,210,A,7,1.5,A,7,12800,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,14.4,A,7,13.3,A,7,93,A,7,986,A,7,220,A,7,1.5,A,7,12800,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,14.4,A,7,13.3,A,7,93,A,7,986,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,14.4,A,7,12.8,A,7,90,A,7,986,A,7,0,A,7,0.0,A,7,11200,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,07:00,88,1099,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,15.0,A,7,12.8,A,7,87,A,7,986,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/25/2003,08:00,357,1359,205,2,8,406,2,15,98,2,8,211,2,8,341,2,15,121,2,8,184,2,19,0,E,9,0,E,9,17.8,A,7,15.6,A,7,87,A,7,986,A,7,230,A,7,3.1,A,7,9600,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/25/2003,09:00,611,1359,393,2,8,590,2,15,127,2,8,405,2,8,567,2,15,150,2,8,251,2,19,0,E,9,0,E,9,20.6,A,7,15.0,A,7,70,A,7,987,A,7,200,A,7,3.1,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,10:00,823,1359,563,2,8,701,2,15,138,2,8,596,2,8,707,2,15,167,2,8,332,2,19,0,E,9,0,E,9,22.8,A,7,15.6,A,7,64,A,7,987,A,7,240,A,7,2.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,11:00,977,1359,682,2,8,714,2,15,167,2,8,724,2,8,727,2,15,200,2,8,489,2,19,0,E,9,0,E,9,24.4,A,7,15.6,A,7,58,A,7,986,A,7,240,A,7,4.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,12:00,1065,1359,751,2,8,722,2,15,183,2,8,800,2,8,738,2,15,220,2,8,629,2,19,0,E,9,0,E,9,25.0,A,7,15.6,A,7,56,A,7,986,A,7,220,A,7,4.6,A,7,16000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,13:00,1079,1359,759,2,8,696,2,15,205,2,8,804,2,8,708,2,15,240,2,8,719,2,19,0,E,9,0,E,9,26.1,A,7,15.6,A,7,52,A,7,985,A,7,240,A,7,4.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,14:00,1019,1359,731,2,8,753,2,15,165,2,8,781,2,8,770,2,15,202,2,8,521,2,19,0,E,9,0,E,9,26.7,A,7,15.6,A,7,51,A,7,984,A,7,240,A,7,3.1,A,7,16000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,15:00,888,1359,609,2,8,677,2,15,165,2,8,640,2,8,683,2,15,193,2,8,422,2,19,0,E,9,0,E,9,26.7,A,7,15.6,A,7,51,A,7,984,A,7,230,A,7,3.1,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,16:00,697,1359,415,2,8,488,2,15,164,2,8,441,2,8,491,2,15,189,2,8,348,2,19,0,E,9,0,E,9,26.7,A,7,15.6,A,7,51,A,7,984,A,7,210,A,7,3.6,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,17:00,457,1359,251,2,8,422,2,15,108,2,8,263,2,8,387,2,15,133,2,8,204,2,19,0,E,9,0,E,9,25.6,A,7,15.6,A,7,54,A,7,984,A,7,230,A,7,2.1,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,18:00,186,1359,73,2,8,214,2,15,43,2,8,76,2,8,132,2,15,57,2,8,77,2,19,0,E,9,0,E,9,23.9,A,7,16.1,A,7,62,A,7,983,A,7,210,A,7,2.1,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,19:00,4,260,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,A,7,22.2,A,7,16.7,A,7,71,A,7,983,A,7,200,A,7,1.5,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,21.7,A,7,16.7,A,7,73,A,7,984,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,17.2,A,7,81,A,7,984,A,7,0,A,7,0.0,A,7,14400,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,19.4,A,7,16.7,A,7,84,A,7,984,A,7,0,A,7,0.0,A,7,12800,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.3,A,7,16.1,A,7,87,A,7,984,A,7,200,A,7,2.1,A,7,12800,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/25/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.3,A,7,16.1,A,7,87,A,7,984,A,7,190,A,7,2.1,A,7,11200,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.2,A,7,16.1,A,7,93,A,7,984,A,7,210,A,7,2.1,A,7,9600,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.8,A,7,16.1,A,7,90,A,7,984,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/26/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.2,A,7,16.1,A,7,93,A,7,984,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/26/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.7,A,7,15.6,A,7,93,A,7,983,A,7,0,A,7,0.0,A,7,9600,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/26/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.1,A,7,15.0,A,7,93,A,7,984,A,7,220,A,7,1.5,A,7,8000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/26/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.1,A,7,15.0,A,7,93,A,7,984,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/26/2003,07:00,85,1099,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,16.7,A,7,15.0,A,7,90,A,7,984,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/26/2003,08:00,354,1360,198,2,8,380,2,15,99,2,8,204,2,8,318,2,15,121,2,8,186,2,19,0,E,9,0,E,9,18.9,A,7,16.7,A,7,87,A,7,984,A,7,200,A,7,1.5,A,7,6400,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/26/2003,09:00,607,1360,386,2,8,572,2,15,130,2,8,397,2,8,548,2,15,152,2,8,254,2,19,0,E,9,0,E,9,22.2,A,7,17.8,A,7,76,A,7,985,A,7,210,A,7,1.5,A,7,12800,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,10:00,819,1360,551,2,8,671,2,15,146,2,8,580,2,8,674,2,15,173,2,8,347,2,19,0,E,9,0,E,9,24.4,A,7,17.8,A,7,67,A,7,985,A,7,230,A,7,2.1,A,7,16000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,11:00,973,1360,682,2,8,647,2,15,218,2,8,711,2,8,650,2,15,244,2,8,612,2,19,0,E,9,0,E,9,25.6,A,7,16.7,A,7,58,A,7,984,A,7,190,A,7,2.6,A,7,16000,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,12:00,1060,1360,531,2,8,235,2,15,348,2,8,577,2,8,254,2,15,379,2,8,1177,2,19,8,E,9,8,E,9,25.6,A,7,16.7,A,7,58,A,7,984,A,7,200,A,7,3.1,A,7,16000,B,7,1219,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,13:00,1074,1360,394,2,8,42,2,15,361,2,8,435,2,8,43,2,15,401,2,8,1420,2,19,8,E,9,8,E,9,27.2,A,7,16.7,A,7,53,A,7,984,A,7,190,A,7,4.6,A,7,16000,B,7,1311,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,14:00,1013,1360,327,2,8,42,2,15,296,2,8,361,2,8,43,2,15,329,2,8,1126,2,19,4,E,9,4,E,9,26.7,A,7,16.1,A,7,52,A,7,983,A,7,140,A,7,2.6,A,7,16000,B,7,7620,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,15:00,882,1360,574,2,8,540,2,15,223,2,8,612,2,8,557,2,15,249,2,8,568,2,19,4,E,9,4,E,9,26.7,A,7,15.0,A,7,49,A,7,983,A,7,160,A,7,3.1,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,16:00,690,1360,327,2,8,194,2,15,229,2,8,356,2,8,199,2,15,255,2,8,574,2,19,3,E,9,3,E,9,26.1,A,7,14.4,A,7,48,A,7,982,A,7,170,A,7,3.1,A,7,16000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,17:00,450,1360,255,2,8,445,2,15,107,2,8,267,2,8,406,2,15,133,2,8,202,2,19,3,E,9,3,E,9,25.6,A,7,15.6,A,7,54,A,7,982,A,7,160,A,7,3.6,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,18:00,180,1360,68,2,8,217,2,15,39,2,8,71,2,8,131,2,15,54,2,8,69,2,19,0,E,9,0,E,9,23.3,A,7,16.1,A,7,64,A,7,982,A,7,140,A,7,3.6,A,7,16000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,19:00,3,215,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,A,7,21.7,A,7,16.7,A,7,73,A,7,982,A,7,160,A,7,2.6,A,7,14400,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,17.2,A,7,81,A,7,982,A,7,140,A,7,2.1,A,7,12800,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.6,A,7,17.2,A,7,81,A,7,983,A,7,130,A,7,2.6,A,7,11200,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,20.0,A,7,16.7,A,7,81,A,7,982,A,7,140,A,7,2.6,A,7,12800,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.9,A,7,16.7,A,7,87,A,7,982,A,7,150,A,7,3.1,A,7,11200,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/26/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,18.9,A,7,16.7,A,7,87,A,7,982,A,7,180,A,7,2.6,A,7,11200,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,17.8,A,7,16.7,A,7,93,A,7,982,A,7,200,A,7,2.1,A,7,9600,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.2,A,7,16.1,A,7,93,A,7,982,A,7,200,A,7,1.5,A,7,8000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -09/27/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,17.2,A,7,16.1,A,7,93,A,7,982,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/27/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,16.7,A,7,16.1,A,7,96,A,7,982,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/27/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,15.0,A,7,14.4,A,7,96,A,7,982,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/27/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,B,8,0,B,8,16.1,A,7,15.6,A,7,97,A,7,982,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/27/2003,07:00,83,1077,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,E,9,15.6,A,7,15.0,A,7,96,A,7,981,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/27/2003,08:00,350,1361,199,2,8,394,2,15,97,2,8,204,2,8,328,2,15,120,2,8,182,2,19,0,E,9,0,E,9,18.9,A,7,17.2,A,7,90,A,7,982,A,7,210,A,7,1.5,A,7,9600,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/27/2003,09:00,603,1361,387,2,8,585,2,15,127,2,8,399,2,8,560,2,15,150,2,8,249,2,19,0,E,9,0,E,9,21.7,A,7,17.8,A,7,79,A,7,982,A,7,250,A,7,2.6,A,7,16000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,10:00,814,1361,557,2,8,695,2,15,140,2,8,588,2,8,699,2,15,168,2,8,333,2,19,0,E,9,0,E,9,23.3,A,7,17.2,A,7,69,A,7,982,A,7,220,A,7,3.6,A,7,16000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,11:00,969,1361,682,2,8,738,2,15,155,2,8,728,2,8,753,2,15,190,2,8,450,2,19,3,E,9,3,E,9,25.0,A,7,16.7,A,7,60,A,7,982,A,7,210,A,7,2.6,A,7,16000,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,12:00,1056,1361,745,2,8,728,2,15,178,2,8,794,2,8,744,2,15,215,2,8,600,2,19,3,E,9,3,E,9,25.6,A,7,17.2,A,7,60,A,7,981,A,7,180,B,8,2.1,A,7,16000,B,7,77777,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,13:00,1069,1361,759,2,8,678,2,15,225,2,8,797,2,8,686,2,15,257,2,8,761,2,19,4,E,9,4,E,9,26.1,A,7,17.2,A,7,58,A,7,980,A,7,140,A,7,3.6,A,7,16000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,14:00,1008,1361,608,2,8,376,2,15,328,2,8,658,2,8,406,2,15,356,2,8,1019,2,19,4,E,9,4,E,9,27.2,A,7,17.2,A,7,54,A,7,978,A,7,160,A,7,5.2,A,7,16000,B,7,77777,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,15:00,876,1361,602,2,8,683,2,15,161,2,8,634,2,8,689,2,15,189,2,8,405,2,19,8,E,9,7,E,9,27.2,A,7,16.1,A,7,51,A,7,977,A,7,190,A,7,5.7,A,7,16000,B,7,7620,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,16:00,684,1361,430,2,8,499,2,15,179,2,8,452,2,8,500,2,15,200,2,8,381,2,19,5,E,9,5,E,9,27.2,A,7,17.8,A,7,56,A,7,977,A,7,180,A,7,4.6,A,7,16000,B,7,7620,A,7,3.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,17:00,443,1361,115,2,8,28,2,15,105,2,8,125,2,8,26,2,15,117,2,8,293,2,19,8,E,9,8,E,9,26.1,A,7,17.8,A,7,60,A,7,978,A,7,170,A,7,5.7,A,7,16000,B,7,1676,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,18:00,173,1361,56,2,8,118,2,15,41,2,8,59,2,8,67,2,15,51,2,8,75,2,19,8,E,9,8,E,9,24.4,A,7,17.8,A,7,67,A,7,978,A,7,170,A,7,3.1,A,7,16000,B,7,1829,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,19:00,2,193,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,9,E,9,7,A,7,22.8,A,7,18.3,A,7,76,A,7,979,A,7,310,A,7,6.7,A,7,16000,B,7,1524,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,18.3,A,7,16.7,A,7,90,A,7,980,A,7,0,A,7,0.0,A,7,4800,B,7,1250,A,7,3.7,E,8,0.000,F,8,0.00,F,8,36,1,D,9,00,C,8 -09/27/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.8,A,7,17.8,A,7,100,A,7,980,A,7,180,A,7,3.6,A,7,11200,B,7,1006,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/27/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,7,E,9,17.8,A,7,17.8,A,7,100,A,7,979,A,7,230,A,7,2.6,A,7,16000,B,7,3658,A,7,3.9,E,8,0.000,F,8,0.00,F,8,19,1,D,9,61,C,8 -09/27/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,17.8,A,7,17.8,A,7,100,A,7,978,A,7,200,A,7,2.6,A,7,16000,B,7,4572,A,7,3.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -09/27/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,17.8,A,7,17.2,A,7,96,A,7,978,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,3.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,A,7,17.8,A,7,17.2,A,7,96,A,7,977,A,7,0,A,7,0.0,A,7,16000,B,7,2591,A,7,3.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.2,A,7,17.2,A,7,100,A,7,977,A,7,0,A,7,0.0,A,7,16000,B,7,1829,A,7,3.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,16.7,A,7,16.7,A,7,100,A,7,976,A,7,270,A,7,2.1,A,7,4000,B,7,61,A,7,3.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.2,A,7,16.7,A,7,97,A,7,976,A,7,0,A,7,0.0,A,7,9600,B,7,61,A,7,3.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/28/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.2,A,7,16.7,A,7,97,A,7,977,A,7,310,A,7,3.1,A,7,6400,B,7,61,A,7,3.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -09/28/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,17.0,A,7,17.0,A,7,100,A,7,977,A,7,300,A,7,2.1,A,7,16100,B,7,840,A,7,3.0,E,8,0.000,F,8,0.00,F,8,3,1,D,9,00,C,8 -09/28/2003,07:00,80,1055,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,10,E,9,10,E,9,17.2,A,7,16.1,A,7,93,A,7,977,A,7,340,A,7,2.6,A,7,14400,B,7,579,A,7,2.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,08:00,346,1361,83,2,8,0,2,15,83,2,8,94,2,8,0,2,15,94,2,8,302,2,19,10,E,9,10,E,9,16.7,A,7,15.0,A,7,90,A,7,978,A,7,330,A,7,3.6,A,7,16000,B,7,1402,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,09:00,599,1361,104,2,8,0,2,15,104,2,8,123,2,8,0,2,15,123,2,8,455,2,19,8,E,9,8,E,9,16.1,A,7,12.8,A,7,81,A,7,978,A,7,320,A,7,2.1,A,7,16000,B,7,1524,A,7,2.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,10:00,810,1361,460,2,8,311,2,15,275,2,8,492,2,8,330,2,15,295,2,8,696,2,19,10,E,9,10,E,9,19.4,A,7,11.1,A,7,59,A,7,978,A,7,320,A,7,3.6,A,7,16000,B,7,1524,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,11:00,964,1361,651,2,8,629,2,15,204,2,8,680,2,8,633,2,15,230,2,8,568,2,19,10,E,9,10,E,9,20.0,A,7,10.6,A,7,55,A,7,978,A,7,300,A,7,3.6,A,7,16000,B,7,1676,A,7,2.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,12:00,1051,1361,739,2,8,704,2,15,194,2,8,783,2,8,716,2,15,228,2,8,641,2,19,5,B,8,5,B,8,21.1,A,7,8.3,A,7,44,A,7,978,A,7,360,A,7,3.6,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,13:00,1064,1361,759,2,8,737,2,15,181,2,8,809,2,8,753,2,15,219,2,8,619,2,19,0,E,9,0,E,9,22.2,A,7,8.9,A,7,43,A,7,977,A,7,320,A,7,4.1,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,14:00,1002,1361,707,2,8,734,2,15,165,2,8,753,2,8,750,2,15,200,2,8,504,2,19,4,E,9,4,E,9,22.2,A,7,9.4,A,7,44,A,7,977,A,7,310,A,7,4.6,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,15:00,870,1361,596,2,8,617,2,15,201,2,8,617,2,8,614,2,15,223,2,8,484,2,19,0,E,9,0,E,9,21.7,A,7,8.3,A,7,42,A,7,977,A,7,250,A,7,3.6,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,16:00,677,1361,228,2,8,47,2,15,205,2,8,251,2,8,47,2,15,228,2,8,617,2,19,3,E,9,3,E,9,22.2,A,7,8.9,A,7,43,A,7,977,A,7,280,A,7,4.1,A,7,16000,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,17:00,437,1361,114,2,8,11,2,15,110,2,8,128,2,8,7,2,15,126,2,8,412,2,19,8,E,9,8,E,9,21.7,A,7,9.4,A,7,45,A,7,978,A,7,260,A,7,6.2,A,7,16000,B,7,1981,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,18:00,166,1361,61,2,8,107,2,15,48,2,8,64,2,8,59,2,15,57,2,8,91,2,19,0,E,9,0,E,9,18.3,A,7,7.8,A,7,50,A,7,978,A,7,290,A,7,4.1,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,19:00,2,147,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,A,7,16.7,A,7,7.2,A,7,53,A,7,979,A,7,290,A,7,4.6,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,15.0,A,7,7.8,A,7,62,A,7,980,A,7,290,A,7,3.1,A,7,16000,B,7,2743,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,8,E,9,8,E,9,15.0,A,7,8.3,A,7,64,A,7,981,A,7,300,A,7,3.1,A,7,16000,B,7,2896,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,E,9,14.4,A,7,6.7,A,7,60,A,7,983,A,7,310,A,7,4.1,A,7,16000,B,7,2743,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,10,E,9,10,A,7,12.8,A,7,5.6,A,7,62,A,7,983,A,7,300,A,7,2.6,A,7,16000,B,7,2743,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/28/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,11.1,A,7,5.0,A,7,66,A,7,983,A,7,290,A,7,2.1,A,7,16000,B,7,2743,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,7,E,9,7,A,7,10.6,A,7,5.6,A,7,71,A,7,983,A,7,270,A,7,2.1,A,7,16000,B,7,2591,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,10.0,A,7,4.4,A,7,68,A,7,983,A,7,290,A,7,4.1,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,8.9,A,7,4.4,A,7,73,A,7,983,A,7,280,A,7,3.1,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,9.4,A,7,4.4,A,7,71,A,7,984,A,7,300,A,7,3.6,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,7.2,A,7,4.4,A,7,82,A,7,984,A,7,280,A,7,2.1,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,7.2,A,7,4.4,A,7,82,A,7,985,A,7,260,A,7,2.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,07:00,77,1033,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,A,7,8.3,A,7,5.6,A,7,83,A,7,986,A,7,270,A,7,2.1,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,08:00,342,1362,192,2,8,382,2,15,96,2,8,197,2,8,315,2,15,118,2,8,180,2,19,0,E,9,0,E,9,11.1,A,7,5.6,A,7,69,A,7,987,A,7,290,A,7,3.6,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,09:00,595,1362,388,2,8,610,2,15,120,2,8,400,2,8,584,2,15,144,2,8,236,2,19,0,E,9,0,E,9,12.8,A,7,5.0,A,7,59,A,7,987,A,7,290,A,7,3.6,A,7,16000,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,10:00,806,1362,545,2,8,647,2,15,161,2,8,568,2,8,645,2,15,185,2,8,370,2,19,0,E,9,0,E,9,14.4,A,7,5.0,A,7,53,A,7,988,A,7,320,B,8,2.6,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,11:00,960,1362,676,2,8,738,2,15,155,2,8,721,2,8,753,2,15,189,2,8,443,2,19,0,E,9,0,E,9,16.1,A,7,5.6,A,7,50,A,7,988,A,7,340,A,7,4.1,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,12:00,1046,1362,733,2,8,716,2,15,181,2,8,779,2,8,731,2,15,217,2,8,595,2,19,3,E,9,3,E,9,16.7,A,7,5.0,A,7,46,A,7,988,A,7,350,A,7,3.6,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,13:00,1058,1362,735,2,8,606,2,15,263,2,8,791,2,8,632,2,15,298,2,8,887,2,19,8,E,9,8,E,9,17.2,A,7,3.9,A,7,41,A,7,988,A,7,320,A,7,3.6,A,7,16000,B,7,1676,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,14:00,996,1362,467,2,8,161,2,15,349,2,8,511,2,8,171,2,15,385,2,8,1108,2,19,0,E,9,0,E,9,17.8,A,7,4.4,A,7,41,A,7,987,A,7,310,A,7,4.6,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,15:00,864,1362,244,2,8,24,2,15,229,2,8,284,2,8,20,2,15,271,2,8,1003,2,19,4,E,9,4,E,9,18.3,A,7,4.4,A,7,40,A,7,987,A,7,320,A,7,3.1,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,16:00,671,1362,413,2,8,463,2,15,184,2,8,431,2,8,462,2,15,203,2,8,390,2,19,4,E,9,4,E,9,18.9,A,7,3.9,A,7,37,A,7,987,A,7,290,A,7,5.2,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,17:00,430,1362,242,2,8,505,2,15,82,2,8,249,2,8,450,2,15,107,2,8,152,2,19,0,E,9,0,E,9,17.8,A,7,3.3,A,7,38,A,7,988,A,7,310,A,7,4.6,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -09/29/2003,18:00,159,1362,57,2,8,206,2,15,33,2,8,60,2,8,116,2,15,47,2,8,58,2,19,0,E,9,0,E,9,15.6,A,7,5.6,A,7,51,A,7,988,A,7,350,A,7,1.5,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,19:00,1,125,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,A,7,13.9,A,7,5.6,A,7,57,A,7,989,A,7,350,A,7,1.5,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,12.8,A,7,6.1,A,7,64,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,9.4,A,7,7.8,A,7,90,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,10.6,A,7,7.2,A,7,79,A,7,992,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,8.9,A,7,7.2,A,7,89,A,7,992,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/29/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,10.0,A,7,6.7,A,7,80,A,7,992,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,01:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,A,7,9.4,A,7,6.1,A,7,80,A,7,992,A,7,350,A,7,2.1,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,02:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,8.3,A,7,6.1,A,7,86,A,7,993,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,03:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,8.3,A,7,5.6,A,7,83,A,7,992,A,7,350,A,7,2.6,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,04:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,7.8,A,7,5.6,A,7,86,A,7,993,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,05:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,7.2,A,7,5.6,A,7,90,A,7,993,A,7,330,A,7,1.5,A,7,16000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,06:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,2,E,9,7.8,A,7,5.6,A,7,86,A,7,993,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,07:00,74,1011,13,2,8,138,2,15,6,2,8,19,2,8,83,2,15,12,2,8,16,2,19,0,E,9,0,E,9,8.3,A,7,5.6,A,7,83,A,7,994,A,7,350,A,7,1.5,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,08:00,339,1363,193,2,8,390,2,15,96,2,8,198,2,8,320,2,15,118,2,8,180,2,19,0,E,9,0,E,9,11.1,A,7,7.2,A,7,77,A,7,994,A,7,340,A,7,1.5,A,7,16000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,09:00,591,1363,374,2,8,598,2,15,114,2,8,388,2,8,573,2,15,138,2,8,225,2,19,0,E,9,0,E,9,13.3,A,7,7.2,A,7,67,A,7,994,A,7,360,A,7,3.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,10:00,802,1363,545,2,8,683,2,15,142,2,8,573,2,8,685,2,15,169,2,8,331,2,19,0,E,9,0,E,9,15.6,A,7,5.6,A,7,51,A,7,995,A,7,360,A,7,3.6,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,11:00,955,1363,670,2,8,714,2,15,168,2,8,709,2,8,725,2,15,199,2,8,472,2,19,0,E,9,0,E,9,16.7,A,7,5.6,A,7,48,A,7,994,A,7,340,B,8,2.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,12:00,1041,1363,745,2,8,770,2,15,155,2,8,776,2,8,772,2,15,185,2,8,456,2,19,1,B,8,1,B,8,17.2,A,7,5.0,A,7,44,A,7,994,A,7,310,B,8,3.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,13:00,1053,1363,741,2,8,707,2,15,192,2,8,785,2,8,720,2,15,227,2,8,636,2,19,3,E,9,3,E,9,17.8,A,7,5.0,A,7,43,A,7,993,A,7,290,A,7,4.1,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,14:00,991,1363,701,2,8,746,2,15,157,2,8,749,2,8,763,2,15,193,2,8,471,2,19,3,E,9,3,E,9,18.3,A,7,4.4,A,7,40,A,7,993,A,7,310,B,8,1.5,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,15:00,858,1363,584,2,8,712,2,15,135,2,8,621,2,8,722,2,15,166,2,8,339,2,19,0,E,9,0,E,9,18.9,A,7,5.6,A,7,42,A,7,992,A,7,320,B,8,2.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,16:00,664,1363,418,2,8,616,2,15,117,2,8,437,2,8,604,2,15,142,2,8,245,2,19,0,E,9,0,E,9,18.9,A,7,4.4,A,7,38,A,7,992,A,7,340,B,8,2.1,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,17:00,423,1363,236,2,8,499,2,15,81,2,8,243,2,8,443,2,15,105,2,8,150,2,19,0,E,9,0,E,9,18.9,A,7,5.6,A,7,42,A,7,992,A,7,350,A,7,1.5,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,18:00,152,1363,55,2,8,204,2,15,33,2,8,59,2,8,112,2,15,46,2,8,59,2,19,0,E,9,0,E,9,17.8,A,7,4.4,A,7,41,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,19:00,1,102,0,2,8,0,2,15,0,2,8,0,2,8,0,2,15,0,2,8,0,2,19,0,E,9,0,A,7,14.4,A,7,8.3,A,7,67,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,20:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,13.3,A,7,8.9,A,7,75,A,7,992,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,21:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,E,9,0,E,9,12.2,A,7,8.9,A,7,80,A,7,992,A,7,0,A,7,0.0,A,7,16000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,22:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,2,E,9,2,E,9,12.8,A,7,9.9,A,7,89,A,7,992,A,7,0,A,7,0.5,A,7,16000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,23:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,9,E,9,9,A,7,13.3,A,7,11.0,A,7,83,A,7,992,A,7,0,A,7,1.0,A,7,16000,B,7,7620,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -09/30/2003,24:00,0,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,5,E,9,5,A,7,13.9,A,7,12.0,A,7,83,A,7,991,A,7,0,A,7,1.5,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -10/01/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,13.0,A,7,100,A,7,980,A,7,40,A,7,2.1,A,7,2400,B,7,90,A,7,2.7,E,8,0.000,?,0,0.00,?,0,10,1,D,9,45,C,8 -10/01/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,14.0,A,7,100,A,7,980,A,7,30,A,7,2.6,A,7,2400,B,7,90,A,7,2.7,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -10/01/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.5,A,7,15.1,A,7,100,A,7,979,A,7,40,A,7,3.1,A,7,2400,B,7,90,A,7,2.7,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -10/01/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,979,A,7,40,A,7,3.6,A,7,2400,B,7,150,A,7,2.8,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -10/01/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,980,A,7,40,A,7,3.6,A,7,2400,B,7,150,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,980,A,7,20,A,7,3.6,A,7,2400,B,7,150,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,07:00,70,989,16,1,13,0,1,9,16,1,13,19,1,13,0,1,9,19,1,13,58,1,21,10,A,7,10,A,7,15.6,A,7,15.6,A,7,100,A,7,980,A,7,20,A,7,4.1,A,7,3200,B,7,150,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,08:00,333,1365,60,1,13,1,1,9,60,1,13,69,1,13,0,1,9,69,1,13,233,1,21,10,A,7,10,A,7,15.6,A,7,15.6,A,7,100,A,7,981,A,7,20,A,7,3.1,A,7,3200,B,7,210,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,09:00,585,1365,197,1,9,1,1,9,196,1,13,219,1,9,1,1,9,219,1,13,710,1,18,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,981,A,7,20,A,7,4.1,A,7,3200,B,7,210,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,10:00,796,1365,286,1,9,1,1,9,286,1,13,323,1,9,1,1,9,323,1,13,1100,1,18,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,981,A,7,30,A,7,4.1,A,7,3200,B,7,210,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,11:00,948,1365,357,1,9,1,1,9,356,1,13,405,1,9,1,1,9,405,1,13,1416,1,18,10,A,7,10,A,7,16.7,A,7,16.7,A,7,100,A,7,981,A,7,40,A,7,4.1,A,7,4000,B,7,240,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,12:00,1033,1365,210,1,9,1,1,9,210,1,13,253,1,9,1,1,9,252,1,13,1017,1,18,10,A,7,10,A,7,17.2,A,7,17.2,A,7,100,A,7,981,A,7,30,A,7,4.1,A,7,4000,B,7,240,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,13:00,1045,1365,369,1,9,1,1,9,367,1,13,423,1,9,1,1,9,423,1,13,1533,1,18,10,A,7,10,A,7,17.8,A,7,17.2,A,7,97,A,7,980,A,7,20,A,7,4.1,A,7,6400,B,7,210,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,14:00,982,1365,207,1,9,1,1,9,206,1,13,247,1,9,1,1,9,246,1,13,982,1,18,10,A,7,10,A,7,18.3,A,7,17.2,A,7,93,A,7,980,A,7,20,A,7,3.6,A,7,9700,B,7,240,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,15:00,849,1365,290,1,9,0,1,9,290,1,13,330,1,9,0,1,9,330,1,13,1161,1,18,10,A,7,10,A,7,18.9,A,7,18.3,A,7,97,A,7,979,A,7,50,A,7,3.1,A,7,9700,B,7,150,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,16:00,654,1365,240,1,9,156,1,9,165,1,13,265,1,9,160,1,9,188,1,13,405,1,18,9,A,7,9,A,7,20.0,A,7,18.3,A,7,90,A,7,979,A,7,80,A,7,3.1,A,7,11300,B,7,1520,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/01/1980,17:00,413,1365,182,1,13,194,1,9,123,1,13,192,1,13,175,1,9,139,1,13,249,1,21,8,A,7,7,A,7,20.6,A,7,17.8,A,7,84,A,7,979,A,7,50,A,7,3.6,A,7,11300,B,7,460,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/01/1980,18:00,142,1365,46,1,13,67,1,9,39,1,13,50,1,13,38,1,9,46,1,13,81,1,21,8,A,7,7,A,7,18.9,A,7,17.8,A,7,93,A,7,980,A,7,50,A,7,2.1,A,7,11300,B,7,1520,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/01/1980,19:00,0,34,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,7,A,7,7,A,7,18.3,A,7,17.2,A,7,93,A,7,980,A,7,360,A,7,1.5,A,7,11300,B,7,1220,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/01/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,17.8,A,7,17.2,A,7,97,A,7,980,A,7,0,A,7,0.0,A,7,11300,B,7,1220,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/01/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,16.7,A,7,16.7,A,7,100,A,7,980,A,7,20,A,7,1.5,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/01/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,15.6,A,7,15.6,A,7,100,A,7,980,A,7,0,A,7,0.0,A,7,8000,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,15.0,A,7,100,A,7,979,A,7,130,A,7,1.5,A,7,4000,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/01/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,15.0,A,7,100,A,7,979,A,7,320,A,7,2.1,A,7,4000,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/02/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,16.1,A,7,16.1,A,7,100,A,7,980,A,7,310,A,7,2.6,A,7,4000,B,7,610,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -10/02/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,15.6,A,7,15.6,A,7,100,A,7,979,A,7,240,A,7,1.5,A,7,4000,B,7,610,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/02/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,14.4,A,7,14.4,A,7,100,A,7,979,A,7,220,A,7,1.5,A,7,400,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/02/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,14.4,A,7,14.4,A,7,100,A,7,979,A,7,210,A,7,2.1,A,7,400,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/02/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,13.9,A,7,13.9,A,7,100,A,7,979,A,7,210,A,7,1.5,A,7,200,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/02/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,14.4,A,7,14.4,A,7,100,A,7,979,A,7,220,A,7,1.5,A,7,200,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/02/1980,07:00,67,967,14,1,13,2,1,9,14,1,13,17,1,13,0,1,9,17,1,13,52,1,21,6,A,7,6,A,7,14.4,A,7,14.4,A,7,100,A,7,979,A,7,210,A,7,2.1,A,7,200,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/02/1980,08:00,329,1365,121,1,13,35,1,9,112,1,13,132,1,13,30,1,9,124,1,13,270,1,21,8,A,7,8,A,7,15.6,A,7,15.6,A,7,100,A,7,979,A,7,210,A,7,2.6,A,7,400,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/02/1980,09:00,581,1365,254,1,13,215,1,9,161,1,13,271,1,13,216,1,9,178,1,13,341,1,21,7,A,7,7,A,7,17.2,A,7,17.2,A,7,100,A,7,979,A,7,230,A,7,3.1,A,7,3200,B,7,60,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/02/1980,10:00,791,1365,438,1,13,345,1,9,236,1,13,470,1,13,365,1,9,258,1,13,573,1,21,5,A,7,5,A,7,18.9,A,7,18.3,A,7,97,A,7,979,A,7,250,A,7,3.6,A,7,8000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/02/1980,11:00,944,1365,574,1,13,461,1,9,253,1,13,608,1,13,477,1,9,277,1,13,701,1,21,3,A,7,3,A,7,20.6,A,7,18.3,A,7,87,A,7,979,A,7,220,A,7,4.1,A,7,11300,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,12:00,1028,1365,615,1,13,412,1,9,303,1,13,648,1,13,428,1,9,325,1,13,972,1,21,3,A,7,3,A,7,23.9,A,7,18.9,A,7,74,A,7,979,A,7,210,A,7,3.6,A,7,11300,B,7,77777,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,13:00,1039,1365,720,1,9,617,1,9,247,1,13,746,1,9,619,1,9,274,1,13,768,1,18,2,A,7,2,A,7,23.9,A,7,17.2,A,7,66,A,7,978,A,7,230,A,7,3.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/02/1980,14:00,976,1365,594,1,13,371,1,9,327,1,13,640,1,13,400,1,9,353,1,13,974,1,21,7,A,7,7,A,7,25.6,A,7,17.8,A,7,62,A,7,978,A,7,200,A,7,5.2,A,7,16100,B,7,760,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,15:00,842,1365,447,1,13,294,1,9,265,1,13,481,1,13,313,1,9,287,1,13,678,1,21,5,A,7,5,A,7,25.0,A,7,18.3,A,7,67,A,7,977,A,7,190,A,7,5.2,A,7,16100,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,16:00,648,1365,359,1,13,415,1,9,161,1,13,378,1,13,412,1,9,182,1,13,333,1,21,4,A,7,4,A,7,25.0,A,7,17.8,A,7,64,A,7,977,A,7,200,A,7,4.6,A,7,11300,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,17:00,406,1365,179,1,13,246,1,9,105,1,13,190,1,13,221,1,9,124,1,13,206,1,21,3,A,7,3,A,7,23.9,A,7,17.2,A,7,66,A,7,977,A,7,210,A,7,4.6,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,18:00,135,1365,43,1,13,48,1,9,38,1,13,46,1,13,26,1,9,44,1,13,79,1,21,0,A,7,0,A,7,21.7,A,7,17.8,A,7,79,A,7,977,A,7,180,A,7,3.1,A,7,16100,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/02/1980,19:00,0,11,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,0,A,7,0,A,7,21.1,A,7,17.8,A,7,81,A,7,977,A,7,190,A,7,2.6,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/02/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,19.4,A,7,17.8,A,7,90,A,7,978,A,7,190,A,7,3.6,A,7,16100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,18.9,A,7,17.8,A,7,93,A,7,978,A,7,190,A,7,2.1,A,7,16100,B,7,1830,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,16.1,A,7,84,A,7,979,A,7,350,A,7,4.6,A,7,16100,B,7,610,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,17.2,A,7,15.6,A,7,90,A,7,979,A,7,20,A,7,4.1,A,7,16100,B,7,760,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/02/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,16.1,A,7,14.4,A,7,90,A,7,979,A,7,20,A,7,3.6,A,7,16100,B,7,850,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,13.9,A,7,90,A,7,979,A,7,20,A,7,3.1,A,7,24100,B,7,910,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -10/03/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,12.2,A,7,81,A,7,979,A,7,20,A,7,3.6,A,7,24100,B,7,980,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,10.0,A,7,70,A,7,979,A,7,10,A,7,4.6,A,7,24100,B,7,980,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.0,A,7,9.4,A,7,70,A,7,979,A,7,20,A,7,4.1,A,7,24100,B,7,1070,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,8.9,A,7,70,A,7,979,A,7,20,A,7,3.1,A,7,24100,B,7,1370,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,8.9,A,7,72,A,7,980,A,7,360,A,7,3.1,A,7,24100,B,7,760,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,07:00,65,945,23,1,13,1,1,9,23,1,13,26,1,13,0,1,9,26,1,13,76,1,21,10,A,7,10,A,7,13.9,A,7,10.0,A,7,78,A,7,979,A,7,20,A,7,3.6,A,7,24100,B,7,550,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/03/1980,08:00,325,1366,67,1,13,3,1,9,66,1,13,76,1,13,1,1,9,76,1,13,248,1,21,10,A,7,10,A,7,13.9,A,7,10.0,A,7,78,A,7,979,A,7,20,A,7,3.6,A,7,24100,B,7,520,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,09:00,577,1366,154,1,9,2,1,9,153,1,13,175,1,9,1,1,9,174,1,13,600,1,18,10,A,7,10,A,7,13.9,A,7,10.0,A,7,78,A,7,980,A,7,10,A,7,4.1,A,7,16100,B,7,550,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,10:00,787,1366,212,1,9,8,1,9,207,1,13,245,1,9,7,1,9,241,1,13,884,1,18,10,A,7,10,A,7,15.0,A,7,11.1,A,7,78,A,7,979,A,7,40,A,7,5.2,A,7,16100,B,7,1370,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,11:00,939,1366,330,1,9,7,1,9,325,1,13,377,1,9,7,1,9,372,1,13,1332,1,18,10,A,7,10,A,7,14.4,A,7,12.2,A,7,87,A,7,978,A,7,60,A,7,3.1,A,7,16100,B,7,2130,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,12:00,1023,1366,305,1,9,4,1,9,302,1,13,355,1,9,4,1,9,353,1,13,1333,1,18,10,A,7,10,A,7,13.9,A,7,13.3,A,7,96,A,7,978,A,7,360,A,7,3.1,A,7,16100,B,7,2130,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,13:00,1034,1366,358,1,9,48,1,9,321,1,13,394,1,9,49,1,9,357,1,13,1225,1,18,10,A,7,8,A,7,15.6,A,7,13.3,A,7,87,A,7,977,A,7,50,A,7,3.1,A,7,16100,B,7,400,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/03/1980,14:00,970,1366,560,1,13,481,1,9,217,1,13,606,1,13,500,1,9,249,1,13,616,1,21,8,A,7,5,A,7,17.2,A,7,12.2,A,7,73,A,7,977,A,7,0,A,7,0.0,A,7,24100,B,7,1070,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,15:00,836,1366,494,1,13,563,1,9,147,1,13,519,1,13,567,1,9,171,1,13,355,1,21,8,A,7,6,A,7,17.8,A,7,12.2,A,7,70,A,7,976,A,7,120,A,7,2.6,A,7,24100,B,7,3660,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,16:00,641,1366,326,1,13,399,1,9,137,1,13,348,1,13,396,1,9,161,1,13,278,1,21,8,A,7,4,A,7,17.8,A,7,11.7,A,7,68,A,7,976,A,7,160,A,7,2.6,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,17:00,399,1366,204,1,13,356,1,9,99,1,13,212,1,13,312,1,9,121,1,13,185,1,21,3,A,7,3,A,7,17.2,A,7,12.2,A,7,73,A,7,976,A,7,180,A,7,3.1,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,18:00,129,1332,53,1,13,129,1,9,39,1,13,54,1,13,62,1,9,48,1,13,73,1,21,4,A,7,4,A,7,15.0,A,7,12.8,A,7,87,A,7,976,A,7,170,A,7,3.1,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,15.0,A,7,13.9,A,7,93,A,7,976,A,7,320,A,7,2.6,A,7,16100,B,7,1520,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,25,C,8 -10/03/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,12.2,A,7,87,A,7,977,A,7,310,A,7,2.1,A,7,16100,B,7,1220,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,10.6,A,7,78,A,7,978,A,7,320,A,7,2.1,A,7,16100,B,7,1400,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,11.7,A,7,90,A,7,978,A,7,340,A,7,2.1,A,7,16100,B,7,1400,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,12.8,A,7,11.7,A,7,93,A,7,978,A,7,0,A,7,0.0,A,7,16100,B,7,1520,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/03/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,12.2,A,7,11.1,A,7,93,A,7,978,A,7,320,A,7,2.1,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,11.7,A,7,11.1,A,7,96,A,7,978,A,7,330,A,7,2.6,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -10/04/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,10.0,A,7,96,A,7,979,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,10.0,A,7,100,A,7,979,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,979,A,7,0,A,7,0.0,A,7,24100,B,7,2130,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,9.4,A,7,9.4,A,7,100,A,7,979,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,8.9,A,7,8.3,A,7,96,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,2130,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,07:00,62,946,19,1,13,3,1,9,19,1,13,22,1,13,0,1,9,22,1,13,66,1,21,8,A,7,8,A,7,8.9,A,7,7.8,A,7,93,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,1830,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,08:00,321,1367,115,1,13,79,1,9,97,1,13,125,1,13,66,1,9,110,1,13,211,1,21,5,A,7,5,A,7,11.1,A,7,8.3,A,7,83,A,7,981,A,7,350,A,7,2.1,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,09:00,573,1367,340,1,13,436,1,9,155,1,13,352,1,13,422,1,9,175,1,13,311,1,21,5,A,7,5,A,7,12.2,A,7,6.1,A,7,67,A,7,982,A,7,350,A,7,3.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,10:00,782,1367,477,1,13,543,1,9,164,1,13,514,1,13,555,1,9,195,1,13,368,1,21,4,A,7,3,A,7,14.4,A,7,6.1,A,7,58,A,7,982,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,11:00,934,1367,535,1,9,442,1,9,231,1,13,571,1,9,458,1,9,257,1,13,626,1,18,7,A,7,2,A,7,15.0,A,7,8.3,A,7,65,A,7,982,A,7,340,A,7,5.2,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,12:00,1018,1367,496,1,13,156,1,9,379,1,13,540,1,13,165,1,9,416,1,13,1230,1,21,8,A,7,7,A,7,15.6,A,7,5.0,A,7,50,A,7,982,A,7,200,A,7,2.1,A,7,24100,B,7,1520,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,13:00,1029,1367,547,1,13,286,1,9,331,1,13,593,1,13,309,1,9,360,1,13,1052,1,21,7,A,7,5,A,7,16.1,A,7,5.0,A,7,48,A,7,982,A,7,280,A,7,5.7,A,7,24100,B,7,7620,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/04/1980,14:00,964,1367,567,1,13,377,1,9,300,1,13,614,1,13,406,1,9,327,1,13,869,1,21,7,A,7,5,A,7,17.2,A,7,6.1,A,7,48,A,7,981,A,7,250,A,7,3.6,A,7,24100,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,15:00,830,1367,521,1,13,456,1,9,242,1,13,544,1,13,467,1,9,259,1,13,587,1,21,8,A,7,3,A,7,17.2,A,7,5.6,A,7,46,A,7,981,A,7,260,A,7,4.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,16:00,635,1367,279,1,13,222,1,9,175,1,13,299,1,13,227,1,9,193,1,13,379,1,21,7,A,7,4,A,7,16.7,A,7,5.6,A,7,48,A,7,982,A,7,250,A,7,2.6,A,7,24100,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,17:00,392,1367,138,1,13,105,1,9,108,1,13,151,1,13,94,1,9,124,1,13,240,1,21,8,A,7,7,A,7,15.6,A,7,6.7,A,7,56,A,7,982,A,7,250,A,7,2.6,A,7,24100,B,7,2290,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,18:00,122,1310,19,1,13,5,1,9,19,1,13,23,1,13,0,1,9,23,1,13,71,1,21,9,A,7,9,A,7,15.6,A,7,7.2,A,7,58,A,7,983,A,7,260,A,7,2.1,A,7,24100,B,7,1830,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,10.0,A,7,75,A,7,983,A,7,0,A,7,0.0,A,7,24100,B,7,1830,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/04/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,11.7,A,7,87,A,7,984,A,7,50,A,7,2.1,A,7,24100,B,7,1830,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,11.1,A,7,87,A,7,985,A,7,20,A,7,2.1,A,7,24100,B,7,2440,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,11.1,A,7,90,A,7,985,A,7,30,A,7,2.1,A,7,24100,B,7,2440,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -10/04/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,10.6,A,7,90,A,7,986,A,7,20,A,7,2.1,A,7,24100,B,7,2440,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/04/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,10.0,A,7,86,A,7,986,A,7,360,A,7,2.6,A,7,24100,B,7,1250,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -10/05/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,10.0,A,7,86,A,7,986,A,7,30,A,7,2.1,A,7,24100,B,7,1250,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,21,C,8 -10/05/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,7.8,A,7,77,A,7,986,A,7,360,A,7,3.6,A,7,24100,B,7,1250,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,7.8,A,7,83,A,7,986,A,7,30,A,7,4.6,A,7,24100,B,7,3050,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,6.7,A,7,77,A,7,986,A,7,50,A,7,3.6,A,7,24100,B,7,2740,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,6.1,A,7,74,A,7,987,A,7,20,A,7,4.1,A,7,24100,B,7,3050,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,10.0,A,7,6.7,A,7,80,A,7,987,A,7,40,A,7,5.2,A,7,24100,B,7,3350,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,07:00,60,923,17,1,13,9,1,9,16,1,13,18,1,13,5,1,9,18,1,13,40,1,21,7,A,7,7,A,7,9.4,A,7,6.7,A,7,83,A,7,988,A,7,30,A,7,4.1,A,7,24100,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -10/05/1980,08:00,317,1368,79,1,13,4,1,9,78,1,13,89,1,13,2,1,9,88,1,13,277,1,21,10,A,7,10,A,7,10.0,A,7,6.7,A,7,80,A,7,988,A,7,40,A,7,5.7,A,7,24100,B,7,3350,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,09:00,569,1368,127,1,9,9,1,9,123,1,13,146,1,9,6,1,9,144,1,13,507,1,18,10,A,7,10,A,7,11.1,A,7,6.7,A,7,74,A,7,989,A,7,360,A,7,5.2,A,7,16100,B,7,3350,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,10:00,778,1368,174,1,9,12,1,9,168,1,13,205,1,9,9,1,9,200,1,13,750,1,18,10,A,7,10,A,7,11.1,A,7,6.1,A,7,72,A,7,989,A,7,60,A,7,5.2,A,7,16100,B,7,1250,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -10/05/1980,11:00,930,1368,247,1,9,7,1,9,242,1,13,288,1,9,6,1,9,284,1,13,1083,1,18,10,A,7,10,A,7,12.2,A,7,6.7,A,7,69,A,7,989,A,7,40,A,7,6.2,A,7,16100,B,7,1190,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,12:00,1013,1368,187,1,9,4,1,9,185,1,13,227,1,9,3,1,9,225,1,13,909,1,18,10,A,7,10,A,7,11.7,A,7,7.2,A,7,74,A,7,989,A,7,10,A,7,4.6,A,7,16100,B,7,1190,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -10/05/1980,13:00,1023,1368,182,1,9,1,1,9,181,1,13,220,1,9,1,1,9,220,1,13,896,1,18,10,A,7,10,A,7,10.6,A,7,7.2,A,7,80,A,7,989,A,7,30,A,7,5.2,A,7,11300,B,7,980,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,60,C,8 -10/05/1980,14:00,958,1368,166,1,9,6,1,9,161,1,13,200,1,9,4,1,9,197,1,13,793,1,18,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,990,A,7,10,A,7,6.7,A,7,11300,B,7,240,A,7,1.7,E,8,0.000,F,8,0.00,?,0,3,1,D,9,61,C,8 -10/05/1980,15:00,824,1368,169,1,9,2,1,9,167,1,13,199,1,9,2,1,9,198,1,13,767,1,18,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,989,A,7,30,A,7,5.2,A,7,11300,B,7,850,A,7,1.7,E,8,0.000,F,8,0.00,?,0,5,1,D,9,61,C,8 -10/05/1980,16:00,628,1368,200,1,9,0,1,9,200,1,13,225,1,9,0,1,9,225,1,13,752,1,18,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,989,A,7,30,A,7,5.2,A,7,11300,B,7,1680,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,17:00,386,1368,116,1,9,0,1,9,116,1,13,129,1,9,0,1,9,129,1,13,397,1,18,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,990,A,7,10,A,7,5.2,A,7,11300,B,7,760,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,18:00,116,1265,32,1,13,0,1,9,32,1,13,36,1,13,0,1,9,36,1,13,105,1,21,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,990,A,7,20,A,7,4.1,A,7,11300,B,7,180,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,991,A,7,10,A,7,5.2,A,7,16100,B,7,1220,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/05/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,991,A,7,10,A,7,4.1,A,7,16100,B,7,1220,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,991,A,7,10,A,7,4.1,A,7,16100,B,7,1220,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,992,A,7,30,A,7,4.1,A,7,16100,B,7,1220,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,992,A,7,30,A,7,5.2,A,7,16100,B,7,1220,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/05/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,8.9,A,7,8.3,A,7,96,A,7,992,A,7,30,A,7,3.6,A,7,16100,B,7,1070,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,8.9,A,7,8.9,A,7,100,A,7,992,A,7,10,A,7,3.6,A,7,16100,B,7,1370,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -10/06/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,8.3,A,7,7.8,A,7,96,A,7,992,A,7,20,A,7,3.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,7.2,A,7,7.2,A,7,100,A,7,991,A,7,10,A,7,3.6,A,7,16100,B,7,1680,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,7.8,A,7,7.8,A,7,100,A,7,992,A,7,10,A,7,3.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,7.2,A,7,7.2,A,7,100,A,7,992,A,7,20,A,7,2.6,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,7.2,A,7,7.2,A,7,100,A,7,993,A,7,360,A,7,3.6,A,7,6400,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/06/1980,07:00,57,901,12,1,13,5,1,9,11,1,13,13,1,13,3,1,9,12,1,13,29,1,21,10,A,7,9,A,7,7.8,A,7,7.2,A,7,96,A,7,994,A,7,360,A,7,3.1,A,7,8000,B,7,1310,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/06/1980,08:00,312,1369,147,1,13,286,1,9,81,1,13,151,1,13,227,1,9,99,1,13,150,1,21,4,A,7,4,A,7,9.4,A,7,8.3,A,7,93,A,7,994,A,7,10,A,7,5.2,A,7,9700,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/06/1980,09:00,564,1369,377,1,9,736,1,9,70,1,13,391,1,9,703,1,9,100,1,13,145,1,18,0,A,7,0,A,7,11.7,A,7,7.8,A,7,77,A,7,994,A,7,30,A,7,4.6,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,10:00,773,1369,553,1,9,816,1,9,89,1,13,585,1,9,813,1,9,124,1,13,207,1,18,0,A,7,0,A,7,12.8,A,7,5.0,A,7,59,A,7,995,A,7,30,A,7,5.7,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,11:00,925,1369,621,1,13,705,1,9,142,1,13,661,1,13,719,1,9,174,1,13,386,1,21,3,A,7,3,A,7,13.9,A,7,5.6,A,7,57,A,7,995,A,7,30,A,7,5.2,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,12:00,1008,1369,581,1,13,467,1,9,234,1,13,625,1,13,486,1,9,266,1,13,707,1,21,5,A,7,5,A,7,15.0,A,7,5.0,A,7,51,A,7,994,A,7,40,A,7,4.1,A,7,19300,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,13:00,1017,1369,660,1,13,550,1,9,249,1,13,708,1,13,573,1,9,281,1,13,768,1,21,5,A,7,5,A,7,15.0,A,7,5.6,A,7,54,A,7,993,A,7,20,A,7,3.6,A,7,19300,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -10/06/1980,14:00,952,1369,607,1,13,551,1,9,222,1,13,653,1,13,572,1,9,254,1,13,614,1,21,4,A,7,4,A,7,15.6,A,7,7.2,A,7,58,A,7,992,A,7,50,A,7,3.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,15:00,818,1369,550,1,13,688,1,9,136,1,13,579,1,13,693,1,9,164,1,13,324,1,21,3,A,7,3,A,7,16.1,A,7,4.4,A,7,46,A,7,992,A,7,360,A,7,3.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,16:00,622,1369,419,1,9,751,1,9,75,1,13,438,1,9,729,1,9,106,1,13,160,1,18,0,A,7,0,A,7,17.2,A,7,6.7,A,7,50,A,7,991,A,7,30,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,17:00,379,1369,222,1,9,601,1,9,53,1,13,226,1,9,525,1,9,80,1,13,102,1,18,0,A,7,0,A,7,16.1,A,7,5.6,A,7,50,A,7,991,A,7,10,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,18:00,110,1243,50,1,13,214,1,9,27,1,13,47,1,13,115,1,9,37,1,13,47,1,21,0,A,7,0,A,7,14.4,A,7,7.2,A,7,62,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,8.3,A,7,80,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/06/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,7.2,A,7,86,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,5.6,A,7,86,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,6.7,A,7,93,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,5.6,A,7,89,A,7,992,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/06/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,5.0,A,7,89,A,7,991,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,3.9,A,7,86,A,7,991,A,7,230,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/07/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,5.0,A,7,96,A,7,991,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,3.9,A,7,96,A,7,990,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,4.4,A,7,96,A,7,990,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,2.8,A,7,93,A,7,990,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,3.3,A,7,96,A,7,990,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,07:00,55,879,22,1,13,12,1,9,21,1,13,24,1,13,7,1,9,23,1,13,50,1,21,0,A,7,0,A,7,4.4,A,7,3.3,A,7,93,A,7,990,A,7,210,A,7,2.1,A,7,11300,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/07/1980,08:00,308,1369,138,1,13,275,1,9,75,1,13,143,1,13,218,1,9,93,1,13,138,1,21,0,A,7,0,A,7,8.9,A,7,6.1,A,7,83,A,7,990,A,7,250,A,7,1.5,A,7,11300,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,09:00,560,1369,331,1,9,504,1,9,123,1,13,351,1,9,487,1,9,151,1,13,240,1,18,0,A,7,0,A,7,12.8,A,7,7.8,A,7,72,A,7,991,A,7,310,A,7,1.5,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,10:00,769,1369,517,1,9,629,1,9,160,1,13,533,1,9,623,1,9,183,1,13,351,1,18,0,A,7,0,A,7,15.6,A,7,6.1,A,7,54,A,7,991,A,7,310,A,7,3.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,11:00,920,1369,657,1,9,698,1,9,185,1,13,686,1,9,702,1,9,212,1,13,482,1,18,0,A,7,0,A,7,17.2,A,7,3.9,A,7,41,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,12:00,1003,1369,734,1,9,728,1,9,197,1,13,770,1,9,737,1,9,228,1,13,584,1,18,0,A,7,0,A,7,18.3,A,7,2.8,A,7,36,A,7,990,A,7,360,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,13:00,1012,1369,747,1,9,739,1,9,198,1,13,785,1,9,748,1,9,230,1,13,597,1,18,0,A,7,0,A,7,20.0,A,7,0.0,A,7,26,A,7,989,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/07/1980,14:00,947,1369,682,1,9,709,1,9,189,1,13,713,1,9,715,1,9,218,1,13,512,1,18,0,A,7,0,A,7,21.1,A,7,3.9,A,7,32,A,7,987,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,15:00,811,1369,559,1,9,656,1,9,167,1,13,579,1,9,653,1,9,191,1,13,382,1,18,0,A,7,0,A,7,21.1,A,7,2.2,A,7,29,A,7,987,A,7,190,A,7,3.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,16:00,615,1369,381,1,9,547,1,9,133,1,13,405,1,9,539,1,9,162,1,13,266,1,18,0,A,7,0,A,7,21.1,A,7,3.9,A,7,32,A,7,986,A,7,180,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,17:00,372,1369,182,1,9,344,1,9,87,1,13,189,1,9,294,1,9,109,1,13,161,1,18,0,A,7,0,A,7,20.6,A,7,6.1,A,7,39,A,7,986,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,18:00,104,1221,38,1,13,44,1,9,33,1,13,40,1,13,23,1,9,38,1,13,69,1,21,0,A,7,0,A,7,17.2,A,7,5.6,A,7,46,A,7,986,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,7.2,A,7,64,A,7,986,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/07/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,7.8,A,7,72,A,7,987,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,7.8,A,7,80,A,7,987,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,7.8,A,7,77,A,7,987,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,7.8,A,7,77,A,7,987,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/07/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,7.2,A,7,77,A,7,986,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,7.2,A,7,86,A,7,986,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/08/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,7.2,A,7,77,A,7,985,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,6.7,A,7,86,A,7,985,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,8.9,A,7,6.7,A,7,86,A,7,985,A,7,210,A,7,2.6,A,7,24100,B,7,1830,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,10.0,A,7,5.6,A,7,74,A,7,985,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,8.9,A,7,7.2,A,7,89,A,7,985,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,07:00,52,856,33,1,13,152,1,9,17,1,13,28,1,13,70,1,9,23,1,13,31,1,21,0,A,7,0,A,7,8.9,A,7,7.8,A,7,93,A,7,985,A,7,220,A,7,2.1,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -10/08/1980,08:00,304,1370,174,1,13,606,1,9,38,1,13,179,1,13,500,1,9,68,1,13,78,1,21,0,A,7,0,A,7,11.7,A,7,9.4,A,7,86,A,7,985,A,7,230,A,7,2.6,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,09:00,556,1370,378,1,9,787,1,9,55,1,13,394,1,9,747,1,9,90,1,13,126,1,18,0,A,7,0,A,7,16.1,A,7,9.4,A,7,65,A,7,985,A,7,210,A,7,2.6,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,10:00,764,1370,557,1,9,867,1,9,70,1,13,581,1,9,853,1,9,104,1,13,168,1,18,0,A,7,0,A,7,18.9,A,7,9.4,A,7,54,A,7,985,A,7,240,A,7,3.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,11:00,915,1370,691,1,9,909,1,9,80,1,13,719,1,9,905,1,9,113,1,13,209,1,18,0,A,7,0,A,7,21.7,A,7,9.4,A,7,46,A,7,985,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,12:00,997,1370,762,1,9,925,1,9,85,1,13,792,1,9,924,1,9,117,1,13,241,1,18,0,A,7,0,A,7,23.9,A,7,11.7,A,7,46,A,7,984,A,7,230,A,7,4.6,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,13:00,1006,1370,772,1,9,930,1,9,85,1,13,802,1,9,930,1,9,117,1,13,244,1,18,0,A,7,0,A,7,24.4,A,7,11.1,A,7,43,A,7,983,A,7,230,A,7,4.1,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/08/1980,14:00,941,1370,667,1,9,862,1,9,72,1,13,697,1,9,860,1,9,104,1,13,204,1,18,1,A,7,1,A,7,25.0,A,7,12.2,A,7,45,A,7,983,A,7,230,A,7,5.2,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,15:00,805,1370,496,1,13,586,1,9,149,1,13,518,1,13,586,1,9,172,1,13,345,1,21,4,A,7,4,A,7,25.0,A,7,11.1,A,7,42,A,7,982,A,7,240,A,7,4.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,16:00,609,1370,387,1,13,617,1,9,111,1,13,402,1,13,595,1,9,136,1,13,223,1,21,3,A,7,3,A,7,23.9,A,7,10.6,A,7,43,A,7,982,A,7,230,A,7,3.6,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,17:00,366,1370,216,1,9,648,1,9,42,1,13,226,1,9,566,1,9,74,1,13,88,1,18,0,A,7,0,A,7,23.3,A,7,14.4,A,7,58,A,7,982,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,18:00,99,1176,52,1,13,265,1,9,22,1,13,46,1,13,140,1,9,34,1,13,40,1,21,0,A,7,0,A,7,20.6,A,7,12.8,A,7,61,A,7,982,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,13.3,A,7,75,A,7,982,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/08/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,12.8,A,7,75,A,7,982,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,12.2,A,7,81,A,7,982,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,12.2,A,7,84,A,7,982,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,11.7,A,7,87,A,7,982,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/08/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,11.1,A,7,90,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,10.0,A,7,86,A,7,982,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/09/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,10.6,A,7,93,A,7,982,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,10.6,A,7,93,A,7,982,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,11.1,A,7,96,A,7,981,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,11.1,A,7,96,A,7,982,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,10.6,A,7,96,A,7,982,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -10/09/1980,07:00,50,834,23,1,13,30,1,9,19,1,13,23,1,13,13,1,9,22,1,13,39,1,21,0,A,7,0,A,7,10.6,A,7,10.6,A,7,100,A,7,982,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -10/09/1980,08:00,300,1371,144,1,13,366,1,9,63,1,13,151,1,13,287,1,9,88,1,13,114,1,21,0,A,7,0,A,7,13.9,A,7,12.8,A,7,93,A,7,983,A,7,240,A,7,2.1,A,7,6400,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/09/1980,09:00,551,1371,339,1,9,592,1,9,99,1,13,351,1,9,561,1,9,125,1,13,194,1,18,0,A,7,0,A,7,18.9,A,7,13.9,A,7,73,A,7,983,A,7,230,A,7,2.1,A,7,9700,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/09/1980,10:00,759,1371,520,1,9,707,1,9,126,1,13,547,1,9,707,1,9,154,1,13,284,1,18,0,A,7,0,A,7,22.2,A,7,13.3,A,7,57,A,7,983,A,7,240,A,7,3.6,A,7,11300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,11:00,910,1371,653,1,9,762,1,9,144,1,13,693,1,9,775,1,9,177,1,13,382,1,18,0,A,7,0,A,7,24.4,A,7,14.4,A,7,54,A,7,983,A,7,270,A,7,2.6,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,12:00,992,1371,726,1,9,787,1,9,153,1,13,749,1,9,785,1,9,179,1,13,402,1,18,0,A,7,0,A,7,25.6,A,7,15.0,A,7,52,A,7,983,A,7,280,A,7,3.6,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,13:00,1001,1371,736,1,9,791,1,9,154,1,13,759,1,9,790,1,9,181,1,13,411,1,18,0,A,7,0,A,7,26.1,A,7,15.0,A,7,50,A,7,982,A,7,230,A,7,3.6,A,7,11300,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,14:00,935,1371,676,1,9,771,1,9,147,1,13,719,1,9,786,1,9,181,1,13,403,1,18,0,A,7,0,A,7,26.1,A,7,14.4,A,7,49,A,7,982,A,7,290,A,7,3.1,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,15:00,799,1371,556,1,9,724,1,9,131,1,13,585,1,9,728,1,9,160,1,13,306,1,18,0,A,7,0,A,7,26.1,A,7,13.3,A,7,45,A,7,981,A,7,250,A,7,3.6,A,7,11300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,16:00,602,1371,383,1,9,627,1,9,105,1,13,398,1,9,605,1,9,131,1,13,212,1,18,0,A,7,0,A,7,26.1,A,7,12.8,A,7,44,A,7,981,A,7,250,A,7,5.2,A,7,11300,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,17:00,359,1371,185,1,9,431,1,9,71,1,13,189,1,9,362,1,9,93,1,13,128,1,18,0,A,7,0,A,7,25.6,A,7,13.9,A,7,49,A,7,981,A,7,240,A,7,3.6,A,7,11300,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,18:00,93,1154,37,1,13,77,1,9,29,1,13,38,1,13,33,1,9,35,1,13,52,1,21,0,A,7,0,A,7,22.8,A,7,13.9,A,7,57,A,7,981,A,7,220,A,7,2.1,A,7,11300,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.0,A,7,15.0,A,7,73,A,7,982,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/09/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,18.9,A,7,15.6,A,7,81,A,7,982,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,15.6,A,7,90,A,7,983,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.1,A,7,15.0,A,7,93,A,7,983,A,7,230,A,7,2.1,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,14.4,A,7,97,A,7,983,A,7,210,A,7,2.1,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/09/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,13.9,A,7,90,A,7,983,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/10/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,13.9,A,7,96,A,7,983,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/10/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,12.8,A,7,96,A,7,983,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/10/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,13.3,A,7,96,A,7,983,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/10/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,13.3,A,7,12.8,A,7,96,A,7,983,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/10/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,12.8,A,7,12.2,A,7,96,A,7,984,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/10/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,12.2,A,7,12.2,A,7,100,A,7,984,A,7,0,A,7,0.0,A,7,1600,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,11,C,8 -10/10/1980,07:00,47,835,28,1,13,99,1,9,17,1,13,25,1,13,38,1,9,22,1,13,30,1,21,1,A,7,1,A,7,12.2,A,7,12.2,A,7,100,A,7,984,A,7,20,A,7,2.6,A,7,4000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,11,C,8 -10/10/1980,08:00,296,1372,64,1,13,2,1,9,63,1,13,72,1,13,1,1,9,72,1,13,231,1,21,10,A,7,10,A,7,15.0,A,7,15.0,A,7,100,A,7,985,A,7,30,A,7,3.1,A,7,4000,B,7,120,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/10/1980,09:00,547,1372,173,1,9,5,1,9,171,1,13,194,1,9,4,1,9,192,1,13,623,1,18,10,A,7,10,A,7,15.6,A,7,15.6,A,7,100,A,7,985,A,7,30,A,7,4.1,A,7,800,B,7,60,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/10/1980,10:00,755,1372,223,1,9,9,1,9,218,1,13,255,1,9,8,1,9,251,1,13,892,1,18,10,A,7,10,A,7,16.1,A,7,16.1,A,7,100,A,7,985,A,7,40,A,7,2.6,A,7,1600,B,7,120,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/10/1980,11:00,905,1372,252,1,9,12,1,9,244,1,13,293,1,9,10,1,9,286,1,13,1072,1,18,10,A,7,10,A,7,17.2,A,7,16.7,A,7,97,A,7,985,A,7,30,A,7,3.1,A,7,3200,B,7,150,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/10/1980,12:00,987,1372,270,1,9,5,1,9,267,1,13,316,1,9,4,1,9,313,1,13,1197,1,18,10,A,7,10,A,7,17.8,A,7,16.7,A,7,93,A,7,985,A,7,70,A,7,2.6,A,7,4000,B,7,270,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/10/1980,13:00,995,1372,747,1,9,894,1,9,95,1,13,774,1,9,892,1,9,124,1,13,252,1,18,0,A,7,0,A,7,20.0,A,7,17.2,A,7,84,A,7,984,A,7,80,A,7,1.5,A,7,4800,B,7,77777,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/10/1980,14:00,929,1372,686,1,9,875,1,9,90,1,13,711,1,9,871,1,9,120,1,13,223,1,18,0,A,7,0,A,7,22.2,A,7,17.8,A,7,76,A,7,983,A,7,220,A,7,1.5,A,7,4800,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/10/1980,15:00,793,1372,568,1,9,837,1,9,81,1,13,590,1,9,825,1,9,112,1,13,181,1,18,0,A,7,0,A,7,23.9,A,7,17.8,A,7,69,A,7,982,A,7,140,A,7,2.6,A,7,4800,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/10/1980,16:00,596,1372,387,1,9,671,1,9,93,1,13,405,1,9,650,1,9,122,1,13,190,1,18,2,A,7,2,A,7,23.9,A,7,18.3,A,7,71,A,7,982,A,7,100,A,7,2.6,A,7,6400,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/10/1980,17:00,353,1372,190,1,9,548,1,9,48,1,13,199,1,9,467,1,9,79,1,13,92,1,18,1,A,7,1,A,7,23.9,A,7,18.3,A,7,71,A,7,981,A,7,160,A,7,3.1,A,7,8000,B,7,77777,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/10/1980,18:00,88,1109,42,1,13,188,1,9,22,1,13,38,1,13,96,1,9,30,1,13,39,1,21,1,A,7,1,A,7,21.7,A,7,17.8,A,7,79,A,7,982,A,7,180,A,7,2.6,A,7,8000,B,7,77777,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/10/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,21.1,A,7,16.7,A,7,76,A,7,982,A,7,180,A,7,3.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -10/10/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,20.0,A,7,16.1,A,7,78,A,7,982,A,7,190,A,7,1.5,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/10/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,16.1,A,7,90,A,7,982,A,7,310,A,7,1.5,A,7,16100,B,7,77777,A,7,2.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/10/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,15.6,A,7,90,A,7,982,A,7,190,A,7,2.1,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/10/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.1,A,7,15.6,A,7,97,A,7,981,A,7,220,A,7,1.5,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/10/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,1,A,7,15.6,A,7,15.6,A,7,100,A,7,981,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,15.0,A,7,97,A,7,981,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -10/11/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,15.0,A,7,15.0,A,7,100,A,7,980,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,15.0,A,7,97,A,7,979,A,7,200,A,7,3.1,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,14.4,A,7,97,A,7,979,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,14.4,A,7,97,A,7,979,A,7,190,A,7,2.6,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,13.9,A,7,96,A,7,979,A,7,200,A,7,2.6,A,7,8000,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,05,C,8 -10/11/1980,07:00,45,812,24,1,13,59,1,9,18,1,13,23,1,13,19,1,9,22,1,13,31,1,21,0,A,7,0,A,7,14.4,A,7,13.9,A,7,96,A,7,979,A,7,200,A,7,2.6,A,7,6400,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/11/1980,08:00,292,1373,136,1,13,353,1,9,60,1,13,143,1,13,273,1,9,85,1,13,108,1,21,1,A,7,1,A,7,16.7,A,7,15.6,A,7,93,A,7,979,A,7,240,A,7,3.6,A,7,6400,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/11/1980,09:00,542,1373,332,1,9,637,1,9,78,1,13,349,1,9,608,1,9,108,1,13,158,1,18,2,A,7,2,A,7,18.9,A,7,16.7,A,7,87,A,7,979,A,7,220,A,7,3.1,A,7,8000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/11/1980,10:00,750,1373,503,1,9,741,1,9,95,1,13,525,1,9,733,1,9,124,1,13,210,1,18,1,A,7,1,A,7,22.2,A,7,16.7,A,7,71,A,7,978,A,7,250,A,7,4.1,A,7,8000,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/11/1980,11:00,900,1373,655,1,9,825,1,9,111,1,13,691,1,9,828,1,9,146,1,13,280,1,18,0,A,7,0,A,7,23.9,A,7,17.2,A,7,66,A,7,978,A,7,250,A,7,3.6,A,7,11300,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,12:00,981,1373,725,1,9,843,1,9,118,1,13,768,1,9,851,1,9,158,1,13,332,1,18,0,A,7,0,A,7,25.6,A,7,16.1,A,7,56,A,7,977,A,7,290,A,7,6.2,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,13:00,989,1373,655,1,13,672,1,9,167,1,13,694,1,13,685,1,9,199,1,13,491,1,21,3,A,7,3,A,7,26.1,A,7,16.1,A,7,54,A,7,976,A,7,260,A,7,4.1,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -10/11/1980,14:00,923,1373,595,1,13,565,1,9,212,1,13,638,1,13,585,1,9,243,1,13,559,1,21,3,A,7,3,A,7,26.1,A,7,15.0,A,7,50,A,7,975,A,7,230,A,7,5.2,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,15:00,786,1373,405,1,13,388,1,9,181,1,13,432,1,13,396,1,9,204,1,13,410,1,21,5,A,7,5,A,7,25.0,A,7,13.9,A,7,50,A,7,975,A,7,260,A,7,4.1,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,16:00,590,1373,365,1,13,542,1,9,130,1,13,387,1,13,529,1,9,159,1,13,257,1,21,3,A,7,3,A,7,25.6,A,7,13.3,A,7,47,A,7,975,A,7,290,A,7,6.2,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,17:00,346,1373,129,1,13,185,1,9,82,1,13,138,1,13,156,1,9,98,1,13,155,1,21,5,A,7,5,A,7,22.8,A,7,3.9,A,7,29,A,7,975,A,7,300,A,7,5.2,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,18:00,83,1087,31,1,13,62,1,9,24,1,13,31,1,13,25,1,9,29,1,13,42,1,21,5,A,7,5,A,7,20.0,A,7,2.2,A,7,31,A,7,976,A,7,310,A,7,3.6,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,18.3,A,7,0.6,A,7,30,A,7,976,A,7,310,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -10/11/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,18.3,A,7,0.0,A,7,29,A,7,977,A,7,320,A,7,5.7,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,17.8,A,7,-1.7,A,7,27,A,7,978,A,7,310,A,7,5.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,-0.6,A,7,35,A,7,978,A,7,330,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,1.1,A,7,45,A,7,979,A,7,310,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/11/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,1.1,A,7,42,A,7,979,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,2.2,A,7,53,A,7,979,A,7,250,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/12/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,2.8,A,7,59,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,3.3,A,7,66,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,3.3,A,7,64,A,7,980,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,3.3,A,7,66,A,7,981,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,3.3,A,7,77,A,7,982,A,7,310,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,07:00,43,790,20,1,13,13,1,9,19,1,13,22,1,13,7,1,9,21,1,13,45,1,21,0,A,7,0,A,7,8.3,A,7,3.9,A,7,74,A,7,982,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/12/1980,08:00,287,1373,128,1,13,283,1,9,68,1,13,133,1,13,217,1,9,87,1,13,124,1,21,0,A,7,0,A,7,12.2,A,7,3.9,A,7,57,A,7,983,A,7,340,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,09:00,538,1373,320,1,9,527,1,9,111,1,13,340,1,9,504,1,9,142,1,13,213,1,18,0,A,7,0,A,7,13.9,A,7,3.3,A,7,49,A,7,983,A,7,340,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,10:00,745,1373,483,1,9,584,1,9,164,1,13,516,1,9,593,1,9,194,1,13,357,1,18,2,A,7,2,A,7,15.0,A,7,3.3,A,7,46,A,7,984,A,7,360,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,11:00,895,1373,559,1,13,501,1,9,230,1,13,592,1,13,517,1,9,254,1,13,590,1,21,3,A,7,3,A,7,15.0,A,7,3.9,A,7,48,A,7,984,A,7,330,A,7,5.2,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,12:00,976,1373,670,1,9,662,1,9,197,1,13,701,1,9,668,1,9,225,1,13,554,1,18,2,A,7,2,A,7,16.1,A,7,3.3,A,7,43,A,7,984,A,7,310,A,7,4.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,13:00,983,1373,658,1,9,624,1,9,209,1,13,687,1,9,628,1,9,235,1,13,591,1,18,2,A,7,2,A,7,17.2,A,7,3.9,A,7,41,A,7,983,A,7,320,A,7,4.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/12/1980,14:00,917,1373,636,1,9,615,1,9,224,1,13,680,1,9,636,1,9,254,1,13,589,1,18,2,A,7,2,A,7,17.2,A,7,2.8,A,7,38,A,7,982,A,7,320,A,7,6.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,15:00,780,1373,507,1,9,629,1,9,148,1,13,529,1,9,626,1,9,172,1,13,333,1,18,1,A,7,1,A,7,17.8,A,7,2.8,A,7,37,A,7,982,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,16:00,583,1373,338,1,9,530,1,9,111,1,13,349,1,9,506,1,9,133,1,13,218,1,18,1,A,7,1,A,7,17.8,A,7,2.2,A,7,35,A,7,982,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,17:00,340,1373,163,1,13,345,1,9,77,1,13,171,1,13,284,1,9,100,1,13,141,1,21,0,A,7,0,A,7,16.7,A,7,1.7,A,7,37,A,7,983,A,7,340,A,7,4.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,18:00,78,1064,31,1,13,35,1,9,27,1,13,33,1,13,17,1,9,31,1,13,56,1,21,0,A,7,0,A,7,13.9,A,7,2.2,A,7,46,A,7,984,A,7,340,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/12/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,2.8,A,7,57,A,7,985,A,7,20,A,7,3.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/12/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,2.2,A,7,59,A,7,986,A,7,10,A,7,3.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,1.1,A,7,59,A,7,987,A,7,360,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,1.7,A,7,66,A,7,988,A,7,350,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,1.1,A,7,65,A,7,988,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/12/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,0.6,A,7,68,A,7,988,A,7,310,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,1.1,A,7,71,A,7,989,A,7,300,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/13/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,1.1,A,7,79,A,7,989,A,7,310,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,0.6,A,7,76,A,7,988,A,7,320,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,0.0,A,7,76,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,0.0,A,7,82,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-0.6,A,7,82,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,07:00,41,767,26,1,13,98,1,9,15,1,13,22,1,13,36,1,9,20,1,13,26,1,21,0,A,7,0,A,7,2.2,A,7,0.6,A,7,89,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/13/1980,08:00,283,1374,155,1,13,548,1,9,40,1,13,156,1,13,439,1,9,66,1,13,77,1,21,0,A,7,0,A,7,7.2,A,7,2.8,A,7,74,A,7,991,A,7,290,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,09:00,533,1374,357,1,9,757,1,9,60,1,13,374,1,9,719,1,9,94,1,13,128,1,18,0,A,7,0,A,7,10.0,A,7,1.1,A,7,54,A,7,991,A,7,310,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,10:00,740,1374,538,1,9,851,1,9,76,1,13,560,1,9,834,1,9,109,1,13,167,1,18,0,A,7,0,A,7,11.1,A,7,1.1,A,7,50,A,7,991,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,11:00,890,1374,677,1,9,904,1,9,87,1,13,701,1,9,898,1,9,118,1,13,208,1,18,0,A,7,0,A,7,13.3,A,7,0.6,A,7,42,A,7,991,A,7,340,A,7,6.7,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,12:00,970,1374,750,1,9,923,1,9,93,1,13,776,1,9,920,1,9,124,1,13,240,1,18,0,A,7,0,A,7,13.9,A,7,0.6,A,7,40,A,7,990,A,7,310,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,13:00,978,1374,752,1,9,919,1,9,93,1,13,778,1,9,917,1,9,124,1,13,242,1,18,0,A,7,0,A,7,15.6,A,7,1.7,A,7,39,A,7,989,A,7,300,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/13/1980,14:00,911,1374,695,1,9,909,1,9,89,1,13,721,1,9,904,1,9,120,1,13,216,1,18,0,A,7,0,A,7,16.1,A,7,0.6,A,7,35,A,7,988,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,15:00,774,1374,572,1,9,870,1,9,79,1,13,595,1,9,856,1,9,111,1,13,175,1,18,0,A,7,0,A,7,17.8,A,7,0.6,A,7,32,A,7,988,A,7,250,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,16:00,577,1374,396,1,9,787,1,9,64,1,13,418,1,9,757,1,9,99,1,13,139,1,18,0,A,7,0,A,7,17.8,A,7,0.0,A,7,30,A,7,988,A,7,300,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,17:00,333,1374,195,1,13,616,1,9,44,1,13,200,1,13,520,1,9,73,1,13,87,1,21,0,A,7,0,A,7,17.2,A,7,-0.6,A,7,30,A,7,988,A,7,300,A,7,5.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,18:00,74,1019,41,1,13,181,1,9,21,1,13,35,1,13,89,1,9,29,1,13,37,1,21,0,A,7,0,A,7,14.4,A,7,2.2,A,7,44,A,7,989,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,3.3,A,7,57,A,7,989,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/13/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,4.4,A,7,71,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,3.9,A,7,77,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,3.3,A,7,83,A,7,991,A,7,180,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,3.3,A,7,80,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/13/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,2.8,A,7,76,A,7,991,A,7,20,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,2.8,A,7,86,A,7,991,A,7,60,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/14/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,2.2,A,7,86,A,7,991,A,7,70,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,1.7,A,7,86,A,7,992,A,7,320,A,7,1.5,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,1.7,A,7,92,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,1.7,A,7,89,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,0.6,A,7,89,A,7,992,A,7,340,A,7,1.5,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,07:00,38,745,27,1,13,102,1,9,15,1,13,22,1,13,37,1,9,20,1,13,26,1,21,0,A,7,0,A,7,2.2,A,7,1.1,A,7,92,A,7,993,A,7,60,A,7,1.5,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/14/1980,08:00,279,1375,154,1,13,562,1,9,39,1,13,157,1,13,448,1,9,66,1,13,76,1,21,0,A,7,0,A,7,5.6,A,7,2.8,A,7,83,A,7,993,A,7,50,A,7,1.5,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,09:00,529,1375,355,1,9,766,1,9,58,1,13,374,1,9,727,1,9,93,1,13,125,1,18,0,A,7,0,A,7,9.4,A,7,3.3,A,7,66,A,7,993,A,7,60,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,10:00,736,1375,537,1,9,861,1,9,74,1,13,560,1,9,844,1,9,107,1,13,165,1,18,0,A,7,0,A,7,13.3,A,7,1.7,A,7,45,A,7,994,A,7,110,A,7,3.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,11:00,884,1375,671,1,9,906,1,9,84,1,13,697,1,9,900,1,9,116,1,13,204,1,18,0,A,7,0,A,7,14.4,A,7,2.2,A,7,44,A,7,993,A,7,170,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,12:00,965,1375,744,1,9,927,1,9,89,1,13,771,1,9,924,1,9,120,1,13,233,1,18,0,A,7,0,A,7,15.6,A,7,2.2,A,7,41,A,7,993,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,13:00,972,1375,748,1,9,926,1,9,90,1,13,776,1,9,924,1,9,121,1,13,237,1,18,0,A,7,0,A,7,17.8,A,7,3.3,A,7,38,A,7,992,A,7,300,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/14/1980,14:00,905,1375,687,1,9,909,1,9,85,1,13,713,1,9,904,1,9,117,1,13,210,1,18,0,A,7,0,A,7,17.8,A,7,3.3,A,7,38,A,7,991,A,7,170,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,15:00,768,1375,561,1,9,829,1,9,96,1,13,588,1,9,822,1,9,128,1,13,215,1,18,4,A,7,0,A,7,18.3,A,7,3.3,A,7,37,A,7,991,A,7,190,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,16:00,570,1375,389,1,9,769,1,9,67,1,13,407,1,9,737,1,9,100,1,13,142,1,18,2,A,7,0,A,7,18.3,A,7,3.3,A,7,37,A,7,990,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,17:00,327,1375,187,1,13,590,1,9,46,1,13,191,1,13,494,1,9,73,1,13,89,1,21,2,A,7,0,A,7,17.8,A,7,3.9,A,7,40,A,7,991,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,18:00,69,997,40,1,13,165,1,9,22,1,13,36,1,13,70,1,9,31,1,13,39,1,21,2,A,7,0,A,7,16.1,A,7,4.4,A,7,46,A,7,990,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,5.0,A,7,62,A,7,991,A,7,180,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -10/14/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,6.1,A,7,67,A,7,991,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,6.7,A,7,74,A,7,991,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,6.7,A,7,83,A,7,991,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,6.7,A,7,83,A,7,991,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/14/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,6.1,A,7,89,A,7,991,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,5.6,A,7,93,A,7,991,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/15/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,5.0,A,7,89,A,7,991,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,5.0,A,7,93,A,7,991,A,7,250,A,7,1.5,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,5.0,A,7,89,A,7,991,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,4.4,A,7,96,A,7,992,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,3.9,A,7,93,A,7,992,A,7,250,A,7,1.5,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,07:00,36,722,23,1,13,69,1,9,15,1,13,20,1,13,25,1,9,19,1,13,26,1,21,0,A,7,0,A,7,6.7,A,7,5.0,A,7,89,A,7,992,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/15/1980,08:00,274,1376,144,1,13,497,1,9,44,1,13,149,1,13,383,1,9,72,1,13,81,1,21,0,A,7,0,A,7,8.9,A,7,7.2,A,7,89,A,7,993,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,09:00,524,1376,341,1,9,713,1,9,67,1,13,353,1,9,671,1,9,96,1,13,136,1,18,0,A,7,0,A,7,12.8,A,7,8.9,A,7,77,A,7,993,A,7,250,A,7,2.6,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,10:00,731,1376,520,1,9,813,1,9,85,1,13,548,1,9,805,1,9,119,1,13,191,1,18,0,A,7,0,A,7,16.7,A,7,8.3,A,7,58,A,7,993,A,7,240,A,7,3.1,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,11:00,879,1376,651,1,9,837,1,9,113,1,13,683,1,9,837,1,9,146,1,13,274,1,18,3,A,7,0,A,7,18.9,A,7,7.2,A,7,47,A,7,993,A,7,230,A,7,3.6,A,7,16100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,12:00,960,1376,725,1,9,861,1,9,120,1,13,764,1,9,866,1,9,157,1,13,322,1,18,3,A,7,0,A,7,20.0,A,7,6.7,A,7,42,A,7,992,A,7,230,A,7,4.1,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,13:00,966,1376,731,1,9,864,1,9,121,1,13,771,1,9,870,1,9,159,1,13,328,1,18,3,A,7,0,A,7,21.1,A,7,6.1,A,7,38,A,7,992,A,7,230,A,7,4.6,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/15/1980,14:00,899,1376,668,1,9,843,1,9,115,1,13,702,1,9,845,1,9,149,1,13,285,1,18,3,A,7,0,A,7,21.7,A,7,6.7,A,7,38,A,7,991,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,15:00,761,1376,547,1,9,799,1,9,101,1,13,568,1,9,790,1,9,130,1,13,220,1,18,3,A,7,0,A,7,22.2,A,7,6.7,A,7,37,A,7,991,A,7,210,A,7,4.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,16:00,564,1376,373,1,9,717,1,9,76,1,13,384,1,9,682,1,9,103,1,13,152,1,18,2,A,7,0,A,7,21.7,A,7,8.3,A,7,43,A,7,991,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,17:00,320,1376,165,1,13,493,1,9,49,1,13,171,1,13,404,1,9,77,1,13,92,1,21,1,A,7,1,A,7,21.1,A,7,9.4,A,7,47,A,7,991,A,7,200,A,7,4.1,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,18:00,65,975,31,1,13,101,1,9,20,1,13,29,1,13,42,1,9,26,1,13,35,1,21,2,A,7,1,A,7,18.3,A,7,10.0,A,7,59,A,7,991,A,7,200,A,7,2.1,A,7,16100,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,10.6,A,7,67,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -10/15/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,10.6,A,7,78,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,11.1,A,7,90,A,7,992,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,10.0,A,7,90,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,9.4,A,7,93,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/15/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,8.3,A,7,93,A,7,993,A,7,220,A,7,2.6,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,8.3,A,7,96,A,7,993,A,7,220,A,7,1.5,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/16/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,8.9,A,7,96,A,7,993,A,7,220,A,7,2.1,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,7.2,A,7,96,A,7,993,A,7,220,A,7,2.6,A,7,16100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,8.3,A,7,96,A,7,993,A,7,210,A,7,2.6,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,10.0,A,7,100,A,7,993,A,7,250,A,7,2.1,A,7,11300,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,7.8,A,7,96,A,7,993,A,7,210,A,7,2.6,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,07:00,34,700,20,1,13,60,1,9,14,1,13,19,1,13,18,1,9,18,1,13,24,1,21,0,A,7,0,A,7,8.9,A,7,8.3,A,7,96,A,7,993,A,7,220,A,7,2.1,A,7,6400,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/16/1980,08:00,270,1377,140,1,13,483,1,9,43,1,13,143,1,13,370,1,9,70,1,13,80,1,21,0,A,7,0,A,7,12.2,A,7,11.7,A,7,96,A,7,993,A,7,200,A,7,2.6,A,7,6400,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/16/1980,09:00,519,1377,334,1,9,702,1,9,66,1,13,345,1,9,660,1,9,95,1,13,134,1,18,0,A,7,0,A,7,15.6,A,7,13.9,A,7,90,A,7,994,A,7,220,A,7,2.6,A,7,6400,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/16/1980,10:00,726,1377,504,1,9,790,1,9,84,1,13,531,1,9,782,1,9,117,1,13,189,1,18,0,A,7,0,A,7,18.9,A,7,15.6,A,7,81,A,7,994,A,7,230,A,7,5.2,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,11:00,874,1377,594,1,9,739,1,9,122,1,13,617,1,9,736,1,9,148,1,13,285,1,18,3,A,7,2,A,7,21.1,A,7,15.6,A,7,71,A,7,994,A,7,240,A,7,4.1,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,12:00,954,1377,538,1,13,481,1,9,202,1,13,583,1,13,500,1,9,235,1,13,552,1,21,5,A,7,4,A,7,21.7,A,7,13.3,A,7,59,A,7,994,A,7,290,A,7,5.2,A,7,11300,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,13:00,960,1377,600,1,13,600,1,9,178,1,13,630,1,13,607,1,9,205,1,13,493,1,21,4,A,7,3,A,7,22.2,A,7,12.8,A,7,55,A,7,993,A,7,250,A,7,2.6,A,7,16100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,14:00,893,1377,571,1,13,599,1,9,180,1,13,595,1,13,601,1,9,204,1,13,450,1,21,3,A,7,3,A,7,23.9,A,7,11.1,A,7,45,A,7,992,A,7,250,A,7,4.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,15:00,755,1377,417,1,13,390,1,9,202,1,13,438,1,13,395,1,9,220,1,13,452,1,21,5,A,7,5,A,7,22.8,A,7,12.8,A,7,53,A,7,992,A,7,240,A,7,3.1,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,16:00,558,1377,344,1,13,616,1,9,92,1,13,358,1,13,587,1,9,119,1,13,183,1,21,4,A,7,3,A,7,22.2,A,7,13.3,A,7,57,A,7,992,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,17:00,314,1377,157,1,13,407,1,9,63,1,13,159,1,13,326,1,9,85,1,13,113,1,21,2,A,7,2,A,7,21.7,A,7,13.3,A,7,59,A,7,992,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,18:00,61,929,31,1,13,100,1,9,20,1,13,28,1,13,41,1,9,26,1,13,35,1,21,1,A,7,1,A,7,19.4,A,7,13.3,A,7,68,A,7,992,A,7,190,A,7,2.6,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,17.8,A,7,13.3,A,7,75,A,7,992,A,7,180,A,7,2.6,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/16/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,16.7,A,7,13.3,A,7,81,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,15.0,A,7,13.3,A,7,90,A,7,993,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,13.9,A,7,13.3,A,7,96,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,12.8,A,7,96,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/16/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,12.2,A,7,96,A,7,992,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,11.1,A,7,96,A,7,992,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/17/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,12.2,A,7,11.7,A,7,96,A,7,992,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,13.3,A,7,12.8,A,7,96,A,7,992,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,12.8,A,7,12.2,A,7,96,A,7,991,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,12.8,A,7,12.8,A,7,100,A,7,991,A,7,230,A,7,1.5,A,7,24100,B,7,1680,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,13.3,A,7,13.3,A,7,100,A,7,991,A,7,230,A,7,1.5,A,7,16100,B,7,1830,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,07:00,32,677,19,1,13,14,1,9,18,1,13,21,1,13,7,1,9,20,1,13,43,1,21,9,A,7,7,A,7,13.3,A,7,13.3,A,7,100,A,7,992,A,7,160,A,7,2.1,A,7,11300,B,7,1680,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/17/1980,08:00,265,1377,111,1,13,158,1,9,80,1,13,116,1,13,116,1,9,93,1,13,157,1,21,6,A,7,6,A,7,15.0,A,7,14.4,A,7,97,A,7,992,A,7,190,A,7,2.1,A,7,11300,B,7,1520,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,09:00,515,1377,277,1,9,489,1,9,92,1,13,286,1,9,456,1,9,114,1,13,177,1,18,2,A,7,2,A,7,18.3,A,7,16.1,A,7,87,A,7,992,A,7,170,A,7,3.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,10:00,721,1377,439,1,13,560,1,9,144,1,13,454,1,13,551,1,9,165,1,13,305,1,21,3,A,7,3,A,7,21.1,A,7,16.1,A,7,73,A,7,992,A,7,200,A,7,3.6,A,7,11300,B,7,77777,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,11:00,869,1377,604,1,9,778,1,9,110,1,13,634,1,9,778,1,9,141,1,13,265,1,18,4,A,7,1,A,7,22.8,A,7,15.6,A,7,64,A,7,991,A,7,220,A,7,5.2,A,7,11300,B,7,77777,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,12:00,948,1377,599,1,13,606,1,9,179,1,13,629,1,13,613,1,9,205,1,13,486,1,21,6,A,7,3,A,7,23.3,A,7,14.4,A,7,58,A,7,991,A,7,180,A,7,5.7,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,13:00,955,1377,412,1,9,252,1,9,236,1,13,453,1,9,272,1,9,264,1,13,647,1,18,8,A,7,8,A,7,25.0,A,7,15.0,A,7,54,A,7,990,A,7,190,A,7,5.2,A,7,16100,B,7,1220,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -10/17/1980,14:00,887,1377,427,1,13,268,1,9,253,1,13,462,1,13,287,1,9,277,1,13,658,1,21,7,A,7,6,A,7,24.4,A,7,15.0,A,7,56,A,7,989,A,7,170,A,7,5.2,A,7,16100,B,7,1250,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,15:00,749,1377,476,1,13,473,1,9,217,1,13,495,1,13,478,1,9,234,1,13,487,1,21,8,A,7,7,A,7,23.9,A,7,14.4,A,7,56,A,7,989,A,7,190,A,7,2.6,A,7,16100,B,7,1310,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,16:00,552,1377,324,1,13,415,1,9,157,1,13,335,1,13,397,1,9,175,1,13,314,1,21,7,A,7,6,A,7,24.4,A,7,14.4,A,7,54,A,7,989,A,7,190,A,7,4.6,A,7,16100,B,7,7620,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,17:00,308,1377,160,1,13,436,1,9,61,1,13,162,1,13,347,1,9,84,1,13,109,1,21,9,A,7,1,A,7,23.9,A,7,13.9,A,7,54,A,7,988,A,7,180,A,7,5.2,A,7,16100,B,7,77777,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,18:00,57,907,29,1,13,88,1,9,20,1,13,27,1,13,35,1,9,25,1,13,35,1,21,4,A,7,3,A,7,21.1,A,7,15.0,A,7,68,A,7,988,A,7,180,A,7,4.1,A,7,16100,B,7,77777,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,19.4,A,7,15.0,A,7,76,A,7,988,A,7,170,A,7,3.6,A,7,24100,B,7,77777,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -10/17/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,18.9,A,7,15.6,A,7,81,A,7,988,A,7,170,A,7,3.1,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,17.8,A,7,15.6,A,7,87,A,7,988,A,7,160,A,7,3.1,A,7,24100,B,7,77777,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,18.3,A,7,16.7,A,7,90,A,7,989,A,7,190,A,7,4.1,A,7,24100,B,7,77777,A,7,2.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,18.3,A,7,17.2,A,7,93,A,7,988,A,7,190,A,7,5.2,A,7,24100,B,7,77777,A,7,3.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/17/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,18.3,A,7,17.8,A,7,97,A,7,988,A,7,180,A,7,4.1,A,7,16100,B,7,7620,A,7,3.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,18.3,A,7,18.3,A,7,100,A,7,987,A,7,190,A,7,4.6,A,7,16100,B,7,180,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -10/18/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,18.3,A,7,100,A,7,987,A,7,210,A,7,4.1,A,7,11300,B,7,150,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,18.3,A,7,100,A,7,986,A,7,200,A,7,3.6,A,7,11300,B,7,3050,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,18.3,A,7,100,A,7,985,A,7,210,A,7,3.1,A,7,11300,B,7,3050,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,18.3,A,7,100,A,7,986,A,7,220,A,7,4.1,A,7,8000,B,7,180,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/18/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,18.3,A,7,100,A,7,985,A,7,220,A,7,5.2,A,7,11300,B,7,180,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,07:00,30,678,10,1,13,0,1,9,10,1,13,12,1,13,0,1,9,12,1,13,37,1,21,10,A,7,10,A,7,17.8,A,7,17.8,A,7,100,A,7,985,A,7,210,A,7,2.6,A,7,11300,B,7,180,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/18/1980,08:00,261,1378,58,1,13,1,1,9,58,1,13,66,1,13,0,1,9,66,1,13,206,1,21,10,A,7,10,A,7,18.3,A,7,18.3,A,7,100,A,7,986,A,7,220,A,7,3.6,A,7,11300,B,7,240,A,7,3.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,09:00,510,1378,128,1,9,3,1,9,127,1,13,146,1,9,2,1,9,145,1,13,490,1,18,10,A,7,10,A,7,19.4,A,7,18.3,A,7,93,A,7,985,A,7,220,A,7,4.1,A,7,11300,B,7,270,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,10:00,716,1378,184,1,9,10,1,9,178,1,13,211,1,9,8,1,9,207,1,13,748,1,18,10,A,7,10,A,7,20.0,A,7,18.9,A,7,93,A,7,985,A,7,220,A,7,5.2,A,7,11300,B,7,270,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,11:00,863,1378,232,1,9,7,1,9,228,1,13,270,1,9,6,1,9,266,1,13,993,1,18,10,A,7,10,A,7,20.6,A,7,18.9,A,7,90,A,7,985,A,7,220,A,7,4.6,A,7,11300,B,7,1830,A,7,3.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,12:00,943,1378,265,1,9,4,1,9,262,1,13,308,1,9,4,1,9,305,1,13,1151,1,18,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,985,A,7,220,A,7,5.7,A,7,11300,B,7,340,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,13:00,949,1378,271,1,9,1,1,9,271,1,13,315,1,9,1,1,9,315,1,13,1182,1,18,10,A,7,10,A,7,22.2,A,7,19.4,A,7,84,A,7,983,A,7,210,A,7,6.2,A,7,11300,B,7,1520,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/18/1980,14:00,881,1378,304,1,9,0,1,9,304,1,13,346,1,9,0,1,9,346,1,13,1217,1,18,10,A,7,10,A,7,23.9,A,7,20.0,A,7,79,A,7,983,A,7,210,A,7,5.2,A,7,11300,B,7,550,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,15:00,743,1378,228,1,9,3,1,9,226,1,13,259,1,9,3,1,9,257,1,13,902,1,18,10,A,7,10,A,7,23.9,A,7,19.4,A,7,76,A,7,982,A,7,220,A,7,5.7,A,7,11300,B,7,610,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,16:00,545,1378,175,1,9,1,1,9,174,1,13,195,1,9,1,1,9,194,1,13,627,1,18,10,A,7,10,A,7,22.8,A,7,19.4,A,7,82,A,7,982,A,7,190,A,7,4.6,A,7,11300,B,7,610,A,7,3.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,17:00,302,1378,49,1,13,0,1,9,49,1,13,57,1,13,0,1,9,57,1,13,191,1,21,10,A,7,10,A,7,22.2,A,7,20.0,A,7,87,A,7,981,A,7,170,A,7,4.6,A,7,11300,B,7,5180,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -10/18/1980,18:00,53,884,21,1,13,0,1,9,21,1,13,24,1,13,0,1,9,24,1,13,69,1,21,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,981,A,7,190,A,7,3.1,A,7,8000,B,7,5180,A,7,3.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -10/18/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,19.4,A,7,90,A,7,981,A,7,190,A,7,4.6,A,7,16100,B,7,3350,A,7,3.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/18/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,981,A,7,180,A,7,5.2,A,7,11300,B,7,2590,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.0,A,7,97,A,7,981,A,7,190,A,7,4.6,A,7,11300,B,7,1250,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,20.0,A,7,93,A,7,981,A,7,190,A,7,4.6,A,7,11300,B,7,1130,A,7,3.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/18/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,21.1,A,7,20.6,A,7,97,A,7,980,A,7,210,A,7,5.2,A,7,11300,B,7,340,A,7,3.6,E,8,0.000,?,0,0.00,?,0,3,1,D,9,61,C,8 -10/18/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.6,A,7,100,A,7,979,A,7,220,A,7,5.7,A,7,11300,B,7,490,A,7,3.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -10/19/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,20.6,A,7,20.6,A,7,100,A,7,979,A,7,230,A,7,5.2,A,7,11300,B,7,310,A,7,3.6,E,8,0.000,?,0,0.00,?,0,61,1,D,9,61,C,8 -10/19/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.9,A,7,100,A,7,979,A,7,240,A,7,3.6,A,7,4800,B,7,490,A,7,3.3,E,8,0.000,?,0,0.00,?,0,25,1,D,9,45,C,8 -10/19/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.9,A,7,100,A,7,979,A,7,250,A,7,3.6,A,7,4800,B,7,150,A,7,3.3,E,8,0.000,?,0,0.00,?,0,20,1,D,9,45,C,8 -10/19/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.9,A,7,100,A,7,978,A,7,230,A,7,5.7,A,7,16100,B,7,460,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -10/19/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.9,A,7,100,A,7,978,A,7,220,A,7,2.6,A,7,16100,B,7,180,A,7,3.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.9,A,7,18.9,A,7,100,A,7,979,A,7,220,A,7,4.1,A,7,6400,B,7,180,A,7,3.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/19/1980,07:00,28,655,9,1,13,0,1,9,9,1,13,11,1,13,0,1,9,11,1,13,33,1,21,10,A,7,10,A,7,18.9,A,7,18.9,A,7,100,A,7,979,A,7,250,A,7,2.6,A,7,4000,B,7,180,A,7,3.3,E,8,0.000,F,8,0.00,?,0,13,1,D,9,45,C,8 -10/19/1980,08:00,257,1379,51,1,13,0,1,9,51,1,13,58,1,13,0,1,9,58,1,13,186,1,21,10,A,7,10,A,7,19.4,A,7,19.4,A,7,100,A,7,979,A,7,20,A,7,5.2,A,7,11300,B,7,180,A,7,3.3,E,8,0.000,F,8,0.00,?,0,3,1,D,9,61,C,8 -10/19/1980,09:00,505,1379,167,1,9,1,1,9,166,1,13,185,1,9,1,1,9,184,1,13,579,1,18,10,A,7,10,A,7,17.8,A,7,17.8,A,7,100,A,7,980,A,7,20,A,7,4.1,A,7,11300,B,7,2290,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,10:00,711,1379,260,1,9,1,1,9,260,1,13,291,1,9,1,1,9,291,1,13,951,1,18,10,A,7,10,A,7,17.8,A,7,17.8,A,7,100,A,7,980,A,7,30,A,7,2.6,A,7,11300,B,7,2290,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,11:00,858,1379,327,1,9,1,1,9,327,1,13,369,1,9,1,1,9,368,1,13,1245,1,18,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,980,A,7,30,A,7,2.6,A,7,16100,B,7,2440,A,7,3.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,12:00,937,1379,324,1,9,0,1,9,324,1,13,370,1,9,0,1,9,370,1,13,1320,1,18,10,A,7,10,A,7,18.9,A,7,17.2,A,7,90,A,7,980,A,7,0,A,7,0.0,A,7,16100,B,7,2440,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,13:00,943,1379,393,1,9,86,1,9,334,1,13,432,1,9,88,1,9,372,1,13,1142,1,18,9,A,7,9,A,7,18.9,A,7,16.7,A,7,87,A,7,979,A,7,140,A,7,2.1,A,7,16100,B,7,2440,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -10/19/1980,14:00,875,1379,411,1,13,281,1,9,232,1,13,448,1,13,301,1,9,257,1,13,589,1,21,7,A,7,6,A,7,21.1,A,7,17.8,A,7,81,A,7,978,A,7,230,A,7,1.5,A,7,16100,B,7,3050,A,7,3.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,15:00,737,1379,467,1,13,625,1,9,130,1,13,487,1,13,620,1,9,155,1,13,284,1,21,8,A,7,3,A,7,21.1,A,7,16.7,A,7,76,A,7,978,A,7,260,A,7,2.1,A,7,16100,B,7,77777,A,7,2.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,16:00,539,1379,267,1,13,327,1,9,138,1,13,286,1,13,322,1,9,160,1,13,282,1,21,8,A,7,6,A,7,21.1,A,7,16.1,A,7,73,A,7,977,A,7,230,A,7,2.6,A,7,16100,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,17:00,296,1379,101,1,13,51,1,9,90,1,13,110,1,13,43,1,9,101,1,13,220,1,21,9,A,7,8,A,7,20.6,A,7,15.6,A,7,73,A,7,977,A,7,210,A,7,3.1,A,7,16100,B,7,7620,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,18:00,49,862,25,1,13,35,1,9,21,1,13,25,1,13,15,1,9,25,1,13,43,1,21,8,A,7,6,A,7,18.9,A,7,16.1,A,7,84,A,7,977,A,7,210,A,7,2.6,A,7,16100,B,7,7620,A,7,2.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,6,A,7,17.8,A,7,15.6,A,7,87,A,7,978,A,7,270,A,7,2.6,A,7,24100,B,7,7620,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/19/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,4,A,7,16.1,A,7,15.0,A,7,93,A,7,978,A,7,250,A,7,2.6,A,7,24100,B,7,7620,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,16.1,A,7,10.6,A,7,70,A,7,979,A,7,300,A,7,5.7,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,14.4,A,7,7.8,A,7,65,A,7,979,A,7,310,A,7,3.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,12.2,A,7,10.0,A,7,86,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/19/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,11.1,A,7,8.9,A,7,86,A,7,980,A,7,30,A,7,2.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,8.3,A,7,83,A,7,980,A,7,60,A,7,1.5,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/20/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,7.8,A,7,83,A,7,980,A,7,80,A,7,2.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,7.2,A,7,77,A,7,980,A,7,350,A,7,6.2,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,7.2,A,7,83,A,7,980,A,7,330,A,7,3.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,6.7,A,7,86,A,7,981,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,6.1,A,7,89,A,7,982,A,7,340,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,07:00,26,632,16,1,13,21,1,9,13,1,13,16,1,13,8,1,9,15,1,13,27,1,21,3,A,7,0,A,7,9.4,A,7,4.4,A,7,71,A,7,983,A,7,330,A,7,4.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -10/20/1980,08:00,252,1380,120,1,13,380,1,9,49,1,13,121,1,13,279,1,9,70,1,13,87,1,21,0,A,7,0,A,7,10.6,A,7,5.0,A,7,69,A,7,984,A,7,30,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,09:00,501,1380,311,1,9,636,1,9,78,1,13,324,1,9,593,1,9,108,1,13,153,1,18,0,A,7,0,A,7,12.8,A,7,4.4,A,7,57,A,7,984,A,7,350,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,10:00,706,1380,486,1,9,747,1,9,101,1,13,514,1,9,744,1,9,133,1,13,222,1,18,0,A,7,0,A,7,13.3,A,7,4.4,A,7,55,A,7,985,A,7,10,A,7,5.2,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,11:00,853,1380,622,1,9,787,1,9,132,1,13,659,1,9,797,1,9,165,1,13,326,1,18,3,A,7,0,A,7,14.4,A,7,3.9,A,7,49,A,7,985,A,7,350,A,7,4.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,12:00,932,1380,689,1,9,806,1,9,141,1,13,710,1,9,802,1,9,167,1,13,338,1,18,3,A,7,0,A,7,15.0,A,7,3.9,A,7,48,A,7,984,A,7,20,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,13:00,937,1380,698,1,9,814,1,9,141,1,13,720,1,9,811,1,9,167,1,13,342,1,18,3,A,7,0,A,7,16.1,A,7,3.3,A,7,43,A,7,984,A,7,360,A,7,5.2,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/20/1980,14:00,869,1380,635,1,9,801,1,9,127,1,13,655,1,9,796,1,9,153,1,13,288,1,18,2,A,7,0,A,7,17.2,A,7,4.4,A,7,43,A,7,983,A,7,330,A,7,3.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,15:00,731,1380,484,1,9,697,1,9,112,1,13,510,1,9,695,1,9,141,1,13,249,1,18,3,A,7,1,A,7,17.2,A,7,3.9,A,7,41,A,7,983,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,16:00,533,1380,313,1,9,581,1,9,87,1,13,326,1,9,549,1,9,114,1,13,172,1,18,4,A,7,1,A,7,17.8,A,7,1.7,A,7,34,A,7,983,A,7,310,A,7,3.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,17:00,290,1380,135,1,13,314,1,9,68,1,13,140,1,13,241,1,9,89,1,13,124,1,21,8,A,7,1,A,7,16.7,A,7,3.3,A,7,41,A,7,983,A,7,300,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,18:00,46,816,23,1,13,31,1,9,19,1,13,23,1,13,13,1,9,22,1,13,39,1,21,7,A,7,1,A,7,14.4,A,7,3.9,A,7,49,A,7,983,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,1,A,7,11.1,A,7,7.2,A,7,77,A,7,984,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/20/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,9.4,A,7,7.2,A,7,86,A,7,985,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,10.0,A,7,7.2,A,7,83,A,7,985,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,8.9,A,7,5.6,A,7,80,A,7,985,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,8.3,A,7,5.6,A,7,83,A,7,986,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/20/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,7.8,A,7,5.6,A,7,86,A,7,986,A,7,250,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,8.9,A,7,5.0,A,7,77,A,7,986,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/21/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,6.7,A,7,5.0,A,7,89,A,7,986,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,6.1,A,7,5.0,A,7,93,A,7,986,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,5.6,A,7,4.4,A,7,93,A,7,986,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,5.6,A,7,4.4,A,7,93,A,7,987,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,5.6,A,7,4.4,A,7,93,A,7,987,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,07:00,24,610,16,1,13,53,1,9,10,1,13,14,1,13,17,1,9,13,1,13,17,1,21,2,A,7,1,A,7,5.6,A,7,4.4,A,7,93,A,7,987,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/21/1980,08:00,248,1381,122,1,13,392,1,9,50,1,13,123,1,13,285,1,9,71,1,13,88,1,21,3,A,7,1,A,7,8.9,A,7,6.1,A,7,83,A,7,988,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,09:00,496,1381,295,1,9,528,1,9,104,1,13,301,1,9,484,1,9,127,1,13,193,1,18,8,A,7,2,A,7,11.7,A,7,6.1,A,7,69,A,7,989,A,7,260,A,7,3.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,10:00,701,1381,349,1,9,414,1,9,138,1,13,377,1,9,417,1,9,165,1,13,287,1,18,8,A,7,2,A,7,15.6,A,7,6.1,A,7,54,A,7,988,A,7,290,A,7,3.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,11:00,847,1381,563,1,13,632,1,9,173,1,13,585,1,13,631,1,9,197,1,13,408,1,21,9,A,7,3,A,7,17.2,A,7,6.7,A,7,50,A,7,988,A,7,250,A,7,4.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,12:00,926,1381,610,1,13,667,1,9,160,1,13,644,1,13,676,1,9,189,1,13,425,1,21,7,A,7,3,A,7,18.3,A,7,7.2,A,7,49,A,7,988,A,7,230,A,7,5.2,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,13:00,931,1381,642,1,13,696,1,9,169,1,13,675,1,13,704,1,9,198,1,13,449,1,21,9,A,7,3,A,7,19.4,A,7,6.7,A,7,44,A,7,986,A,7,230,A,7,5.2,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -10/21/1980,14:00,863,1381,585,1,9,706,1,9,141,1,13,618,1,9,714,1,9,170,1,13,349,1,18,6,A,7,2,A,7,20.0,A,7,6.7,A,7,42,A,7,985,A,7,270,A,7,3.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,15:00,725,1381,470,1,9,702,1,9,99,1,13,500,1,9,703,1,9,130,1,13,222,1,18,3,A,7,2,A,7,20.0,A,7,6.7,A,7,42,A,7,985,A,7,230,A,7,5.2,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,16:00,527,1381,327,1,9,650,1,9,76,1,13,343,1,9,615,1,9,107,1,13,152,1,18,2,A,7,2,A,7,19.4,A,7,5.0,A,7,39,A,7,985,A,7,240,A,7,4.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,17:00,284,1381,143,1,13,465,1,9,46,1,13,147,1,13,362,1,9,72,1,13,85,1,21,2,A,7,1,A,7,17.8,A,7,6.1,A,7,47,A,7,985,A,7,230,A,7,3.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,18:00,43,794,25,1,13,81,1,9,16,1,13,22,1,13,30,1,9,20,1,13,28,1,21,2,A,7,2,A,7,16.1,A,7,5.6,A,7,50,A,7,985,A,7,190,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,5,A,7,15.0,A,7,6.1,A,7,56,A,7,986,A,7,200,A,7,2.1,A,7,24100,B,7,3660,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -10/21/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,3,A,7,13.3,A,7,7.8,A,7,69,A,7,986,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,11.7,A,7,7.2,A,7,74,A,7,987,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,11.1,A,7,7.2,A,7,77,A,7,987,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,7.2,A,7,80,A,7,987,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/21/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,11.1,A,7,7.2,A,7,77,A,7,987,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,10.0,A,7,7.2,A,7,83,A,7,987,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/22/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,1,A,7,9.4,A,7,7.2,A,7,86,A,7,987,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,7.8,A,7,6.7,A,7,93,A,7,987,A,7,200,A,7,1.5,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,7.2,A,7,6.1,A,7,93,A,7,987,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,7.2,A,7,6.1,A,7,93,A,7,988,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,6.7,A,7,6.1,A,7,96,A,7,988,A,7,250,A,7,1.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,07:00,23,587,14,1,13,13,1,9,13,1,13,15,1,13,6,1,9,15,1,13,32,1,21,9,A,7,4,A,7,6.7,A,7,6.1,A,7,96,A,7,988,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -10/22/1980,08:00,243,1381,94,1,13,140,1,9,69,1,13,98,1,13,98,1,9,81,1,13,133,1,21,9,A,7,4,A,7,8.3,A,7,8.3,A,7,100,A,7,989,A,7,40,A,7,2.1,A,7,11300,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,09:00,491,1381,164,1,13,125,1,9,119,1,13,180,1,13,120,1,9,137,1,13,273,1,21,9,A,7,6,A,7,12.2,A,7,10.0,A,7,86,A,7,990,A,7,0,A,7,0.0,A,7,11300,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,10:00,695,1381,259,1,13,126,1,9,195,1,13,284,1,13,130,1,9,218,1,13,487,1,21,9,A,7,6,A,7,17.2,A,7,10.0,A,7,63,A,7,990,A,7,0,A,7,0.0,A,7,16100,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,11:00,842,1381,550,1,13,564,1,9,204,1,13,585,1,13,579,1,9,231,1,13,488,1,21,9,A,7,6,A,7,19.4,A,7,7.8,A,7,47,A,7,990,A,7,340,A,7,2.1,A,7,24100,B,7,7620,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,12:00,921,1381,619,1,13,642,1,9,189,1,13,645,1,13,645,1,9,214,1,13,486,1,21,8,A,7,4,A,7,21.1,A,7,5.0,A,7,35,A,7,990,A,7,330,A,7,1.5,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,13:00,926,1381,536,1,13,420,1,9,253,1,13,566,1,13,434,1,9,274,1,13,675,1,21,8,A,7,4,A,7,21.1,A,7,5.0,A,7,35,A,7,990,A,7,80,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/22/1980,14:00,857,1381,618,1,9,856,1,9,83,1,13,642,1,9,848,1,9,114,1,13,195,1,18,1,A,7,1,A,7,21.1,A,7,5.0,A,7,35,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,15:00,719,1381,447,1,9,683,1,9,90,1,13,468,1,9,673,1,9,117,1,13,195,1,18,1,A,7,1,A,7,21.7,A,7,5.6,A,7,35,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,16:00,521,1381,343,1,9,742,1,9,60,1,13,358,1,9,700,1,9,93,1,13,127,1,18,0,A,7,0,A,7,21.7,A,7,6.7,A,7,38,A,7,989,A,7,130,A,7,2.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,17:00,278,1381,148,1,13,528,1,9,40,1,13,149,1,13,419,1,9,65,1,13,77,1,21,0,A,7,0,A,7,21.1,A,7,5.6,A,7,36,A,7,990,A,7,70,A,7,1.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,18:00,40,771,27,1,13,97,1,9,16,1,13,23,1,13,35,1,9,21,1,13,28,1,21,0,A,7,0,A,7,18.3,A,7,7.2,A,7,49,A,7,990,A,7,190,A,7,1.5,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,9.4,A,7,72,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/22/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.2,A,7,10.0,A,7,86,A,7,991,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,10.0,A,7,90,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,8.9,A,7,90,A,7,993,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,8.3,A,7,86,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/22/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,7.8,A,7,86,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,8.9,A,7,7.8,A,7,93,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/23/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,8.3,A,7,7.2,A,7,93,A,7,994,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,9.4,A,7,8.3,A,7,93,A,7,994,A,7,30,A,7,4.1,A,7,16100,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,9.4,A,7,8.9,A,7,96,A,7,995,A,7,20,A,7,4.6,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,9.4,A,7,8.3,A,7,93,A,7,995,A,7,30,A,7,5.7,A,7,11300,B,7,77777,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,7.8,A,7,89,A,7,996,A,7,20,A,7,6.2,A,7,11300,B,7,340,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,07:00,21,564,4,1,13,0,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,9.4,A,7,6.1,A,7,80,A,7,997,A,7,40,A,7,5.2,A,7,11300,B,7,370,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/23/1980,08:00,238,1382,45,1,13,2,1,9,45,1,13,52,1,13,0,1,9,52,1,13,165,1,21,10,A,7,10,A,7,10.0,A,7,6.1,A,7,77,A,7,998,A,7,50,A,7,5.2,A,7,11300,B,7,400,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,09:00,486,1382,100,1,9,1,1,9,99,1,13,115,1,9,1,1,9,114,1,13,398,1,18,10,A,7,10,A,7,10.0,A,7,7.2,A,7,83,A,7,998,A,7,40,A,7,5.7,A,7,11300,B,7,400,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,10:00,690,1382,197,1,9,1,1,9,196,1,13,224,1,9,1,1,9,223,1,13,783,1,18,10,A,7,10,A,7,10.6,A,7,7.2,A,7,80,A,7,999,A,7,40,A,7,6.7,A,7,11300,B,7,430,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,11:00,837,1382,241,1,9,9,1,9,235,1,13,277,1,9,8,1,9,272,1,13,995,1,18,10,A,7,10,A,7,10.6,A,7,6.7,A,7,77,A,7,999,A,7,40,A,7,6.2,A,7,11300,B,7,460,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,12:00,915,1382,253,1,9,6,1,9,249,1,13,294,1,9,5,1,9,290,1,13,1090,1,18,10,A,7,10,A,7,11.1,A,7,6.1,A,7,72,A,7,998,A,7,40,A,7,6.2,A,7,11300,B,7,490,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,13:00,920,1382,283,1,9,2,1,9,282,1,13,326,1,9,2,1,9,325,1,13,1192,1,18,10,A,7,10,A,7,12.2,A,7,7.2,A,7,72,A,7,997,A,7,50,A,7,7.2,A,7,11300,B,7,7620,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/23/1980,14:00,851,1382,265,1,9,1,1,9,265,1,13,304,1,9,1,1,9,303,1,13,1090,1,18,10,A,7,10,A,7,11.7,A,7,6.1,A,7,69,A,7,997,A,7,40,A,7,7.2,A,7,11300,B,7,2440,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,15:00,713,1382,217,1,9,1,1,9,216,1,13,246,1,9,1,1,9,245,1,13,852,1,18,10,A,7,10,A,7,11.7,A,7,6.1,A,7,69,A,7,998,A,7,40,A,7,4.6,A,7,11300,B,7,3050,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,16:00,515,1382,151,1,9,1,1,9,151,1,13,170,1,9,1,1,9,170,1,13,553,1,18,10,A,7,10,A,7,11.1,A,7,5.6,A,7,69,A,7,998,A,7,40,A,7,5.2,A,7,16100,B,7,2440,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,17:00,272,1382,67,1,13,1,1,9,66,1,13,74,1,13,0,1,9,74,1,13,229,1,21,10,A,7,10,A,7,10.6,A,7,5.0,A,7,69,A,7,998,A,7,50,A,7,5.2,A,7,16100,B,7,2290,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,18:00,37,749,15,1,13,0,1,9,15,1,13,17,1,13,0,1,9,17,1,13,52,1,21,10,A,7,10,A,7,9.4,A,7,5.0,A,7,74,A,7,998,A,7,40,A,7,4.6,A,7,16100,B,7,3660,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,5.0,A,7,77,A,7,998,A,7,40,A,7,4.1,A,7,24100,B,7,3660,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/23/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,4.4,A,7,74,A,7,998,A,7,50,A,7,4.1,A,7,24100,B,7,2440,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,7.8,A,7,3.9,A,7,77,A,7,998,A,7,50,A,7,5.2,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,4,A,7,7.8,A,7,4.4,A,7,80,A,7,998,A,7,50,A,7,4.6,A,7,24100,B,7,3660,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,7.2,A,7,3.9,A,7,80,A,7,998,A,7,50,A,7,4.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/23/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,7.2,A,7,3.9,A,7,80,A,7,997,A,7,40,A,7,6.2,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,7.2,A,7,3.9,A,7,80,A,7,997,A,7,40,A,7,5.2,A,7,24100,B,7,2290,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -10/24/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,7.2,A,7,2.8,A,7,74,A,7,997,A,7,40,A,7,5.7,A,7,24100,B,7,2290,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,2.2,A,7,71,A,7,997,A,7,40,A,7,6.2,A,7,24100,B,7,670,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,3.3,A,7,80,A,7,996,A,7,40,A,7,5.2,A,7,24100,B,7,580,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,2.8,A,7,74,A,7,997,A,7,40,A,7,5.2,A,7,24100,B,7,580,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,2.8,A,7,74,A,7,996,A,7,40,A,7,5.7,A,7,24100,B,7,610,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,07:00,19,542,9,1,13,0,1,9,9,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,6.7,A,7,3.3,A,7,80,A,7,996,A,7,40,A,7,5.7,A,7,24100,B,7,1520,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/24/1980,08:00,234,1383,61,1,13,0,1,9,61,1,13,68,1,13,0,1,9,68,1,13,203,1,21,10,A,7,10,A,7,7.2,A,7,3.9,A,7,80,A,7,997,A,7,40,A,7,5.2,A,7,16100,B,7,1520,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,09:00,481,1383,135,1,9,0,1,9,135,1,13,152,1,9,0,1,9,152,1,13,494,1,18,10,A,7,10,A,7,7.8,A,7,3.9,A,7,77,A,7,997,A,7,50,A,7,6.2,A,7,16100,B,7,1490,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,10:00,685,1383,210,1,9,1,1,9,209,1,13,237,1,9,1,1,9,237,1,13,813,1,18,10,A,7,10,A,7,8.3,A,7,3.9,A,7,74,A,7,997,A,7,30,A,7,6.2,A,7,16100,B,7,1400,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,11:00,831,1383,277,1,9,0,1,9,277,1,13,315,1,9,0,1,9,315,1,13,1103,1,18,10,A,7,10,A,7,8.3,A,7,5.0,A,7,80,A,7,996,A,7,40,A,7,6.2,A,7,16100,B,7,670,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,12:00,909,1383,293,1,9,1,1,9,293,1,13,336,1,9,1,1,9,336,1,13,1213,1,18,10,A,7,10,A,7,9.4,A,7,6.1,A,7,80,A,7,995,A,7,40,A,7,5.2,A,7,11300,B,7,490,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,13:00,914,1383,340,1,9,1,1,9,340,1,13,386,1,9,1,1,9,385,1,13,1331,1,18,10,A,7,10,A,7,9.4,A,7,6.1,A,7,80,A,7,994,A,7,40,A,7,5.7,A,7,11300,B,7,490,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/24/1980,14:00,845,1383,166,1,9,0,1,9,165,1,13,196,1,9,0,1,9,196,1,13,765,1,18,10,A,7,10,A,7,8.9,A,7,7.2,A,7,89,A,7,992,A,7,40,A,7,5.2,A,7,6400,B,7,640,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,51,C,8 -10/24/1980,15:00,707,1383,131,1,9,1,1,9,130,1,13,154,1,9,1,1,9,154,1,13,583,1,18,10,A,7,10,A,7,9.4,A,7,7.8,A,7,89,A,7,992,A,7,40,A,7,6.2,A,7,6400,B,7,520,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,51,C,8 -10/24/1980,16:00,509,1383,141,1,9,0,1,9,141,1,13,159,1,9,0,1,9,159,1,13,525,1,18,10,A,7,10,A,7,10.0,A,7,7.8,A,7,86,A,7,992,A,7,50,A,7,6.2,A,7,16100,B,7,340,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/24/1980,17:00,266,1383,41,1,13,0,1,9,41,1,13,48,1,13,0,1,9,48,1,13,158,1,21,10,A,7,10,A,7,9.4,A,7,8.3,A,7,93,A,7,991,A,7,60,A,7,5.2,A,7,11300,B,7,310,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,51,C,8 -10/24/1980,18:00,34,703,10,1,13,0,1,9,10,1,13,12,1,13,0,1,9,12,1,13,37,1,21,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,990,A,7,50,A,7,4.6,A,7,8000,B,7,210,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/24/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,8.9,A,7,100,A,7,990,A,7,40,A,7,5.2,A,7,6400,B,7,150,A,7,1.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/24/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,989,A,7,50,A,7,4.6,A,7,6400,B,7,120,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/24/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,988,A,7,40,A,7,4.6,A,7,6400,B,7,90,A,7,1.9,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -10/24/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,987,A,7,20,A,7,4.1,A,7,6400,B,7,90,A,7,1.9,E,8,0.000,?,0,0.00,?,0,13,1,D,9,45,C,8 -10/24/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,986,A,7,20,A,7,3.6,A,7,3200,B,7,60,A,7,1.9,E,8,0.000,?,0,0.00,?,0,10,1,D,9,45,C,8 -10/24/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,984,A,7,20,A,7,4.1,A,7,3200,B,7,60,A,7,1.9,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -10/25/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,982,A,7,20,A,7,5.2,A,7,3200,B,7,60,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/25/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,980,A,7,30,A,7,4.6,A,7,3200,B,7,60,A,7,1.9,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -10/25/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,979,A,7,10,A,7,4.1,A,7,3200,B,7,60,A,7,1.8,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -10/25/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,977,A,7,10,A,7,4.1,A,7,3200,B,7,60,A,7,1.8,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -10/25/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,976,A,7,360,A,7,3.6,A,7,3200,B,7,60,A,7,1.9,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -10/25/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,975,A,7,340,A,7,2.1,A,7,3200,B,7,60,A,7,1.9,E,8,0.000,?,0,0.00,?,0,13,1,D,9,45,C,8 -10/25/1980,07:00,18,519,7,1,13,0,1,9,7,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,975,A,7,280,A,7,2.6,A,7,4800,B,7,760,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/25/1980,08:00,229,1384,66,1,13,1,1,9,66,1,13,73,1,13,0,1,9,73,1,13,211,1,21,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,974,A,7,230,A,7,2.6,A,7,16100,B,7,760,A,7,1.9,E,8,0.000,F,8,0.00,?,0,5,1,D,9,00,C,8 -10/25/1980,09:00,476,1384,102,1,9,1,1,9,102,1,13,117,1,9,1,1,9,117,1,13,403,1,18,10,A,7,10,A,7,10.6,A,7,10.6,A,7,100,A,7,973,A,7,220,A,7,4.1,A,7,3200,B,7,60,A,7,2.0,E,8,0.000,F,8,0.00,?,0,10,1,D,9,45,C,8 -10/25/1980,10:00,680,1384,139,1,9,1,1,9,139,1,13,163,1,9,1,1,9,163,1,13,604,1,18,10,A,7,10,A,7,10.6,A,7,10.6,A,7,100,A,7,973,A,7,290,A,7,5.2,A,7,3200,B,7,180,A,7,2.0,E,8,0.000,F,8,0.00,?,0,53,1,D,9,45,C,8 -10/25/1980,11:00,826,1384,174,1,9,1,1,9,174,1,13,206,1,9,1,1,9,205,1,13,790,1,18,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,974,A,7,270,A,7,4.1,A,7,3200,B,7,1070,A,7,1.9,E,8,0.000,F,8,0.00,?,0,15,1,D,9,45,C,8 -10/25/1980,12:00,904,1384,323,1,9,0,1,9,323,1,13,367,1,9,0,1,9,367,1,13,1282,1,18,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,974,A,7,270,A,7,6.2,A,7,16100,B,7,1070,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,13:00,908,1384,400,1,9,189,1,9,275,1,13,439,1,9,200,1,9,307,1,13,789,1,18,9,A,7,9,A,7,11.7,A,7,9.4,A,7,86,A,7,974,A,7,270,A,7,7.2,A,7,24100,B,7,910,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,25,C,8 -10/25/1980,14:00,839,1384,273,1,9,93,1,9,217,1,13,303,1,9,98,1,9,243,1,13,590,1,18,9,A,7,9,A,7,12.2,A,7,4.4,A,7,59,A,7,974,A,7,290,A,7,8.2,A,7,32200,B,7,1220,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,15:00,701,1384,423,1,13,588,1,9,123,1,13,441,1,13,580,1,9,147,1,13,262,1,21,4,A,7,4,A,7,12.8,A,7,3.3,A,7,53,A,7,975,A,7,300,A,7,8.2,A,7,32200,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,16:00,504,1384,339,1,9,795,1,9,47,1,13,356,1,9,742,1,9,85,1,13,113,1,18,1,A,7,1,A,7,10.6,A,7,0.6,A,7,50,A,7,976,A,7,300,A,7,8.8,A,7,32200,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,17:00,261,1384,131,1,13,359,1,9,62,1,13,135,1,13,262,1,9,86,1,13,113,1,21,4,A,7,4,A,7,8.3,A,7,0.0,A,7,56,A,7,978,A,7,310,A,7,10.3,A,7,32200,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,18:00,31,680,16,1,13,22,1,9,14,1,13,17,1,13,8,1,9,16,1,13,29,1,21,7,A,7,7,A,7,7.2,A,7,-1.1,A,7,56,A,7,979,A,7,310,A,7,8.2,A,7,24100,B,7,1310,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,6.1,A,7,-2.2,A,7,56,A,7,979,A,7,270,A,7,6.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -10/25/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-1.7,A,7,62,A,7,980,A,7,260,A,7,4.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,5.0,A,7,-1.7,A,7,62,A,7,980,A,7,270,A,7,5.7,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,5.0,A,7,-2.2,A,7,60,A,7,981,A,7,280,A,7,6.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,3.9,A,7,-1.7,A,7,67,A,7,981,A,7,250,A,7,3.1,A,7,24100,B,7,1400,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/25/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,4.4,A,7,-1.1,A,7,68,A,7,982,A,7,210,A,7,3.6,A,7,24100,B,7,1520,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,4.4,A,7,-1.1,A,7,68,A,7,982,A,7,220,A,7,3.6,A,7,24100,B,7,1520,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -10/26/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,4.4,A,7,-1.1,A,7,68,A,7,983,A,7,230,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,2.8,A,7,-1.1,A,7,76,A,7,983,A,7,240,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,2.8,A,7,-1.1,A,7,76,A,7,983,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-1.1,A,7,82,A,7,984,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-1.1,A,7,85,A,7,984,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,07:00,16,496,9,1,13,7,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,1.7,A,7,-1.1,A,7,82,A,7,985,A,7,250,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/26/1980,08:00,225,1385,97,1,13,290,1,9,50,1,13,102,1,13,197,1,9,70,1,13,90,1,21,0,A,7,0,A,7,4.4,A,7,0.0,A,7,73,A,7,986,A,7,240,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,09:00,471,1385,279,1,9,569,1,9,84,1,13,288,1,9,519,1,9,111,1,13,159,1,18,0,A,7,0,A,7,7.8,A,7,0.6,A,7,61,A,7,987,A,7,250,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,10:00,675,1385,456,1,9,704,1,9,111,1,13,478,1,9,693,1,9,139,1,13,235,1,18,0,A,7,0,A,7,10.0,A,7,0.6,A,7,52,A,7,988,A,7,240,A,7,5.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,11:00,821,1385,589,1,9,773,1,9,128,1,13,623,1,9,780,1,9,159,1,13,305,1,18,0,A,7,0,A,7,11.7,A,7,-0.6,A,7,43,A,7,988,A,7,250,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,12:00,898,1385,615,1,9,710,1,9,151,1,13,649,1,9,719,1,9,181,1,13,387,1,18,4,A,7,1,A,7,12.8,A,7,-0.6,A,7,40,A,7,988,A,7,270,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,13:00,903,1385,662,1,9,784,1,9,147,1,13,700,1,9,795,1,9,180,1,13,380,1,18,2,A,7,0,A,7,13.9,A,7,-2.8,A,7,32,A,7,987,A,7,270,A,7,6.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/26/1980,14:00,833,1385,566,1,9,695,1,9,145,1,13,594,1,9,698,1,9,173,1,13,345,1,18,4,A,7,1,A,7,14.4,A,7,-2.8,A,7,31,A,7,987,A,7,270,A,7,5.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,15:00,695,1385,435,1,9,534,1,9,165,1,13,460,1,9,536,1,9,190,1,13,348,1,18,7,A,7,2,A,7,14.4,A,7,-4.4,A,7,27,A,7,987,A,7,260,A,7,5.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,16:00,498,1385,250,1,13,299,1,9,142,1,13,265,1,13,287,1,9,162,1,13,293,1,21,8,A,7,4,A,7,14.4,A,7,-5.0,A,7,26,A,7,987,A,7,270,A,7,5.7,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,17:00,255,1385,89,1,13,89,1,9,72,1,13,96,1,13,67,1,9,84,1,13,154,1,21,8,A,7,4,A,7,13.9,A,7,-5.0,A,7,27,A,7,987,A,7,260,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,18:00,29,658,10,1,13,4,1,9,9,1,13,10,1,13,2,1,9,10,1,13,23,1,21,9,A,7,4,A,7,11.7,A,7,-2.8,A,7,37,A,7,988,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,8.3,A,7,0.6,A,7,58,A,7,988,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/26/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,6.7,A,7,2.2,A,7,74,A,7,989,A,7,300,A,7,3.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,5.6,A,7,2.2,A,7,79,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,5.0,A,7,1.7,A,7,79,A,7,990,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,4.4,A,7,1.7,A,7,82,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/26/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,2,A,7,3.9,A,7,0.0,A,7,76,A,7,990,A,7,200,A,7,1.5,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,0,A,7,4.4,A,7,-1.1,A,7,68,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -10/27/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,5,A,7,2.8,A,7,-0.6,A,7,79,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,7620,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,3.3,A,7,0.6,A,7,82,A,7,990,A,7,180,A,7,1.5,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,3.9,A,7,0.0,A,7,76,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,4,A,7,2.2,A,7,0.0,A,7,85,A,7,991,A,7,40,A,7,2.6,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,2.8,A,7,1.1,A,7,89,A,7,991,A,7,30,A,7,2.6,A,7,24100,B,7,3050,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,07:00,15,473,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,4.4,A,7,0.0,A,7,73,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,3050,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -10/27/1980,08:00,220,1385,64,1,13,6,1,9,63,1,13,70,1,13,1,1,9,70,1,13,201,1,21,10,A,7,10,A,7,5.6,A,7,1.7,A,7,76,A,7,993,A,7,40,A,7,2.1,A,7,24100,B,7,3350,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,09:00,466,1385,170,1,13,88,1,9,140,1,13,186,1,13,82,1,9,158,1,13,373,1,21,10,A,7,7,A,7,7.8,A,7,1.1,A,7,63,A,7,994,A,7,80,A,7,2.1,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,10:00,670,1385,153,1,9,4,1,9,151,1,13,177,1,9,3,1,9,176,1,13,638,1,18,10,A,7,10,A,7,8.9,A,7,-0.6,A,7,52,A,7,995,A,7,0,A,7,0.0,A,7,24100,B,7,2590,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,11:00,815,1385,216,1,9,17,1,9,206,1,13,250,1,9,14,1,9,242,1,13,891,1,18,10,A,7,10,A,7,8.9,A,7,1.1,A,7,59,A,7,994,A,7,140,A,7,2.6,A,7,24100,B,7,3660,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,12:00,893,1385,569,1,9,458,1,9,272,1,13,592,1,9,471,1,9,288,1,13,703,1,18,10,A,7,8,A,7,10.0,A,7,1.1,A,7,54,A,7,992,A,7,90,A,7,3.6,A,7,24100,B,7,2590,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,13:00,897,1385,449,1,13,413,1,9,180,1,13,488,1,13,427,1,9,210,1,13,450,1,21,7,A,7,4,A,7,11.7,A,7,-0.6,A,7,43,A,7,992,A,7,150,A,7,3.1,A,7,24100,B,7,4570,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -10/27/1980,14:00,828,1385,526,1,13,596,1,9,166,1,13,545,1,13,594,1,9,189,1,13,384,1,21,4,A,7,3,A,7,13.3,A,7,1.1,A,7,44,A,7,991,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,15:00,690,1385,402,1,13,525,1,9,138,1,13,432,1,13,527,1,9,168,1,13,285,1,21,8,A,7,7,A,7,13.3,A,7,1.1,A,7,44,A,7,990,A,7,180,A,7,3.6,A,7,24100,B,7,2590,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,16:00,492,1385,211,1,9,181,1,9,146,1,13,229,1,9,173,1,9,167,1,13,335,1,18,9,A,7,8,A,7,13.9,A,7,1.7,A,7,44,A,7,989,A,7,160,A,7,2.6,A,7,24100,B,7,2590,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,17:00,250,1385,84,1,13,101,1,9,65,1,13,91,1,13,76,1,9,77,1,13,139,1,21,9,A,7,8,A,7,12.8,A,7,3.3,A,7,53,A,7,989,A,7,140,A,7,2.1,A,7,24100,B,7,2590,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,18:00,27,635,5,1,13,2,1,9,5,1,13,6,1,13,1,1,9,6,1,13,13,1,21,9,A,7,9,A,7,11.7,A,7,3.9,A,7,59,A,7,990,A,7,150,A,7,1.5,A,7,24100,B,7,2590,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,10.6,A,7,6.1,A,7,74,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,2900,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/27/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,6.7,A,7,83,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,3050,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,5.0,A,7,74,A,7,990,A,7,170,A,7,2.1,A,7,24100,B,7,3050,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,5.6,A,7,80,A,7,989,A,7,200,A,7,2.1,A,7,24100,B,7,3050,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,5.0,A,7,74,A,7,989,A,7,180,A,7,3.1,A,7,24100,B,7,3050,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/27/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,8.9,A,7,4.4,A,7,74,A,7,987,A,7,180,A,7,3.1,A,7,24100,B,7,3050,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/28/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,10.0,A,7,6.1,A,7,77,A,7,985,A,7,210,A,7,3.6,A,7,24100,B,7,3660,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/28/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,8.3,A,7,83,A,7,985,A,7,210,A,7,5.2,A,7,24100,B,7,3660,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/28/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,8.9,A,7,83,A,7,985,A,7,230,A,7,4.6,A,7,24100,B,7,3350,A,7,1.8,E,8,0.000,?,0,0.00,?,0,3,1,D,9,00,C,8 -10/28/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,8.9,A,7,90,A,7,985,A,7,220,A,7,5.2,A,7,11300,B,7,2130,A,7,1.8,E,8,0.000,?,0,0.00,?,0,5,1,D,9,61,C,8 -10/28/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,984,A,7,210,A,7,5.7,A,7,11300,B,7,2290,A,7,1.9,E,8,0.000,?,0,0.00,?,0,8,1,D,9,61,C,8 -10/28/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,983,A,7,230,A,7,5.2,A,7,11300,B,7,2590,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -10/28/1980,07:00,13,450,2,1,13,1,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,983,A,7,240,A,7,3.1,A,7,6400,B,7,180,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/28/1980,08:00,215,1386,35,1,13,14,1,9,33,1,13,39,1,13,10,1,9,37,1,13,88,1,21,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,983,A,7,190,A,7,2.1,A,7,6400,B,7,340,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/28/1980,09:00,461,1386,119,1,9,4,1,9,117,1,13,134,1,9,3,1,9,133,1,13,438,1,18,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,983,A,7,230,A,7,2.6,A,7,4000,B,7,240,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/28/1980,10:00,664,1386,166,1,9,8,1,9,163,1,13,192,1,9,6,1,9,189,1,13,672,1,18,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,983,A,7,210,A,7,2.6,A,7,4000,B,7,120,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/28/1980,11:00,810,1386,231,1,9,8,1,9,226,1,13,265,1,9,7,1,9,261,1,13,948,1,18,10,A,7,10,A,7,13.9,A,7,13.9,A,7,100,A,7,983,A,7,280,A,7,4.1,A,7,6400,B,7,120,A,7,2.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/28/1980,12:00,887,1386,250,1,9,4,1,9,247,1,13,289,1,9,3,1,9,286,1,13,1064,1,18,10,A,7,10,A,7,15.0,A,7,15.0,A,7,100,A,7,982,A,7,260,A,7,4.1,A,7,6400,B,7,610,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/28/1980,13:00,891,1386,265,1,9,4,1,9,262,1,13,305,1,9,4,1,9,302,1,13,1111,1,18,10,A,7,10,A,7,16.1,A,7,15.0,A,7,93,A,7,980,A,7,210,A,7,4.6,A,7,11300,B,7,3660,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -10/28/1980,14:00,822,1386,310,1,9,0,1,9,310,1,13,348,1,9,0,1,9,348,1,13,1166,1,18,10,A,7,10,A,7,16.7,A,7,15.0,A,7,90,A,7,980,A,7,240,A,7,3.6,A,7,16100,B,7,430,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/28/1980,15:00,684,1386,252,1,9,1,1,9,252,1,13,281,1,9,1,1,9,281,1,13,905,1,18,10,A,7,10,A,7,17.2,A,7,15.6,A,7,90,A,7,980,A,7,230,A,7,4.6,A,7,16100,B,7,400,A,7,2.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/28/1980,16:00,487,1386,165,1,9,1,1,9,165,1,13,183,1,9,1,1,9,183,1,13,561,1,18,10,A,7,10,A,7,17.2,A,7,15.0,A,7,87,A,7,980,A,7,230,A,7,3.6,A,7,16100,B,7,3660,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/28/1980,17:00,244,1386,86,1,13,119,1,9,65,1,13,94,1,13,88,1,9,78,1,13,139,1,21,10,A,7,9,A,7,16.1,A,7,15.0,A,7,93,A,7,981,A,7,230,A,7,3.1,A,7,16100,B,7,7620,A,7,2.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/28/1980,18:00,24,612,10,1,13,14,1,9,9,1,13,11,1,13,5,1,9,11,1,13,18,1,21,8,A,7,7,A,7,15.6,A,7,14.4,A,7,93,A,7,981,A,7,220,A,7,2.6,A,7,16100,B,7,7620,A,7,2.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/28/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,14.4,A,7,13.9,A,7,96,A,7,981,A,7,220,A,7,2.6,A,7,16100,B,7,7620,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/28/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,13.9,A,7,13.9,A,7,100,A,7,982,A,7,210,A,7,2.6,A,7,11300,B,7,7620,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/28/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,13.9,A,7,13.9,A,7,100,A,7,983,A,7,210,A,7,2.6,A,7,8000,B,7,7620,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/28/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,13.9,A,7,100,A,7,984,A,7,240,A,7,1.5,A,7,6400,B,7,150,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/28/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,13.9,A,7,100,A,7,984,A,7,270,A,7,2.6,A,7,4800,B,7,120,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/28/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,13.9,A,7,100,A,7,984,A,7,290,A,7,2.1,A,7,4800,B,7,90,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/29/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,13.3,A,7,100,A,7,984,A,7,330,A,7,2.1,A,7,4800,B,7,90,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -10/29/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.8,A,7,100,A,7,985,A,7,0,A,7,0.0,A,7,200,B,7,30,A,7,2.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/29/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,12.2,A,7,100,A,7,985,A,7,0,A,7,0.0,A,7,200,B,7,30,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/29/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,986,A,7,360,A,7,3.1,A,7,3200,B,7,3050,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/29/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,11.1,A,7,11.1,A,7,100,A,7,987,A,7,20,A,7,3.6,A,7,16100,B,7,7620,A,7,2.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,10.6,A,7,10.6,A,7,100,A,7,987,A,7,30,A,7,3.6,A,7,16100,B,7,7620,A,7,2.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/29/1980,07:00,12,428,7,1,13,3,1,9,7,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,4,A,7,10.6,A,7,10.0,A,7,96,A,7,988,A,7,30,A,7,4.1,A,7,16100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/29/1980,08:00,211,1387,73,1,13,57,1,9,64,1,13,79,1,13,43,1,9,73,1,13,150,1,21,10,A,7,8,A,7,10.6,A,7,9.4,A,7,93,A,7,989,A,7,40,A,7,4.6,A,7,16100,B,7,2440,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,09:00,456,1387,129,1,9,93,1,9,98,1,13,143,1,9,88,1,9,114,1,13,222,1,18,10,A,7,10,A,7,11.1,A,7,9.4,A,7,90,A,7,990,A,7,50,A,7,6.2,A,7,16100,B,7,2440,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,10:00,659,1387,201,1,9,10,1,9,196,1,13,227,1,9,8,1,9,223,1,13,760,1,18,10,A,7,10,A,7,11.7,A,7,8.3,A,7,80,A,7,990,A,7,50,A,7,5.2,A,7,16100,B,7,1520,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,11:00,804,1387,262,1,9,8,1,9,258,1,13,299,1,9,7,1,9,294,1,13,1030,1,18,10,A,7,10,A,7,11.1,A,7,8.3,A,7,83,A,7,991,A,7,50,A,7,5.2,A,7,11300,B,7,1070,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,12:00,882,1387,245,1,9,3,1,9,244,1,13,284,1,9,3,1,9,283,1,13,1050,1,18,10,A,7,10,A,7,11.1,A,7,7.8,A,7,80,A,7,991,A,7,50,A,7,4.1,A,7,11300,B,7,980,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,13:00,886,1387,249,1,9,4,1,9,246,1,13,287,1,9,3,1,9,285,1,13,1059,1,18,10,A,7,10,A,7,11.1,A,7,7.2,A,7,77,A,7,990,A,7,50,A,7,4.1,A,7,11300,B,7,1190,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/29/1980,14:00,816,1387,241,1,9,5,1,9,238,1,13,276,1,9,4,1,9,274,1,13,987,1,18,10,A,7,10,A,7,11.1,A,7,7.2,A,7,77,A,7,990,A,7,60,A,7,4.6,A,7,11300,B,7,1040,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,15:00,678,1387,183,1,9,2,1,9,182,1,13,209,1,9,2,1,9,208,1,13,735,1,18,10,A,7,10,A,7,10.6,A,7,7.2,A,7,80,A,7,990,A,7,50,A,7,4.1,A,7,11300,B,7,1040,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,16:00,481,1387,162,1,9,2,1,9,161,1,13,179,1,9,2,1,9,178,1,13,549,1,18,10,A,7,10,A,7,10.0,A,7,7.2,A,7,83,A,7,990,A,7,50,A,7,4.1,A,7,11300,B,7,550,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,17:00,239,1387,54,1,13,1,1,9,54,1,13,61,1,13,0,1,9,61,1,13,189,1,21,10,A,7,10,A,7,10.0,A,7,7.2,A,7,83,A,7,990,A,7,60,A,7,3.6,A,7,11300,B,7,520,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/29/1980,18:00,22,589,8,1,13,0,1,9,8,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,9.4,A,7,7.2,A,7,86,A,7,991,A,7,30,A,7,3.6,A,7,11300,B,7,460,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -10/29/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,6.7,A,7,86,A,7,992,A,7,60,A,7,3.1,A,7,8000,B,7,430,A,7,1.6,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -10/29/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,7.8,A,7,100,A,7,992,A,7,60,A,7,3.1,A,7,3200,B,7,150,A,7,1.7,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -10/29/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,7.2,A,7,100,A,7,992,A,7,80,A,7,3.1,A,7,3200,B,7,150,A,7,1.6,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -10/29/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,7.2,A,7,100,A,7,993,A,7,70,A,7,2.1,A,7,3200,B,7,150,A,7,1.6,E,8,0.000,?,0,0.00,?,0,18,1,D,9,45,C,8 -10/29/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,7.2,A,7,100,A,7,993,A,7,60,A,7,3.1,A,7,3200,B,7,150,A,7,1.6,E,8,0.000,?,0,0.00,?,0,8,1,D,9,45,C,8 -10/29/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,7.2,A,7,100,A,7,992,A,7,70,A,7,3.6,A,7,3200,B,7,120,A,7,1.6,E,8,0.000,?,0,0.00,?,0,18,1,D,9,45,C,8 -10/30/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,7.2,A,7,100,A,7,993,A,7,40,A,7,3.6,A,7,3200,B,7,120,A,7,1.6,E,8,0.000,?,0,0.00,?,0,20,1,D,9,45,C,8 -10/30/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,7.2,A,7,100,A,7,993,A,7,60,A,7,3.1,A,7,3200,B,7,120,A,7,1.6,E,8,0.000,?,0,0.00,?,0,13,1,D,9,45,C,8 -10/30/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,992,A,7,50,A,7,3.1,A,7,3200,B,7,120,A,7,1.5,E,8,0.000,?,0,0.00,?,0,30,1,D,9,45,C,8 -10/30/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,993,A,7,50,A,7,4.1,A,7,3200,B,7,120,A,7,1.5,E,8,0.000,?,0,0.00,?,0,23,1,D,9,45,C,8 -10/30/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,5.6,A,7,100,A,7,993,A,7,60,A,7,3.6,A,7,3200,B,7,270,A,7,1.5,E,8,0.000,?,0,0.00,?,0,18,1,D,9,45,C,8 -10/30/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,5.0,A,7,100,A,7,993,A,7,60,A,7,3.6,A,7,3200,B,7,120,A,7,1.4,E,8,0.000,?,0,0.00,?,0,20,1,D,9,45,C,8 -10/30/1980,07:00,11,405,4,1,13,0,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,5.0,A,7,5.0,A,7,100,A,7,993,A,7,60,A,7,4.1,A,7,3200,B,7,90,A,7,1.4,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -10/30/1980,08:00,206,1388,36,1,13,0,1,9,36,1,13,41,1,13,0,1,9,41,1,13,132,1,21,10,A,7,10,A,7,5.0,A,7,5.0,A,7,100,A,7,994,A,7,70,A,7,5.7,A,7,3200,B,7,90,A,7,1.4,E,8,0.000,F,8,0.00,?,0,13,1,D,9,45,C,8 -10/30/1980,09:00,451,1388,90,1,9,1,1,9,89,1,13,103,1,9,1,1,9,103,1,13,355,1,18,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,995,A,7,50,A,7,4.1,A,7,3200,B,7,120,A,7,1.4,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -10/30/1980,10:00,654,1388,137,1,9,1,1,9,136,1,13,159,1,9,1,1,9,158,1,13,582,1,18,10,A,7,10,A,7,5.0,A,7,5.0,A,7,100,A,7,994,A,7,80,A,7,4.1,A,7,8000,B,7,120,A,7,1.4,E,8,0.000,F,8,0.00,?,0,5,1,D,9,45,C,8 -10/30/1980,11:00,799,1388,186,1,9,0,1,9,186,1,13,217,1,9,0,1,9,217,1,13,817,1,18,10,A,7,10,A,7,5.0,A,7,5.0,A,7,100,A,7,994,A,7,70,A,7,3.1,A,7,8000,B,7,150,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/30/1980,12:00,876,1388,208,1,9,0,1,9,208,1,13,243,1,9,0,1,9,243,1,13,931,1,18,10,A,7,10,A,7,5.0,A,7,5.0,A,7,100,A,7,994,A,7,60,A,7,3.1,A,7,6400,B,7,180,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/30/1980,13:00,880,1388,332,1,9,1,1,9,331,1,13,374,1,9,1,1,9,374,1,13,1272,1,18,10,A,7,10,A,7,5.6,A,7,5.0,A,7,96,A,7,993,A,7,40,A,7,3.1,A,7,11300,B,7,180,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -10/30/1980,14:00,811,1388,276,1,9,2,1,9,276,1,13,314,1,9,2,1,9,313,1,13,1079,1,18,10,A,7,10,A,7,6.1,A,7,5.0,A,7,93,A,7,992,A,7,70,A,7,5.2,A,7,11300,B,7,610,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/30/1980,15:00,673,1388,240,1,9,1,1,9,240,1,13,268,1,9,1,1,9,268,1,13,870,1,18,10,A,7,10,A,7,6.7,A,7,5.0,A,7,89,A,7,992,A,7,60,A,7,2.6,A,7,11300,B,7,370,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/30/1980,16:00,476,1388,168,1,9,0,1,9,168,1,13,185,1,9,0,1,9,185,1,13,556,1,18,10,A,7,10,A,7,6.7,A,7,5.0,A,7,89,A,7,992,A,7,40,A,7,4.1,A,7,11300,B,7,700,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/30/1980,17:00,234,1388,68,1,13,0,1,9,68,1,13,75,1,13,0,1,9,75,1,13,217,1,21,10,A,7,10,A,7,6.7,A,7,5.0,A,7,89,A,7,992,A,7,20,A,7,3.1,A,7,11300,B,7,640,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/30/1980,18:00,20,567,11,1,13,0,1,9,11,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,992,A,7,60,A,7,2.1,A,7,11300,B,7,640,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/30/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,992,A,7,40,A,7,2.1,A,7,16100,B,7,700,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/30/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,993,A,7,20,A,7,2.1,A,7,16100,B,7,700,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/30/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,992,A,7,360,A,7,1.5,A,7,16100,B,7,700,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/30/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,992,A,7,0,A,7,0.0,A,7,16100,B,7,760,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/30/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,5.6,A,7,93,A,7,991,A,7,0,A,7,0.0,A,7,16100,B,7,1520,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/30/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,6.1,A,7,5.6,A,7,96,A,7,991,A,7,210,A,7,2.1,A,7,16100,B,7,1830,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,4.4,A,7,100,A,7,991,A,7,300,A,7,2.6,A,7,11300,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -10/31/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,3.9,A,7,100,A,7,991,A,7,260,A,7,2.1,A,7,11300,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,3.9,A,7,100,A,7,990,A,7,0,A,7,0.0,A,7,6400,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,11,C,8 -10/31/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,2.8,A,7,100,A,7,990,A,7,240,A,7,1.5,A,7,6400,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,11,C,8 -10/31/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,2.2,A,7,100,A,7,990,A,7,220,A,7,2.1,A,7,2400,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,11,C,8 -10/31/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,2.2,A,7,2.2,A,7,100,A,7,991,A,7,230,A,7,2.1,A,7,800,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -10/31/1980,07:00,10,382,6,1,13,4,1,9,5,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,1.7,A,7,1.7,A,7,100,A,7,990,A,7,250,A,7,1.5,A,7,6400,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/31/1980,08:00,201,1388,83,1,13,261,1,9,45,1,13,87,1,13,167,1,9,62,1,13,81,1,21,0,A,7,0,A,7,4.4,A,7,4.4,A,7,100,A,7,990,A,7,260,A,7,3.1,A,7,6400,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -10/31/1980,09:00,446,1388,258,1,9,554,1,9,79,1,13,267,1,9,498,1,9,106,1,13,149,1,18,0,A,7,0,A,7,8.3,A,7,6.7,A,7,89,A,7,991,A,7,280,A,7,3.1,A,7,11300,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,10:00,649,1388,428,1,9,687,1,9,105,1,13,449,1,9,672,1,9,133,1,13,219,1,18,0,A,7,0,A,7,10.6,A,7,6.1,A,7,74,A,7,990,A,7,260,A,7,3.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,11:00,794,1388,559,1,9,760,1,9,122,1,13,591,1,9,764,1,9,153,1,13,284,1,18,0,A,7,0,A,7,12.8,A,7,4.4,A,7,57,A,7,990,A,7,290,A,7,4.6,A,7,16100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,12:00,871,1388,636,1,9,802,1,9,131,1,13,656,1,9,795,1,9,155,1,13,292,1,18,0,A,7,0,A,7,14.4,A,7,0.6,A,7,39,A,7,989,A,7,300,A,7,3.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,13:00,874,1388,638,1,9,799,1,9,131,1,13,657,1,9,792,1,9,156,1,13,293,1,18,0,A,7,0,A,7,15.6,A,7,1.7,A,7,39,A,7,988,A,7,270,A,7,3.1,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -10/31/1980,14:00,805,1388,574,1,9,772,1,9,123,1,13,607,1,9,778,1,9,155,1,13,289,1,18,0,A,7,0,A,7,16.1,A,7,2.8,A,7,41,A,7,987,A,7,320,A,7,2.6,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,15:00,667,1388,449,1,9,705,1,9,107,1,13,470,1,9,693,1,9,136,1,13,226,1,18,0,A,7,0,A,7,16.7,A,7,4.4,A,7,45,A,7,987,A,7,290,A,7,2.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,16:00,471,1388,280,1,9,578,1,9,82,1,13,289,1,9,527,1,9,109,1,13,156,1,18,0,A,7,0,A,7,16.1,A,7,5.6,A,7,50,A,7,987,A,7,240,A,7,3.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,17:00,229,1388,102,1,13,307,1,9,50,1,13,106,1,13,210,1,9,71,1,13,90,1,21,0,A,7,0,A,7,15.0,A,7,6.1,A,7,56,A,7,986,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,18:00,19,544,12,1,13,12,1,9,11,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,12.2,A,7,6.1,A,7,67,A,7,986,A,7,250,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,7.2,A,7,80,A,7,987,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -10/31/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,7.8,A,7,89,A,7,987,A,7,260,A,7,3.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,7.8,A,7,89,A,7,987,A,7,270,A,7,3.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.7,A,7,9.2,A,7,93,A,7,987,A,7,280,A,7,3.3,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.9,A,7,10.7,A,7,89,A,7,987,A,7,260,A,7,3.5,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -10/31/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.2,A,7,12.1,A,7,74,A,7,987,A,7,300,A,7,3.7,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -11/01/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.5,A,7,13.5,A,7,96,A,7,974,A,7,190,A,7,4.0,A,7,4800,B,7,91,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/01/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.8,A,7,14.9,A,7,100,A,7,973,A,7,190,A,7,4.2,A,7,4800,B,7,122,A,7,1.9,E,8,0.000,F,8,0.00,F,8,13,1,D,9,45,C,8 -11/01/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.0,A,7,16.4,A,7,97,A,7,972,A,7,200,A,7,4.4,A,7,4800,B,7,152,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/01/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,18.3,A,7,17.8,A,7,97,A,7,971,A,7,200,A,7,4.6,A,7,4800,B,7,183,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/01/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.8,A,7,100,A,7,970,A,7,200,A,7,3.6,A,7,4800,B,7,335,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/01/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,17.2,A,7,96,A,7,969,A,7,210,A,7,3.6,A,7,8000,B,7,396,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/01/1994,07:00,9,382,1,1,10,0,1,16,1,1,10,0,1,10,0,1,16,0,1,10,0,1,21,8,A,7,8,A,7,17.2,A,7,16.1,A,7,93,A,7,969,A,7,220,A,7,6.7,A,7,11200,B,7,914,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/01/1994,08:00,198,1388,25,1,10,0,1,16,25,1,10,29,1,10,0,1,16,29,1,10,97,1,21,10,A,7,10,A,7,16.7,A,7,15.0,A,7,90,A,7,970,A,7,230,A,7,7.7,A,7,11200,B,7,396,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,02,C,8 -11/01/1994,09:00,443,1388,74,1,10,0,1,16,74,1,10,86,1,10,0,1,16,86,1,10,304,1,21,10,A,7,10,A,7,17.2,A,7,15.0,A,7,87,A,7,969,A,7,200,A,7,7.2,A,7,11200,B,7,457,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,10:00,646,1388,122,1,10,0,1,16,122,1,10,143,1,10,0,1,16,143,1,10,531,1,21,10,A,7,10,A,7,17.2,A,7,14.4,A,7,84,A,7,969,A,7,230,A,7,6.2,A,7,11200,B,7,518,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,11:00,790,1388,159,1,10,0,1,16,159,1,10,187,1,10,0,1,16,187,1,10,719,1,21,10,A,7,10,A,7,17.2,A,7,11.7,A,7,70,A,7,970,A,7,300,A,7,8.2,A,7,11200,B,7,1219,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,12:00,867,1388,433,1,10,366,1,16,204,1,10,463,1,10,377,1,16,227,1,10,498,1,21,7,A,7,7,A,7,16.1,A,7,6.7,A,7,54,A,7,970,A,7,300,A,7,7.2,A,7,24000,B,7,3048,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,13:00,871,1388,614,1,10,711,1,16,168,1,10,644,1,10,713,1,16,195,1,10,408,1,21,3,A,7,3,A,7,16.7,A,7,2.8,A,7,39,A,7,970,A,7,300,A,7,10.3,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,14:00,802,1388,532,1,10,680,1,16,139,1,10,560,1,10,681,1,16,166,1,10,320,1,21,2,A,7,2,A,7,15.0,A,7,1.1,A,7,39,A,7,971,A,7,300,A,7,7.7,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,15:00,664,1388,360,1,10,453,1,16,143,1,10,385,1,10,451,1,16,168,1,10,293,1,21,3,A,7,3,A,7,13.3,A,7,0.6,A,7,42,A,7,973,A,7,310,A,7,7.2,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,16:00,467,1388,189,1,10,138,1,16,142,1,10,205,1,10,130,1,16,161,1,10,323,1,21,6,A,7,6,A,7,12.8,A,7,0.6,A,7,43,A,7,974,A,7,300,A,7,8.2,A,7,24000,B,7,1676,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,17:00,226,1388,90,1,10,27,1,16,86,1,10,99,1,10,21,1,16,95,1,10,189,1,21,8,A,7,8,A,7,11.7,A,7,0.0,A,7,44,A,7,976,A,7,280,A,7,8.8,A,7,24000,B,7,1829,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,18:00,18,521,4,1,10,5,1,16,4,1,10,0,1,10,0,1,16,0,1,10,0,1,21,7,A,7,7,A,7,10.6,A,7,-0.6,A,7,46,A,7,976,A,7,280,A,7,9.3,A,7,24000,B,7,1829,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,10.0,A,7,0.0,A,7,50,A,7,977,A,7,280,A,7,6.7,A,7,24000,B,7,1829,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,8.9,A,7,0.0,A,7,54,A,7,978,A,7,260,A,7,5.7,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,8.9,A,7,0.0,A,7,54,A,7,978,A,7,270,A,7,4.6,A,7,24000,B,7,1676,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,7.8,A,7,0.0,A,7,58,A,7,979,A,7,250,A,7,4.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,0.0,A,7,65,A,7,979,A,7,220,A,7,3.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/01/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,0.0,A,7,67,A,7,980,A,7,230,A,7,3.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-0.6,A,7,59,A,7,981,A,7,260,A,7,5.7,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-1.1,A,7,57,A,7,982,A,7,250,A,7,5.7,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,6.7,A,7,-1.1,A,7,57,A,7,982,A,7,270,A,7,5.2,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,6.1,A,7,-1.7,A,7,56,A,7,983,A,7,270,A,7,5.2,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,5.6,A,7,-1.7,A,7,58,A,7,984,A,7,280,A,7,3.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,6,A,7,3.9,A,7,-1.7,A,7,66,A,7,985,A,7,230,A,7,3.6,A,7,24000,B,7,7620,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,07:00,8,359,1,1,10,1,1,16,1,1,10,0,1,10,0,1,16,0,1,10,0,1,21,7,A,7,6,A,7,5.0,A,7,-1.7,A,7,61,A,7,985,A,7,270,A,7,4.1,A,7,24000,B,7,6096,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,08:00,194,1389,41,1,10,20,1,16,39,1,10,46,1,10,14,1,16,44,1,10,99,1,21,9,A,7,8,A,7,6.7,A,7,-1.7,A,7,54,A,7,987,A,7,290,A,7,4.6,A,7,24000,B,7,1524,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,09:00,438,1389,130,1,10,70,1,16,108,1,10,143,1,10,64,1,16,123,1,10,296,1,21,9,A,7,7,A,7,9.4,A,7,-1.7,A,7,45,A,7,988,A,7,290,A,7,7.2,A,7,24000,B,7,1524,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,10:00,640,1389,279,1,10,211,1,16,182,1,10,306,1,10,214,1,16,207,1,10,442,1,21,8,A,7,6,A,7,10.6,A,7,-3.3,A,7,36,A,7,989,A,7,280,A,7,4.1,A,7,24000,B,7,7620,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,11:00,785,1389,504,1,10,629,1,16,148,1,10,527,1,10,626,1,16,172,1,10,331,1,21,5,A,7,2,A,7,13.9,A,7,-4.4,A,7,27,A,7,989,A,7,310,A,7,5.2,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,12:00,861,1389,590,1,10,739,1,16,132,1,10,629,1,10,749,1,16,163,1,10,327,1,21,3,A,7,1,A,7,15.0,A,7,-4.4,A,7,25,A,7,989,A,7,310,A,7,4.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,13:00,865,1389,583,1,10,748,1,16,117,1,10,610,1,10,745,1,16,144,1,10,271,1,21,2,A,7,1,A,7,16.7,A,7,-5.6,A,7,20,A,7,988,A,7,320,A,7,5.2,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,14:00,796,1389,548,1,10,700,1,16,147,1,10,575,1,10,698,1,16,173,1,10,333,1,21,8,A,7,1,A,7,18.3,A,7,-5.6,A,7,18,A,7,988,A,7,320,A,7,3.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,15:00,659,1389,415,1,10,642,1,16,110,1,10,435,1,10,628,1,16,136,1,10,229,1,21,5,A,7,1,A,7,18.9,A,7,-5.6,A,7,17,A,7,988,A,7,320,A,7,3.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,16:00,462,1389,273,1,10,579,1,16,80,1,10,283,1,10,526,1,16,108,1,10,152,1,21,3,A,7,0,A,7,19.4,A,7,-4.4,A,7,19,A,7,988,A,7,280,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,17:00,221,1389,99,1,10,344,1,16,44,1,10,101,1,10,238,1,16,63,1,10,78,1,21,0,A,7,0,A,7,17.8,A,7,-5.0,A,7,20,A,7,989,A,7,290,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,18:00,16,498,3,1,10,17,1,16,2,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,15.0,A,7,-3.9,A,7,26,A,7,989,A,7,250,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,-2.8,A,7,32,A,7,990,A,7,270,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,-0.6,A,7,46,A,7,990,A,7,280,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,0.0,A,7,54,A,7,991,A,7,200,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,-1.1,A,7,51,A,7,991,A,7,280,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,0.0,A,7,56,A,7,991,A,7,290,A,7,2.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/02/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,1.1,A,7,70,A,7,992,A,7,200,A,7,1.5,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,0.6,A,7,76,A,7,992,A,7,270,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,-1.7,A,7,52,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-0.6,A,7,67,A,7,992,A,7,200,A,7,2.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-1.1,A,7,64,A,7,991,A,7,240,A,7,2.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,0.0,A,7,70,A,7,992,A,7,250,A,7,2.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,5.0,A,7,0.0,A,7,70,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,07:00,7,336,1,1,10,12,1,16,1,1,10,0,1,10,0,1,16,0,1,10,0,1,21,6,A,7,1,A,7,5.0,A,7,0.0,A,7,70,A,7,992,A,7,220,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,08:00,189,1390,58,1,10,138,1,16,39,1,10,62,1,10,83,1,16,51,1,10,70,1,21,6,A,7,2,A,7,5.0,A,7,1.1,A,7,76,A,7,993,A,7,220,A,7,2.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,09:00,433,1390,247,1,10,572,1,16,68,1,10,258,1,10,513,1,16,97,1,10,130,1,21,3,A,7,1,A,7,10.6,A,7,3.3,A,7,61,A,7,994,A,7,210,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,10:00,635,1390,407,1,10,519,1,16,169,1,10,425,1,10,511,1,16,190,1,10,348,1,21,5,A,7,2,A,7,16.1,A,7,3.3,A,7,42,A,7,994,A,7,250,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,11:00,779,1390,459,1,10,578,1,16,135,1,10,483,1,10,577,1,16,159,1,10,305,1,21,6,A,7,3,A,7,20.0,A,7,1.1,A,7,28,A,7,994,A,7,230,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,12:00,856,1390,569,1,10,637,1,16,176,1,10,593,1,10,636,1,16,200,1,10,416,1,21,6,A,7,2,A,7,22.2,A,7,0.0,A,7,23,A,7,993,A,7,250,A,7,4.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,13:00,860,1390,529,1,10,518,1,16,209,1,10,565,1,10,533,1,16,234,1,10,508,1,21,6,A,7,3,A,7,22.2,A,7,0.6,A,7,24,A,7,992,A,7,250,A,7,4.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,14:00,791,1390,515,1,10,587,1,16,181,1,10,551,1,10,599,1,16,209,1,10,409,1,21,9,A,7,2,A,7,23.3,A,7,0.6,A,7,22,A,7,991,A,7,200,A,7,5.2,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,15:00,653,1390,413,1,10,563,1,16,149,1,10,440,1,10,559,1,16,176,1,10,305,1,21,10,A,7,4,A,7,23.3,A,7,0.6,A,7,22,A,7,991,A,7,200,A,7,6.2,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,16:00,457,1390,221,1,10,357,1,16,103,1,10,233,1,10,325,1,16,125,1,10,194,1,21,10,A,7,4,A,7,22.2,A,7,1.1,A,7,25,A,7,991,A,7,220,A,7,5.2,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,17:00,216,1390,77,1,10,61,1,16,67,1,10,82,1,10,42,1,16,76,1,10,142,1,21,10,A,7,6,A,7,18.9,A,7,2.2,A,7,33,A,7,991,A,7,230,A,7,2.6,A,7,24000,B,7,7620,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,18:00,14,475,3,1,10,3,1,16,3,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,7,A,7,16.1,A,7,2.2,A,7,39,A,7,991,A,7,210,A,7,2.6,A,7,24000,B,7,7620,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,15.0,A,7,3.3,A,7,45,A,7,992,A,7,220,A,7,2.6,A,7,24000,B,7,7620,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,13.9,A,7,2.8,A,7,47,A,7,992,A,7,230,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,11.7,A,7,3.9,A,7,59,A,7,993,A,7,220,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,11.7,A,7,3.3,A,7,56,A,7,993,A,7,200,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,11.1,A,7,3.9,A,7,61,A,7,992,A,7,230,A,7,2.1,A,7,24000,B,7,7620,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/03/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,10.0,A,7,3.3,A,7,63,A,7,992,A,7,250,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,2,A,7,9.4,A,7,2.8,A,7,63,A,7,992,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,7.2,A,7,2.8,A,7,74,A,7,992,A,7,240,A,7,2.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,7.2,A,7,2.8,A,7,74,A,7,992,A,7,220,A,7,2.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,5.6,A,7,2.8,A,7,82,A,7,992,A,7,210,A,7,2.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,2.8,A,7,79,A,7,992,A,7,210,A,7,2.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,5.6,A,7,2.8,A,7,82,A,7,992,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,07:00,6,313,0,1,10,2,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,2,A,7,0,A,7,3.9,A,7,2.2,A,7,89,A,7,992,A,7,200,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,08:00,184,1391,72,1,10,217,1,16,43,1,10,75,1,10,132,1,16,57,1,10,77,1,21,1,A,7,0,A,7,7.8,A,7,4.4,A,7,79,A,7,993,A,7,200,A,7,2.6,A,7,19200,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,09:00,428,1391,220,1,10,457,1,16,79,1,10,227,1,10,405,1,16,102,1,10,147,1,21,1,A,7,0,A,7,12.8,A,7,5.6,A,7,62,A,7,993,A,7,220,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,10:00,630,1391,390,1,10,624,1,16,107,1,10,408,1,10,606,1,16,133,1,10,219,1,21,1,A,7,0,A,7,17.2,A,7,5.6,A,7,46,A,7,993,A,7,250,A,7,4.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,11:00,774,1391,532,1,10,730,1,16,125,1,10,562,1,10,730,1,16,154,1,10,284,1,21,1,A,7,0,A,7,20.0,A,7,5.0,A,7,37,A,7,993,A,7,230,A,7,5.2,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,12:00,851,1391,565,1,10,682,1,16,147,1,10,596,1,10,686,1,16,174,1,10,355,1,21,1,A,7,0,A,7,22.2,A,7,5.0,A,7,33,A,7,992,A,7,220,A,7,5.2,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,13:00,855,1391,608,1,10,775,1,16,132,1,10,648,1,10,784,1,16,164,1,10,324,1,21,0,A,7,0,A,7,23.3,A,7,2.8,A,7,26,A,7,991,A,7,200,A,7,5.2,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,14:00,785,1391,546,1,10,748,1,16,124,1,10,580,1,10,750,1,16,154,1,10,285,1,21,0,A,7,0,A,7,23.9,A,7,1.7,A,7,23,A,7,990,A,7,200,A,7,5.2,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,15:00,648,1391,425,1,10,682,1,16,107,1,10,447,1,10,666,1,16,135,1,10,222,1,21,0,A,7,0,A,7,23.9,A,7,1.1,A,7,22,A,7,990,A,7,230,A,7,5.2,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,16:00,452,1391,253,1,10,524,1,16,83,1,10,262,1,10,472,1,16,108,1,10,155,1,21,1,A,7,0,A,7,23.3,A,7,2.2,A,7,25,A,7,990,A,7,180,A,7,4.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,17:00,211,1391,84,1,10,223,1,16,50,1,10,87,1,10,146,1,16,65,1,10,90,1,21,2,A,7,1,A,7,20.6,A,7,3.3,A,7,32,A,7,990,A,7,190,A,7,3.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,18:00,13,452,2,1,10,2,1,16,2,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,3,A,7,17.2,A,7,3.3,A,7,39,A,7,990,A,7,180,A,7,3.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,2,A,7,15.6,A,7,3.9,A,7,46,A,7,990,A,7,200,A,7,3.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,1,A,7,15.6,A,7,3.9,A,7,46,A,7,991,A,7,220,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,13.3,A,7,4.4,A,7,55,A,7,991,A,7,200,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,12.2,A,7,5.0,A,7,61,A,7,991,A,7,220,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,12.2,A,7,5.6,A,7,64,A,7,991,A,7,230,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/04/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,12.2,A,7,6.7,A,7,69,A,7,990,A,7,220,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,12.2,A,7,8.9,A,7,80,A,7,990,A,7,220,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,12.2,A,7,9.4,A,7,83,A,7,990,A,7,230,A,7,2.6,A,7,24000,B,7,1128,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,5,A,7,12.8,A,7,10.6,A,7,86,A,7,990,A,7,230,A,7,3.1,A,7,16000,B,7,7620,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,13.3,A,7,11.7,A,7,90,A,7,990,A,7,220,A,7,2.6,A,7,16000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,6,A,7,13.3,A,7,12.2,A,7,93,A,7,990,A,7,240,A,7,2.6,A,7,12800,B,7,7620,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,12.2,A,7,11.7,A,7,97,A,7,990,A,7,230,A,7,3.1,A,7,6400,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,07:00,5,290,0,1,10,6,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,4,A,7,12.2,A,7,12.2,A,7,100,A,7,990,A,7,200,A,7,3.1,A,7,2000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/05/1994,08:00,180,1391,20,1,10,0,1,16,20,1,10,24,1,10,0,1,16,24,1,10,78,1,21,10,A,7,10,A,7,14.4,A,7,14.4,A,7,100,A,7,990,A,7,230,A,7,4.1,A,7,400,B,7,30,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,10,C,8 -11/05/1994,09:00,423,1391,58,1,10,0,1,16,58,1,10,69,1,10,0,1,16,69,1,10,244,1,21,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,991,A,7,230,A,7,5.2,A,7,8000,B,7,152,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/05/1994,10:00,625,1391,165,1,10,0,1,16,165,1,10,188,1,10,0,1,16,188,1,10,654,1,21,10,A,7,10,A,7,17.8,A,7,15.6,A,7,87,A,7,990,A,7,230,A,7,5.2,A,7,11200,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/05/1994,11:00,769,1391,275,1,10,120,1,16,209,1,10,304,1,10,125,1,16,234,1,10,542,1,21,10,A,7,8,A,7,20.6,A,7,16.1,A,7,75,A,7,991,A,7,230,A,7,7.2,A,7,11200,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,12:00,845,1391,324,1,10,111,1,16,256,1,10,355,1,10,117,1,16,284,1,10,697,1,21,10,A,7,9,A,7,21.7,A,7,15.6,A,7,68,A,7,990,A,7,230,A,7,6.2,A,7,24000,B,7,914,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,13:00,849,1391,325,1,10,156,1,16,229,1,10,358,1,10,164,1,16,258,1,10,625,1,21,10,A,7,9,A,7,22.2,A,7,14.4,A,7,61,A,7,989,A,7,240,A,7,6.2,A,7,24000,B,7,1067,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,14:00,780,1391,354,1,10,300,1,16,186,1,10,388,1,10,317,1,16,209,1,10,427,1,21,10,A,7,7,A,7,22.8,A,7,13.9,A,7,57,A,7,989,A,7,240,A,7,6.2,A,7,24000,B,7,1219,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,15:00,643,1391,313,1,10,106,1,16,264,1,10,343,1,10,106,1,16,293,1,10,709,1,21,10,A,7,8,A,7,22.8,A,7,13.9,A,7,57,A,7,988,A,7,210,A,7,6.2,A,7,24000,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,16:00,447,1391,122,1,10,113,1,16,86,1,10,137,1,10,106,1,16,102,1,10,194,1,21,10,A,7,7,A,7,22.2,A,7,13.3,A,7,57,A,7,988,A,7,210,A,7,5.2,A,7,24000,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,17:00,207,1391,83,1,10,70,1,16,72,1,10,88,1,10,47,1,16,81,1,10,153,1,21,10,A,7,8,A,7,20.6,A,7,12.8,A,7,61,A,7,988,A,7,220,A,7,3.6,A,7,24000,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,18:00,12,429,3,1,10,3,1,16,3,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,6,A,7,18.9,A,7,12.8,A,7,68,A,7,988,A,7,200,A,7,3.6,A,7,24000,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,17.2,A,7,12.8,A,7,75,A,7,988,A,7,190,A,7,3.1,A,7,24000,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,17.8,A,7,13.3,A,7,75,A,7,988,A,7,190,A,7,3.1,A,7,24000,B,7,1341,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,16.7,A,7,12.8,A,7,78,A,7,987,A,7,190,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,16.1,A,7,13.3,A,7,83,A,7,988,A,7,200,A,7,3.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,16.1,A,7,13.3,A,7,83,A,7,988,A,7,200,A,7,2.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/05/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,15.6,A,7,13.3,A,7,86,A,7,987,A,7,190,A,7,3.1,A,7,24000,B,7,1311,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,16.7,A,7,14.4,A,7,86,A,7,987,A,7,200,A,7,3.6,A,7,24000,B,7,1402,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,16.1,A,7,13.9,A,7,87,A,7,987,A,7,190,A,7,3.1,A,7,24000,B,7,1433,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,17.2,A,7,14.4,A,7,84,A,7,986,A,7,200,A,7,4.6,A,7,19200,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,16.1,A,7,14.4,A,7,90,A,7,985,A,7,200,A,7,4.1,A,7,24000,B,7,1524,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,14.4,A,7,86,A,7,985,A,7,210,A,7,5.2,A,7,24000,B,7,1219,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,14.4,A,7,80,A,7,985,A,7,230,A,7,7.7,A,7,24000,B,7,914,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,07:00,4,267,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,10,A,7,17.8,A,7,14.4,A,7,80,A,7,985,A,7,210,A,7,7.7,A,7,19200,B,7,914,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,08:00,175,1392,35,1,10,0,1,16,35,1,10,40,1,10,0,1,16,40,1,10,123,1,21,10,A,7,10,A,7,18.3,A,7,15.0,A,7,81,A,7,985,A,7,210,A,7,5.7,A,7,24000,B,7,3048,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,21,C,8 -11/06/1994,09:00,418,1392,68,1,10,0,1,16,68,1,10,79,1,10,0,1,16,79,1,10,278,1,21,10,A,7,10,A,7,17.8,A,7,15.6,A,7,87,A,7,986,A,7,220,A,7,6.2,A,7,16000,B,7,2743,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,10:00,619,1392,116,1,10,0,1,16,116,1,10,136,1,10,0,1,16,136,1,10,500,1,21,10,A,7,10,A,7,17.2,A,7,16.7,A,7,97,A,7,985,A,7,210,A,7,6.2,A,7,11200,B,7,2743,A,7,2.3,E,8,0.000,F,8,0.00,F,8,3,1,D,9,00,C,8 -11/06/1994,11:00,763,1392,128,1,10,0,1,16,128,1,10,153,1,10,0,1,16,153,1,10,593,1,21,10,A,7,10,A,7,18.9,A,7,17.2,A,7,90,A,7,985,A,7,220,A,7,7.2,A,7,11200,B,7,366,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,12:00,840,1392,172,1,10,0,1,16,172,1,10,203,1,10,0,1,16,203,1,10,787,1,21,10,A,7,10,A,7,19.4,A,7,17.2,A,7,87,A,7,985,A,7,220,A,7,6.2,A,7,11200,B,7,427,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,13:00,844,1392,173,1,10,0,1,16,173,1,10,204,1,10,0,1,16,204,1,10,792,1,21,10,A,7,10,A,7,20.0,A,7,17.2,A,7,84,A,7,984,A,7,220,A,7,6.2,A,7,11200,B,7,610,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,14:00,775,1392,155,1,10,0,1,16,155,1,10,182,1,10,0,1,16,182,1,10,697,1,21,10,A,7,10,A,7,21.1,A,7,17.2,A,7,78,A,7,984,A,7,210,A,7,5.2,A,7,11200,B,7,671,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,02,C,8 -11/06/1994,15:00,638,1392,182,1,10,95,1,16,139,1,10,203,1,10,97,1,16,159,1,10,337,1,21,9,A,7,9,A,7,21.1,A,7,16.7,A,7,76,A,7,984,A,7,220,A,7,6.2,A,7,16000,B,7,701,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,16:00,442,1392,250,1,10,515,1,16,86,1,10,257,1,10,459,1,16,111,1,10,159,1,21,3,A,7,3,A,7,21.1,A,7,16.1,A,7,73,A,7,984,A,7,240,A,7,6.2,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,17:00,202,1392,86,1,10,302,1,16,42,1,10,91,1,10,193,1,16,62,1,10,75,1,21,0,A,7,0,A,7,20.0,A,7,16.1,A,7,78,A,7,984,A,7,240,A,7,3.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,18:00,11,406,1,1,10,10,1,16,1,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,17.8,A,7,15.6,A,7,87,A,7,985,A,7,230,A,7,4.1,A,7,19200,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.1,A,7,15.0,A,7,93,A,7,986,A,7,250,A,7,3.1,A,7,19200,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,14.4,A,7,100,A,7,986,A,7,250,A,7,3.1,A,7,19200,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,11.1,A,7,67,A,7,987,A,7,330,A,7,3.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,8.3,A,7,58,A,7,988,A,7,330,A,7,4.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,8.3,A,7,62,A,7,988,A,7,330,A,7,3.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/06/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,8.3,A,7,64,A,7,989,A,7,330,A,7,3.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,7.8,A,7,67,A,7,989,A,7,310,A,7,3.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,6.1,A,7,74,A,7,990,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,5.6,A,7,71,A,7,990,A,7,310,A,7,2.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,6.1,A,7,68,A,7,991,A,7,340,A,7,3.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,5.6,A,7,66,A,7,991,A,7,360,A,7,6.2,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,4.4,A,7,63,A,7,993,A,7,360,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,07:00,3,244,0,1,10,34,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,10.6,A,7,3.9,A,7,63,A,7,994,A,7,360,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,08:00,170,1393,81,1,10,458,1,16,25,1,10,82,1,10,306,1,16,45,1,10,49,1,21,0,A,7,0,A,7,11.7,A,7,3.9,A,7,59,A,7,995,A,7,360,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,09:00,413,1393,258,1,10,729,1,16,41,1,10,273,1,10,655,1,16,78,1,10,97,1,21,0,A,7,0,A,7,12.8,A,7,2.2,A,7,48,A,7,996,A,7,20,A,7,5.7,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,10:00,614,1393,425,1,10,839,1,16,55,1,10,449,1,10,806,1,16,92,1,10,132,1,21,0,A,7,0,A,7,14.4,A,7,2.2,A,7,44,A,7,998,A,7,30,A,7,5.2,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,11:00,758,1393,550,1,10,891,1,16,64,1,10,578,1,10,876,1,16,100,1,10,159,1,21,0,A,7,0,A,7,15.6,A,7,1.1,A,7,37,A,7,998,A,7,30,A,7,4.1,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,12:00,835,1393,617,1,10,914,1,16,69,1,10,648,1,10,905,1,16,104,1,10,176,1,21,0,A,7,0,A,7,16.7,A,7,0.6,A,7,34,A,7,997,A,7,80,A,7,6.7,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,13:00,839,1393,621,1,10,916,1,16,69,1,10,652,1,10,907,1,16,104,1,10,177,1,21,0,A,7,0,A,7,17.8,A,7,-1.7,A,7,26,A,7,996,A,7,80,A,7,6.2,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,14:00,770,1393,554,1,10,858,1,16,79,1,10,579,1,10,843,1,16,111,1,10,173,1,21,2,A,7,2,A,7,18.3,A,7,-2.8,A,7,23,A,7,996,A,7,50,A,7,5.7,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,15:00,633,1393,384,1,10,620,1,16,102,1,10,404,1,10,604,1,16,128,1,10,210,1,21,6,A,7,3,A,7,18.3,A,7,-3.3,A,7,22,A,7,996,A,7,40,A,7,4.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,16:00,438,1393,250,1,10,600,1,16,61,1,10,263,1,10,542,1,16,92,1,10,119,1,21,6,A,7,1,A,7,17.2,A,7,-3.3,A,7,24,A,7,996,A,7,50,A,7,3.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,17:00,198,1393,64,1,10,138,1,16,44,1,10,68,1,10,85,1,16,56,1,10,80,1,21,9,A,7,3,A,7,15.6,A,7,-2.2,A,7,29,A,7,997,A,7,60,A,7,3.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,18:00,10,383,2,1,10,26,1,16,1,1,10,0,1,10,0,1,16,0,1,10,0,1,21,6,A,7,2,A,7,13.9,A,7,-2.2,A,7,32,A,7,997,A,7,40,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,11.7,A,7,-1.1,A,7,41,A,7,997,A,7,80,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,10.0,A,7,0.0,A,7,50,A,7,997,A,7,60,A,7,1.5,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,-0.6,A,7,51,A,7,997,A,7,40,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,0.6,A,7,68,A,7,997,A,7,30,A,7,1.5,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,0.6,A,7,68,A,7,997,A,7,80,A,7,1.5,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/07/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,0.0,A,7,65,A,7,996,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-0.6,A,7,59,A,7,996,A,7,190,A,7,2.1,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-1.1,A,7,57,A,7,996,A,7,200,A,7,2.6,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-2.2,A,7,54,A,7,996,A,7,210,A,7,2.1,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-2.2,A,7,52,A,7,996,A,7,220,A,7,2.1,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-2.2,A,7,63,A,7,995,A,7,260,A,7,2.6,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-1.7,A,7,71,A,7,995,A,7,270,A,7,1.5,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,07:00,3,221,0,1,10,18,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,2,A,7,2,A,7,2.8,A,7,-1.7,A,7,71,A,7,995,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,08:00,165,1393,43,1,10,137,1,16,27,1,10,47,1,10,79,1,16,37,1,10,47,1,21,3,A,7,3,A,7,5.0,A,7,1.7,A,7,79,A,7,995,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,09:00,408,1393,197,1,10,369,1,16,89,1,10,208,1,10,324,1,16,113,1,10,165,1,21,6,A,7,2,A,7,11.1,A,7,1.1,A,7,50,A,7,995,A,7,250,A,7,4.1,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,10:00,609,1393,331,1,10,322,1,16,191,1,10,352,1,10,325,1,16,210,1,10,420,1,21,8,A,7,3,A,7,13.3,A,7,0.0,A,7,40,A,7,995,A,7,250,A,7,4.1,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,11:00,753,1393,430,1,10,460,1,16,181,1,10,456,1,10,466,1,16,204,1,10,397,1,21,7,A,7,2,A,7,16.1,A,7,1.1,A,7,36,A,7,995,A,7,250,A,7,5.2,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,12:00,829,1393,581,1,10,643,1,16,197,1,10,619,1,10,659,1,16,226,1,10,462,1,21,8,A,7,3,A,7,17.2,A,7,0.0,A,7,31,A,7,994,A,7,250,A,7,5.2,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,13:00,834,1393,569,1,10,752,1,16,119,1,10,609,1,10,762,1,16,151,1,10,289,1,21,6,A,7,2,A,7,18.3,A,7,0.0,A,7,29,A,7,992,A,7,250,A,7,5.2,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,14:00,765,1393,467,1,10,480,1,16,204,1,10,492,1,10,486,1,16,224,1,10,457,1,21,6,A,7,3,A,7,18.9,A,7,0.0,A,7,28,A,7,991,A,7,260,A,7,4.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,15:00,628,1393,432,1,10,821,1,16,61,1,10,454,1,10,791,1,16,96,1,10,139,1,21,1,A,7,0,A,7,20.0,A,7,1.7,A,7,30,A,7,990,A,7,210,A,7,5.2,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,16:00,433,1393,274,1,10,736,1,16,45,1,10,290,1,10,667,1,16,81,1,10,102,1,21,0,A,7,0,A,7,20.0,A,7,2.2,A,7,31,A,7,989,A,7,250,A,7,5.2,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,17:00,194,1393,91,1,10,425,1,16,31,1,10,94,1,10,282,1,16,54,1,10,57,1,21,2,A,7,1,A,7,17.2,A,7,2.2,A,7,36,A,7,989,A,7,230,A,7,4.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,18:00,9,360,2,1,10,6,1,16,1,1,10,0,1,10,0,1,16,0,1,10,0,1,21,9,A,7,4,A,7,13.9,A,7,1.7,A,7,44,A,7,989,A,7,220,A,7,3.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,13.3,A,7,1.7,A,7,45,A,7,989,A,7,210,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,10.6,A,7,2.2,A,7,56,A,7,989,A,7,210,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,1,A,7,10.0,A,7,2.8,A,7,61,A,7,988,A,7,220,A,7,3.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,10.0,A,7,2.2,A,7,58,A,7,988,A,7,230,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,2.2,A,7,58,A,7,988,A,7,220,A,7,2.6,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/08/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,2.2,A,7,61,A,7,987,A,7,230,A,7,2.6,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,3.3,A,7,68,A,7,987,A,7,230,A,7,2.6,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.0,A,7,3.9,A,7,66,A,7,987,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,4.4,A,7,71,A,7,987,A,7,210,A,7,2.6,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,4.4,A,7,82,A,7,986,A,7,220,A,7,3.1,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,4.4,A,7,82,A,7,986,A,7,220,A,7,3.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,5.6,A,7,86,A,7,986,A,7,240,A,7,3.6,A,7,19200,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,07:00,2,197,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,7.8,A,7,6.1,A,7,89,A,7,987,A,7,240,A,7,2.6,A,7,19200,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,08:00,161,1394,53,1,10,92,1,16,42,1,10,55,1,10,49,1,16,50,1,10,78,1,21,0,A,7,0,A,7,9.4,A,7,7.8,A,7,90,A,7,987,A,7,220,A,7,3.6,A,7,11200,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,09:00,403,1394,201,1,10,374,1,16,93,1,10,211,1,10,327,1,16,116,1,10,173,1,21,0,A,7,0,A,7,13.3,A,7,8.3,A,7,72,A,7,987,A,7,230,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,10:00,604,1394,362,1,10,536,1,16,130,1,10,387,1,10,524,1,16,159,1,10,257,1,21,0,A,7,0,A,7,16.7,A,7,8.9,A,7,60,A,7,986,A,7,240,A,7,3.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,11:00,748,1394,467,1,10,556,1,16,169,1,10,500,1,10,563,1,16,196,1,10,367,1,21,3,A,7,0,A,7,20.6,A,7,8.3,A,7,45,A,7,985,A,7,260,A,7,3.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,12:00,824,1394,553,1,10,635,1,16,177,1,10,573,1,10,630,1,16,200,1,10,400,1,21,2,A,7,0,A,7,22.8,A,7,7.2,A,7,37,A,7,985,A,7,250,A,7,5.2,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,13:00,828,1394,537,1,10,594,1,16,184,1,10,577,1,10,609,1,16,214,1,10,428,1,21,3,A,7,0,A,7,23.3,A,7,8.3,A,7,38,A,7,983,A,7,260,A,7,4.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,14:00,760,1394,497,1,10,616,1,16,160,1,10,514,1,10,607,1,16,182,1,10,343,1,21,1,A,7,0,A,7,23.9,A,7,8.9,A,7,38,A,7,983,A,7,260,A,7,5.2,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,15:00,624,1394,377,1,10,539,1,16,136,1,10,403,1,10,530,1,16,164,1,10,272,1,21,1,A,7,0,A,7,23.9,A,7,7.8,A,7,36,A,7,983,A,7,230,A,7,5.2,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,16:00,429,1394,220,1,10,398,1,16,97,1,10,231,1,10,355,1,16,122,1,10,181,1,21,0,A,7,0,A,7,23.3,A,7,8.9,A,7,40,A,7,982,A,7,230,A,7,5.2,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,17:00,190,1394,67,1,10,128,1,16,50,1,10,71,1,10,77,1,16,61,1,10,94,1,21,0,A,7,0,A,7,21.7,A,7,7.8,A,7,41,A,7,982,A,7,230,A,7,5.7,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,18:00,8,360,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,1,A,7,0,A,7,17.8,A,7,7.8,A,7,52,A,7,982,A,7,220,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,7.8,A,7,56,A,7,982,A,7,200,A,7,3.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,8.9,A,7,64,A,7,982,A,7,220,A,7,3.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,12.2,A,7,72,A,7,981,A,7,230,A,7,4.6,A,7,19200,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,13.3,A,7,78,A,7,981,A,7,230,A,7,4.6,A,7,19200,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,13.3,A,7,80,A,7,981,A,7,230,A,7,3.6,A,7,19200,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/09/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,13.9,A,7,84,A,7,981,A,7,240,A,7,4.6,A,7,19200,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,13.9,A,7,90,A,7,981,A,7,240,A,7,4.1,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.6,A,7,13.9,A,7,90,A,7,980,A,7,230,A,7,4.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,13.9,A,7,93,A,7,980,A,7,240,A,7,3.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,15.6,A,7,14.4,A,7,93,A,7,980,A,7,240,A,7,4.6,A,7,16000,B,7,3048,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,14.4,A,7,93,A,7,980,A,7,230,A,7,3.1,A,7,16000,B,7,3048,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,14.4,A,7,93,A,7,981,A,7,270,A,7,3.1,A,7,14400,B,7,2896,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/10/1994,07:00,2,174,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,10,A,7,15.6,A,7,15.0,A,7,96,A,7,982,A,7,280,A,7,2.6,A,7,9600,B,7,3048,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/10/1994,08:00,156,1395,31,1,10,0,1,16,31,1,10,35,1,10,0,1,16,35,1,10,108,1,21,10,A,7,10,A,7,15.6,A,7,14.4,A,7,93,A,7,983,A,7,330,A,7,3.1,A,7,4800,B,7,3048,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/10/1994,09:00,398,1395,78,1,10,0,1,16,78,1,10,90,1,10,0,1,16,90,1,10,304,1,21,10,A,7,10,A,7,15.6,A,7,15.0,A,7,96,A,7,984,A,7,10,A,7,2.1,A,7,4000,B,7,1463,A,7,2.0,E,8,0.000,F,8,0.00,F,8,10,1,D,9,45,C,8 -11/10/1994,10:00,599,1395,105,1,10,0,1,16,105,1,10,123,1,10,0,1,16,123,1,10,455,1,21,10,A,7,10,A,7,12.2,A,7,11.1,A,7,93,A,7,986,A,7,50,A,7,10.3,A,7,3200,B,7,244,A,7,2.0,E,8,0.000,F,8,0.00,F,8,18,1,D,9,45,C,8 -11/10/1994,11:00,743,1395,135,1,10,0,1,16,135,1,10,160,1,10,0,1,16,160,1,10,612,1,21,10,A,7,10,A,7,9.4,A,7,8.3,A,7,93,A,7,988,A,7,50,A,7,8.2,A,7,4800,B,7,305,A,7,2.0,E,8,0.000,F,8,0.00,F,8,25,1,D,9,45,C,8 -11/10/1994,12:00,819,1395,151,1,10,0,1,16,151,1,10,179,1,10,0,1,16,179,1,10,700,1,21,10,A,7,10,A,7,8.9,A,7,8.3,A,7,96,A,7,988,A,7,40,A,7,7.2,A,7,4800,B,7,305,A,7,2.0,E,8,0.000,F,8,0.00,F,8,25,1,D,9,45,C,8 -11/10/1994,13:00,823,1395,151,1,10,0,1,16,151,1,10,179,1,10,0,1,16,179,1,10,701,1,21,10,A,7,10,A,7,8.9,A,7,7.8,A,7,93,A,7,989,A,7,50,A,7,6.2,A,7,9600,B,7,305,A,7,2.0,E,8,0.000,F,8,0.00,F,8,5,1,D,9,45,C,8 -11/10/1994,14:00,755,1395,137,1,10,0,1,16,137,1,10,162,1,10,0,1,16,162,1,10,624,1,21,10,A,7,10,A,7,8.3,A,7,7.8,A,7,97,A,7,989,A,7,50,A,7,6.2,A,7,9600,B,7,305,A,7,2.0,E,8,0.000,F,8,0.00,F,8,13,1,D,9,45,C,8 -11/10/1994,15:00,619,1395,110,1,10,0,1,16,110,1,10,129,1,10,0,1,16,129,1,10,479,1,21,10,A,7,10,A,7,8.3,A,7,6.7,A,7,90,A,7,989,A,7,50,A,7,8.2,A,7,11200,B,7,305,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/10/1994,16:00,425,1395,84,1,10,0,1,16,84,1,10,97,1,10,0,1,16,97,1,10,330,1,21,10,A,7,10,A,7,8.3,A,7,6.7,A,7,90,A,7,990,A,7,40,A,7,6.7,A,7,24000,B,7,1463,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/10/1994,17:00,186,1395,31,1,10,0,1,16,31,1,10,36,1,10,0,1,16,36,1,10,114,1,21,10,A,7,10,A,7,8.3,A,7,6.7,A,7,90,A,7,990,A,7,40,A,7,7.2,A,7,12800,B,7,1524,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,18:00,7,337,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,10,A,7,7.8,A,7,5.6,A,7,86,A,7,990,A,7,50,A,7,6.7,A,7,16000,B,7,3658,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/10/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,3.9,A,7,76,A,7,991,A,7,50,A,7,5.7,A,7,24000,B,7,3048,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/10/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,2.8,A,7,71,A,7,992,A,7,40,A,7,4.6,A,7,24000,B,7,3048,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,21,C,8 -11/10/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,3.3,A,7,73,A,7,992,A,7,30,A,7,4.6,A,7,24000,B,7,3048,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,2.8,A,7,71,A,7,993,A,7,40,A,7,5.2,A,7,24000,B,7,3353,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,2.8,A,7,71,A,7,993,A,7,50,A,7,5.7,A,7,24000,B,7,3353,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/10/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,7.2,A,7,2.8,A,7,74,A,7,993,A,7,50,A,7,5.2,A,7,24000,B,7,4572,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,6.7,A,7,2.8,A,7,76,A,7,993,A,7,30,A,7,4.1,A,7,24000,B,7,3353,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,5.6,A,7,2.8,A,7,82,A,7,993,A,7,30,A,7,3.6,A,7,24000,B,7,3658,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,2.2,A,7,79,A,7,992,A,7,30,A,7,5.2,A,7,24000,B,7,3353,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,1.7,A,7,76,A,7,993,A,7,20,A,7,4.6,A,7,24000,B,7,3658,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,5.6,A,7,1.1,A,7,73,A,7,994,A,7,30,A,7,4.1,A,7,24000,B,7,3658,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,5.0,A,7,1.1,A,7,76,A,7,994,A,7,40,A,7,4.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,07:00,1,151,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,3,A,7,3,A,7,5.0,A,7,-1.1,A,7,64,A,7,994,A,7,40,A,7,6.7,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,08:00,151,1395,48,1,10,113,1,16,36,1,10,51,1,10,58,1,16,45,1,10,65,1,21,2,A,7,2,A,7,5.6,A,7,-2.2,A,7,56,A,7,996,A,7,60,A,7,6.2,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,14,C,8 -11/11/1994,09:00,393,1395,209,1,10,277,1,16,131,1,10,218,1,10,243,1,16,149,1,10,272,1,21,3,A,7,3,A,7,7.2,A,7,-3.9,A,7,43,A,7,996,A,7,60,A,7,8.2,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,10:00,594,1395,364,1,10,632,1,16,95,1,10,382,1,10,609,1,16,122,1,10,192,1,21,1,A,7,1,A,7,8.3,A,7,-3.9,A,7,40,A,7,996,A,7,60,A,7,8.2,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,11:00,737,1395,504,1,10,737,1,16,114,1,10,534,1,10,734,1,16,144,1,10,252,1,21,0,A,7,0,A,7,10.0,A,7,-4.4,A,7,34,A,7,996,A,7,60,A,7,7.7,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,12:00,814,1395,572,1,10,770,1,16,123,1,10,609,1,10,776,1,16,155,1,10,291,1,21,0,A,7,0,A,7,10.6,A,7,-4.4,A,7,33,A,7,996,A,7,40,A,7,7.2,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,13:00,819,1395,577,1,10,772,1,16,124,1,10,614,1,10,779,1,16,156,1,10,294,1,21,0,A,7,0,A,7,11.7,A,7,-2.8,A,7,35,A,7,995,A,7,30,A,7,7.2,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,14:00,751,1395,516,1,10,744,1,16,116,1,10,547,1,10,743,1,16,146,1,10,259,1,21,0,A,7,0,A,7,12.8,A,7,-2.8,A,7,33,A,7,994,A,7,30,A,7,5.2,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,15:00,615,1395,397,1,10,675,1,16,99,1,10,417,1,10,654,1,16,127,1,10,202,1,21,0,A,7,0,A,7,13.3,A,7,-2.2,A,7,33,A,7,994,A,7,60,A,7,6.2,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,16:00,420,1395,235,1,10,533,1,16,74,1,10,243,1,10,471,1,16,101,1,10,138,1,21,0,A,7,0,A,7,12.8,A,7,-2.8,A,7,33,A,7,994,A,7,50,A,7,4.1,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,17:00,182,1395,72,1,10,233,1,16,41,1,10,75,1,10,140,1,16,56,1,10,73,1,21,0,A,7,0,A,7,11.7,A,7,-2.2,A,7,37,A,7,994,A,7,40,A,7,3.6,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,18:00,6,314,0,1,10,3,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,8.9,A,7,-1.7,A,7,47,A,7,995,A,7,30,A,7,3.6,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,-1.7,A,7,50,A,7,995,A,7,40,A,7,3.1,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-1.1,A,7,59,A,7,995,A,7,30,A,7,3.6,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-2.2,A,7,61,A,7,996,A,7,70,A,7,3.1,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-2.2,A,7,58,A,7,996,A,7,50,A,7,2.6,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-1.7,A,7,66,A,7,996,A,7,40,A,7,3.1,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/11/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-1.7,A,7,69,A,7,996,A,7,40,A,7,3.6,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-2.8,A,7,65,A,7,996,A,7,50,A,7,2.6,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-2.8,A,7,70,A,7,997,A,7,20,A,7,2.6,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-2.8,A,7,83,A,7,997,A,7,360,A,7,1.5,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-3.3,A,7,70,A,7,997,A,7,20,A,7,3.6,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-3.3,A,7,76,A,7,997,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.7,A,7,-4.4,A,7,80,A,7,997,A,7,330,A,7,1.5,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,07:00,1,128,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,-0.6,A,7,-3.9,A,7,76,A,7,998,A,7,60,A,7,2.1,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,08:00,147,1396,51,1,10,140,1,16,36,1,10,54,1,10,70,1,16,46,1,10,66,1,21,0,A,7,0,A,7,1.7,A,7,-2.8,A,7,70,A,7,998,A,7,30,A,7,3.6,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,09:00,388,1396,206,1,10,462,1,16,77,1,10,211,1,10,396,1,16,100,1,10,139,1,21,0,A,7,0,A,7,4.4,A,7,-2.2,A,7,61,A,7,999,A,7,30,A,7,5.2,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,10:00,589,1396,370,1,10,625,1,16,106,1,10,385,1,10,597,1,16,132,1,10,210,1,21,0,A,7,0,A,7,8.3,A,7,-1.1,A,7,51,A,7,999,A,7,60,A,7,4.1,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,11:00,732,1396,497,1,10,706,1,16,126,1,10,522,1,10,700,1,16,153,1,10,273,1,21,0,A,7,0,A,7,10.0,A,7,-1.7,A,7,43,A,7,999,A,7,70,A,7,3.6,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,12:00,809,1396,547,1,10,713,1,16,134,1,10,579,1,10,715,1,16,162,1,10,311,1,21,1,A,7,1,A,7,12.2,A,7,-1.1,A,7,39,A,7,997,A,7,40,A,7,3.6,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,13:00,814,1396,568,1,10,723,1,16,146,1,10,597,1,10,723,1,16,173,1,10,337,1,21,2,A,7,0,A,7,12.8,A,7,-2.2,A,7,34,A,7,996,A,7,140,A,7,2.1,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,14:00,746,1396,507,1,10,683,1,16,142,1,10,529,1,10,675,1,16,167,1,10,306,1,21,3,A,7,0,A,7,14.4,A,7,-2.2,A,7,31,A,7,995,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,15:00,610,1396,386,1,10,627,1,16,112,1,10,402,1,10,603,1,16,137,1,10,223,1,21,1,A,7,0,A,7,15.6,A,7,-1.1,A,7,31,A,7,995,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,16:00,416,1396,227,1,10,487,1,16,81,1,10,233,1,10,426,1,16,105,1,10,148,1,21,0,A,7,0,A,7,15.6,A,7,-1.1,A,7,31,A,7,995,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,17:00,179,1396,67,1,10,187,1,16,43,1,10,69,1,10,111,1,16,55,1,10,78,1,21,0,A,7,0,A,7,13.9,A,7,-2.8,A,7,30,A,7,995,A,7,80,A,7,2.1,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,18:00,5,291,0,1,10,1,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,11.7,A,7,-2.2,A,7,37,A,7,994,A,7,90,A,7,1.5,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,0.0,A,7,60,A,7,995,A,7,100,A,7,2.1,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,6.1,A,7,0.0,A,7,65,A,7,995,A,7,40,A,7,1.5,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,3.9,A,7,0.6,A,7,79,A,7,995,A,7,210,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,4.4,A,7,0.0,A,7,73,A,7,995,A,7,250,A,7,2.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-1.1,A,7,67,A,7,995,A,7,280,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/12/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,3.3,A,7,-1.1,A,7,72,A,7,994,A,7,280,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-2.2,A,7,71,A,7,994,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-2.2,A,7,71,A,7,994,A,7,320,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-1.7,A,7,83,A,7,994,A,7,230,A,7,2.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-2.2,A,7,74,A,7,994,A,7,300,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-2.2,A,7,83,A,7,993,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-2.2,A,7,74,A,7,993,A,7,280,A,7,2.6,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,07:00,1,105,0,1,10,4,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,1.7,A,7,-2.2,A,7,74,A,7,994,A,7,300,A,7,2.1,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,08:00,142,1397,58,1,10,286,1,16,28,1,10,58,1,10,162,1,16,42,1,10,50,1,21,0,A,7,0,A,7,1.7,A,7,-0.6,A,7,84,A,7,994,A,7,230,A,7,2.6,A,7,19200,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,09:00,383,1397,222,1,10,614,1,16,53,1,10,228,1,10,535,1,16,80,1,10,102,1,21,0,A,7,0,A,7,8.9,A,7,3.3,A,7,68,A,7,994,A,7,210,A,7,2.6,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,10:00,584,1397,386,1,10,753,1,16,71,1,10,404,1,10,721,1,16,102,1,10,148,1,21,0,A,7,0,A,7,13.9,A,7,1.1,A,7,42,A,7,995,A,7,250,A,7,2.6,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,11:00,727,1397,505,1,10,803,1,16,87,1,10,533,1,10,792,1,16,119,1,10,192,1,21,1,A,7,0,A,7,16.7,A,7,1.7,A,7,36,A,7,994,A,7,240,A,7,3.6,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,12:00,804,1397,575,1,10,826,1,16,99,1,10,606,1,10,821,1,16,131,1,10,226,1,21,2,A,7,0,A,7,19.4,A,7,2.8,A,7,33,A,7,993,A,7,230,A,7,2.6,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,13:00,809,1397,579,1,10,806,1,16,112,1,10,603,1,10,798,1,16,139,1,10,244,1,21,4,A,7,0,A,7,20.6,A,7,3.9,A,7,33,A,7,993,A,7,200,A,7,3.1,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,14:00,741,1397,509,1,10,766,1,16,102,1,10,529,1,10,752,1,16,128,1,10,213,1,21,5,A,7,1,A,7,22.2,A,7,5.6,A,7,34,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,15:00,606,1397,351,1,10,526,1,16,123,1,10,377,1,10,515,1,16,153,1,10,242,1,21,8,A,7,3,A,7,22.2,A,7,5.6,A,7,34,A,7,991,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,16:00,412,1397,229,1,10,503,1,16,80,1,10,235,1,10,439,1,16,105,1,10,146,1,21,4,A,7,1,A,7,22.2,A,7,6.7,A,7,37,A,7,991,A,7,190,A,7,1.5,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,17:00,175,1397,71,1,10,254,1,16,39,1,10,74,1,10,150,1,16,55,1,10,70,1,21,6,A,7,1,A,7,20.6,A,7,5.0,A,7,36,A,7,991,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,18:00,5,291,0,1,10,7,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,7,A,7,2,A,7,16.1,A,7,1.7,A,7,38,A,7,992,A,7,170,A,7,2.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,0,A,7,13.9,A,7,2.2,A,7,45,A,7,992,A,7,190,A,7,2.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,0,A,7,12.2,A,7,2.8,A,7,53,A,7,993,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,0,A,7,10.0,A,7,3.9,A,7,66,A,7,993,A,7,200,A,7,2.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,11.1,A,7,2.2,A,7,54,A,7,993,A,7,230,A,7,2.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,2.2,A,7,65,A,7,993,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/13/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,1.7,A,7,61,A,7,993,A,7,230,A,7,2.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,1.7,A,7,63,A,7,993,A,7,220,A,7,1.5,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,0.6,A,7,70,A,7,992,A,7,60,A,7,1.5,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,1.7,A,7,73,A,7,992,A,7,70,A,7,2.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,0.6,A,7,73,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,-0.6,A,7,64,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-0.6,A,7,75,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,07:00,0,82,0,1,10,1,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,3.3,A,7,-0.6,A,7,75,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,08:00,138,1397,51,1,10,199,1,16,31,1,10,53,1,10,102,1,16,43,1,10,55,1,21,0,A,7,0,A,7,5.6,A,7,0.6,A,7,70,A,7,994,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,09:00,379,1397,208,1,10,534,1,16,63,1,10,216,1,10,458,1,16,91,1,10,118,1,21,0,A,7,0,A,7,12.8,A,7,5.6,A,7,62,A,7,994,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,10:00,579,1397,370,1,10,686,1,16,86,1,10,391,1,10,659,1,16,117,1,10,175,1,21,0,A,7,0,A,7,17.8,A,7,2.8,A,7,37,A,7,995,A,7,170,A,7,2.1,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,11:00,722,1397,494,1,10,760,1,16,101,1,10,512,1,10,744,1,16,126,1,10,207,1,21,0,A,7,0,A,7,20.0,A,7,3.9,A,7,35,A,7,995,A,7,170,A,7,3.1,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,12:00,799,1397,536,1,10,750,1,16,107,1,10,560,1,10,743,1,16,134,1,10,235,1,21,1,A,7,1,A,7,21.7,A,7,6.1,A,7,36,A,7,994,A,7,310,A,7,2.1,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,13:00,804,1397,468,1,10,576,1,16,136,1,10,493,1,10,577,1,16,160,1,10,313,1,21,2,A,7,1,A,7,21.7,A,7,8.3,A,7,42,A,7,993,A,7,160,A,7,4.1,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,14:00,737,1397,474,1,10,526,1,16,196,1,10,497,1,10,530,1,16,217,1,10,429,1,21,8,A,7,3,A,7,22.2,A,7,9.4,A,7,44,A,7,992,A,7,100,A,7,2.6,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,15:00,602,1397,308,1,10,396,1,16,137,1,10,326,1,10,387,1,16,159,1,10,272,1,21,7,A,7,4,A,7,21.7,A,7,9.4,A,7,45,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,16:00,409,1397,188,1,10,67,1,16,168,1,10,205,1,10,62,1,16,187,1,10,393,1,21,10,A,7,5,A,7,21.1,A,7,8.9,A,7,46,A,7,992,A,7,230,A,7,2.6,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,17:00,172,1397,62,1,10,50,1,16,55,1,10,67,1,10,35,1,16,62,1,10,124,1,21,10,A,7,5,A,7,20.0,A,7,7.2,A,7,43,A,7,992,A,7,230,A,7,2.1,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,18:00,4,268,0,1,10,1,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,5,A,7,17.2,A,7,5.0,A,7,44,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,13.3,A,7,4.4,A,7,55,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,1,A,7,11.7,A,7,4.4,A,7,61,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,10.0,A,7,3.9,A,7,66,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,8.9,A,7,3.9,A,7,71,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,0,A,7,9.4,A,7,3.9,A,7,68,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/14/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,10.0,A,7,4.4,A,7,68,A,7,993,A,7,300,A,7,2.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,6.7,A,7,3.9,A,7,82,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,2,A,7,7.2,A,7,3.9,A,7,80,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,6.7,A,7,3.9,A,7,82,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,1,A,7,6.1,A,7,3.9,A,7,86,A,7,991,A,7,320,A,7,2.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,0,A,7,5.6,A,7,3.3,A,7,85,A,7,991,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,6.7,A,7,3.3,A,7,79,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,07:00,0,58,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,9,A,7,4,A,7,6.7,A,7,3.9,A,7,82,A,7,992,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,08:00,133,1398,56,1,10,19,1,16,54,1,10,61,1,10,12,1,16,60,1,10,111,1,21,9,A,7,4,A,7,8.3,A,7,6.1,A,7,86,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,09:00,374,1398,178,1,10,216,1,16,121,1,10,187,1,10,186,1,16,137,1,10,248,1,21,9,A,7,4,A,7,13.3,A,7,8.9,A,7,75,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,10:00,574,1398,247,1,10,92,1,16,209,1,10,270,1,10,90,1,16,233,1,10,558,1,21,10,A,7,7,A,7,17.2,A,7,8.9,A,7,58,A,7,993,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,11:00,717,1398,204,1,10,102,1,16,151,1,10,227,1,10,106,1,16,173,1,10,380,1,21,10,A,7,8,A,7,19.4,A,7,8.9,A,7,51,A,7,993,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,12:00,794,1398,374,1,10,171,1,16,276,1,10,405,1,10,178,1,16,304,1,10,726,1,21,10,A,7,7,A,7,20.6,A,7,7.8,A,7,44,A,7,992,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,13:00,800,1398,224,1,10,148,1,16,139,1,10,251,1,10,157,1,16,160,1,10,309,1,21,10,A,7,8,A,7,21.1,A,7,7.8,A,7,42,A,7,991,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,14:00,732,1398,327,1,10,147,1,16,249,1,10,354,1,10,151,1,16,274,1,10,632,1,21,10,A,7,7,A,7,21.7,A,7,7.8,A,7,41,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,15:00,598,1398,286,1,10,261,1,16,174,1,10,305,1,10,262,1,16,192,1,10,374,1,21,10,A,7,8,A,7,21.7,A,7,7.2,A,7,39,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,16:00,405,1398,199,1,10,108,1,16,168,1,10,218,1,10,99,1,16,189,1,10,391,1,21,10,A,7,7,A,7,21.1,A,7,7.2,A,7,41,A,7,989,A,7,100,A,7,2.1,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,17:00,168,1398,49,1,10,9,1,16,48,1,10,54,1,10,1,1,16,54,1,10,150,1,21,10,A,7,8,A,7,18.9,A,7,6.7,A,7,45,A,7,989,A,7,100,A,7,2.1,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,18:00,4,245,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,7,A,7,17.2,A,7,6.7,A,7,50,A,7,990,A,7,90,A,7,2.1,A,7,16000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,13.9,A,7,7.2,A,7,64,A,7,990,A,7,60,A,7,1.5,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,4,A,7,12.2,A,7,7.2,A,7,71,A,7,990,A,7,40,A,7,2.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,8.9,A,7,6.1,A,7,83,A,7,990,A,7,90,A,7,1.5,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,5,A,7,10.6,A,7,6.7,A,7,77,A,7,990,A,7,30,A,7,1.5,A,7,24000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,10.6,A,7,6.7,A,7,77,A,7,990,A,7,40,A,7,2.6,A,7,24000,B,7,4572,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/15/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,5,A,7,10.6,A,7,6.7,A,7,77,A,7,990,A,7,40,A,7,2.6,A,7,24000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,6.7,A,7,83,A,7,989,A,7,50,A,7,2.6,A,7,24000,B,7,3962,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,6,A,7,10.0,A,7,6.7,A,7,80,A,7,989,A,7,30,A,7,2.6,A,7,19200,B,7,4572,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,6,A,7,10.0,A,7,6.7,A,7,80,A,7,989,A,7,40,A,7,2.6,A,7,19200,B,7,4572,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,10.0,A,7,7.2,A,7,83,A,7,988,A,7,40,A,7,2.6,A,7,16000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,10.0,A,7,7.2,A,7,83,A,7,988,A,7,30,A,7,2.6,A,7,16000,B,7,1067,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,10.0,A,7,7.2,A,7,83,A,7,988,A,7,40,A,7,3.1,A,7,16000,B,7,1829,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,07:00,0,35,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,9,A,7,9,A,7,10.6,A,7,7.2,A,7,79,A,7,988,A,7,20,A,7,3.1,A,7,16000,B,7,853,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,08:00,129,1399,29,1,10,6,1,16,28,1,10,32,1,10,0,1,16,32,1,10,94,1,21,9,A,7,9,A,7,11.1,A,7,7.8,A,7,80,A,7,989,A,7,20,A,7,3.6,A,7,16000,B,7,4572,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,09:00,369,1399,66,1,10,17,1,16,61,1,10,72,1,10,15,1,16,68,1,10,172,1,21,10,A,7,9,A,7,12.8,A,7,9.4,A,7,80,A,7,989,A,7,30,A,7,4.1,A,7,16000,B,7,3658,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,10:00,569,1399,198,1,10,140,1,16,141,1,10,218,1,10,139,1,16,161,1,10,332,1,21,9,A,7,8,A,7,15.6,A,7,10.6,A,7,72,A,7,989,A,7,30,A,7,5.2,A,7,11200,B,7,3658,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,11:00,713,1399,279,1,10,53,1,16,252,1,10,306,1,10,53,1,16,279,1,10,734,1,21,10,A,7,9,A,7,15.6,A,7,11.1,A,7,75,A,7,989,A,7,50,A,7,6.2,A,7,11200,B,7,914,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,12:00,790,1399,428,1,10,61,1,16,394,1,10,469,1,10,63,1,16,433,1,10,1078,1,21,10,A,7,9,A,7,16.7,A,7,11.7,A,7,72,A,7,988,A,7,30,A,7,5.7,A,7,11200,B,7,762,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,13:00,795,1399,416,1,10,258,1,16,268,1,10,451,1,10,268,1,16,298,1,10,705,1,21,7,A,7,7,A,7,17.2,A,7,11.7,A,7,70,A,7,987,A,7,60,A,7,5.2,A,7,11200,B,7,2286,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,14:00,728,1399,143,1,10,0,1,16,143,1,10,168,1,10,0,1,16,168,1,10,634,1,21,10,A,7,10,A,7,16.7,A,7,11.7,A,7,72,A,7,987,A,7,50,A,7,5.2,A,7,11200,B,7,701,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,15:00,594,1399,109,1,10,0,1,16,109,1,10,127,1,10,0,1,16,127,1,10,466,1,21,10,A,7,10,A,7,16.1,A,7,11.1,A,7,72,A,7,986,A,7,30,A,7,5.2,A,7,8000,B,7,701,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,16:00,401,1399,64,1,10,0,1,16,64,1,10,75,1,10,0,1,16,75,1,10,260,1,21,10,A,7,10,A,7,15.0,A,7,10.6,A,7,75,A,7,986,A,7,20,A,7,5.2,A,7,8000,B,7,701,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -11/16/1994,17:00,165,1399,28,1,10,0,1,16,28,1,10,32,1,10,0,1,16,32,1,10,101,1,21,10,A,7,10,A,7,14.4,A,7,9.4,A,7,72,A,7,986,A,7,40,A,7,5.2,A,7,8000,B,7,762,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -11/16/1994,18:00,3,245,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,10,A,7,12.8,A,7,7.8,A,7,72,A,7,987,A,7,50,A,7,8.2,A,7,16000,B,7,853,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,05,C,8 -11/16/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,7.2,A,7,77,A,7,988,A,7,50,A,7,7.7,A,7,16000,B,7,610,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,7.2,A,7,86,A,7,988,A,7,50,A,7,8.2,A,7,12800,B,7,396,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,6.7,A,7,83,A,7,988,A,7,50,A,7,8.2,A,7,12800,B,7,366,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,6.7,A,7,86,A,7,988,A,7,30,A,7,8.2,A,7,12800,B,7,366,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,6.7,A,7,86,A,7,988,A,7,30,A,7,6.2,A,7,12800,B,7,305,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/16/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,7.2,A,7,89,A,7,987,A,7,30,A,7,7.2,A,7,12800,B,7,305,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/17/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,7.2,A,7,89,A,7,987,A,7,40,A,7,6.7,A,7,14400,B,7,335,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/17/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,7.2,A,7,89,A,7,987,A,7,40,A,7,8.2,A,7,14400,B,7,335,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/17/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,7.2,A,7,93,A,7,987,A,7,40,A,7,8.2,A,7,9600,B,7,366,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/17/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,7.2,A,7,93,A,7,986,A,7,40,A,7,7.2,A,7,14400,B,7,305,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,6.7,A,7,90,A,7,986,A,7,50,A,7,9.8,A,7,19200,B,7,335,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/17/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.3,A,7,6.1,A,7,86,A,7,986,A,7,30,A,7,7.7,A,7,19200,B,7,366,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/17/1994,07:00,0,12,0,1,0,0,1,0,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,10,A,7,10,A,7,8.3,A,7,6.7,A,7,90,A,7,987,A,7,40,A,7,7.7,A,7,19200,B,7,335,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/17/1994,08:00,124,1399,17,1,10,0,1,16,17,1,10,20,1,10,0,1,16,20,1,10,63,1,21,10,A,7,10,A,7,8.9,A,7,6.7,A,7,86,A,7,987,A,7,40,A,7,8.2,A,7,19200,B,7,335,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,02,C,8 -11/17/1994,09:00,364,1399,48,1,10,0,1,16,48,1,10,57,1,10,0,1,16,57,1,10,198,1,21,10,A,7,10,A,7,8.9,A,7,7.2,A,7,89,A,7,987,A,7,40,A,7,8.2,A,7,16000,B,7,335,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/17/1994,10:00,564,1399,87,1,10,0,1,16,87,1,10,103,1,10,0,1,16,103,1,10,380,1,21,10,A,7,10,A,7,9.4,A,7,7.2,A,7,86,A,7,987,A,7,40,A,7,7.2,A,7,16000,B,7,335,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/17/1994,11:00,708,1399,117,1,10,0,1,16,117,1,10,139,1,10,0,1,16,139,1,10,532,1,21,10,A,7,10,A,7,10.0,A,7,7.8,A,7,86,A,7,987,A,7,30,A,7,7.7,A,7,16000,B,7,335,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/17/1994,12:00,785,1399,159,1,10,0,1,16,159,1,10,187,1,10,0,1,16,187,1,10,714,1,21,10,A,7,10,A,7,10.6,A,7,7.8,A,7,83,A,7,986,A,7,40,A,7,8.2,A,7,11200,B,7,427,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/17/1994,13:00,791,1399,135,1,10,0,1,16,135,1,10,161,1,10,0,1,16,161,1,10,628,1,21,10,A,7,10,A,7,10.0,A,7,8.3,A,7,89,A,7,985,A,7,40,A,7,8.2,A,7,4000,B,7,366,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/17/1994,14:00,724,1399,121,1,10,0,1,16,121,1,10,144,1,10,0,1,16,144,1,10,552,1,21,10,A,7,10,A,7,10.6,A,7,8.3,A,7,86,A,7,985,A,7,40,A,7,8.2,A,7,9600,B,7,366,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,15:00,590,1399,92,1,10,0,1,16,92,1,10,109,1,10,0,1,16,109,1,10,405,1,21,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,985,A,7,30,A,7,6.2,A,7,3200,B,7,274,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,16:00,398,1399,54,1,10,0,1,16,54,1,10,64,1,10,0,1,16,64,1,10,225,1,21,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,985,A,7,30,A,7,6.2,A,7,3200,B,7,244,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,17:00,162,1399,21,1,10,0,1,16,21,1,10,25,1,10,0,1,16,25,1,10,80,1,21,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,985,A,7,40,A,7,7.7,A,7,3200,B,7,244,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,18:00,3,222,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,985,A,7,50,A,7,8.2,A,7,3200,B,7,244,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,985,A,7,40,A,7,7.2,A,7,9600,B,7,274,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,985,A,7,50,A,7,7.2,A,7,6400,B,7,244,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,985,A,7,40,A,7,7.7,A,7,8000,B,7,244,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,985,A,7,30,A,7,7.2,A,7,8000,B,7,213,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,10.0,A,7,100,A,7,985,A,7,20,A,7,4.6,A,7,4800,B,7,152,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/17/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.0,A,7,96,A,7,985,A,7,30,A,7,5.2,A,7,6400,B,7,152,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/18/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.0,A,7,96,A,7,985,A,7,40,A,7,5.7,A,7,8000,B,7,152,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/18/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.6,A,7,100,A,7,984,A,7,40,A,7,6.2,A,7,6400,B,7,122,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/18/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.6,A,7,100,A,7,984,A,7,10,A,7,5.7,A,7,6400,B,7,91,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/18/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.6,A,7,100,A,7,984,A,7,10,A,7,4.6,A,7,6400,B,7,91,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/18/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,984,A,7,360,A,7,4.6,A,7,6400,B,7,91,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/18/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,11.1,A,7,100,A,7,984,A,7,20,A,7,4.6,A,7,6400,B,7,152,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/18/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.7,A,7,11.7,A,7,100,A,7,984,A,7,10,A,7,5.7,A,7,11200,B,7,152,A,7,2.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/18/1994,08:00,120,1388,11,1,10,0,1,16,11,1,10,13,1,10,0,1,16,13,1,10,43,1,21,10,A,7,10,A,7,12.2,A,7,11.7,A,7,97,A,7,984,A,7,20,A,7,4.6,A,7,16000,B,7,183,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,51,C,8 -11/18/1994,09:00,359,1400,55,1,10,0,1,16,55,1,10,64,1,10,0,1,16,64,1,10,221,1,21,10,A,7,10,A,7,12.8,A,7,12.2,A,7,96,A,7,984,A,7,10,A,7,5.2,A,7,16000,B,7,213,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,10:00,559,1400,95,1,10,0,1,16,95,1,10,111,1,10,0,1,16,111,1,10,407,1,21,10,A,7,10,A,7,14.4,A,7,12.8,A,7,90,A,7,984,A,7,50,A,7,4.1,A,7,16000,B,7,244,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,11:00,703,1400,124,1,10,0,1,16,124,1,10,147,1,10,0,1,16,147,1,10,556,1,21,10,A,7,10,A,7,15.6,A,7,13.3,A,7,86,A,7,984,A,7,40,A,7,5.2,A,7,16000,B,7,274,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,12:00,780,1400,140,1,10,0,1,16,140,1,10,166,1,10,0,1,16,166,1,10,643,1,21,10,A,7,10,A,7,16.1,A,7,13.9,A,7,87,A,7,983,A,7,10,A,7,4.1,A,7,16000,B,7,274,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,13:00,786,1400,169,1,10,0,1,16,169,1,10,198,1,10,0,1,16,198,1,10,750,1,21,10,A,7,10,A,7,17.2,A,7,14.4,A,7,84,A,7,983,A,7,10,A,7,5.2,A,7,16000,B,7,457,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,14:00,720,1400,279,1,10,261,1,16,144,1,10,307,1,10,273,1,16,166,1,10,308,1,21,6,A,7,6,A,7,20.0,A,7,14.4,A,7,70,A,7,982,A,7,10,A,7,5.2,A,7,24000,B,7,671,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,02,C,8 -11/18/1994,15:00,586,1400,179,1,10,173,1,16,106,1,10,197,1,10,174,1,16,124,1,10,208,1,21,7,A,7,7,A,7,19.4,A,7,14.4,A,7,73,A,7,982,A,7,10,A,7,5.2,A,7,24000,B,7,884,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,16:00,395,1400,200,1,10,47,1,16,186,1,10,217,1,10,43,1,16,205,1,10,408,1,21,9,A,7,9,A,7,19.4,A,7,15.0,A,7,76,A,7,982,A,7,10,A,7,4.6,A,7,24000,B,7,1006,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,17:00,160,1400,54,1,10,201,1,16,31,1,10,57,1,10,112,1,16,44,1,10,55,1,21,2,A,7,2,A,7,19.4,A,7,15.0,A,7,76,A,7,983,A,7,20,A,7,4.6,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,18:00,2,198,0,1,10,19,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,17.8,A,7,14.4,A,7,80,A,7,983,A,7,20,A,7,3.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.8,A,7,13.9,A,7,78,A,7,984,A,7,40,A,7,2.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,13.9,A,7,81,A,7,985,A,7,10,A,7,3.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,17.2,A,7,13.3,A,7,78,A,7,985,A,7,20,A,7,3.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,16.7,A,7,12.8,A,7,78,A,7,985,A,7,360,A,7,3.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,16.1,A,7,12.2,A,7,78,A,7,985,A,7,360,A,7,3.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/18/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,15.6,A,7,11.7,A,7,78,A,7,986,A,7,360,A,7,3.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,11.1,A,7,77,A,7,986,A,7,360,A,7,3.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,10.0,A,7,72,A,7,986,A,7,360,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,9.4,A,7,72,A,7,986,A,7,350,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,8.9,A,7,72,A,7,987,A,7,10,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,7.8,A,7,69,A,7,988,A,7,360,A,7,2.6,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,6.7,A,7,66,A,7,988,A,7,10,A,7,3.1,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,12.2,A,7,6.1,A,7,66,A,7,989,A,7,20,A,7,3.6,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,08:00,115,1365,38,1,10,152,1,16,26,1,10,42,1,10,74,1,16,35,1,10,46,1,21,2,A,7,1,A,7,13.3,A,7,5.6,A,7,60,A,7,990,A,7,10,A,7,3.6,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,09:00,355,1400,194,1,10,518,1,16,62,1,10,200,1,10,433,1,16,90,1,10,114,1,21,3,A,7,0,A,7,15.0,A,7,6.7,A,7,58,A,7,991,A,7,10,A,7,4.1,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,10:00,554,1400,353,1,10,684,1,16,82,1,10,372,1,10,652,1,16,113,1,10,165,1,21,2,A,7,0,A,7,17.2,A,7,8.3,A,7,56,A,7,992,A,7,40,A,7,5.2,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,11:00,698,1400,480,1,10,782,1,16,90,1,10,502,1,10,765,1,16,119,1,10,189,1,21,0,A,7,0,A,7,18.3,A,7,10.0,A,7,58,A,7,992,A,7,30,A,7,4.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,12:00,776,1400,540,1,10,783,1,16,106,1,10,562,1,10,772,1,16,133,1,10,226,1,21,2,A,7,0,A,7,20.0,A,7,11.7,A,7,59,A,7,992,A,7,40,A,7,5.2,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,13:00,782,1400,547,1,10,779,1,16,112,1,10,567,1,10,767,1,16,137,1,10,235,1,21,3,A,7,0,A,7,20.0,A,7,12.2,A,7,61,A,7,992,A,7,20,A,7,4.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,14:00,716,1400,468,1,10,614,1,16,154,1,10,483,1,10,599,1,16,176,1,10,317,1,21,7,A,7,2,A,7,21.7,A,7,12.8,A,7,57,A,7,991,A,7,20,A,7,5.2,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,15:00,583,1400,350,1,10,487,1,16,147,1,10,367,1,10,471,1,16,170,1,10,293,1,21,6,A,7,3,A,7,21.7,A,7,12.8,A,7,57,A,7,991,A,7,30,A,7,4.1,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,16:00,392,1400,222,1,10,564,1,16,64,1,10,231,1,10,489,1,16,93,1,10,120,1,21,2,A,7,0,A,7,21.1,A,7,12.2,A,7,57,A,7,991,A,7,40,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,17:00,157,1400,64,1,10,247,1,16,36,1,10,66,1,10,136,1,16,51,1,10,64,1,21,3,A,7,0,A,7,18.3,A,7,10.6,A,7,61,A,7,991,A,7,50,A,7,3.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,18:00,2,198,0,1,10,4,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,2,A,7,0,A,7,16.7,A,7,9.4,A,7,62,A,7,992,A,7,10,A,7,2.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,15.0,A,7,9.4,A,7,69,A,7,992,A,7,10,A,7,2.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,1,A,7,13.9,A,7,8.9,A,7,72,A,7,993,A,7,10,A,7,2.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,1,A,7,11.7,A,7,2.8,A,7,54,A,7,993,A,7,50,A,7,1.5,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,9.4,A,7,5.0,A,7,74,A,7,993,A,7,20,A,7,2.1,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,3,A,7,10.6,A,7,1.1,A,7,52,A,7,993,A,7,40,A,7,2.6,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/19/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,6.7,A,7,0.6,A,7,65,A,7,993,A,7,40,A,7,1.5,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,2,A,7,9.4,A,7,-1.7,A,7,45,A,7,993,A,7,20,A,7,2.6,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,7.2,A,7,-0.6,A,7,57,A,7,993,A,7,40,A,7,2.6,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,2,A,7,6.1,A,7,0.0,A,7,65,A,7,993,A,7,10,A,7,1.5,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,3,A,7,7.2,A,7,-1.1,A,7,55,A,7,993,A,7,50,A,7,2.6,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,2,A,7,6.7,A,7,-1.1,A,7,57,A,7,994,A,7,30,A,7,2.6,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,3.9,A,7,0.0,A,7,76,A,7,994,A,7,90,A,7,2.1,A,7,24000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,6.7,A,7,-1.7,A,7,54,A,7,995,A,7,30,A,7,3.1,A,7,24000,B,7,77777,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,08:00,111,1343,25,1,10,15,1,16,23,1,10,27,1,10,9,1,16,26,1,10,57,1,21,9,A,7,8,A,7,8.3,A,7,-1.1,A,7,51,A,7,995,A,7,60,A,7,3.6,A,7,24000,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,09:00,350,1401,94,1,10,77,1,16,75,1,10,104,1,10,66,1,16,88,1,10,164,1,21,9,A,7,7,A,7,9.4,A,7,-1.7,A,7,45,A,7,996,A,7,60,A,7,4.1,A,7,24000,B,7,7620,A,7,2.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,10:00,550,1401,283,1,10,396,1,16,127,1,10,298,1,10,378,1,16,149,1,10,247,1,21,8,A,7,3,A,7,11.7,A,7,-1.1,A,7,41,A,7,997,A,7,60,A,7,6.2,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,11:00,694,1401,436,1,10,579,1,16,149,1,10,467,1,10,580,1,16,179,1,10,310,1,21,10,A,7,2,A,7,13.9,A,7,2.8,A,7,47,A,7,997,A,7,50,A,7,5.2,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,12:00,771,1401,516,1,10,573,1,16,201,1,10,545,1,10,581,1,16,223,1,10,450,1,21,10,A,7,3,A,7,16.1,A,7,4.4,A,7,46,A,7,996,A,7,80,A,7,4.1,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,13:00,778,1401,475,1,10,569,1,16,159,1,10,494,1,10,562,1,16,180,1,10,346,1,21,10,A,7,2,A,7,17.8,A,7,-2.8,A,7,24,A,7,995,A,7,130,A,7,4.1,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,14:00,712,1401,383,1,10,419,1,16,170,1,10,406,1,10,421,1,16,191,1,10,361,1,21,10,A,7,3,A,7,17.8,A,7,-2.2,A,7,25,A,7,994,A,7,50,A,7,4.1,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,15:00,580,1401,369,1,10,586,1,16,126,1,10,378,1,10,552,1,16,149,1,10,239,1,21,10,A,7,2,A,7,18.3,A,7,-1.7,A,7,25,A,7,993,A,7,50,A,7,4.6,A,7,24000,B,7,77777,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,16:00,389,1401,169,1,10,87,1,16,145,1,10,185,1,10,79,1,16,163,1,10,347,1,21,10,A,7,4,A,7,16.1,A,7,-1.7,A,7,29,A,7,993,A,7,60,A,7,4.6,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,17:00,154,1401,45,1,10,35,1,16,41,1,10,49,1,10,24,1,16,46,1,10,97,1,21,10,A,7,7,A,7,15.0,A,7,-1.7,A,7,31,A,7,993,A,7,60,A,7,3.1,A,7,24000,B,7,7620,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,18:00,2,175,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,10,A,7,13.9,A,7,0.0,A,7,38,A,7,993,A,7,60,A,7,2.6,A,7,24000,B,7,1067,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,0.0,A,7,40,A,7,993,A,7,70,A,7,2.1,A,7,24000,B,7,975,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.3,A,7,0.6,A,7,42,A,7,993,A,7,60,A,7,2.6,A,7,24000,B,7,1006,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,0.6,A,7,43,A,7,993,A,7,70,A,7,2.1,A,7,24000,B,7,914,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,1.7,A,7,49,A,7,993,A,7,70,A,7,3.1,A,7,24000,B,7,1463,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,3.3,A,7,54,A,7,993,A,7,60,A,7,2.6,A,7,24000,B,7,1372,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/20/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,11.1,A,7,3.3,A,7,59,A,7,992,A,7,70,A,7,3.1,A,7,24000,B,7,7620,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,8.3,A,7,86,A,7,991,A,7,60,A,7,3.1,A,7,16000,B,7,1372,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,4.4,A,7,65,A,7,990,A,7,70,A,7,3.1,A,7,16000,B,7,1402,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,6.7,A,7,80,A,7,989,A,7,70,A,7,3.1,A,7,11200,B,7,1402,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,8.3,A,7,93,A,7,988,A,7,80,A,7,5.2,A,7,8000,B,7,732,A,7,2.1,E,8,0.000,F,8,0.00,F,8,3,1,D,9,61,C,8 -11/21/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,9.4,A,7,8.3,A,7,93,A,7,987,A,7,70,A,7,3.6,A,7,9600,B,7,366,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/21/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.0,A,7,9.4,A,7,96,A,7,986,A,7,100,A,7,3.6,A,7,6400,B,7,213,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/21/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,11.1,A,7,10.6,A,7,97,A,7,985,A,7,120,A,7,3.6,A,7,3200,B,7,91,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/21/1994,08:00,107,1320,13,1,10,0,1,16,13,1,10,15,1,10,0,1,16,15,1,10,50,1,21,10,A,7,10,A,7,12.2,A,7,12.2,A,7,100,A,7,985,A,7,160,A,7,3.1,A,7,2400,B,7,366,A,7,2.0,E,8,0.000,F,8,0.00,F,8,51,1,D,9,45,C,8 -11/21/1994,09:00,345,1402,54,1,10,0,1,16,54,1,10,63,1,10,0,1,16,63,1,10,215,1,21,10,A,7,10,A,7,13.9,A,7,13.3,A,7,96,A,7,984,A,7,60,A,7,3.1,A,7,3200,B,7,274,A,7,2.0,E,8,0.000,F,8,0.00,F,8,107,1,D,9,45,C,8 -11/21/1994,10:00,545,1402,78,1,10,0,1,16,78,1,10,93,1,10,0,1,16,93,1,10,342,1,21,10,A,7,10,A,7,13.3,A,7,12.8,A,7,97,A,7,984,A,7,300,A,7,11.3,A,7,2400,B,7,91,A,7,2.0,E,8,0.000,F,8,0.00,F,8,46,1,D,9,45,C,8 -11/21/1994,11:00,689,1402,147,1,10,0,1,16,147,1,10,171,1,10,0,1,16,171,1,10,631,1,21,10,A,7,10,A,7,12.2,A,7,11.7,A,7,97,A,7,984,A,7,30,A,7,2.6,A,7,6400,B,7,610,A,7,1.9,E,8,0.000,F,8,0.00,F,8,89,1,D,9,45,C,8 -11/21/1994,12:00,767,1402,116,1,10,0,1,16,116,1,10,139,1,10,0,1,16,139,1,10,545,1,21,10,A,7,10,A,7,13.9,A,7,13.9,A,7,100,A,7,983,A,7,0,A,7,0.0,A,7,3200,B,7,91,A,7,1.9,E,8,0.000,F,8,0.00,F,8,18,1,D,9,45,C,8 -11/21/1994,13:00,774,1402,168,1,10,0,1,16,168,1,10,196,1,10,0,1,16,196,1,10,740,1,21,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,982,A,7,240,A,7,2.6,A,7,11200,B,7,1829,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/21/1994,14:00,709,1402,302,1,10,91,1,16,256,1,10,331,1,10,91,1,16,285,1,10,738,1,21,9,A,7,9,A,7,17.2,A,7,15.0,A,7,87,A,7,981,A,7,190,A,7,2.6,A,7,16000,B,7,1829,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,21,C,8 -11/21/1994,15:00,576,1402,237,1,10,183,1,16,161,1,10,259,1,10,182,1,16,184,1,10,380,1,21,9,A,7,8,A,7,18.3,A,7,15.6,A,7,84,A,7,980,A,7,250,A,7,3.6,A,7,16000,B,7,2286,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,16:00,386,1402,195,1,10,422,1,16,79,1,10,207,1,10,363,1,16,107,1,10,144,1,21,2,A,7,2,A,7,19.4,A,7,15.6,A,7,79,A,7,980,A,7,210,A,7,2.6,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,17:00,152,1402,70,1,10,422,1,16,24,1,10,70,1,10,269,1,16,41,1,10,45,1,21,0,A,7,0,A,7,17.8,A,7,14.4,A,7,80,A,7,981,A,7,250,A,7,3.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,18:00,2,175,0,1,10,22,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,15.0,A,7,13.3,A,7,90,A,7,981,A,7,260,A,7,3.1,A,7,19200,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,13.3,A,7,93,A,7,981,A,7,270,A,7,2.1,A,7,19200,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,13.3,A,7,96,A,7,982,A,7,290,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,12.2,A,7,96,A,7,982,A,7,280,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,11.1,A,7,96,A,7,983,A,7,260,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,12.8,A,7,97,A,7,983,A,7,260,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/21/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,12.8,A,7,97,A,7,983,A,7,270,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,13.3,A,7,96,A,7,983,A,7,300,A,7,2.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,14.4,A,7,11.1,A,7,81,A,7,984,A,7,310,A,7,2.6,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.9,A,7,7.8,A,7,67,A,7,985,A,7,320,A,7,4.1,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,6.7,A,7,66,A,7,986,A,7,320,A,7,3.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,5.6,A,7,66,A,7,987,A,7,310,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,3.9,A,7,63,A,7,988,A,7,300,A,7,2.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,3.9,A,7,74,A,7,989,A,7,280,A,7,2.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,08:00,103,1297,42,1,10,306,1,16,18,1,10,45,1,10,179,1,16,29,1,10,35,1,21,0,A,7,0,A,7,9.4,A,7,2.2,A,7,61,A,7,990,A,7,310,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,09:00,341,1402,178,1,10,566,1,16,40,1,10,186,1,10,481,1,16,68,1,10,83,1,21,1,A,7,1,A,7,11.7,A,7,2.2,A,7,52,A,7,990,A,7,300,A,7,5.2,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,10:00,540,1402,341,1,10,643,1,16,93,1,10,355,1,10,605,1,16,121,1,10,181,1,21,5,A,7,3,A,7,11.7,A,7,1.7,A,7,50,A,7,991,A,7,300,A,7,3.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,11:00,685,1402,432,1,10,694,1,16,93,1,10,461,1,10,688,1,16,124,1,10,202,1,21,4,A,7,2,A,7,13.3,A,7,-0.6,A,7,38,A,7,991,A,7,320,A,7,3.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,12:00,763,1402,349,1,10,370,1,16,147,1,10,378,1,10,376,1,16,173,1,10,318,1,21,8,A,7,6,A,7,13.9,A,7,-0.6,A,7,37,A,7,991,A,7,320,A,7,3.1,A,7,24000,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,13:00,770,1402,404,1,10,274,1,16,254,1,10,431,1,10,288,1,16,272,1,10,615,1,21,7,A,7,6,A,7,15.0,A,7,-2.2,A,7,30,A,7,990,A,7,300,A,7,4.1,A,7,24000,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,14:00,705,1402,441,1,10,635,1,16,122,1,10,463,1,10,626,1,16,147,1,10,259,1,21,3,A,7,3,A,7,16.7,A,7,-3.3,A,7,24,A,7,989,A,7,310,A,7,3.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,15:00,573,1402,355,1,10,687,1,16,74,1,10,369,1,10,654,1,16,101,1,10,149,1,21,2,A,7,2,A,7,16.7,A,7,-3.3,A,7,24,A,7,990,A,7,310,A,7,3.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,16:00,383,1402,175,1,10,361,1,16,76,1,10,186,1,10,310,1,16,101,1,10,138,1,21,3,A,7,3,A,7,16.1,A,7,-4.4,A,7,23,A,7,990,A,7,310,A,7,4.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,17:00,150,1402,64,1,10,284,1,16,34,1,10,65,1,10,162,1,16,48,1,10,58,1,21,4,A,7,2,A,7,14.4,A,7,-3.3,A,7,28,A,7,990,A,7,320,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,18:00,1,152,0,1,10,12,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,3,A,7,3,A,7,10.6,A,7,-2.8,A,7,38,A,7,991,A,7,320,A,7,3.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,10.6,A,7,-4.4,A,7,33,A,7,991,A,7,300,A,7,2.6,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,10.6,A,7,-7.8,A,7,25,A,7,992,A,7,330,A,7,3.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,6,A,7,10.0,A,7,-10.6,A,7,20,A,7,992,A,7,320,A,7,3.1,A,7,24000,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,8.9,A,7,-11.1,A,7,21,A,7,992,A,7,330,A,7,3.1,A,7,24000,B,7,4572,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,7.8,A,7,-11.1,A,7,22,A,7,993,A,7,340,A,7,2.6,A,7,24000,B,7,4572,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/22/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,6,A,7,7.2,A,7,-10.0,A,7,26,A,7,993,A,7,350,A,7,2.6,A,7,24000,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,6.1,A,7,-9.4,A,7,29,A,7,993,A,7,340,A,7,2.6,A,7,24000,B,7,4572,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,5.6,A,7,-9.4,A,7,30,A,7,993,A,7,10,A,7,2.6,A,7,24000,B,7,4572,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,5.0,A,7,-9.4,A,7,31,A,7,993,A,7,360,A,7,2.6,A,7,24000,B,7,3658,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,4.4,A,7,-10.6,A,7,29,A,7,993,A,7,360,A,7,4.1,A,7,24000,B,7,3658,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,3.9,A,7,-11.1,A,7,29,A,7,994,A,7,360,A,7,4.1,A,7,24000,B,7,3658,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,-12.2,A,7,26,A,7,994,A,7,360,A,7,3.1,A,7,24000,B,7,3353,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,2.8,A,7,-13.3,A,7,26,A,7,994,A,7,360,A,7,3.1,A,7,24000,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,08:00,99,1274,38,1,10,173,1,16,24,1,10,40,1,10,80,1,16,34,1,10,42,1,21,7,A,7,2,A,7,3.3,A,7,-12.8,A,7,26,A,7,994,A,7,350,A,7,2.6,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,09:00,336,1403,150,1,10,333,1,16,70,1,10,159,1,10,271,1,16,93,1,10,127,1,21,9,A,7,3,A,7,5.0,A,7,-15.6,A,7,18,A,7,995,A,7,350,A,7,2.6,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,10:00,536,1403,270,1,10,386,1,16,123,1,10,286,1,10,367,1,16,145,1,10,238,1,21,10,A,7,4,A,7,5.6,A,7,-18.9,A,7,13,A,7,995,A,7,310,A,7,3.6,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,11:00,680,1403,384,1,10,374,1,16,203,1,10,411,1,10,385,1,16,223,1,10,456,1,21,9,A,7,4,A,7,6.7,A,7,-18.3,A,7,12,A,7,995,A,7,330,A,7,3.6,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,12:00,759,1403,505,1,10,682,1,16,136,1,10,529,1,10,677,1,16,162,1,10,298,1,21,7,A,7,2,A,7,7.2,A,7,-17.8,A,7,13,A,7,993,A,7,320,A,7,4.6,A,7,24000,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,13:00,766,1403,450,1,10,551,1,16,148,1,10,468,1,10,545,1,16,169,1,10,322,1,21,5,A,7,4,A,7,8.3,A,7,-17.2,A,7,12,A,7,993,A,7,300,A,7,5.2,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,14:00,702,1403,461,1,10,741,1,16,90,1,10,482,1,10,725,1,16,118,1,10,190,1,21,2,A,7,2,A,7,7.8,A,7,-18.3,A,7,11,A,7,992,A,7,290,A,7,4.6,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,15:00,570,1403,388,1,10,813,1,16,58,1,10,409,1,10,772,1,16,94,1,10,128,1,21,0,A,7,0,A,7,8.3,A,7,-17.2,A,7,12,A,7,991,A,7,300,A,7,5.2,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,16:00,380,1403,231,1,10,690,1,16,44,1,10,242,1,10,604,1,16,78,1,10,91,1,21,0,A,7,0,A,7,7.8,A,7,-16.7,A,7,13,A,7,991,A,7,290,A,7,6.2,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,17:00,147,1403,66,1,10,386,1,16,25,1,10,66,1,10,242,1,16,40,1,10,45,1,21,0,A,7,0,A,7,6.7,A,7,-15.0,A,7,17,A,7,991,A,7,280,A,7,4.1,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,18:00,1,152,0,1,10,15,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,0,A,7,0,A,7,5.0,A,7,-15.6,A,7,18,A,7,991,A,7,290,A,7,5.7,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-15.6,A,7,19,A,7,992,A,7,290,A,7,5.7,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-14.4,A,7,23,A,7,992,A,7,280,A,7,4.1,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-14.4,A,7,23,A,7,993,A,7,280,A,7,3.6,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-14.4,A,7,21,A,7,993,A,7,310,A,7,4.6,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-12.8,A,7,25,A,7,993,A,7,320,A,7,3.6,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/23/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-11.7,A,7,28,A,7,993,A,7,340,A,7,5.7,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-10.6,A,7,31,A,7,993,A,7,330,A,7,5.2,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-10.6,A,7,37,A,7,993,A,7,210,A,7,4.1,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-11.1,A,7,32,A,7,994,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-10.6,A,7,33,A,7,994,A,7,270,A,7,3.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-9.4,A,7,45,A,7,995,A,7,280,A,7,3.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-10.0,A,7,41,A,7,996,A,7,260,A,7,2.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-8.3,A,7,52,A,7,996,A,7,280,A,7,2.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,08:00,95,1251,38,1,10,266,1,16,17,1,10,39,1,10,154,1,16,27,1,10,34,1,21,0,A,7,0,A,7,-1.1,A,7,-6.1,A,7,66,A,7,997,A,7,160,A,7,2.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,09:00,332,1403,193,1,10,644,1,16,41,1,10,201,1,10,541,1,16,72,1,10,83,1,21,0,A,7,0,A,7,4.4,A,7,-7.8,A,7,38,A,7,997,A,7,290,A,7,3.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,10:00,531,1403,322,1,10,631,1,16,83,1,10,338,1,10,594,1,16,112,1,10,164,1,21,6,A,7,1,A,7,6.1,A,7,-7.8,A,7,33,A,7,997,A,7,310,A,7,3.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,11:00,676,1403,439,1,10,719,1,16,93,1,10,468,1,10,711,1,16,124,1,10,200,1,21,7,A,7,1,A,7,7.8,A,7,-7.8,A,7,30,A,7,997,A,7,310,A,7,4.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,12:00,755,1403,485,1,10,469,1,16,232,1,10,501,1,10,473,1,16,246,1,10,523,1,21,8,A,7,3,A,7,8.3,A,7,-7.8,A,7,29,A,7,996,A,7,320,A,7,3.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,13:00,762,1403,515,1,10,701,1,16,134,1,10,541,1,10,697,1,16,161,1,10,295,1,21,7,A,7,2,A,7,9.4,A,7,-7.2,A,7,28,A,7,995,A,7,240,A,7,4.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,14:00,698,1403,442,1,10,552,1,16,167,1,10,468,1,10,553,1,16,192,1,10,352,1,21,5,A,7,3,A,7,10.0,A,7,-7.2,A,7,27,A,7,995,A,7,290,A,7,4.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,15:00,567,1403,344,1,10,642,1,16,84,1,10,363,1,10,614,1,16,113,1,10,169,1,21,5,A,7,2,A,7,10.6,A,7,-7.2,A,7,26,A,7,994,A,7,240,A,7,3.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,16:00,378,1403,181,1,10,330,1,16,92,1,10,189,1,10,281,1,16,113,1,10,171,1,21,9,A,7,3,A,7,10.6,A,7,-7.2,A,7,26,A,7,993,A,7,210,A,7,4.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,17:00,145,1403,55,1,10,177,1,16,36,1,10,56,1,10,93,1,16,47,1,10,65,1,21,9,A,7,2,A,7,7.8,A,7,-6.1,A,7,35,A,7,993,A,7,240,A,7,3.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,18:00,1,129,0,1,10,1,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,9,A,7,3,A,7,6.1,A,7,-6.1,A,7,39,A,7,993,A,7,210,A,7,3.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,1,A,7,3.9,A,7,-6.7,A,7,43,A,7,993,A,7,230,A,7,3.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,1,A,7,2.2,A,7,-6.1,A,7,51,A,7,993,A,7,220,A,7,4.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,2.8,A,7,-6.1,A,7,49,A,7,993,A,7,230,A,7,4.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-6.1,A,7,47,A,7,992,A,7,230,A,7,3.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-6.1,A,7,49,A,7,992,A,7,230,A,7,3.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/24/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-6.1,A,7,53,A,7,992,A,7,210,A,7,3.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-6.7,A,7,52,A,7,991,A,7,230,A,7,2.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-6.7,A,7,54,A,7,991,A,7,220,A,7,4.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-6.1,A,7,55,A,7,991,A,7,230,A,7,3.6,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,-0.6,A,7,-6.1,A,7,63,A,7,991,A,7,220,A,7,4.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,0,A,7,-1.1,A,7,-6.1,A,7,66,A,7,991,A,7,240,A,7,4.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,-0.6,A,7,-5.6,A,7,66,A,7,991,A,7,220,A,7,4.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,-0.6,A,7,-5.0,A,7,69,A,7,991,A,7,240,A,7,3.1,A,7,24000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,08:00,91,1228,15,1,10,0,1,16,15,1,10,18,1,10,0,1,16,18,1,10,56,1,21,10,A,7,10,A,7,0.0,A,7,-4.4,A,7,69,A,7,991,A,7,200,A,7,3.1,A,7,24000,B,7,3658,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,09:00,327,1404,101,1,10,75,1,16,83,1,10,110,1,10,63,1,16,95,1,10,181,1,21,10,A,7,8,A,7,2.8,A,7,-3.3,A,7,62,A,7,992,A,7,240,A,7,3.1,A,7,24000,B,7,7620,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,10:00,527,1404,214,1,10,192,1,16,142,1,10,235,1,10,187,1,16,164,1,10,329,1,21,10,A,7,7,A,7,6.1,A,7,-3.3,A,7,49,A,7,992,A,7,240,A,7,6.2,A,7,24000,B,7,7620,A,7,1.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,11:00,672,1404,282,1,10,65,1,16,251,1,10,309,1,10,65,1,16,278,1,10,701,1,21,10,A,7,9,A,7,8.9,A,7,-2.8,A,7,42,A,7,992,A,7,230,A,7,4.1,A,7,24000,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,12:00,751,1404,193,1,10,100,1,16,140,1,10,218,1,10,105,1,16,162,1,10,358,1,21,10,A,7,9,A,7,10.6,A,7,-3.3,A,7,36,A,7,991,A,7,240,A,7,4.1,A,7,24000,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,13:00,759,1404,500,1,10,609,1,16,171,1,10,535,1,10,617,1,16,200,1,10,374,1,21,10,A,7,4,A,7,13.3,A,7,-8.3,A,7,20,A,7,990,A,7,240,A,7,4.6,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,14:00,695,1404,474,1,10,779,1,16,88,1,10,496,1,10,762,1,16,117,1,10,186,1,21,2,A,7,2,A,7,13.9,A,7,-7.8,A,7,20,A,7,990,A,7,210,A,7,6.2,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,15:00,564,1404,363,1,10,652,1,16,100,1,10,377,1,10,618,1,16,128,1,10,196,1,21,3,A,7,3,A,7,14.4,A,7,-8.3,A,7,18,A,7,989,A,7,220,A,7,6.2,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,16:00,376,1404,213,1,10,572,1,16,60,1,10,222,1,10,490,1,16,90,1,10,113,1,21,1,A,7,1,A,7,13.9,A,7,-7.2,A,7,21,A,7,989,A,7,230,A,7,4.6,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,17:00,144,1404,49,1,10,178,1,16,30,1,10,51,1,10,93,1,16,41,1,10,53,1,21,4,A,7,4,A,7,10.0,A,7,-6.7,A,7,28,A,7,989,A,7,230,A,7,3.1,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,18:00,1,129,0,1,10,9,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,2,A,7,2,A,7,9.4,A,7,-8.3,A,7,26,A,7,989,A,7,180,A,7,2.1,A,7,24000,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,5,A,7,8.3,A,7,-7.8,A,7,29,A,7,989,A,7,220,A,7,2.6,A,7,24000,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,7.8,A,7,-6.7,A,7,33,A,7,990,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,6.7,A,7,-5.6,A,7,39,A,7,989,A,7,220,A,7,2.6,A,7,24000,B,7,1981,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,6.7,A,7,-6.1,A,7,37,A,7,990,A,7,240,A,7,3.1,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,5.0,A,7,-5.6,A,7,44,A,7,990,A,7,240,A,7,3.1,A,7,24000,B,7,4572,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/25/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,-4.4,A,7,40,A,7,990,A,7,240,A,7,3.6,A,7,24000,B,7,1829,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,6.7,A,7,-4.4,A,7,43,A,7,990,A,7,270,A,7,1.5,A,7,24000,B,7,2743,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,5.6,A,7,-4.4,A,7,46,A,7,990,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,6.1,A,7,-3.9,A,7,47,A,7,990,A,7,350,A,7,2.6,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,6.7,A,7,-2.8,A,7,49,A,7,990,A,7,330,A,7,3.1,A,7,24000,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,2,A,7,5.6,A,7,-2.2,A,7,56,A,7,990,A,7,20,A,7,3.1,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,4,A,7,5.0,A,7,-2.8,A,7,55,A,7,991,A,7,30,A,7,2.6,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,4.4,A,7,-2.2,A,7,61,A,7,991,A,7,40,A,7,3.1,A,7,24000,B,7,2591,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,08:00,88,1205,36,1,10,51,1,16,32,1,10,39,1,10,25,1,16,37,1,10,66,1,21,10,A,7,5,A,7,5.6,A,7,-1.1,A,7,61,A,7,992,A,7,40,A,7,3.6,A,7,24000,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,09:00,323,1404,116,1,10,100,1,16,93,1,10,126,1,10,83,1,16,107,1,10,202,1,21,10,A,7,9,A,7,7.2,A,7,1.1,A,7,65,A,7,993,A,7,50,A,7,4.1,A,7,24000,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,10:00,523,1404,135,1,10,0,1,16,135,1,10,153,1,10,0,1,16,153,1,10,513,1,21,10,A,7,10,A,7,8.3,A,7,1.7,A,7,63,A,7,993,A,7,50,A,7,5.2,A,7,24000,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,11:00,668,1404,179,1,10,0,1,16,179,1,10,204,1,10,0,1,16,204,1,10,715,1,21,10,A,7,10,A,7,8.9,A,7,0.6,A,7,56,A,7,994,A,7,70,A,7,5.2,A,7,24000,B,7,7620,A,7,1.5,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,12:00,747,1404,203,1,10,0,1,16,203,1,10,232,1,10,0,1,16,232,1,10,833,1,21,10,A,7,10,A,7,8.9,A,7,0.6,A,7,56,A,7,994,A,7,60,A,7,4.1,A,7,24000,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,13:00,755,1404,206,1,10,0,1,16,206,1,10,236,1,10,0,1,16,236,1,10,847,1,21,10,A,7,10,A,7,8.9,A,7,1.1,A,7,58,A,7,992,A,7,60,A,7,4.1,A,7,24000,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,14:00,692,1404,187,1,10,0,1,16,187,1,10,213,1,10,0,1,16,213,1,10,753,1,21,10,A,7,10,A,7,8.9,A,7,1.1,A,7,58,A,7,992,A,7,90,A,7,3.1,A,7,24000,B,7,7620,A,7,1.6,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,15:00,562,1404,117,1,10,0,1,16,117,1,10,135,1,10,0,1,16,135,1,10,480,1,21,10,A,7,10,A,7,8.9,A,7,1.1,A,7,58,A,7,993,A,7,60,A,7,3.6,A,7,24000,B,7,1676,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,16:00,374,1404,72,1,10,0,1,16,72,1,10,83,1,10,0,1,16,83,1,10,277,1,21,10,A,7,10,A,7,8.9,A,7,1.1,A,7,58,A,7,993,A,7,50,A,7,2.1,A,7,16000,B,7,1676,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,17:00,142,1404,22,1,10,0,1,16,22,1,10,25,1,10,0,1,16,25,1,10,80,1,21,10,A,7,10,A,7,8.3,A,7,2.2,A,7,65,A,7,993,A,7,110,A,7,2.6,A,7,16000,B,7,2896,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/26/1994,18:00,1,129,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,10,A,7,7.8,A,7,2.8,A,7,71,A,7,994,A,7,120,A,7,2.1,A,7,19200,B,7,3353,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/26/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,3.3,A,7,76,A,7,994,A,7,140,A,7,2.1,A,7,19200,B,7,3353,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,3.9,A,7,80,A,7,994,A,7,70,A,7,2.6,A,7,24000,B,7,3048,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,02,C,8 -11/26/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,2.2,A,7,70,A,7,994,A,7,130,A,7,2.1,A,7,19200,B,7,2896,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,2.2,A,7,70,A,7,994,A,7,130,A,7,2.1,A,7,19200,B,7,1524,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,2.2,A,7,70,A,7,994,A,7,60,A,7,2.6,A,7,19200,B,7,1524,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/26/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,0.6,A,7,63,A,7,994,A,7,60,A,7,2.6,A,7,19200,B,7,1524,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/27/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,-1.1,A,7,55,A,7,994,A,7,90,A,7,4.1,A,7,24000,B,7,1341,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/27/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,-0.6,A,7,57,A,7,995,A,7,90,A,7,3.1,A,7,24000,B,7,1341,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/27/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,-2.2,A,7,50,A,7,994,A,7,130,A,7,5.2,A,7,24000,B,7,1189,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/27/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,-3.9,A,7,43,A,7,994,A,7,90,A,7,4.6,A,7,24000,B,7,1189,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/27/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,-4.4,A,7,42,A,7,994,A,7,70,A,7,3.6,A,7,24000,B,7,1097,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/27/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,-4.4,A,7,43,A,7,994,A,7,80,A,7,3.6,A,7,24000,B,7,975,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/27/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,1.7,A,7,83,A,7,995,A,7,10,A,7,3.1,A,7,8000,B,7,823,A,7,2.3,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/27/1994,08:00,84,1183,13,1,10,0,1,16,13,1,10,15,1,10,0,1,16,15,1,10,49,1,21,10,A,7,10,A,7,3.3,A,7,1.7,A,7,89,A,7,995,A,7,30,A,7,3.6,A,7,6400,B,7,975,A,7,2.2,E,8,0.000,F,8,0.00,F,8,13,1,D,9,45,C,8 -11/27/1994,09:00,318,1405,51,1,10,0,1,16,51,1,10,59,1,10,0,1,16,59,1,10,199,1,21,10,A,7,10,A,7,3.3,A,7,2.2,A,7,92,A,7,995,A,7,40,A,7,5.2,A,7,6400,B,7,732,A,7,2.2,E,8,0.000,F,8,0.00,F,8,28,1,D,9,45,C,8 -11/27/1994,10:00,519,1405,96,1,10,0,1,16,96,1,10,112,1,10,0,1,16,112,1,10,397,1,21,10,A,7,10,A,7,3.9,A,7,2.8,A,7,93,A,7,996,A,7,40,A,7,4.1,A,7,4000,B,7,610,A,7,2.2,E,8,0.000,F,8,0.00,F,8,20,1,D,9,45,C,8 -11/27/1994,11:00,664,1405,92,1,10,0,1,16,92,1,10,110,1,10,0,1,16,110,1,10,423,1,21,10,A,7,10,A,7,3.9,A,7,2.8,A,7,93,A,7,995,A,7,40,A,7,4.1,A,7,4000,B,7,183,A,7,2.2,E,8,0.000,F,8,0.00,F,8,43,1,D,9,45,C,8 -11/27/1994,12:00,743,1405,106,1,10,0,1,16,106,1,10,128,1,10,0,1,16,128,1,10,498,1,21,10,A,7,10,A,7,3.9,A,7,3.3,A,7,96,A,7,994,A,7,30,A,7,4.1,A,7,4000,B,7,183,A,7,2.2,E,8,0.000,F,8,0.00,F,8,5,1,D,9,45,C,8 -11/27/1994,13:00,752,1405,108,1,10,0,1,16,108,1,10,130,1,10,0,1,16,130,1,10,509,1,21,10,A,7,10,A,7,4.4,A,7,3.9,A,7,97,A,7,993,A,7,50,A,7,5.2,A,7,4000,B,7,152,A,7,2.2,E,8,0.000,F,8,0.00,F,8,10,1,D,9,45,C,8 -11/27/1994,14:00,689,1405,97,1,10,0,1,16,97,1,10,116,1,10,0,1,16,116,1,10,449,1,21,10,A,7,10,A,7,4.4,A,7,3.9,A,7,97,A,7,992,A,7,40,A,7,4.1,A,7,4000,B,7,122,A,7,2.2,E,8,0.000,F,8,0.00,F,8,3,1,D,9,45,C,8 -11/27/1994,15:00,559,1405,74,1,10,0,1,16,74,1,10,88,1,10,0,1,16,88,1,10,329,1,21,10,A,7,10,A,7,4.4,A,7,3.9,A,7,97,A,7,991,A,7,50,A,7,5.2,A,7,2400,B,7,122,A,7,2.2,E,8,0.000,F,8,0.00,F,8,3,1,D,9,45,C,8 -11/27/1994,16:00,372,1405,43,1,10,0,1,16,43,1,10,51,1,10,0,1,16,51,1,10,181,1,21,10,A,7,10,A,7,4.4,A,7,3.9,A,7,97,A,7,991,A,7,40,A,7,4.1,A,7,2400,B,7,91,A,7,2.2,E,8,0.000,F,8,0.00,F,8,3,1,D,9,45,C,8 -11/27/1994,17:00,140,1405,14,1,10,0,1,16,14,1,10,17,1,10,0,1,16,17,1,10,54,1,21,10,A,7,10,A,7,3.9,A,7,3.3,A,7,96,A,7,991,A,7,10,A,7,4.1,A,7,2400,B,7,91,A,7,2.2,E,8,0.000,F,8,0.00,F,8,5,1,D,9,45,C,8 -11/27/1994,18:00,1,105,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,10,A,7,3.9,A,7,3.3,A,7,96,A,7,991,A,7,10,A,7,2.6,A,7,2400,B,7,61,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/27/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,3.3,A,7,96,A,7,990,A,7,30,A,7,3.1,A,7,1600,B,7,61,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/27/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,3.3,A,7,96,A,7,989,A,7,60,A,7,2.6,A,7,2400,B,7,61,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/27/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,3.9,A,7,100,A,7,988,A,7,20,A,7,2.6,A,7,800,B,7,0,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/27/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,3.3,A,7,96,A,7,988,A,7,360,A,7,2.6,A,7,400,B,7,0,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/27/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,3.9,A,7,100,A,7,987,A,7,40,A,7,1.5,A,7,200,B,7,0,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/27/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,3.9,A,7,100,A,7,986,A,7,340,A,7,2.1,A,7,200,B,7,0,A,7,2.1,E,8,0.000,F,8,0.00,F,8,3,1,D,9,45,C,8 -11/28/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,3.9,A,7,100,A,7,985,A,7,320,A,7,2.1,A,7,200,B,7,0,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,3.9,A,7,100,A,7,984,A,7,0,A,7,0.0,A,7,200,B,7,0,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,3.9,A,7,97,A,7,984,A,7,270,A,7,2.1,A,7,200,B,7,0,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,983,A,7,290,A,7,3.1,A,7,200,B,7,0,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,982,A,7,260,A,7,2.6,A,7,200,B,7,0,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,982,A,7,190,A,7,2.6,A,7,200,B,7,0,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,5.0,A,7,100,A,7,981,A,7,190,A,7,3.6,A,7,200,B,7,0,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,08:00,81,1160,8,1,10,0,1,16,8,1,10,10,1,10,0,1,16,10,1,10,32,1,21,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,981,A,7,220,A,7,3.6,A,7,200,B,7,0,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,09:00,314,1405,37,1,10,0,1,16,37,1,10,44,1,10,0,1,16,44,1,10,152,1,21,10,A,7,10,A,7,7.2,A,7,6.7,A,7,97,A,7,981,A,7,270,A,7,4.1,A,7,200,B,7,0,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,10:00,514,1405,70,1,10,0,1,16,70,1,10,83,1,10,0,1,16,83,1,10,305,1,21,10,A,7,10,A,7,7.8,A,7,7.8,A,7,100,A,7,981,A,7,230,A,7,3.1,A,7,200,B,7,0,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,11:00,660,1405,95,1,10,0,1,16,95,1,10,114,1,10,0,1,16,114,1,10,433,1,21,10,A,7,10,A,7,9.4,A,7,9.4,A,7,100,A,7,981,A,7,210,A,7,4.6,A,7,800,B,7,30,A,7,2.0,E,8,0.000,F,8,0.00,F,8,3,1,D,9,45,C,8 -11/28/1994,12:00,740,1405,109,1,10,0,1,16,109,1,10,131,1,10,0,1,16,131,1,10,509,1,21,10,A,7,10,A,7,12.2,A,7,12.2,A,7,100,A,7,979,A,7,210,A,7,7.7,A,7,4800,B,7,152,A,7,2.0,E,8,0.000,F,8,0.00,F,8,8,1,D,9,45,C,8 -11/28/1994,13:00,749,1405,197,1,10,0,1,16,197,1,10,226,1,10,0,1,16,226,1,10,817,1,21,10,A,7,10,A,7,13.9,A,7,13.3,A,7,96,A,7,977,A,7,200,A,7,8.8,A,7,9600,B,7,3658,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,14:00,686,1405,119,1,10,0,1,16,119,1,10,141,1,10,0,1,16,141,1,10,532,1,21,10,A,7,10,A,7,15.0,A,7,13.9,A,7,93,A,7,979,A,7,270,A,7,5.7,A,7,11200,B,7,274,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,21,C,8 -11/28/1994,15:00,557,1405,138,1,10,0,1,16,138,1,10,157,1,10,0,1,16,157,1,10,539,1,21,10,A,7,10,A,7,12.8,A,7,11.7,A,7,93,A,7,980,A,7,250,A,7,6.2,A,7,11200,B,7,3658,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/28/1994,16:00,370,1405,55,1,10,0,1,16,55,1,10,64,1,10,0,1,16,64,1,10,223,1,21,10,A,7,10,A,7,12.8,A,7,11.7,A,7,93,A,7,981,A,7,250,A,7,5.2,A,7,11200,B,7,274,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/28/1994,17:00,139,1405,30,1,10,28,1,16,28,1,10,34,1,10,16,1,16,33,1,10,58,1,21,10,A,7,6,A,7,12.2,A,7,11.1,A,7,93,A,7,982,A,7,240,A,7,4.6,A,7,16000,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/28/1994,18:00,1,105,0,1,10,2,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,5,A,7,11.1,A,7,10.6,A,7,97,A,7,982,A,7,240,A,7,3.6,A,7,16000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/28/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,10.0,A,7,10.0,A,7,100,A,7,983,A,7,240,A,7,3.6,A,7,14400,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/28/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,6,A,7,8.9,A,7,8.3,A,7,96,A,7,984,A,7,240,A,7,2.6,A,7,1600,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,10.6,A,7,10.0,A,7,96,A,7,985,A,7,250,A,7,4.6,A,7,800,B,7,30,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,7.8,A,7,7.2,A,7,96,A,7,985,A,7,270,A,7,2.6,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,6.1,A,7,6.1,A,7,100,A,7,985,A,7,270,A,7,2.1,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/28/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,6.7,A,7,5.6,A,7,93,A,7,985,A,7,290,A,7,2.1,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,3.9,A,7,3.3,A,7,96,A,7,986,A,7,220,A,7,2.6,A,7,800,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,1.7,A,7,1.1,A,7,96,A,7,987,A,7,200,A,7,2.1,A,7,200,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/29/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,3,A,7,1.7,A,7,1.7,A,7,100,A,7,987,A,7,240,A,7,2.1,A,7,1600,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/29/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,1.1,A,7,1.1,A,7,100,A,7,988,A,7,220,A,7,2.1,A,7,16000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/29/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,0.6,A,7,0.0,A,7,96,A,7,988,A,7,200,A,7,2.1,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,1.7,A,7,1.1,A,7,96,A,7,988,A,7,220,A,7,2.1,A,7,24000,B,7,3962,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,5,A,7,1.7,A,7,0.6,A,7,92,A,7,989,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,08:00,78,1136,19,1,10,19,1,16,17,1,10,21,1,10,9,1,16,20,1,10,35,1,21,10,A,7,7,A,7,2.2,A,7,1.1,A,7,92,A,7,990,A,7,40,A,7,2.1,A,7,24000,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,03,C,8 -11/29/1994,09:00,310,1406,103,1,10,104,1,16,80,1,10,112,1,10,85,1,16,94,1,10,173,1,21,10,A,7,8,A,7,5.0,A,7,2.2,A,7,82,A,7,990,A,7,350,A,7,2.6,A,7,24000,B,7,7620,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,10:00,510,1406,199,1,10,128,1,16,152,1,10,216,1,10,123,1,16,171,1,10,350,1,21,10,A,7,9,A,7,6.7,A,7,2.8,A,7,76,A,7,990,A,7,90,A,7,3.1,A,7,24000,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,11:00,656,1406,164,1,10,0,1,16,164,1,10,188,1,10,0,1,16,188,1,10,666,1,21,10,A,7,10,A,7,8.3,A,7,2.2,A,7,65,A,7,991,A,7,60,A,7,2.6,A,7,24000,B,7,7620,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,12:00,736,1406,151,1,10,0,1,16,151,1,10,177,1,10,0,1,16,177,1,10,664,1,21,10,A,7,10,A,7,8.9,A,7,1.7,A,7,61,A,7,991,A,7,0,A,7,0.0,A,7,24000,B,7,2743,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,13:00,746,1406,154,1,10,0,1,16,154,1,10,180,1,10,0,1,16,180,1,10,678,1,21,10,A,7,10,A,7,7.8,A,7,3.9,A,7,76,A,7,990,A,7,0,A,7,0.0,A,7,16000,B,7,2743,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,14:00,684,1406,138,1,10,0,1,16,138,1,10,161,1,10,0,1,16,161,1,10,597,1,21,10,A,7,10,A,7,7.8,A,7,2.8,A,7,71,A,7,991,A,7,180,A,7,3.6,A,7,11200,B,7,2134,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/29/1994,15:00,555,1406,106,1,10,0,1,16,106,1,10,123,1,10,0,1,16,123,1,10,442,1,21,10,A,7,10,A,7,5.6,A,7,2.8,A,7,82,A,7,990,A,7,160,A,7,3.1,A,7,3200,B,7,1676,A,7,2.0,E,8,0.000,F,8,0.00,F,8,23,1,D,9,61,C,8 -11/29/1994,16:00,368,1406,62,1,10,0,1,16,62,1,10,72,1,10,0,1,16,72,1,10,245,1,21,10,A,7,10,A,7,5.0,A,7,3.3,A,7,89,A,7,990,A,7,0,A,7,0.0,A,7,4800,B,7,1829,A,7,2.0,E,8,0.000,F,8,0.00,F,8,10,1,D,9,45,C,8 -11/29/1994,17:00,138,1406,20,1,10,0,1,16,20,1,10,23,1,10,0,1,16,23,1,10,74,1,21,10,A,7,10,A,7,5.0,A,7,3.3,A,7,89,A,7,990,A,7,0,A,7,0.0,A,7,4800,B,7,2134,A,7,2.0,E,8,0.000,F,8,0.00,F,8,18,1,D,9,45,C,8 -11/29/1994,18:00,1,105,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,990,A,7,320,A,7,1.5,A,7,4800,B,7,518,A,7,2.1,E,8,0.000,F,8,0.00,F,8,5,1,D,9,45,C,8 -11/29/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,990,A,7,10,A,7,1.5,A,7,4800,B,7,396,A,7,2.1,E,8,0.000,F,8,0.00,F,8,8,1,D,9,45,C,8 -11/29/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,991,A,7,250,A,7,1.5,A,7,11200,B,7,427,A,7,2.1,E,8,0.000,F,8,0.00,F,8,3,1,D,9,45,C,8 -11/29/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,92,A,7,990,A,7,0,A,7,0.0,A,7,24000,B,7,427,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,61,C,8 -11/29/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,5.0,A,7,96,A,7,990,A,7,0,A,7,0.0,A,7,12800,B,7,457,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,92,A,7,990,A,7,290,A,7,2.6,A,7,12800,B,7,1676,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/29/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,5.0,A,7,96,A,7,990,A,7,240,A,7,2.6,A,7,4800,B,7,1676,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,5.0,A,7,96,A,7,989,A,7,260,A,7,2.6,A,7,4800,B,7,1676,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/30/1994,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,92,A,7,989,A,7,280,A,7,3.1,A,7,14400,B,7,1676,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,45,C,8 -11/30/1994,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,3.9,A,7,89,A,7,989,A,7,280,A,7,2.6,A,7,19200,B,7,2134,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,3.9,A,7,89,A,7,989,A,7,280,A,7,2.6,A,7,19200,B,7,2743,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,7,A,7,4.4,A,7,3.3,A,7,93,A,7,990,A,7,280,A,7,2.1,A,7,19200,B,7,2896,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,3.9,A,7,2.8,A,7,93,A,7,990,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,2.2,A,7,1.1,A,7,92,A,7,991,A,7,320,A,7,2.6,A,7,19200,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,08:00,75,1113,25,1,10,10,1,16,24,1,10,27,1,10,6,1,16,27,1,10,57,1,21,8,A,7,3,A,7,2.2,A,7,0.6,A,7,89,A,7,991,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,02,C,8 -11/30/1994,09:00,306,1406,131,1,10,232,1,16,81,1,10,139,1,10,182,1,16,99,1,10,156,1,21,7,A,7,2,A,7,6.1,A,7,1.7,A,7,73,A,7,991,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,2.2,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,10:00,506,1406,269,1,10,329,1,16,151,1,10,285,1,10,316,1,16,171,1,10,315,1,21,8,A,7,3,A,7,10.0,A,7,0.0,A,7,50,A,7,992,A,7,330,A,7,2.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,11:00,652,1406,368,1,10,479,1,16,146,1,10,392,1,10,474,1,16,171,1,10,297,1,21,6,A,7,1,A,7,11.1,A,7,-1.7,A,7,40,A,7,993,A,7,320,A,7,3.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,12:00,733,1406,461,1,10,606,1,16,145,1,10,479,1,10,596,1,16,167,1,10,306,1,21,3,A,7,1,A,7,12.8,A,7,-1.7,A,7,36,A,7,992,A,7,320,A,7,4.6,A,7,24000,B,7,77777,A,7,2.1,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,13:00,743,1406,461,1,10,621,1,16,132,1,10,482,1,10,615,1,16,156,1,10,286,1,21,2,A,7,1,A,7,13.3,A,7,-4.4,A,7,28,A,7,991,A,7,330,A,7,3.1,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,14:00,681,1406,417,1,10,574,1,16,138,1,10,431,1,10,558,1,16,160,1,10,280,1,21,3,A,7,1,A,7,13.9,A,7,-4.4,A,7,27,A,7,990,A,7,330,A,7,2.6,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,15:00,553,1406,311,1,10,518,1,16,107,1,10,321,1,10,486,1,16,129,1,10,205,1,21,2,A,7,1,A,7,13.9,A,7,-4.4,A,7,27,A,7,990,A,7,330,A,7,3.1,A,7,24000,B,7,77777,A,7,2.0,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,16:00,367,1406,178,1,10,344,1,16,89,1,10,186,1,10,289,1,16,111,1,10,165,1,21,3,A,7,1,A,7,13.3,A,7,-3.3,A,7,30,A,7,991,A,7,300,A,7,3.1,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,17:00,137,1406,42,1,10,84,1,16,34,1,10,45,1,10,40,1,16,41,1,10,62,1,21,2,A,7,1,A,7,11.1,A,7,-3.9,A,7,33,A,7,991,A,7,290,A,7,2.1,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,18:00,1,105,0,1,10,0,1,16,0,1,10,0,1,10,0,1,16,0,1,10,0,1,21,3,A,7,1,A,7,7.2,A,7,-1.1,A,7,55,A,7,992,A,7,240,A,7,2.6,A,7,24000,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-0.6,A,7,59,A,7,992,A,7,320,A,7,2.6,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-1.1,A,7,64,A,7,993,A,7,0,A,7,0.0,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-0.6,A,7,67,A,7,994,A,7,270,A,7,2.1,A,7,24000,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.1,A,7,-0.7,A,7,63,A,7,994,A,7,330,A,7,2.2,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.2,A,7,-1.0,A,7,69,A,7,994,A,7,290,A,7,2.4,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -11/30/1994,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.3,A,7,-1.2,A,7,70,A,7,995,A,7,330,A,7,2.5,A,7,24000,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,F,8,0,1,D,9,00,C,8 -12/01/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.3,A,7,-1.4,A,7,58,A,7,990,A,7,220,A,7,2.7,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/01/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.4,A,7,-1.6,A,7,58,A,7,990,A,7,220,A,7,2.8,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.5,A,7,-1.9,A,7,58,A,7,990,A,7,220,A,7,3.0,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,-2.2,A,7,58,A,7,989,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-2.2,A,7,60,A,7,989,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-2.2,A,7,62,A,7,990,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,3.3,A,7,-2.2,A,7,67,A,7,990,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/01/1980,08:00,70,1091,34,1,13,144,1,9,21,1,13,33,1,13,60,1,9,29,1,13,37,1,21,4,A,7,0,A,7,4.4,A,7,-1.7,A,7,65,A,7,990,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,09:00,300,1407,153,1,13,465,1,9,53,1,13,157,1,13,366,1,9,79,1,13,96,1,21,5,A,7,1,A,7,7.2,A,7,-1.1,A,7,56,A,7,990,A,7,240,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,10:00,501,1407,322,1,9,729,1,9,62,1,13,335,1,9,678,1,9,93,1,13,126,1,18,2,A,7,0,A,7,10.6,A,7,-0.6,A,7,46,A,7,991,A,7,230,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,11:00,647,1407,451,1,9,815,1,9,75,1,13,475,1,9,793,1,9,109,1,13,161,1,18,2,A,7,0,A,7,12.8,A,7,-1.1,A,7,39,A,7,991,A,7,220,A,7,5.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,12:00,728,1407,520,1,9,844,1,9,82,1,13,550,1,9,834,1,9,117,1,13,184,1,18,2,A,7,0,A,7,15.6,A,7,0.0,A,7,35,A,7,990,A,7,240,A,7,5.7,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,13:00,739,1407,532,1,9,849,1,9,83,1,13,561,1,9,840,1,9,119,1,13,187,1,18,2,A,7,0,A,7,16.7,A,7,0.0,A,7,32,A,7,989,A,7,220,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/01/1980,14:00,678,1407,449,1,9,716,1,9,102,1,13,473,1,9,705,1,9,132,1,13,217,1,18,5,A,7,1,A,7,17.8,A,7,0.6,A,7,32,A,7,989,A,7,200,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,15:00,551,1407,351,1,9,673,1,9,85,1,13,366,1,9,638,1,9,115,1,13,169,1,18,5,A,7,2,A,7,17.8,A,7,0.0,A,7,30,A,7,989,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,16:00,365,1407,200,1,9,537,1,9,58,1,13,205,1,9,455,1,9,87,1,13,109,1,18,3,A,7,1,A,7,17.8,A,7,0.0,A,7,30,A,7,989,A,7,200,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,17:00,136,1407,51,1,13,210,1,9,30,1,13,53,1,13,106,1,9,42,1,13,53,1,21,3,A,7,1,A,7,14.4,A,7,0.6,A,7,39,A,7,989,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,18:00,0,82,1,1,13,3,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,3,A,7,1,A,7,12.2,A,7,0.0,A,7,43,A,7,989,A,7,190,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.1,A,7,0.0,A,7,47,A,7,990,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/01/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,0.0,A,7,52,A,7,990,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,0.0,A,7,52,A,7,990,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,0.0,A,7,52,A,7,990,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,8.9,A,7,-0.6,A,7,52,A,7,990,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/01/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,2,A,7,7.2,A,7,-0.6,A,7,58,A,7,989,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,0,A,7,6.7,A,7,-1.1,A,7,58,A,7,989,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/02/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-1.1,A,7,60,A,7,989,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-1.1,A,7,60,A,7,989,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,6.1,A,7,-1.1,A,7,60,A,7,988,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,2,A,7,5.6,A,7,-0.6,A,7,65,A,7,988,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,1,A,7,5.6,A,7,-1.1,A,7,63,A,7,988,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,6.1,A,7,-1.1,A,7,60,A,7,988,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/02/1980,08:00,67,1068,27,1,13,24,1,9,25,1,13,29,1,13,14,1,9,28,1,13,58,1,21,8,A,7,3,A,7,7.8,A,7,-1.1,A,7,54,A,7,988,A,7,230,A,7,4.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,09:00,296,1408,135,1,13,331,1,9,66,1,13,142,1,13,255,1,9,88,1,13,120,1,21,5,A,7,4,A,7,9.4,A,7,-1.1,A,7,48,A,7,987,A,7,220,A,7,5.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,10:00,497,1408,290,1,9,577,1,9,85,1,13,301,1,9,532,1,9,112,1,13,163,1,18,2,A,7,2,A,7,12.8,A,7,0.0,A,7,42,A,7,987,A,7,240,A,7,6.2,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,11:00,643,1408,411,1,9,732,1,9,75,1,13,432,1,9,711,1,9,105,1,13,160,1,18,1,A,7,1,A,7,15.0,A,7,1.7,A,7,41,A,7,987,A,7,220,A,7,7.2,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,12:00,725,1408,504,1,9,792,1,9,94,1,13,524,1,9,777,1,9,123,1,13,199,1,18,0,A,7,0,A,7,16.7,A,7,2.8,A,7,40,A,7,985,A,7,230,A,7,6.7,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,13:00,736,1408,518,1,9,804,1,9,95,1,13,539,1,9,790,1,9,124,1,13,202,1,18,0,A,7,0,A,7,17.8,A,7,3.9,A,7,40,A,7,983,A,7,220,A,7,7.7,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/02/1980,14:00,676,1408,463,1,9,773,1,9,89,1,13,479,1,9,752,1,9,117,1,13,183,1,18,0,A,7,0,A,7,18.3,A,7,6.1,A,7,45,A,7,983,A,7,200,A,7,6.7,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,15:00,549,1408,354,1,9,706,1,9,76,1,13,372,1,9,672,1,9,109,1,13,153,1,18,0,A,7,0,A,7,18.3,A,7,7.2,A,7,49,A,7,982,A,7,200,A,7,6.7,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,16:00,364,1408,203,1,9,556,1,9,57,1,13,209,1,9,471,1,9,87,1,13,107,1,18,0,A,7,0,A,7,18.3,A,7,7.2,A,7,49,A,7,982,A,7,200,A,7,7.2,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,17:00,135,1408,49,1,13,204,1,9,29,1,13,51,1,13,103,1,9,41,1,13,51,1,21,1,A,7,1,A,7,17.2,A,7,6.7,A,7,50,A,7,981,A,7,220,A,7,6.2,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,18:00,0,82,0,1,13,0,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,6,A,7,4,A,7,16.1,A,7,7.2,A,7,56,A,7,981,A,7,220,A,7,5.2,A,7,24100,B,7,2590,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,16.1,A,7,7.8,A,7,58,A,7,982,A,7,240,A,7,4.1,A,7,24100,B,7,1830,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/02/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,16.1,A,7,9.4,A,7,65,A,7,983,A,7,240,A,7,4.1,A,7,24100,B,7,1680,A,7,1.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,12.2,A,7,-1.7,A,7,38,A,7,984,A,7,300,A,7,7.7,A,7,24100,B,7,1680,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,10.0,A,7,-3.9,A,7,38,A,7,986,A,7,320,A,7,6.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,-3.3,A,7,49,A,7,987,A,7,330,A,7,5.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/02/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,-3.3,A,7,55,A,7,988,A,7,320,A,7,6.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-5.0,A,7,51,A,7,989,A,7,300,A,7,7.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/03/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-5.6,A,7,53,A,7,990,A,7,320,A,7,5.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-5.6,A,7,57,A,7,991,A,7,340,A,7,4.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-6.1,A,7,57,A,7,991,A,7,320,A,7,4.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-6.1,A,7,59,A,7,992,A,7,300,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-6.1,A,7,61,A,7,993,A,7,260,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-6.7,A,7,59,A,7,994,A,7,310,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/03/1980,08:00,65,1044,31,1,13,134,1,9,19,1,13,30,1,13,54,1,9,26,1,13,33,1,21,0,A,7,0,A,7,1.1,A,7,-6.1,A,7,59,A,7,995,A,7,300,A,7,5.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,09:00,292,1408,135,1,13,358,1,9,61,1,13,143,1,13,274,1,9,86,1,13,110,1,21,5,A,7,2,A,7,2.8,A,7,-6.1,A,7,52,A,7,997,A,7,300,A,7,6.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,10:00,493,1408,314,1,9,653,1,9,84,1,13,326,1,9,601,1,9,114,1,13,161,1,18,5,A,7,2,A,7,4.4,A,7,-6.7,A,7,45,A,7,998,A,7,300,A,7,7.2,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,11:00,640,1408,419,1,9,749,1,9,77,1,13,439,1,9,726,1,9,107,1,13,162,1,18,3,A,7,1,A,7,5.6,A,7,-7.2,A,7,40,A,7,998,A,7,310,A,7,7.7,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,12:00,722,1408,479,1,9,718,1,9,109,1,13,506,1,9,713,1,9,139,1,13,238,1,18,7,A,7,1,A,7,6.7,A,7,-7.8,A,7,35,A,7,998,A,7,320,A,7,6.7,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,13:00,734,1408,485,1,9,665,1,9,137,1,13,505,1,9,655,1,9,162,1,13,292,1,18,8,A,7,2,A,7,8.3,A,7,-8.3,A,7,30,A,7,998,A,7,340,A,7,6.7,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/03/1980,14:00,674,1408,458,1,9,676,1,9,132,1,13,473,1,9,657,1,9,157,1,13,268,1,18,8,A,7,2,A,7,8.9,A,7,-8.9,A,7,28,A,7,997,A,7,320,A,7,5.7,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,15:00,547,1408,361,1,9,645,1,9,108,1,13,370,1,9,603,1,9,135,1,13,205,1,18,8,A,7,2,A,7,9.4,A,7,-10.0,A,7,25,A,7,997,A,7,350,A,7,6.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,16:00,363,1408,201,1,9,545,1,9,59,1,13,207,1,9,460,1,9,88,1,13,110,1,18,4,A,7,1,A,7,8.9,A,7,-9.4,A,7,27,A,7,997,A,7,340,A,7,5.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,17:00,134,1408,57,1,13,301,1,9,27,1,13,57,1,13,165,1,9,41,1,13,48,1,21,0,A,7,0,A,7,7.2,A,7,-8.9,A,7,31,A,7,997,A,7,330,A,7,3.6,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,18:00,0,82,2,1,13,1,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,3.9,A,7,-7.8,A,7,43,A,7,997,A,7,330,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-7.2,A,7,50,A,7,997,A,7,120,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/03/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-7.2,A,7,54,A,7,998,A,7,260,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-8.9,A,7,48,A,7,998,A,7,350,A,7,3.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-7.2,A,7,59,A,7,999,A,7,10,A,7,1.5,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.7,A,7,-7.8,A,7,63,A,7,998,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/03/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.2,A,7,-7.8,A,7,66,A,7,999,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-6.7,A,7,75,A,7,999,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/04/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-4.4,A,7,-6.7,A,7,85,A,7,999,A,7,70,A,7,2.1,A,7,32200,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-6.7,A,7,78,A,7,999,A,7,30,A,7,1.5,A,7,32200,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-7.8,A,7,75,A,7,998,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.0,A,7,-7.8,A,7,81,A,7,998,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.0,A,7,-7.2,A,7,85,A,7,998,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-8.3,A,7,84,A,7,998,A,7,60,A,7,2.1,A,7,32200,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/04/1980,08:00,62,1021,36,1,13,210,1,9,16,1,13,31,1,13,98,1,9,24,1,13,29,1,21,0,A,7,0,A,7,-3.9,A,7,-7.8,A,7,75,A,7,999,A,7,340,A,7,2.1,A,7,32200,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,09:00,289,1409,167,1,13,652,1,9,33,1,13,177,1,13,535,1,9,66,1,13,73,1,21,0,A,7,0,A,7,1.7,A,7,-7.2,A,7,52,A,7,999,A,7,20,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,10:00,490,1409,333,1,9,822,1,9,46,1,13,351,1,9,762,1,9,85,1,13,110,1,18,0,A,7,0,A,7,3.9,A,7,-8.9,A,7,39,A,7,1000,A,7,50,A,7,2.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,11:00,637,1409,460,1,9,890,1,9,56,1,13,484,1,9,858,1,9,94,1,13,135,1,18,0,A,7,0,A,7,6.7,A,7,-10.0,A,7,30,A,7,999,A,7,130,A,7,1.5,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,12:00,719,1409,530,1,9,909,1,9,64,1,13,556,1,9,888,1,9,101,1,13,153,1,18,1,A,7,0,A,7,7.8,A,7,-10.0,A,7,27,A,7,998,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,13:00,731,1409,507,1,9,842,1,9,67,1,13,530,1,9,824,1,9,101,1,13,157,1,18,3,A,7,1,A,7,9.4,A,7,-10.0,A,7,25,A,7,997,A,7,180,A,7,3.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/04/1980,14:00,672,1409,449,1,9,773,1,9,77,1,13,471,1,9,756,1,9,109,1,13,167,1,18,6,A,7,1,A,7,10.0,A,7,-10.0,A,7,24,A,7,996,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,15:00,546,1409,347,1,9,698,1,9,74,1,13,356,1,9,656,1,9,101,1,13,145,1,18,7,A,7,1,A,7,11.1,A,7,-9.4,A,7,23,A,7,995,A,7,290,A,7,2.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,16:00,362,1409,143,1,13,171,1,9,98,1,13,150,1,13,145,1,9,113,1,13,192,1,21,8,A,7,3,A,7,11.1,A,7,-9.4,A,7,23,A,7,995,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,17:00,134,1409,49,1,13,133,1,9,36,1,13,51,1,13,62,1,9,45,1,13,67,1,21,8,A,7,4,A,7,11.1,A,7,-8.3,A,7,25,A,7,995,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,18:00,0,82,2,1,13,1,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,8,A,7,4,A,7,8.3,A,7,-8.9,A,7,29,A,7,995,A,7,200,A,7,1.5,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,4.4,A,7,-7.8,A,7,41,A,7,995,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/04/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,4.4,A,7,-7.2,A,7,43,A,7,995,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,3.3,A,7,-6.1,A,7,50,A,7,995,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,2.8,A,7,-7.8,A,7,46,A,7,995,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-5.6,A,7,59,A,7,995,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/04/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-3.3,A,7,73,A,7,994,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-5.6,A,7,55,A,7,994,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/05/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-5.0,A,7,57,A,7,993,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-3.9,A,7,72,A,7,993,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-6.1,A,7,64,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-2.8,A,7,82,A,7,992,A,7,80,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.1,A,7,-4.4,A,7,78,A,7,993,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,-1.7,A,7,-5.6,A,7,75,A,7,993,A,7,240,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/05/1980,08:00,59,998,29,1,13,127,1,9,17,1,13,27,1,13,50,1,9,24,1,13,30,1,21,3,A,7,2,A,7,-1.1,A,7,-5.6,A,7,72,A,7,994,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,09:00,285,1409,120,1,13,230,1,9,74,1,13,128,1,13,174,1,9,92,1,13,141,1,21,6,A,7,5,A,7,5.0,A,7,-2.8,A,7,58,A,7,994,A,7,360,A,7,1.5,A,7,16100,B,7,2130,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,10:00,486,1409,205,1,13,190,1,9,139,1,13,223,1,13,181,1,9,160,1,13,317,1,21,7,A,7,6,A,7,7.2,A,7,-3.3,A,7,47,A,7,995,A,7,10,A,7,3.1,A,7,16100,B,7,2130,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,11:00,634,1409,322,1,13,365,1,9,157,1,13,338,1,13,359,1,9,176,1,13,319,1,21,7,A,7,6,A,7,8.9,A,7,-2.2,A,7,46,A,7,994,A,7,90,A,7,1.5,A,7,16100,B,7,3050,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,12:00,716,1409,475,1,13,599,1,9,169,1,13,503,1,13,602,1,9,196,1,13,359,1,21,8,A,7,7,A,7,11.1,A,7,-2.8,A,7,38,A,7,994,A,7,60,A,7,3.1,A,7,16100,B,7,1680,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/05/1980,13:00,729,1409,356,1,13,250,1,9,226,1,13,379,1,13,260,1,9,244,1,13,526,1,21,7,A,7,6,A,7,11.7,A,7,-3.9,A,7,34,A,7,993,A,7,50,A,7,2.6,A,7,16100,B,7,1680,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/05/1980,14:00,670,1409,461,1,13,729,1,9,112,1,13,482,1,13,714,1,9,141,1,13,233,1,21,5,A,7,4,A,7,12.2,A,7,-4.4,A,7,31,A,7,992,A,7,180,A,7,2.1,A,7,16100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,15:00,545,1409,233,1,13,216,1,9,149,1,13,248,1,13,212,1,9,166,1,13,310,1,21,6,A,7,6,A,7,13.9,A,7,-5.0,A,7,27,A,7,992,A,7,170,A,7,2.6,A,7,16100,B,7,3050,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,16:00,361,1409,133,1,13,138,1,9,97,1,13,144,1,13,119,1,9,114,1,13,213,1,21,6,A,7,6,A,7,14.4,A,7,-6.1,A,7,24,A,7,992,A,7,230,A,7,1.5,A,7,16100,B,7,3050,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,17:00,133,1409,52,1,13,81,1,9,44,1,13,55,1,13,43,1,9,51,1,13,92,1,21,6,A,7,6,A,7,12.2,A,7,-5.0,A,7,30,A,7,992,A,7,190,A,7,1.5,A,7,16100,B,7,3050,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,18:00,0,82,2,1,13,1,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,5,A,7,5,A,7,10.0,A,7,-3.3,A,7,39,A,7,992,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,8.3,A,7,-1.1,A,7,52,A,7,992,A,7,50,A,7,1.5,A,7,16100,B,7,2290,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/05/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,5.6,A,7,0.0,A,7,68,A,7,993,A,7,20,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,5.0,A,7,-0.6,A,7,68,A,7,992,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,-0.6,A,7,65,A,7,992,A,7,230,A,7,1.5,A,7,24100,B,7,2740,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,0.0,A,7,65,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,2740,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/05/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,5.6,A,7,-1.1,A,7,63,A,7,993,A,7,210,A,7,1.5,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-0.6,A,7,76,A,7,992,A,7,250,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/06/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,6,A,7,4.4,A,7,0.0,A,7,73,A,7,992,A,7,0,A,7,0.0,A,7,16100,B,7,7620,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,0.6,A,7,73,A,7,992,A,7,0,A,7,0.0,A,7,24100,B,7,2290,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,6,A,7,5.0,A,7,0.6,A,7,73,A,7,992,A,7,0,A,7,0.0,A,7,16100,B,7,3050,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,5,A,7,4.4,A,7,1.1,A,7,79,A,7,992,A,7,0,A,7,0.0,A,7,16100,B,7,3050,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,3.3,A,7,0.0,A,7,79,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,3050,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,3.9,A,7,-0.6,A,7,73,A,7,993,A,7,0,A,7,0.0,A,7,16100,B,7,2590,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/06/1980,08:00,57,975,26,1,13,59,1,9,20,1,13,25,1,13,20,1,9,24,1,13,35,1,21,5,A,7,5,A,7,3.3,A,7,0.6,A,7,82,A,7,994,A,7,50,A,7,1.5,A,7,6400,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/06/1980,09:00,281,1409,136,1,13,393,1,9,57,1,13,138,1,13,298,1,9,78,1,13,101,1,21,4,A,7,3,A,7,6.7,A,7,-0.6,A,7,60,A,7,994,A,7,200,A,7,2.6,A,7,9700,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/06/1980,10:00,483,1409,301,1,9,664,1,9,73,1,13,316,1,9,611,1,9,105,1,13,142,1,18,3,A,7,2,A,7,10.0,A,7,-0.6,A,7,48,A,7,994,A,7,220,A,7,2.1,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,11:00,630,1409,278,1,13,223,1,9,177,1,13,296,1,13,226,1,9,194,1,13,383,1,21,6,A,7,5,A,7,13.3,A,7,0.0,A,7,40,A,7,994,A,7,0,A,7,0.0,A,7,11300,B,7,2590,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,12:00,714,1409,428,1,13,555,1,9,145,1,13,459,1,13,558,1,9,175,1,13,303,1,21,5,A,7,4,A,7,15.6,A,7,-1.7,A,7,31,A,7,993,A,7,300,A,7,2.1,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,13:00,727,1409,496,1,9,843,1,9,59,1,13,521,1,9,825,1,9,94,1,13,148,1,18,1,A,7,1,A,7,17.2,A,7,0.0,A,7,31,A,7,992,A,7,180,A,7,2.1,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -12/06/1980,14:00,669,1409,404,1,9,652,1,9,92,1,13,427,1,9,643,1,9,121,1,13,197,1,18,1,A,7,1,A,7,19.4,A,7,-0.6,A,7,26,A,7,992,A,7,210,A,7,2.6,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,15:00,544,1409,355,1,9,710,1,9,79,1,13,373,1,9,673,1,9,112,1,13,158,1,18,2,A,7,2,A,7,20.0,A,7,-1.1,A,7,24,A,7,992,A,7,250,A,7,3.1,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,16:00,360,1409,213,1,9,658,1,9,43,1,13,220,1,9,566,1,9,75,1,13,88,1,18,1,A,7,0,A,7,19.4,A,7,0.0,A,7,27,A,7,992,A,7,230,A,7,3.1,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,17:00,133,1409,58,1,13,364,1,9,23,1,13,57,1,13,219,1,9,37,1,13,42,1,21,0,A,7,0,A,7,17.2,A,7,0.6,A,7,33,A,7,992,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,18:00,0,82,3,1,13,3,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,13.3,A,7,1.1,A,7,44,A,7,992,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,12.2,A,7,1.1,A,7,47,A,7,993,A,7,240,A,7,3.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/06/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,10.6,A,7,1.1,A,7,52,A,7,993,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,0.6,A,7,54,A,7,993,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,9.4,A,7,0.6,A,7,54,A,7,993,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,0.6,A,7,58,A,7,993,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/06/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,0.0,A,7,54,A,7,993,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,0.0,A,7,63,A,7,992,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/07/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.9,A,7,-1.1,A,7,50,A,7,993,A,7,40,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,0.0,A,7,68,A,7,993,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,0.0,A,7,70,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,0.0,A,7,73,A,7,993,A,7,290,A,7,1.5,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,1.1,A,7,79,A,7,993,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,3.9,A,7,0.0,A,7,76,A,7,993,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/07/1980,08:00,55,952,30,1,13,138,1,9,17,1,13,27,1,13,53,1,9,24,1,13,30,1,21,6,A,7,1,A,7,5.0,A,7,0.0,A,7,70,A,7,994,A,7,0,A,7,0.0,A,7,12900,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,09:00,278,1410,152,1,13,573,1,9,39,1,13,155,1,13,452,1,9,66,1,13,75,1,21,5,A,7,0,A,7,10.6,A,7,5.0,A,7,69,A,7,994,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,10:00,480,1410,287,1,9,588,1,9,86,1,13,297,1,9,536,1,9,113,1,13,162,1,18,8,A,7,1,A,7,16.7,A,7,5.0,A,7,46,A,7,994,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,11:00,628,1410,399,1,9,652,1,9,107,1,13,416,1,9,631,1,9,134,1,13,217,1,18,8,A,7,2,A,7,20.6,A,7,6.7,A,7,41,A,7,994,A,7,340,A,7,3.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,12:00,711,1410,473,1,9,776,1,9,80,1,13,500,1,9,764,1,9,113,1,13,178,1,18,4,A,7,1,A,7,22.2,A,7,9.4,A,7,44,A,7,993,A,7,310,A,7,2.6,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,13:00,725,1410,522,1,9,897,1,9,58,1,13,548,1,9,877,1,9,95,1,13,147,1,18,1,A,7,0,A,7,22.8,A,7,8.9,A,7,41,A,7,993,A,7,240,A,7,4.1,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -12/07/1980,14:00,667,1410,476,1,9,889,1,9,52,1,13,501,1,9,862,1,9,91,1,13,134,1,18,0,A,7,0,A,7,23.3,A,7,7.8,A,7,37,A,7,992,A,7,240,A,7,3.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,15:00,543,1410,367,1,9,830,1,9,44,1,13,386,1,9,783,1,9,83,1,13,113,1,18,0,A,7,0,A,7,23.3,A,7,8.9,A,7,40,A,7,992,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,16:00,360,1410,219,1,9,717,1,9,34,1,13,231,1,9,623,1,9,71,1,13,84,1,18,0,A,7,0,A,7,22.2,A,7,10.0,A,7,46,A,7,992,A,7,240,A,7,2.6,A,7,24100,B,7,77777,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,17:00,133,1410,62,1,13,438,1,9,19,1,13,64,1,13,286,1,9,37,1,13,39,1,21,0,A,7,0,A,7,18.9,A,7,8.3,A,7,51,A,7,992,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,18:00,0,82,5,1,13,5,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,16.1,A,7,7.8,A,7,58,A,7,992,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,15.0,A,7,7.8,A,7,62,A,7,992,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/07/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,12.8,A,7,6.1,A,7,64,A,7,992,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,13.3,A,7,4.4,A,7,55,A,7,992,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,3.3,A,7,57,A,7,992,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,2.8,A,7,55,A,7,992,A,7,240,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/07/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,1.7,A,7,51,A,7,991,A,7,250,A,7,2.6,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,11.7,A,7,2.2,A,7,53,A,7,991,A,7,250,A,7,3.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/08/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,8.3,A,7,2.8,A,7,68,A,7,991,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.8,A,7,3.3,A,7,74,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.6,A,7,2.8,A,7,83,A,7,991,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,2.8,A,7,86,A,7,991,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,3.3,A,7,93,A,7,991,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,3.3,A,7,1.7,A,7,89,A,7,991,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/08/1980,08:00,52,952,23,1,13,69,1,9,16,1,13,22,1,13,23,1,9,20,1,13,27,1,21,6,A,7,2,A,7,4.4,A,7,2.2,A,7,86,A,7,991,A,7,210,A,7,2.1,A,7,11300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,09:00,274,1410,110,1,13,214,1,9,68,1,13,116,1,13,159,1,9,85,1,13,128,1,21,9,A,7,3,A,7,10.0,A,7,4.4,A,7,69,A,7,991,A,7,210,A,7,2.1,A,7,11300,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,10:00,476,1410,300,1,9,701,1,9,62,1,13,310,1,9,643,1,9,92,1,13,123,1,18,3,A,7,0,A,7,15.6,A,7,4.4,A,7,48,A,7,991,A,7,220,A,7,2.6,A,7,11300,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,11:00,625,1410,428,1,9,800,1,9,72,1,13,450,1,9,774,1,9,105,1,13,154,1,18,2,A,7,0,A,7,19.4,A,7,3.9,A,7,36,A,7,990,A,7,240,A,7,3.6,A,7,11300,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,12:00,709,1410,505,1,9,852,1,9,74,1,13,526,1,9,830,1,9,108,1,13,157,1,18,1,A,7,0,A,7,20.6,A,7,2.2,A,7,30,A,7,989,A,7,200,A,7,3.6,A,7,11300,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,13:00,723,1410,512,1,9,828,1,9,85,1,13,538,1,9,816,1,9,118,1,13,187,1,18,3,A,7,0,A,7,22.2,A,7,5.0,A,7,33,A,7,987,A,7,220,A,7,4.1,A,7,11300,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/08/1980,14:00,666,1410,466,1,9,789,1,9,91,1,13,481,1,9,764,1,9,118,1,13,183,1,18,5,A,7,0,A,7,22.2,A,7,3.9,A,7,30,A,7,987,A,7,220,A,7,4.1,A,7,11300,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,15:00,542,1410,337,1,9,647,1,9,86,1,13,351,1,9,611,1,9,115,1,13,170,1,18,7,A,7,1,A,7,22.2,A,7,4.4,A,7,31,A,7,986,A,7,230,A,7,4.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,16:00,360,1410,183,1,9,372,1,9,87,1,13,190,1,9,310,1,9,110,1,13,161,1,18,9,A,7,2,A,7,21.7,A,7,4.4,A,7,33,A,7,986,A,7,220,A,7,4.6,A,7,24100,B,7,77777,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,17:00,133,1410,49,1,13,159,1,9,33,1,13,50,1,13,79,1,9,42,1,13,59,1,21,7,A,7,2,A,7,18.9,A,7,6.1,A,7,43,A,7,985,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,18:00,0,82,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,8,A,7,3,A,7,15.6,A,7,6.1,A,7,54,A,7,986,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,14.4,A,7,7.2,A,7,62,A,7,987,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/08/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,13.3,A,7,7.8,A,7,69,A,7,986,A,7,220,A,7,4.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,12.2,A,7,7.2,A,7,72,A,7,986,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,1,A,7,13.3,A,7,7.8,A,7,69,A,7,985,A,7,230,A,7,5.2,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,1,A,7,12.8,A,7,7.8,A,7,72,A,7,985,A,7,220,A,7,4.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/08/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,11.1,A,7,7.2,A,7,77,A,7,985,A,7,230,A,7,4.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,11.1,A,7,7.8,A,7,80,A,7,985,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/09/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,9.4,A,7,7.2,A,7,86,A,7,985,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,10.6,A,7,7.8,A,7,83,A,7,985,A,7,230,A,7,3.6,A,7,24100,B,7,77777,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,5,A,7,10.0,A,7,6.7,A,7,80,A,7,984,A,7,200,A,7,3.6,A,7,24100,B,7,7620,A,7,1.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,9.4,A,7,7.8,A,7,89,A,7,984,A,7,220,A,7,3.1,A,7,24100,B,7,3660,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,10.0,A,7,7.8,A,7,86,A,7,984,A,7,210,A,7,2.6,A,7,24100,B,7,3660,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,8,A,7,11.7,A,7,7.8,A,7,77,A,7,985,A,7,220,A,7,3.1,A,7,24100,B,7,3660,A,7,1.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/09/1980,08:00,50,929,24,1,13,14,1,9,23,1,13,26,1,13,8,1,9,26,1,13,53,1,21,9,A,7,8,A,7,11.7,A,7,7.8,A,7,77,A,7,985,A,7,210,A,7,3.1,A,7,24100,B,7,3660,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,09:00,271,1411,77,1,13,5,1,9,77,1,13,86,1,13,2,1,9,86,1,13,251,1,21,10,A,7,8,A,7,12.8,A,7,8.9,A,7,77,A,7,985,A,7,230,A,7,3.6,A,7,16100,B,7,3660,A,7,1.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,10:00,473,1411,174,1,13,153,1,9,122,1,13,190,1,13,145,1,9,141,1,13,277,1,21,8,A,7,7,A,7,14.4,A,7,9.4,A,7,72,A,7,984,A,7,230,A,7,4.6,A,7,16100,B,7,3660,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,11:00,622,1411,262,1,9,113,1,9,211,1,13,286,1,9,111,1,9,237,1,13,587,1,18,10,A,7,9,A,7,18.3,A,7,11.1,A,7,63,A,7,984,A,7,240,A,7,5.2,A,7,16100,B,7,3660,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,12:00,707,1411,190,1,9,5,1,9,187,1,13,217,1,9,4,1,9,215,1,13,760,1,18,10,A,7,10,A,7,18.3,A,7,11.1,A,7,63,A,7,983,A,7,220,A,7,6.2,A,7,16100,B,7,3660,A,7,2.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -12/09/1980,13:00,721,1411,220,1,9,5,1,9,218,1,13,250,1,9,4,1,9,248,1,13,853,1,18,10,A,7,10,A,7,18.9,A,7,12.2,A,7,65,A,7,982,A,7,220,A,7,5.2,A,7,16100,B,7,3660,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -12/09/1980,14:00,665,1411,165,1,9,1,1,9,164,1,13,189,1,9,1,1,9,188,1,13,670,1,18,10,A,7,10,A,7,19.4,A,7,12.2,A,7,63,A,7,981,A,7,230,A,7,6.7,A,7,16100,B,7,3660,A,7,2.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,15:00,542,1411,190,1,9,9,1,9,187,1,13,211,1,9,7,1,9,208,1,13,639,1,18,10,A,7,10,A,7,18.3,A,7,12.8,A,7,70,A,7,981,A,7,240,A,7,6.2,A,7,16100,B,7,3660,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,16:00,360,1411,115,1,13,6,1,9,113,1,13,126,1,13,3,1,9,125,1,13,368,1,21,10,A,7,10,A,7,18.3,A,7,12.8,A,7,70,A,7,981,A,7,220,A,7,6.2,A,7,11300,B,7,580,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,17:00,134,1411,35,1,13,2,1,9,35,1,13,39,1,13,0,1,9,39,1,13,111,1,21,10,A,7,10,A,7,17.8,A,7,13.3,A,7,75,A,7,981,A,7,230,A,7,7.2,A,7,11300,B,7,520,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,18:00,0,82,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,17.8,A,7,13.3,A,7,75,A,7,981,A,7,230,A,7,5.2,A,7,16100,B,7,520,A,7,2.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,13.9,A,7,78,A,7,981,A,7,230,A,7,5.2,A,7,16100,B,7,520,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/09/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,13.9,A,7,81,A,7,981,A,7,220,A,7,5.7,A,7,16100,B,7,520,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.2,A,7,14.4,A,7,84,A,7,981,A,7,210,A,7,5.2,A,7,16100,B,7,520,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,17.8,A,7,14.4,A,7,81,A,7,981,A,7,230,A,7,4.1,A,7,16100,B,7,490,A,7,2.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/09/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.7,A,7,15.0,A,7,90,A,7,981,A,7,220,A,7,3.6,A,7,11300,B,7,520,A,7,2.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -12/09/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,15.0,A,7,93,A,7,981,A,7,240,A,7,3.1,A,7,11300,B,7,520,A,7,2.6,E,8,0.000,?,0,0.00,?,0,3,1,D,9,61,C,8 -12/10/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,16.1,A,7,15.6,A,7,97,A,7,981,A,7,240,A,7,2.6,A,7,11300,B,7,340,A,7,2.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -12/10/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,15.6,A,7,14.4,A,7,93,A,7,981,A,7,240,A,7,3.1,A,7,9700,B,7,910,A,7,2.5,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -12/10/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,13.9,A,7,96,A,7,981,A,7,240,A,7,2.1,A,7,16100,B,7,910,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -12/10/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,14.4,A,7,13.9,A,7,96,A,7,981,A,7,260,A,7,3.1,A,7,11300,B,7,1040,A,7,2.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -12/10/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,13.9,A,7,13.3,A,7,96,A,7,981,A,7,330,A,7,3.1,A,7,11300,B,7,1160,A,7,2.3,E,8,0.000,?,0,0.00,?,0,8,1,D,9,61,C,8 -12/10/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.8,A,7,12.2,A,7,96,A,7,981,A,7,0,A,7,0.0,A,7,9700,B,7,1220,A,7,2.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -12/10/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,12.2,A,7,11.7,A,7,96,A,7,982,A,7,200,A,7,2.1,A,7,8000,B,7,1070,A,7,2.1,E,8,0.000,?,0,0.00,?,0,13,1,D,9,45,C,8 -12/10/1980,08:00,48,905,12,1,13,0,1,9,12,1,13,14,1,13,0,1,9,14,1,13,44,1,21,10,A,7,10,A,7,11.7,A,7,11.1,A,7,96,A,7,981,A,7,170,A,7,1.5,A,7,4800,B,7,1220,A,7,2.0,E,8,0.000,F,8,0.00,?,0,13,1,D,9,45,C,8 -12/10/1980,09:00,268,1411,45,1,13,0,1,9,45,1,13,52,1,13,0,1,9,52,1,13,170,1,21,10,A,7,10,A,7,11.7,A,7,11.1,A,7,96,A,7,982,A,7,220,A,7,1.5,A,7,4000,B,7,120,A,7,2.1,E,8,0.000,F,8,0.00,?,0,13,1,D,9,45,C,8 -12/10/1980,10:00,470,1411,90,1,9,1,1,9,90,1,13,104,1,9,1,1,9,104,1,13,362,1,18,10,A,7,10,A,7,11.7,A,7,11.1,A,7,96,A,7,982,A,7,40,A,7,2.6,A,7,4000,B,7,1370,A,7,2.1,E,8,0.000,F,8,0.00,?,0,8,1,D,9,45,C,8 -12/10/1980,11:00,620,1411,199,1,9,0,1,9,199,1,13,223,1,9,0,1,9,223,1,13,728,1,18,10,A,7,10,A,7,11.7,A,7,10.6,A,7,93,A,7,983,A,7,60,A,7,3.6,A,7,8000,B,7,1070,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/10/1980,12:00,705,1411,244,1,9,1,1,9,243,1,13,273,1,9,1,1,9,272,1,13,895,1,18,10,A,7,10,A,7,12.2,A,7,10.6,A,7,90,A,7,982,A,7,10,A,7,3.1,A,7,8000,B,7,880,A,7,2.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/10/1980,13:00,720,1411,232,1,9,1,1,9,231,1,13,261,1,9,1,1,9,260,1,13,883,1,18,10,A,7,10,A,7,12.2,A,7,9.4,A,7,83,A,7,982,A,7,30,A,7,3.6,A,7,9700,B,7,760,A,7,1.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -12/10/1980,14:00,664,1411,212,1,9,61,1,9,183,1,13,233,1,9,60,1,9,204,1,13,546,1,18,9,A,7,9,A,7,12.2,A,7,7.8,A,7,75,A,7,982,A,7,40,A,7,4.1,A,7,11300,B,7,1070,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/10/1980,15:00,541,1411,191,1,9,78,1,9,161,1,13,209,1,9,75,1,9,181,1,13,443,1,18,10,A,7,9,A,7,11.7,A,7,8.3,A,7,80,A,7,982,A,7,30,A,7,3.1,A,7,11300,B,7,1070,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/10/1980,16:00,360,1411,66,1,13,1,1,9,66,1,13,76,1,13,0,1,9,76,1,13,255,1,21,10,A,7,10,A,7,11.1,A,7,3.9,A,7,61,A,7,983,A,7,330,A,7,5.7,A,7,11300,B,7,1130,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/10/1980,17:00,134,1411,38,1,13,15,1,9,36,1,13,41,1,13,10,1,9,40,1,13,84,1,21,9,A,7,7,A,7,10.0,A,7,2.2,A,7,59,A,7,984,A,7,350,A,7,4.6,A,7,24100,B,7,1220,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/10/1980,18:00,0,106,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,7,A,7,3,A,7,8.3,A,7,0.6,A,7,58,A,7,985,A,7,340,A,7,4.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/10/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,6.7,A,7,0.6,A,7,65,A,7,985,A,7,340,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/10/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,6.1,A,7,-1.7,A,7,58,A,7,986,A,7,350,A,7,6.2,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/10/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,5,A,7,5.6,A,7,-2.2,A,7,58,A,7,987,A,7,320,A,7,4.1,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/10/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,5,A,7,4.4,A,7,-2.2,A,7,62,A,7,987,A,7,320,A,7,3.6,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/10/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,3.3,A,7,-2.2,A,7,67,A,7,987,A,7,310,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/10/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,3.3,A,7,-3.3,A,7,62,A,7,987,A,7,310,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-2.2,A,7,73,A,7,987,A,7,300,A,7,4.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/11/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-2.2,A,7,79,A,7,988,A,7,300,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-2.2,A,7,79,A,7,988,A,7,310,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,-3.3,A,7,75,A,7,989,A,7,310,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-3.3,A,7,82,A,7,989,A,7,330,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-3.9,A,7,75,A,7,989,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,0.6,A,7,-3.9,A,7,72,A,7,990,A,7,330,A,7,5.2,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/11/1980,08:00,46,882,25,1,13,96,1,9,16,1,13,23,1,13,35,1,9,21,1,13,28,1,21,2,A,7,2,A,7,0.0,A,7,-3.9,A,7,75,A,7,990,A,7,320,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,09:00,265,1411,129,1,13,325,1,9,67,1,13,132,1,13,236,1,9,88,1,13,123,1,21,2,A,7,2,A,7,2.2,A,7,-4.4,A,7,62,A,7,991,A,7,330,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,10:00,468,1411,198,1,13,360,1,9,78,1,13,215,1,13,330,1,9,105,1,13,143,1,21,3,A,7,3,A,7,3.9,A,7,-4.4,A,7,55,A,7,991,A,7,350,A,7,3.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,11:00,617,1411,351,1,13,431,1,9,161,1,13,365,1,13,421,1,9,180,1,13,327,1,21,3,A,7,3,A,7,5.0,A,7,-3.3,A,7,55,A,7,991,A,7,20,A,7,2.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,12:00,703,1411,443,1,9,652,1,9,116,1,13,464,1,9,643,1,9,142,1,13,247,1,18,6,A,7,2,A,7,6.1,A,7,-3.9,A,7,49,A,7,991,A,7,340,A,7,1.5,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,13:00,718,1411,359,1,13,313,1,9,198,1,13,385,1,13,326,1,9,218,1,13,447,1,21,7,A,7,6,A,7,7.2,A,7,-3.3,A,7,47,A,7,991,A,7,280,A,7,3.1,A,7,24100,B,7,3050,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -12/11/1980,14:00,663,1411,425,1,13,700,1,9,94,1,13,449,1,13,689,1,9,124,1,13,199,1,21,3,A,7,3,A,7,7.8,A,7,-5.0,A,7,40,A,7,989,A,7,30,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,15:00,541,1411,373,1,9,834,1,9,51,1,13,392,1,9,785,1,9,89,1,13,119,1,18,0,A,7,0,A,7,8.3,A,7,-4.4,A,7,41,A,7,989,A,7,340,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,16:00,360,1411,209,1,13,637,1,9,45,1,13,215,1,13,547,1,9,75,1,13,90,1,21,4,A,7,1,A,7,8.3,A,7,-3.3,A,7,44,A,7,989,A,7,290,A,7,1.5,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,17:00,135,1411,56,1,13,298,1,9,27,1,13,56,1,13,163,1,9,41,1,13,48,1,21,3,A,7,0,A,7,7.2,A,7,-3.9,A,7,46,A,7,990,A,7,320,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,18:00,1,106,3,1,13,3,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,1,A,7,1,A,7,5.6,A,7,-6.1,A,7,43,A,7,990,A,7,320,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-2.8,A,7,70,A,7,990,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/11/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-1.1,A,7,85,A,7,990,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.0,A,7,-3.3,A,7,79,A,7,990,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.1,A,7,-3.3,A,7,85,A,7,990,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.1,A,7,-6.1,A,7,69,A,7,990,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/11/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.7,A,7,-4.4,A,7,82,A,7,990,A,7,0,A,7,0.0,A,7,32200,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-5.6,A,7,85,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/12/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-5.0,A,7,85,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.2,A,7,-3.9,A,7,89,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-5.0,A,7,88,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-5.0,A,7,88,A,7,990,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-5.0,A,7,88,A,7,990,A,7,250,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,-3.3,A,7,-5.0,A,7,88,A,7,991,A,7,330,A,7,2.1,A,7,16100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/12/1980,08:00,44,859,19,1,13,31,1,9,16,1,13,20,1,13,13,1,9,19,1,13,33,1,21,0,A,7,0,A,7,-2.8,A,7,-4.4,A,7,88,A,7,991,A,7,0,A,7,0.0,A,7,11300,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,09:00,262,1412,114,1,13,313,1,9,56,1,13,120,1,13,227,1,9,78,1,13,101,1,21,1,A,7,1,A,7,1.7,A,7,-2.2,A,7,76,A,7,991,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,10:00,465,1412,262,1,9,556,1,9,78,1,13,272,1,9,504,1,9,105,1,13,148,1,18,1,A,7,1,A,7,6.1,A,7,-2.2,A,7,55,A,7,991,A,7,0,A,7,0.0,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,11:00,615,1412,346,1,13,426,1,9,159,1,13,360,1,13,416,1,9,179,1,13,322,1,21,5,A,7,5,A,7,8.9,A,7,0.0,A,7,54,A,7,991,A,7,200,A,7,2.6,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,12:00,701,1412,412,1,9,442,1,9,191,1,13,429,1,9,441,1,9,209,1,13,408,1,18,8,A,7,8,A,7,8.3,A,7,-1.7,A,7,50,A,7,991,A,7,240,A,7,3.1,A,7,11300,B,7,2130,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,13:00,717,1412,287,1,9,130,1,9,220,1,13,312,1,9,134,1,9,244,1,13,552,1,18,8,A,7,8,A,7,9.4,A,7,-2.2,A,7,44,A,7,989,A,7,210,A,7,4.1,A,7,11300,B,7,2130,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/12/1980,14:00,663,1412,352,1,13,422,1,9,152,1,13,372,1,13,419,1,9,174,1,13,311,1,21,3,A,7,3,A,7,10.6,A,7,-1.7,A,7,43,A,7,988,A,7,230,A,7,3.6,A,7,11300,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,15:00,541,1412,337,1,9,634,1,9,92,1,13,349,1,9,596,1,9,120,1,13,179,1,18,0,A,7,0,A,7,11.7,A,7,-1.7,A,7,40,A,7,987,A,7,230,A,7,3.6,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,16:00,360,1412,191,1,13,473,1,9,69,1,13,195,1,13,394,1,9,94,1,13,125,1,21,0,A,7,0,A,7,11.7,A,7,-1.1,A,7,41,A,7,987,A,7,220,A,7,4.1,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,17:00,135,1412,48,1,13,150,1,9,33,1,13,49,1,13,75,1,9,42,1,13,59,1,21,0,A,7,0,A,7,10.0,A,7,-2.8,A,7,41,A,7,987,A,7,230,A,7,4.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,18:00,1,106,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,6.7,A,7,-2.8,A,7,51,A,7,987,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-1.7,A,7,58,A,7,987,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/12/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-1.1,A,7,68,A,7,987,A,7,220,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,0.0,A,7,76,A,7,986,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-1.1,A,7,70,A,7,986,A,7,170,A,7,2.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,0.0,A,7,82,A,7,986,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/12/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,-0.6,A,7,73,A,7,986,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-1.1,A,7,76,A,7,985,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/13/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-1.1,A,7,79,A,7,985,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,0.0,A,7,82,A,7,985,A,7,230,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,-0.6,A,7,76,A,7,985,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,0.0,A,7,82,A,7,984,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,2,A,7,1.7,A,7,-0.6,A,7,85,A,7,984,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,4,A,7,1.7,A,7,-0.6,A,7,85,A,7,984,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/13/1980,08:00,43,859,17,1,13,12,1,9,16,1,13,18,1,13,6,1,9,18,1,13,39,1,21,9,A,7,5,A,7,1.7,A,7,-0.6,A,7,85,A,7,985,A,7,180,A,7,2.6,A,7,24100,B,7,7620,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,09:00,259,1412,105,1,13,55,1,9,95,1,13,115,1,13,44,1,9,106,1,13,213,1,21,7,A,7,4,A,7,4.4,A,7,1.1,A,7,79,A,7,985,A,7,210,A,7,2.6,A,7,24100,B,7,7620,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,10:00,462,1412,221,1,13,335,1,9,110,1,13,230,1,13,305,1,9,130,1,13,208,1,21,8,A,7,6,A,7,7.2,A,7,1.7,A,7,68,A,7,985,A,7,210,A,7,2.1,A,7,24100,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,11:00,613,1412,276,1,13,262,1,9,162,1,13,296,1,13,264,1,9,181,1,13,344,1,21,9,A,7,7,A,7,10.0,A,7,0.0,A,7,50,A,7,985,A,7,240,A,7,2.6,A,7,16100,B,7,7620,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,12:00,699,1412,383,1,13,396,1,9,186,1,13,400,1,13,395,1,9,203,1,13,396,1,21,8,A,7,3,A,7,13.3,A,7,1.1,A,7,44,A,7,984,A,7,310,A,7,3.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,13:00,716,1412,389,1,9,509,1,9,130,1,13,406,1,9,501,1,9,151,1,13,275,1,18,6,A,7,1,A,7,15.6,A,7,2.2,A,7,41,A,7,983,A,7,260,A,7,3.6,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -12/13/1980,14:00,662,1412,397,1,9,567,1,9,129,1,13,410,1,9,549,1,9,151,1,13,260,1,18,6,A,7,2,A,7,16.7,A,7,1.1,A,7,35,A,7,983,A,7,270,A,7,3.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,15:00,541,1412,299,1,9,419,1,9,137,1,13,311,1,9,398,1,9,158,1,13,268,1,18,6,A,7,2,A,7,16.7,A,7,1.7,A,7,37,A,7,982,A,7,260,A,7,3.6,A,7,16100,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,16:00,361,1412,106,1,13,70,1,9,88,1,13,116,1,13,61,1,9,101,1,13,193,1,21,8,A,7,6,A,7,16.1,A,7,1.1,A,7,36,A,7,982,A,7,280,A,7,3.6,A,7,16100,B,7,7620,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,17:00,136,1412,40,1,13,19,1,9,38,1,13,44,1,13,12,1,9,42,1,13,88,1,21,10,A,7,7,A,7,14.4,A,7,1.7,A,7,42,A,7,983,A,7,320,A,7,2.6,A,7,16100,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,18:00,1,106,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,7,A,7,12.8,A,7,2.2,A,7,49,A,7,984,A,7,320,A,7,3.6,A,7,16100,B,7,7620,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,12.8,A,7,2.2,A,7,49,A,7,984,A,7,320,A,7,4.1,A,7,24100,B,7,3660,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/13/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,11.1,A,7,2.2,A,7,55,A,7,985,A,7,300,A,7,3.6,A,7,24100,B,7,4270,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,9,A,7,11.1,A,7,-1.1,A,7,43,A,7,986,A,7,320,A,7,3.6,A,7,24100,B,7,4270,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,10.0,A,7,-2.2,A,7,43,A,7,987,A,7,320,A,7,4.1,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,7,A,7,8.9,A,7,-2.8,A,7,44,A,7,987,A,7,330,A,7,4.6,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/13/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,3,A,7,7.8,A,7,-2.8,A,7,48,A,7,988,A,7,340,A,7,4.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-3.3,A,7,51,A,7,988,A,7,340,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/14/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-3.9,A,7,55,A,7,988,A,7,350,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.8,A,7,-5.0,A,7,57,A,7,988,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-4.4,A,7,64,A,7,988,A,7,310,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.1,A,7,-6.1,A,7,69,A,7,989,A,7,300,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,-5.0,A,7,64,A,7,989,A,7,310,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-5.6,A,7,69,A,7,989,A,7,260,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/14/1980,08:00,41,836,30,1,13,180,1,9,12,1,13,23,1,13,78,1,9,18,1,13,22,1,21,0,A,7,0,A,7,1.7,A,7,-5.6,A,7,59,A,7,990,A,7,320,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,09:00,256,1412,146,1,13,650,1,9,27,1,13,154,1,13,516,1,9,60,1,13,65,1,21,0,A,7,0,A,7,3.9,A,7,-6.7,A,7,46,A,7,991,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,10:00,460,1412,249,1,13,485,1,9,91,1,13,266,1,13,441,1,9,122,1,13,169,1,21,4,A,7,4,A,7,6.7,A,7,-8.9,A,7,32,A,7,991,A,7,310,A,7,5.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,11:00,611,1412,323,1,13,458,1,9,124,1,13,345,1,13,448,1,9,151,1,13,244,1,21,6,A,7,6,A,7,8.3,A,7,-8.3,A,7,30,A,7,991,A,7,300,A,7,6.2,A,7,24100,B,7,5180,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,12:00,698,1412,459,1,13,621,1,9,150,1,13,471,1,13,603,1,9,172,1,13,303,1,21,6,A,7,6,A,7,8.3,A,7,-5.6,A,7,37,A,7,990,A,7,280,A,7,4.6,A,7,24100,B,7,5180,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,13:00,715,1412,387,1,13,382,1,9,192,1,13,416,1,13,397,1,9,214,1,13,430,1,21,7,A,7,7,A,7,10.0,A,7,-6.1,A,7,32,A,7,989,A,7,280,A,7,4.6,A,7,24100,B,7,4570,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/14/1980,14:00,662,1412,342,1,13,438,1,9,136,1,13,366,1,13,435,1,9,162,1,13,275,1,21,6,A,7,5,A,7,10.0,A,7,-6.7,A,7,31,A,7,988,A,7,270,A,7,3.6,A,7,24100,B,7,7620,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,15:00,541,1412,261,1,13,392,1,9,109,1,13,277,1,13,373,1,9,134,1,13,208,1,21,7,A,7,3,A,7,11.1,A,7,-4.4,A,7,34,A,7,988,A,7,330,A,7,6.2,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,16:00,361,1412,167,1,9,382,1,9,69,1,13,178,1,9,320,1,9,96,1,13,125,1,18,6,A,7,2,A,7,10.6,A,7,-6.7,A,7,29,A,7,988,A,7,290,A,7,4.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,17:00,137,1412,64,1,13,422,1,9,22,1,13,64,1,13,258,1,9,38,1,13,41,1,21,3,A,7,0,A,7,9.4,A,7,-7.2,A,7,30,A,7,989,A,7,290,A,7,5.2,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,18:00,1,106,5,1,13,10,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,7.8,A,7,-7.2,A,7,34,A,7,988,A,7,290,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,-5.0,A,7,45,A,7,989,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/14/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,5.0,A,7,-6.1,A,7,45,A,7,989,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,2.8,A,7,-6.1,A,7,52,A,7,989,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-6.7,A,7,52,A,7,989,A,7,270,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-6.1,A,7,57,A,7,989,A,7,260,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/14/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,0,A,7,0.0,A,7,-5.6,A,7,67,A,7,989,A,7,220,A,7,1.5,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,-0.6,A,7,-4.4,A,7,75,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/15/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,-1.1,A,7,-4.4,A,7,78,A,7,989,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,5,A,7,-1.1,A,7,-4.4,A,7,78,A,7,989,A,7,70,A,7,1.5,A,7,24100,B,7,7620,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,-1.1,A,7,-3.9,A,7,82,A,7,988,A,7,50,A,7,3.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,-1.7,A,7,-4.4,A,7,82,A,7,988,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,2,A,7,-1.1,A,7,-3.9,A,7,82,A,7,988,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,3,A,7,-1.7,A,7,-3.9,A,7,85,A,7,988,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/15/1980,08:00,39,812,19,1,13,36,1,9,16,1,13,20,1,13,14,1,9,19,1,13,33,1,21,9,A,7,2,A,7,-1.1,A,7,-4.4,A,7,78,A,7,989,A,7,60,A,7,2.1,A,7,32200,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,09:00,253,1412,113,1,13,294,1,9,60,1,13,117,1,13,210,1,9,80,1,13,109,1,21,9,A,7,3,A,7,1.7,A,7,-2.8,A,7,73,A,7,989,A,7,110,A,7,2.1,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,10:00,457,1412,153,1,13,145,1,9,106,1,13,169,1,13,136,1,9,125,1,13,239,1,21,10,A,7,5,A,7,5.6,A,7,-3.3,A,7,53,A,7,989,A,7,140,A,7,3.6,A,7,11300,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,11:00,609,1412,272,1,13,217,1,9,178,1,13,296,1,13,217,1,9,202,1,13,425,1,21,9,A,7,7,A,7,7.2,A,7,-4.4,A,7,44,A,7,988,A,7,160,A,7,4.1,A,7,16100,B,7,3660,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,12:00,696,1412,332,1,9,247,1,9,209,1,13,353,1,9,255,1,9,227,1,13,474,1,18,10,A,7,8,A,7,7.8,A,7,-3.3,A,7,46,A,7,987,A,7,180,A,7,4.1,A,7,16100,B,7,3660,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,13:00,714,1412,260,1,9,108,1,9,205,1,13,284,1,9,111,1,9,228,1,13,513,1,18,10,A,7,9,A,7,8.9,A,7,-6.1,A,7,34,A,7,985,A,7,170,A,7,4.1,A,7,16100,B,7,3660,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/15/1980,14:00,661,1412,156,1,9,28,1,9,143,1,13,172,1,9,27,1,9,159,1,13,444,1,18,10,A,7,9,A,7,8.9,A,7,-3.9,A,7,41,A,7,984,A,7,180,A,7,4.1,A,7,16100,B,7,3660,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,15:00,541,1412,208,1,9,53,1,9,187,1,13,227,1,9,51,1,9,207,1,13,495,1,18,10,A,7,9,A,7,8.9,A,7,-3.3,A,7,42,A,7,982,A,7,160,A,7,4.1,A,7,16100,B,7,3660,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,16:00,362,1412,124,1,9,89,1,9,101,1,13,135,1,9,77,1,9,115,1,13,222,1,18,10,A,7,9,A,7,8.3,A,7,-2.8,A,7,46,A,7,982,A,7,150,A,7,3.1,A,7,16100,B,7,3660,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,17:00,138,1412,30,1,13,4,1,9,29,1,13,33,1,13,0,1,9,33,1,13,99,1,21,10,A,7,10,A,7,6.7,A,7,-5.0,A,7,44,A,7,981,A,7,140,A,7,2.1,A,7,24100,B,7,7620,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,18:00,1,129,0,1,13,0,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,5.6,A,7,-3.9,A,7,51,A,7,981,A,7,150,A,7,2.6,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,-2.8,A,7,58,A,7,981,A,7,160,A,7,2.6,A,7,24100,B,7,4570,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/15/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,-2.8,A,7,60,A,7,981,A,7,0,A,7,0.0,A,7,24100,B,7,3960,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,-2.8,A,7,62,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,2740,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,3,A,7,3.3,A,7,-2.2,A,7,67,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-2.2,A,7,70,A,7,979,A,7,350,A,7,2.6,A,7,24100,B,7,1040,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/15/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-1.7,A,7,73,A,7,978,A,7,30,A,7,2.1,A,7,24100,B,7,1160,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/16/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,-2.8,A,7,65,A,7,977,A,7,350,A,7,2.6,A,7,24100,B,7,1160,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,21,C,8 -12/16/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-2.2,A,7,70,A,7,977,A,7,360,A,7,2.6,A,7,24100,B,7,1160,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/16/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,2.2,A,7,-2.2,A,7,73,A,7,976,A,7,10,A,7,2.6,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/16/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,6,A,7,2.2,A,7,-2.2,A,7,73,A,7,976,A,7,10,A,7,2.6,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/16/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,8,A,7,2.2,A,7,-2.2,A,7,73,A,7,975,A,7,10,A,7,3.1,A,7,24100,B,7,7620,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/16/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,-1.1,A,7,79,A,7,975,A,7,40,A,7,1.5,A,7,16100,B,7,1070,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -12/16/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,-0.6,A,7,82,A,7,976,A,7,0,A,7,0.0,A,7,16100,B,7,2740,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -12/16/1980,08:00,38,812,12,1,13,2,1,9,11,1,13,13,1,13,0,1,9,13,1,13,40,1,21,10,A,7,10,A,7,2.2,A,7,1.1,A,7,92,A,7,976,A,7,0,A,7,0.0,A,7,4800,B,7,940,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/16/1980,09:00,251,1413,43,1,13,1,1,9,43,1,13,50,1,13,0,1,9,50,1,13,161,1,21,10,A,7,10,A,7,2.8,A,7,1.7,A,7,92,A,7,976,A,7,90,A,7,2.1,A,7,6400,B,7,910,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/16/1980,10:00,455,1413,93,1,9,5,1,9,92,1,13,107,1,9,3,1,9,107,1,13,362,1,18,10,A,7,10,A,7,3.9,A,7,2.8,A,7,93,A,7,976,A,7,100,A,7,1.5,A,7,8000,B,7,910,A,7,1.2,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -12/16/1980,11:00,607,1413,125,1,9,4,1,9,123,1,13,145,1,9,3,1,9,143,1,13,516,1,18,10,A,7,10,A,7,4.4,A,7,3.9,A,7,96,A,7,976,A,7,70,A,7,2.1,A,7,8000,B,7,1220,A,7,1.3,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -12/16/1980,12:00,695,1413,159,1,9,1,1,9,159,1,13,184,1,9,1,1,9,184,1,13,670,1,18,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,975,A,7,0,A,7,0.0,A,7,8000,B,7,1220,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/16/1980,13:00,714,1413,239,1,9,3,1,9,238,1,13,269,1,9,3,1,9,268,1,13,892,1,18,10,A,7,10,A,7,6.1,A,7,5.0,A,7,93,A,7,975,A,7,0,A,7,0.0,A,7,8000,B,7,1680,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,21,C,8 -12/16/1980,14:00,661,1413,224,1,9,3,1,9,223,1,13,251,1,9,3,1,9,250,1,13,814,1,18,10,A,7,10,A,7,6.7,A,7,5.0,A,7,89,A,7,974,A,7,60,A,7,2.1,A,7,8000,B,7,1680,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/16/1980,15:00,542,1413,179,1,9,1,1,9,179,1,13,199,1,9,1,1,9,199,1,13,624,1,18,10,A,7,10,A,7,7.2,A,7,5.0,A,7,86,A,7,974,A,7,30,A,7,1.5,A,7,8000,B,7,1830,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/16/1980,16:00,363,1413,126,1,9,128,1,9,93,1,13,138,1,9,111,1,9,109,1,13,204,1,18,10,A,7,8,A,7,7.8,A,7,4.4,A,7,80,A,7,974,A,7,130,A,7,1.5,A,7,8000,B,7,2440,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/16/1980,17:00,140,1413,38,1,13,6,1,9,38,1,13,43,1,13,0,1,9,43,1,13,119,1,21,10,A,7,10,A,7,7.2,A,7,5.0,A,7,86,A,7,975,A,7,70,A,7,2.1,A,7,8000,B,7,1980,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/16/1980,18:00,1,130,1,1,13,0,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,7.2,A,7,5.0,A,7,86,A,7,976,A,7,60,A,7,2.1,A,7,11300,B,7,2130,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/16/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,5.0,A,7,86,A,7,976,A,7,50,A,7,2.1,A,7,11300,B,7,2130,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,21,C,8 -12/16/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,4.4,A,7,93,A,7,977,A,7,10,A,7,2.1,A,7,11300,B,7,1400,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,61,C,8 -12/16/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,977,A,7,0,A,7,0.0,A,7,11300,B,7,1250,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/16/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,977,A,7,350,A,7,1.5,A,7,11300,B,7,1160,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/16/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,2.8,A,7,93,A,7,978,A,7,0,A,7,0.0,A,7,11300,B,7,940,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/16/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,2.2,A,7,86,A,7,978,A,7,350,A,7,2.6,A,7,11300,B,7,760,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,0.0,A,7,73,A,7,979,A,7,360,A,7,2.6,A,7,24100,B,7,1010,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/17/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,0.6,A,7,79,A,7,979,A,7,330,A,7,3.6,A,7,24100,B,7,1010,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,-1.7,A,7,70,A,7,979,A,7,340,A,7,3.6,A,7,24100,B,7,1010,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,-2.2,A,7,70,A,7,980,A,7,350,A,7,3.1,A,7,24100,B,7,1010,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,2.8,A,7,-2.2,A,7,70,A,7,980,A,7,360,A,7,3.1,A,7,24100,B,7,1010,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,1.1,A,7,-1.7,A,7,82,A,7,981,A,7,360,A,7,3.6,A,7,24100,B,7,1370,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/17/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,1.1,A,7,-2.8,A,7,76,A,7,982,A,7,10,A,7,4.1,A,7,24100,B,7,1370,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/17/1980,08:00,37,789,14,1,13,11,1,9,13,1,13,15,1,13,6,1,9,15,1,13,32,1,21,7,A,7,4,A,7,0.6,A,7,-3.9,A,7,72,A,7,983,A,7,10,A,7,4.1,A,7,24100,B,7,7620,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,09:00,248,1413,118,1,13,315,1,9,62,1,13,121,1,13,222,1,9,82,1,13,113,1,21,3,A,7,2,A,7,1.7,A,7,-3.3,A,7,70,A,7,984,A,7,10,A,7,5.2,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,10:00,453,1413,274,1,9,682,1,9,54,1,13,285,1,9,621,1,9,85,1,13,111,1,18,0,A,7,0,A,7,3.3,A,7,-3.9,A,7,60,A,7,984,A,7,10,A,7,4.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,11:00,605,1413,407,1,9,790,1,9,66,1,13,429,1,9,763,1,9,101,1,13,143,1,18,0,A,7,0,A,7,3.9,A,7,-6.1,A,7,48,A,7,984,A,7,40,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,12:00,694,1413,492,1,9,847,1,9,73,1,13,513,1,9,823,1,9,107,1,13,154,1,18,0,A,7,0,A,7,6.1,A,7,-3.9,A,7,49,A,7,983,A,7,50,A,7,4.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,13:00,713,1413,515,1,9,867,1,9,75,1,13,537,1,9,845,1,9,109,1,13,158,1,18,0,A,7,0,A,7,6.1,A,7,-6.1,A,7,42,A,7,983,A,7,330,A,7,4.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/17/1980,14:00,661,1413,468,1,9,843,1,9,71,1,13,496,1,9,824,1,9,108,1,13,157,1,18,0,A,7,0,A,7,7.2,A,7,-0.6,A,7,58,A,7,983,A,7,250,A,7,1.5,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,15:00,542,1413,363,1,9,781,1,9,61,1,13,381,1,9,739,1,9,96,1,13,129,1,18,0,A,7,0,A,7,7.8,A,7,-2.8,A,7,48,A,7,983,A,7,300,A,7,3.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,16:00,364,1413,218,1,9,657,1,9,47,1,13,224,1,9,564,1,9,78,1,13,93,1,18,0,A,7,0,A,7,7.2,A,7,-4.4,A,7,44,A,7,984,A,7,300,A,7,3.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,17:00,141,1413,60,1,13,332,1,9,27,1,13,61,1,13,186,1,9,43,1,13,48,1,21,0,A,7,0,A,7,6.1,A,7,-5.0,A,7,45,A,7,984,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,18:00,1,130,3,1,13,5,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,3.3,A,7,-3.3,A,7,62,A,7,985,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.7,A,7,-5.0,A,7,62,A,7,985,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/17/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-0.6,A,7,-4.4,A,7,75,A,7,985,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-7.2,A,7,72,A,7,985,A,7,210,A,7,2.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.2,A,7,-5.6,A,7,78,A,7,985,A,7,210,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-6.7,A,7,78,A,7,986,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/17/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.2,A,7,-5.6,A,7,78,A,7,985,A,7,220,A,7,2.6,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-6.7,A,7,78,A,7,985,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/18/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.3,A,7,-3.9,A,7,96,A,7,985,A,7,200,A,7,2.1,A,7,24100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-5.6,A,7,88,A,7,985,A,7,210,A,7,2.6,A,7,11300,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-5.6,A,7,88,A,7,985,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-5.0,A,7,92,A,7,984,A,7,210,A,7,2.6,A,7,16100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-1.7,A,7,-2.2,A,7,96,A,7,985,A,7,250,A,7,2.1,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.8,A,7,-3.3,A,7,96,A,7,986,A,7,220,A,7,3.1,A,7,16100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/18/1980,08:00,35,789,25,1,13,132,1,9,12,1,13,19,1,13,55,1,9,17,1,13,22,1,21,0,A,7,0,A,7,-2.2,A,7,-3.9,A,7,89,A,7,986,A,7,210,A,7,3.1,A,7,4800,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/18/1980,09:00,246,1413,135,1,13,595,1,9,31,1,13,139,1,13,454,1,9,60,1,13,63,1,21,0,A,7,0,A,7,1.7,A,7,-2.2,A,7,76,A,7,986,A,7,240,A,7,4.1,A,7,6400,B,7,77777,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/18/1980,10:00,451,1413,295,1,9,781,1,9,44,1,13,311,1,9,712,1,9,82,1,13,103,1,18,0,A,7,0,A,7,4.4,A,7,0.6,A,7,76,A,7,987,A,7,230,A,7,4.6,A,7,8000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/18/1980,11:00,604,1413,425,1,9,864,1,9,53,1,13,446,1,9,827,1,9,91,1,13,128,1,18,0,A,7,0,A,7,6.7,A,7,0.6,A,7,65,A,7,987,A,7,230,A,7,4.1,A,7,8000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/18/1980,12:00,693,1413,504,1,9,901,1,9,59,1,13,529,1,9,877,1,9,97,1,13,144,1,18,0,A,7,0,A,7,9.4,A,7,1.1,A,7,56,A,7,985,A,7,230,A,7,2.6,A,7,8000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/18/1980,13:00,713,1413,521,1,9,907,1,9,60,1,13,546,1,9,885,1,9,97,1,13,148,1,18,0,A,7,0,A,7,11.1,A,7,1.1,A,7,50,A,7,984,A,7,230,A,7,3.1,A,7,8000,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/18/1980,14:00,662,1413,475,1,9,886,1,9,57,1,13,498,1,9,858,1,9,95,1,13,139,1,18,0,A,7,0,A,7,12.2,A,7,1.7,A,7,49,A,7,984,A,7,190,A,7,3.6,A,7,9700,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/18/1980,15:00,543,1413,373,1,9,836,1,9,50,1,13,393,1,9,788,1,9,89,1,13,119,1,18,0,A,7,0,A,7,13.3,A,7,0.6,A,7,42,A,7,984,A,7,220,A,7,3.1,A,7,9700,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/18/1980,16:00,365,1413,225,1,9,718,1,9,38,1,13,237,1,9,625,1,9,75,1,13,88,1,18,0,A,7,0,A,7,12.8,A,7,0.0,A,7,42,A,7,984,A,7,220,A,7,3.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,17:00,143,1413,66,1,13,423,1,9,23,1,13,66,1,13,262,1,9,40,1,13,43,1,21,0,A,7,0,A,7,10.6,A,7,-0.6,A,7,46,A,7,984,A,7,190,A,7,3.1,A,7,16100,B,7,77777,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,18:00,1,153,5,1,13,11,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,8.3,A,7,0.6,A,7,58,A,7,984,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,0.6,A,7,65,A,7,985,A,7,200,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,0.0,A,7,63,A,7,985,A,7,210,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,0.0,A,7,70,A,7,984,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,5.0,A,7,0.0,A,7,70,A,7,984,A,7,200,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,7.2,A,7,0.0,A,7,60,A,7,984,A,7,210,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/18/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,0.0,A,7,65,A,7,984,A,7,200,A,7,3.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.7,A,7,0.6,A,7,65,A,7,984,A,7,220,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/19/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,6.1,A,7,0.0,A,7,65,A,7,984,A,7,230,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,0.6,A,7,76,A,7,984,A,7,230,A,7,2.6,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,-0.6,A,7,82,A,7,984,A,7,210,A,7,3.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.3,A,7,0.0,A,7,79,A,7,984,A,7,220,A,7,3.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/19/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,3.9,A,7,0.0,A,7,76,A,7,984,A,7,210,A,7,4.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/19/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,4.4,A,7,-0.6,A,7,70,A,7,985,A,7,230,A,7,3.6,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/19/1980,08:00,34,766,23,1,13,99,1,9,13,1,13,19,1,13,33,1,9,18,1,13,22,1,21,2,A,7,0,A,7,4.4,A,7,0.0,A,7,73,A,7,986,A,7,230,A,7,3.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,09:00,244,1413,129,1,13,533,1,9,36,1,13,130,1,13,402,1,9,60,1,13,68,1,21,2,A,7,0,A,7,6.1,A,7,1.1,A,7,71,A,7,986,A,7,230,A,7,4.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,10:00,449,1413,274,1,9,630,1,9,72,1,13,284,1,9,567,1,9,103,1,13,137,1,18,2,A,7,2,A,7,10.0,A,7,2.8,A,7,61,A,7,987,A,7,260,A,7,3.1,A,7,16100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,11:00,603,1413,390,1,9,772,1,9,58,1,13,408,1,9,738,1,9,92,1,13,132,1,18,1,A,7,1,A,7,13.3,A,7,6.1,A,7,62,A,7,988,A,7,310,A,7,4.1,A,7,16100,B,7,77777,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,12:00,692,1413,471,1,9,802,1,9,76,1,13,498,1,9,788,1,9,111,1,13,169,1,18,1,A,7,1,A,7,14.4,A,7,3.3,A,7,48,A,7,988,A,7,330,A,7,4.6,A,7,12900,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,13:00,713,1413,403,1,13,441,1,9,179,1,13,423,1,13,442,1,9,199,1,13,382,1,21,5,A,7,5,A,7,14.4,A,7,2.2,A,7,44,A,7,988,A,7,330,A,7,6.2,A,7,12900,B,7,77777,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,03,C,8 -12/19/1980,14:00,662,1413,228,1,9,55,1,9,202,1,13,250,1,9,54,1,9,225,1,13,589,1,18,9,A,7,9,A,7,11.7,A,7,3.9,A,7,59,A,7,988,A,7,330,A,7,6.2,A,7,12900,B,7,2130,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,15:00,544,1413,142,1,9,74,1,9,113,1,13,157,1,9,73,1,9,129,1,13,263,1,18,10,A,7,10,A,7,10.0,A,7,1.7,A,7,57,A,7,989,A,7,330,A,7,5.2,A,7,12900,B,7,2130,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,16:00,367,1413,112,1,9,50,1,9,99,1,13,123,1,9,44,1,9,111,1,13,255,1,18,9,A,7,9,A,7,8.9,A,7,1.7,A,7,61,A,7,990,A,7,330,A,7,5.2,A,7,12900,B,7,2130,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,17:00,144,1413,29,1,13,13,1,9,28,1,13,32,1,13,8,1,9,31,1,13,70,1,21,10,A,7,9,A,7,8.3,A,7,-1.7,A,7,50,A,7,991,A,7,350,A,7,5.2,A,7,16100,B,7,2130,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,18:00,1,153,1,1,13,1,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,9,A,7,7.8,A,7,-2.2,A,7,50,A,7,992,A,7,10,A,7,4.6,A,7,24100,B,7,1830,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/19/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,-6.7,A,7,41,A,7,993,A,7,20,A,7,4.1,A,7,24100,B,7,1830,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/19/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,4,A,7,3.3,A,7,-3.9,A,7,60,A,7,993,A,7,20,A,7,4.6,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,3.3,A,7,-9.4,A,7,39,A,7,994,A,7,10,A,7,5.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,4,A,7,1.7,A,7,-7.8,A,7,50,A,7,995,A,7,10,A,7,4.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,1.1,A,7,-7.2,A,7,54,A,7,995,A,7,20,A,7,3.6,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/19/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,0.6,A,7,-8.9,A,7,50,A,7,996,A,7,30,A,7,3.1,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.6,A,7,-10.6,A,7,44,A,7,996,A,7,30,A,7,4.6,A,7,16100,B,7,1400,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/20/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.0,A,7,-7.2,A,7,59,A,7,996,A,7,30,A,7,5.2,A,7,16100,B,7,1220,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,-0.6,A,7,-8.3,A,7,56,A,7,997,A,7,40,A,7,5.7,A,7,16100,B,7,1400,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,-1.1,A,7,-7.8,A,7,61,A,7,997,A,7,40,A,7,5.7,A,7,16100,B,7,1520,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,9,A,7,9,A,7,-1.7,A,7,-7.8,A,7,63,A,7,997,A,7,40,A,7,5.2,A,7,16100,B,7,1520,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,-2.2,A,7,-7.8,A,7,66,A,7,998,A,7,30,A,7,4.6,A,7,16100,B,7,1490,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,-2.8,A,7,-6.1,A,7,78,A,7,998,A,7,20,A,7,3.6,A,7,16100,B,7,77777,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/20/1980,08:00,33,742,11,1,13,13,1,9,10,1,13,12,1,13,5,1,9,12,1,13,21,1,21,3,A,7,3,A,7,-3.9,A,7,-10.0,A,7,63,A,7,999,A,7,20,A,7,3.6,A,7,16100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,09:00,242,1414,105,1,13,298,1,9,53,1,13,109,1,13,208,1,9,73,1,13,95,1,21,2,A,7,1,A,7,-3.3,A,7,-10.0,A,7,60,A,7,1000,A,7,40,A,7,3.6,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,10:00,448,1414,269,1,9,622,1,9,71,1,13,280,1,9,560,1,9,102,1,13,136,1,18,0,A,7,0,A,7,-2.2,A,7,-9.4,A,7,58,A,7,1001,A,7,40,A,7,6.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,11:00,601,1414,403,1,9,734,1,9,88,1,13,423,1,9,709,1,9,120,1,13,180,1,18,0,A,7,0,A,7,-1.1,A,7,-10.0,A,7,51,A,7,1001,A,7,360,A,7,4.1,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,12:00,692,1414,484,1,9,783,1,9,98,1,13,497,1,9,760,1,9,123,1,13,195,1,18,0,A,7,0,A,7,-1.1,A,7,-10.6,A,7,49,A,7,1000,A,7,30,A,7,5.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,13:00,713,1414,500,1,9,789,1,9,100,1,13,515,1,9,769,1,9,126,1,13,202,1,18,0,A,7,0,A,7,-0.6,A,7,-11.1,A,7,45,A,7,999,A,7,30,A,7,5.7,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/20/1980,14:00,663,1414,460,1,9,775,1,9,95,1,13,473,1,9,748,1,9,120,1,13,186,1,18,0,A,7,0,A,7,0.6,A,7,-12.2,A,7,38,A,7,999,A,7,30,A,7,5.2,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,15:00,545,1414,354,1,9,702,1,9,82,1,13,371,1,9,664,1,9,114,1,13,163,1,18,0,A,7,0,A,7,0.6,A,7,-13.9,A,7,33,A,7,999,A,7,30,A,7,4.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,16:00,368,1414,208,1,9,555,1,9,62,1,13,214,1,9,470,1,9,91,1,13,115,1,18,0,A,7,0,A,7,0.6,A,7,-13.9,A,7,33,A,7,1001,A,7,20,A,7,5.7,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,17:00,146,1414,56,1,13,223,1,9,33,1,13,59,1,13,117,1,9,46,1,13,59,1,21,0,A,7,0,A,7,-0.6,A,7,-14.4,A,7,35,A,7,1000,A,7,50,A,7,4.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,18:00,2,177,2,1,13,2,1,9,1,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,-2.2,A,7,-14.4,A,7,39,A,7,1001,A,7,20,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-2.2,A,7,-16.7,A,7,32,A,7,1002,A,7,20,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/20/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-3.9,A,7,-16.1,A,7,38,A,7,1002,A,7,10,A,7,3.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.0,A,7,-18.3,A,7,35,A,7,1003,A,7,10,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-5.6,A,7,-16.7,A,7,42,A,7,1004,A,7,20,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.7,A,7,-15.6,A,7,50,A,7,1004,A,7,50,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/20/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-14.4,A,7,52,A,7,1004,A,7,60,A,7,3.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-15.0,A,7,54,A,7,1004,A,7,60,A,7,4.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/21/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-18.3,A,7,41,A,7,1005,A,7,40,A,7,2.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.3,A,7,-17.2,A,7,49,A,7,1005,A,7,80,A,7,2.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-17.8,A,7,49,A,7,1005,A,7,50,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-9.4,A,7,-16.7,A,7,56,A,7,1005,A,7,50,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,-10.0,A,7,-17.2,A,7,56,A,7,1005,A,7,50,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,-10.0,A,7,-18.3,A,7,51,A,7,1006,A,7,50,A,7,4.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/21/1980,08:00,32,742,18,1,13,33,1,9,14,1,13,17,1,13,9,1,9,16,1,13,24,1,21,5,A,7,5,A,7,-10.0,A,7,-19.4,A,7,46,A,7,1006,A,7,50,A,7,4.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,09:00,240,1414,121,1,13,429,1,9,48,1,13,123,1,13,305,1,9,71,1,13,84,1,21,4,A,7,3,A,7,-10.0,A,7,-16.7,A,7,59,A,7,1007,A,7,50,A,7,3.1,A,7,19300,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,10:00,446,1414,257,1,13,582,1,9,73,1,13,268,1,13,523,1,9,102,1,13,139,1,21,4,A,7,3,A,7,-7.2,A,7,-16.7,A,7,47,A,7,1007,A,7,50,A,7,5.7,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,11:00,600,1414,430,1,9,878,1,9,55,1,13,452,1,9,839,1,9,94,1,13,130,1,18,0,A,7,0,A,7,-6.1,A,7,-17.2,A,7,41,A,7,1007,A,7,50,A,7,4.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,12:00,691,1414,513,1,9,919,1,9,61,1,13,538,1,9,894,1,9,99,1,13,146,1,18,0,A,7,0,A,7,-5.0,A,7,-17.2,A,7,38,A,7,1006,A,7,360,A,7,4.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,13:00,713,1414,532,1,9,919,1,9,66,1,13,557,1,9,896,1,9,103,1,13,153,1,18,1,A,7,0,A,7,-3.9,A,7,-16.7,A,7,37,A,7,1005,A,7,40,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/21/1980,14:00,663,1414,438,1,9,780,1,9,70,1,13,465,1,9,764,1,9,105,1,13,156,1,18,3,A,7,1,A,7,-2.8,A,7,-16.7,A,7,34,A,7,1004,A,7,60,A,7,3.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,15:00,546,1414,349,1,9,695,1,9,79,1,13,367,1,9,659,1,9,111,1,13,158,1,18,6,A,7,1,A,7,-2.2,A,7,-17.2,A,7,31,A,7,1004,A,7,90,A,7,3.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,16:00,370,1414,185,1,13,429,1,9,72,1,13,197,1,13,362,1,9,101,1,13,131,1,21,7,A,7,3,A,7,-2.8,A,7,-17.8,A,7,31,A,7,1004,A,7,70,A,7,3.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,17:00,148,1414,50,1,13,150,1,9,34,1,13,52,1,13,80,1,9,43,1,13,61,1,21,7,A,7,3,A,7,-2.2,A,7,-18.9,A,7,27,A,7,1004,A,7,40,A,7,4.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,18:00,2,177,4,1,13,7,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,7,A,7,2,A,7,-3.3,A,7,-17.8,A,7,32,A,7,1004,A,7,60,A,7,2.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,-5.0,A,7,-13.9,A,7,50,A,7,1004,A,7,50,A,7,3.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/21/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,2,A,7,-5.0,A,7,-16.1,A,7,42,A,7,1004,A,7,70,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,3,A,7,-6.1,A,7,-17.2,A,7,41,A,7,1004,A,7,50,A,7,2.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,-6.7,A,7,-17.8,A,7,41,A,7,1004,A,7,40,A,7,1.5,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-17.2,A,7,45,A,7,1004,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/21/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.3,A,7,-15.0,A,7,59,A,7,1004,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-14.4,A,7,64,A,7,1004,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/22/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-14.4,A,7,64,A,7,1004,A,7,30,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-9.4,A,7,-14.4,A,7,67,A,7,1005,A,7,40,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-10.0,A,7,-15.6,A,7,64,A,7,1004,A,7,20,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-9.4,A,7,-15.6,A,7,61,A,7,1004,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,0,A,7,-10.0,A,7,-16.1,A,7,61,A,7,1004,A,7,40,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,0,A,7,-9.4,A,7,-15.6,A,7,61,A,7,1005,A,7,30,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/22/1980,08:00,31,719,19,1,13,45,1,9,15,1,13,18,1,13,12,1,9,18,1,13,26,1,21,8,A,7,1,A,7,-10.0,A,7,-15.6,A,7,64,A,7,1005,A,7,20,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,09:00,238,1414,111,1,13,346,1,9,52,1,13,116,1,13,239,1,9,75,1,13,94,1,21,8,A,7,1,A,7,-7.8,A,7,-13.9,A,7,62,A,7,1004,A,7,70,A,7,3.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,10:00,445,1414,259,1,9,543,1,9,87,1,13,265,1,9,482,1,9,113,1,13,160,1,18,9,A,7,1,A,7,-5.0,A,7,-13.3,A,7,52,A,7,1005,A,7,60,A,7,4.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,11:00,599,1414,385,1,9,669,1,9,100,1,13,402,1,9,642,1,9,128,1,13,200,1,18,9,A,7,1,A,7,-2.8,A,7,-14.4,A,7,41,A,7,1004,A,7,50,A,7,4.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,12:00,691,1414,474,1,9,740,1,9,110,1,13,497,1,9,729,1,9,140,1,13,233,1,18,9,A,7,1,A,7,-2.2,A,7,-15.0,A,7,37,A,7,1003,A,7,60,A,7,3.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,13:00,713,1414,513,1,9,766,1,9,124,1,13,535,1,9,754,1,9,153,1,13,263,1,18,9,A,7,0,A,7,-0.6,A,7,-15.6,A,7,32,A,7,1002,A,7,340,A,7,2.1,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/22/1980,14:00,664,1414,472,1,9,765,1,9,110,1,13,493,1,9,748,1,9,140,1,13,228,1,18,8,A,7,0,A,7,0.6,A,7,-15.0,A,7,30,A,7,1001,A,7,150,A,7,1.5,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,15:00,548,1414,314,1,9,489,1,9,123,1,13,331,1,9,466,1,9,149,1,13,238,1,18,10,A,7,2,A,7,1.1,A,7,-16.1,A,7,27,A,7,1000,A,7,80,A,7,3.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,16:00,372,1414,175,1,13,411,1,9,67,1,13,181,1,13,347,1,9,89,1,13,123,1,21,10,A,7,5,A,7,1.1,A,7,-16.1,A,7,27,A,7,1000,A,7,30,A,7,2.6,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,17:00,150,1414,25,1,13,5,1,9,25,1,13,29,1,13,0,1,9,29,1,13,90,1,21,10,A,7,10,A,7,0.6,A,7,-15.6,A,7,29,A,7,999,A,7,50,A,7,3.1,A,7,24100,B,7,1520,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,18:00,2,200,0,1,13,0,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,0.6,A,7,-15.0,A,7,30,A,7,999,A,7,70,A,7,2.1,A,7,24100,B,7,1520,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.6,A,7,-14.4,A,7,32,A,7,999,A,7,50,A,7,2.6,A,7,24100,B,7,700,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/22/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.6,A,7,-13.9,A,7,33,A,7,999,A,7,50,A,7,2.6,A,7,24100,B,7,610,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.0,A,7,-13.3,A,7,36,A,7,998,A,7,40,A,7,2.6,A,7,24100,B,7,700,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.0,A,7,-12.2,A,7,40,A,7,998,A,7,20,A,7,2.6,A,7,24100,B,7,610,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-12.2,A,7,41,A,7,997,A,7,20,A,7,2.6,A,7,24100,B,7,610,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/22/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-12.2,A,7,41,A,7,997,A,7,360,A,7,3.1,A,7,24100,B,7,550,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-11.7,A,7,43,A,7,996,A,7,60,A,7,2.6,A,7,16100,B,7,460,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.8,A,7,-4.4,A,7,88,A,7,995,A,7,20,A,7,2.6,A,7,4800,B,7,460,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/23/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.8,A,7,-3.3,A,7,96,A,7,994,A,7,360,A,7,2.1,A,7,11300,B,7,400,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.8,A,7,-3.3,A,7,96,A,7,993,A,7,10,A,7,1.5,A,7,11300,B,7,400,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.8,A,7,-3.3,A,7,96,A,7,993,A,7,350,A,7,2.6,A,7,11300,B,7,400,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.2,A,7,-2.8,A,7,96,A,7,992,A,7,40,A,7,1.5,A,7,11300,B,7,490,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.7,A,7,-2.8,A,7,92,A,7,992,A,7,60,A,7,2.1,A,7,11300,B,7,550,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/23/1980,08:00,30,719,15,1,13,2,1,9,15,1,13,17,1,13,0,1,9,17,1,13,50,1,21,10,A,7,10,A,7,-1.7,A,7,-2.2,A,7,96,A,7,992,A,7,120,A,7,1.5,A,7,4800,B,7,3050,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/23/1980,09:00,236,1414,67,1,13,0,1,9,67,1,13,74,1,13,0,1,9,74,1,13,215,1,21,10,A,7,10,A,7,-1.1,A,7,-1.7,A,7,96,A,7,992,A,7,0,A,7,0.0,A,7,9700,B,7,1680,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/23/1980,10:00,443,1414,146,1,9,74,1,9,123,1,13,160,1,9,68,1,9,139,1,13,327,1,18,9,A,7,9,A,7,-0.6,A,7,-1.7,A,7,92,A,7,992,A,7,330,A,7,2.6,A,7,11300,B,7,1520,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,11:00,599,1414,255,1,9,227,1,9,159,1,13,274,1,9,228,1,9,177,1,13,335,1,18,8,A,7,8,A,7,1.7,A,7,-0.6,A,7,85,A,7,991,A,7,0,A,7,0.0,A,7,11300,B,7,1520,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,12:00,691,1414,404,1,13,524,1,9,147,1,13,432,1,13,524,1,9,175,1,13,304,1,21,4,A,7,3,A,7,3.9,A,7,1.1,A,7,82,A,7,990,A,7,20,A,7,1.5,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,13:00,714,1414,520,1,9,920,1,9,54,1,13,548,1,9,899,1,9,93,1,13,140,1,18,0,A,7,0,A,7,7.2,A,7,1.1,A,7,65,A,7,989,A,7,50,A,7,1.5,A,7,11300,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,01,C,8 -12/23/1980,14:00,665,1414,432,1,9,754,1,9,75,1,13,455,1,9,736,1,9,107,1,13,163,1,18,1,A,7,1,A,7,8.9,A,7,0.6,A,7,56,A,7,990,A,7,10,A,7,1.5,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,15:00,549,1414,217,1,9,193,1,9,142,1,13,233,1,9,190,1,9,159,1,13,292,1,18,8,A,7,8,A,7,10.0,A,7,0.6,A,7,52,A,7,988,A,7,80,A,7,1.5,A,7,16100,B,7,1250,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,16:00,374,1414,135,1,9,63,1,9,118,1,13,147,1,9,56,1,9,132,1,13,293,1,18,9,A,7,9,A,7,10.0,A,7,1.1,A,7,54,A,7,988,A,7,150,A,7,1.5,A,7,16100,B,7,1250,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,17:00,152,1414,46,1,13,51,1,9,40,1,13,50,1,13,29,1,9,46,1,13,84,1,21,8,A,7,7,A,7,8.9,A,7,1.7,A,7,61,A,7,988,A,7,240,A,7,2.6,A,7,16100,B,7,1400,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,18:00,2,200,2,1,13,1,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,9,A,7,7,A,7,7.2,A,7,1.1,A,7,65,A,7,988,A,7,180,A,7,2.6,A,7,24100,B,7,3050,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,4,A,7,1,A,7,5.0,A,7,1.1,A,7,76,A,7,989,A,7,230,A,7,2.1,A,7,24100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/23/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,1,A,7,2.2,A,7,0.6,A,7,89,A,7,988,A,7,140,A,7,2.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,0.0,A,7,92,A,7,988,A,7,220,A,7,2.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,0.6,A,7,96,A,7,988,A,7,200,A,7,2.6,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,1.1,A,7,100,A,7,988,A,7,210,A,7,3.1,A,7,16100,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/23/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,2.2,A,7,1.7,A,7,96,A,7,987,A,7,240,A,7,1.5,A,7,6400,B,7,77777,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,1.1,A,7,1.1,A,7,100,A,7,987,A,7,220,A,7,2.6,A,7,6400,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -12/24/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,0.6,A,7,0.6,A,7,100,A,7,987,A,7,220,A,7,2.6,A,7,6400,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,0.6,A,7,0.6,A,7,100,A,7,986,A,7,220,A,7,3.1,A,7,800,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,6,A,7,6,A,7,0.0,A,7,0.0,A,7,100,A,7,985,A,7,250,A,7,1.5,A,7,400,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,0.0,A,7,0.0,A,7,100,A,7,984,A,7,190,A,7,2.1,A,7,200,B,7,77777,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.1,A,7,-1.1,A,7,100,A,7,984,A,7,230,A,7,3.1,A,7,200,B,7,30,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-0.6,A,7,100,A,7,984,A,7,230,A,7,5.2,A,7,6400,B,7,30,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,08:00,29,719,7,1,13,0,1,9,7,1,13,8,1,13,0,1,9,8,1,13,27,1,21,10,A,7,10,A,7,-0.6,A,7,-0.6,A,7,100,A,7,983,A,7,210,A,7,4.1,A,7,200,B,7,60,A,7,1.0,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,09:00,235,1414,72,1,13,2,1,9,71,1,13,78,1,13,1,1,9,78,1,13,221,1,21,10,A,7,10,A,7,0.0,A,7,0.0,A,7,100,A,7,983,A,7,200,A,7,4.1,A,7,1300,B,7,60,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,10:00,442,1414,153,1,9,11,1,9,149,1,13,168,1,9,8,1,9,165,1,13,490,1,18,10,A,7,10,A,7,1.7,A,7,1.7,A,7,100,A,7,982,A,7,180,A,7,3.1,A,7,1300,B,7,90,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,11:00,598,1414,157,1,9,1,1,9,157,1,13,179,1,9,1,1,9,178,1,13,611,1,18,10,A,7,10,A,7,3.3,A,7,3.3,A,7,100,A,7,981,A,7,190,A,7,5.7,A,7,1600,B,7,120,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,12:00,691,1414,253,1,9,5,1,9,251,1,13,282,1,9,5,1,9,280,1,13,896,1,18,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,979,A,7,200,A,7,7.2,A,7,2400,B,7,150,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,13:00,714,1414,233,1,9,2,1,9,232,1,13,262,1,9,2,1,9,261,1,13,879,1,18,10,A,7,10,A,7,7.2,A,7,6.7,A,7,96,A,7,978,A,7,220,A,7,6.2,A,7,2400,B,7,150,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,10,C,8 -12/24/1980,14:00,667,1414,205,1,9,6,1,9,202,1,13,231,1,9,5,1,9,229,1,13,771,1,18,10,A,7,10,A,7,7.2,A,7,6.7,A,7,96,A,7,977,A,7,240,A,7,6.2,A,7,4800,B,7,210,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,15:00,551,1414,191,1,9,2,1,9,190,1,13,211,1,9,2,1,9,210,1,13,652,1,18,10,A,7,10,A,7,8.3,A,7,7.8,A,7,96,A,7,977,A,7,230,A,7,6.2,A,7,6400,B,7,270,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,16:00,376,1414,119,1,9,1,1,9,118,1,13,130,1,9,1,1,9,130,1,13,388,1,18,10,A,7,10,A,7,9.4,A,7,7.8,A,7,89,A,7,977,A,7,250,A,7,6.2,A,7,6400,B,7,310,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/24/1980,17:00,155,1414,50,1,13,133,1,9,35,1,13,53,1,13,69,1,9,45,1,13,63,1,21,7,A,7,7,A,7,8.3,A,7,7.8,A,7,96,A,7,978,A,7,250,A,7,2.1,A,7,9700,B,7,980,A,7,1.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/24/1980,18:00,3,224,2,1,13,0,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,9,A,7,9,A,7,7.8,A,7,7.2,A,7,96,A,7,978,A,7,290,A,7,4.1,A,7,4000,B,7,1310,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/24/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,7.8,A,7,5.6,A,7,86,A,7,979,A,7,320,A,7,4.6,A,7,12900,B,7,1400,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/24/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,7.2,A,7,2.8,A,7,74,A,7,980,A,7,300,A,7,5.2,A,7,24100,B,7,1310,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/24/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,3,A,7,5.6,A,7,-1.1,A,7,63,A,7,980,A,7,320,A,7,4.1,A,7,24100,B,7,77777,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/24/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,2,A,7,5.0,A,7,-2.2,A,7,60,A,7,981,A,7,330,A,7,9.3,A,7,24100,B,7,77777,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/24/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,-3.3,A,7,57,A,7,983,A,7,320,A,7,7.2,A,7,24100,B,7,1070,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/24/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,-5.0,A,7,55,A,7,984,A,7,320,A,7,7.2,A,7,24100,B,7,1220,A,7,0.8,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,5,A,7,0.0,A,7,-7.8,A,7,56,A,7,985,A,7,330,A,7,7.7,A,7,24100,B,7,77777,A,7,0.7,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/25/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,-2.8,A,7,-10.0,A,7,58,A,7,987,A,7,330,A,7,6.2,A,7,24100,B,7,77777,A,7,0.6,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-4.4,A,7,-12.8,A,7,53,A,7,990,A,7,330,A,7,6.7,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-6.1,A,7,-15.6,A,7,48,A,7,991,A,7,340,A,7,7.2,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-7.2,A,7,-16.1,A,7,49,A,7,991,A,7,360,A,7,6.7,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-16.7,A,7,54,A,7,992,A,7,360,A,7,7.7,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-10.0,A,7,-18.9,A,7,49,A,7,994,A,7,360,A,7,6.7,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/25/1980,08:00,28,695,15,1,13,39,1,9,11,1,13,14,1,13,10,1,9,14,1,13,18,1,21,0,A,7,0,A,7,-10.0,A,7,-18.9,A,7,49,A,7,994,A,7,350,A,7,6.7,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,09:00,233,1414,114,1,13,423,1,9,44,1,13,117,1,13,298,1,9,67,1,13,78,1,21,0,A,7,0,A,7,-9.4,A,7,-18.9,A,7,47,A,7,995,A,7,340,A,7,7.2,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,10:00,441,1414,274,1,9,665,1,9,65,1,13,286,1,9,598,1,9,99,1,13,125,1,18,0,A,7,0,A,7,-8.3,A,7,-20.6,A,7,37,A,7,997,A,7,350,A,7,7.7,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,11:00,598,1414,408,1,9,771,1,9,81,1,13,421,1,9,735,1,9,109,1,13,160,1,18,0,A,7,0,A,7,-7.2,A,7,-21.1,A,7,32,A,7,998,A,7,360,A,7,5.7,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,12:00,691,1414,494,1,9,823,1,9,90,1,13,513,1,9,802,1,9,119,1,13,186,1,18,0,A,7,0,A,7,-5.6,A,7,-21.1,A,7,28,A,7,997,A,7,360,A,7,5.7,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,13:00,715,1414,514,1,9,831,1,9,92,1,13,535,1,9,814,1,9,122,1,13,194,1,18,0,A,7,0,A,7,-4.4,A,7,-20.6,A,7,27,A,7,996,A,7,10,A,7,5.2,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/25/1980,14:00,668,1414,475,1,9,816,1,9,88,1,13,493,1,9,792,1,9,117,1,13,180,1,18,0,A,7,0,A,7,-3.9,A,7,-22.8,A,7,22,A,7,996,A,7,340,A,7,5.7,A,7,24100,B,7,77777,A,7,0.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,15:00,553,1414,372,1,9,755,1,9,76,1,13,383,1,9,710,1,9,104,1,13,147,1,18,0,A,7,0,A,7,-3.3,A,7,-23.3,A,7,20,A,7,996,A,7,360,A,7,2.6,A,7,24100,B,7,77777,A,7,0.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,16:00,378,1414,224,1,9,615,1,9,58,1,13,232,1,9,527,1,9,91,1,13,109,1,18,0,A,7,0,A,7,-3.3,A,7,-23.9,A,7,19,A,7,996,A,7,360,A,7,3.6,A,7,24100,B,7,77777,A,7,0.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,17:00,157,1414,65,1,13,287,1,9,33,1,13,66,1,13,168,1,9,47,1,13,57,1,21,0,A,7,0,A,7,-5.0,A,7,-23.3,A,7,22,A,7,996,A,7,10,A,7,3.1,A,7,24100,B,7,77777,A,7,0.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,18:00,3,224,2,1,13,5,1,9,2,1,13,0,1,13,0,1,9,0,1,13,0,1,21,0,A,7,0,A,7,-6.7,A,7,-21.7,A,7,30,A,7,997,A,7,20,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-9.4,A,7,-20.6,A,7,40,A,7,997,A,7,40,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/25/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-8.9,A,7,-17.8,A,7,49,A,7,997,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-10.0,A,7,-18.3,A,7,51,A,7,997,A,7,40,A,7,1.5,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,A,7,1,A,7,-10.0,A,7,-20.0,A,7,44,A,7,998,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-11.1,A,7,-17.8,A,7,58,A,7,998,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/25/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,2,A,7,-12.2,A,7,-16.7,A,7,70,A,7,997,A,7,70,A,7,2.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/26/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,1,A,7,-10.0,A,7,-16.7,A,7,59,A,7,997,A,7,360,A,7,2.1,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,01,C,8 -12/26/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,A,7,0,A,7,-12.8,A,7,-17.2,A,7,70,A,7,998,A,7,110,A,7,1.5,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,A,7,0,A,7,-12.2,A,7,-16.1,A,7,73,A,7,998,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,0,A,7,-12.2,A,7,-15.0,A,7,80,A,7,998,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,-13.3,A,7,-16.1,A,7,80,A,7,998,A,7,0,A,7,0.0,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,2,A,7,0,A,7,-13.3,A,7,-15.0,A,7,87,A,7,998,A,7,360,A,7,1.5,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,5,A,7,3,A,7,-12.2,A,7,-15.0,A,7,80,A,7,999,A,7,230,A,7,1.5,A,7,24100,B,7,77777,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/26/1980,08:00,28,695,16,1,13,29,1,9,13,1,13,16,1,13,11,1,9,15,1,13,27,1,21,6,A,7,4,A,7,-12.2,A,7,-16.1,A,7,73,A,7,998,A,7,160,A,7,1.5,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,09:00,232,1415,81,1,13,61,1,9,71,1,13,89,1,13,47,1,9,81,1,13,166,1,21,8,A,7,6,A,7,-10.0,A,7,-14.4,A,7,70,A,7,998,A,7,160,A,7,3.1,A,7,24100,B,7,7620,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,10:00,441,1415,158,1,9,190,1,9,99,1,13,170,1,9,174,1,9,116,1,13,191,1,18,8,A,7,8,A,7,-8.9,A,7,-13.3,A,7,71,A,7,998,A,7,160,A,7,3.1,A,7,24100,B,7,3050,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,11:00,597,1415,229,1,9,82,1,9,194,1,13,251,1,9,80,1,9,217,1,13,538,1,18,8,A,7,8,A,7,-6.7,A,7,-16.7,A,7,45,A,7,998,A,7,0,A,7,0.0,A,7,24100,B,7,3050,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,12:00,691,1415,232,1,9,38,1,9,213,1,13,254,1,9,38,1,9,236,1,13,629,1,18,10,A,7,10,A,7,-5.6,A,7,-16.7,A,7,42,A,7,997,A,7,0,A,7,0.0,A,7,24100,B,7,3050,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,13:00,716,1415,206,1,9,2,1,9,205,1,13,234,1,9,2,1,9,233,1,13,814,1,18,10,A,7,10,A,7,-3.9,A,7,-16.7,A,7,37,A,7,996,A,7,0,A,7,0.0,A,7,24100,B,7,3050,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/26/1980,14:00,669,1415,437,1,9,671,1,9,118,1,13,455,1,9,654,1,9,144,1,13,243,1,18,7,A,7,2,A,7,-3.3,A,7,-17.2,A,7,34,A,7,994,A,7,170,A,7,2.6,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,15:00,555,1415,343,1,9,587,1,9,112,1,13,353,1,9,549,1,9,136,1,13,212,1,18,7,A,7,2,A,7,-2.2,A,7,-16.7,A,7,32,A,7,994,A,7,230,A,7,1.5,A,7,24100,B,7,77777,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,16:00,381,1415,133,1,9,149,1,9,93,1,13,146,1,9,132,1,9,111,1,13,205,1,18,10,A,7,8,A,7,-2.2,A,7,-17.2,A,7,31,A,7,994,A,7,70,A,7,2.6,A,7,24100,B,7,2290,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,17:00,160,1415,35,1,13,5,1,9,35,1,13,40,1,13,0,1,9,40,1,13,119,1,21,10,A,7,10,A,7,-2.8,A,7,-16.7,A,7,34,A,7,994,A,7,60,A,7,2.6,A,7,24100,B,7,2290,A,7,0.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,18:00,3,248,0,1,13,0,1,9,0,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,-3.3,A,7,-15.6,A,7,39,A,7,994,A,7,50,A,7,2.1,A,7,24100,B,7,2130,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-4.4,A,7,-14.4,A,7,46,A,7,995,A,7,0,A,7,0.0,A,7,16100,B,7,2130,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/26/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-3.9,A,7,-13.9,A,7,46,A,7,994,A,7,70,A,7,2.1,A,7,16100,B,7,2130,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-3.9,A,7,-13.3,A,7,48,A,7,994,A,7,10,A,7,2.6,A,7,16100,B,7,2130,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-3.9,A,7,-13.3,A,7,48,A,7,995,A,7,360,A,7,3.1,A,7,16100,B,7,2130,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-3.9,A,7,-13.3,A,7,48,A,7,995,A,7,60,A,7,2.1,A,7,16100,B,7,2130,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/26/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,7,A,7,-6.1,A,7,-13.3,A,7,57,A,7,995,A,7,60,A,7,2.6,A,7,16100,B,7,2130,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,-6.1,A,7,-12.2,A,7,62,A,7,994,A,7,30,A,7,2.6,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/27/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,8,A,7,8,A,7,-6.1,A,7,-12.2,A,7,62,A,7,994,A,7,50,A,7,2.6,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,7,A,7,7,A,7,-6.1,A,7,-12.8,A,7,60,A,7,994,A,7,20,A,7,4.1,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-5.6,A,7,-12.8,A,7,57,A,7,994,A,7,40,A,7,4.1,A,7,24100,B,7,2290,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-5.6,A,7,-13.3,A,7,55,A,7,993,A,7,40,A,7,5.2,A,7,24100,B,7,2440,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-5.0,A,7,-13.9,A,7,50,A,7,994,A,7,30,A,7,4.1,A,7,24100,B,7,2590,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-5.0,A,7,-13.9,A,7,50,A,7,995,A,7,50,A,7,4.6,A,7,24100,B,7,1250,A,7,0.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/27/1980,08:00,27,672,9,1,13,1,1,9,9,1,13,11,1,13,0,1,9,11,1,13,33,1,21,10,A,7,10,A,7,-5.0,A,7,-13.9,A,7,50,A,7,995,A,7,50,A,7,5.2,A,7,24100,B,7,980,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,09:00,231,1415,74,1,13,4,1,9,74,1,13,81,1,13,1,1,9,81,1,13,224,1,21,10,A,7,10,A,7,-4.4,A,7,-13.9,A,7,48,A,7,995,A,7,40,A,7,6.7,A,7,24100,B,7,980,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,10:00,440,1415,216,1,9,304,1,9,121,1,13,229,1,9,278,1,9,142,1,13,243,1,18,8,A,7,8,A,7,-3.3,A,7,-13.3,A,7,46,A,7,996,A,7,40,A,7,7.2,A,7,24100,B,7,940,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,11:00,597,1415,163,1,9,3,1,9,162,1,13,185,1,9,2,1,9,184,1,13,624,1,18,10,A,7,10,A,7,-2.2,A,7,-12.8,A,7,45,A,7,996,A,7,40,A,7,6.2,A,7,24100,B,7,700,A,7,0.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,12:00,692,1415,167,1,9,5,1,9,165,1,13,193,1,9,4,1,9,191,1,13,686,1,18,10,A,7,10,A,7,-2.2,A,7,-11.7,A,7,49,A,7,995,A,7,40,A,7,6.7,A,7,16100,B,7,700,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,13:00,717,1415,172,1,9,0,1,9,172,1,13,198,1,9,0,1,9,198,1,13,721,1,18,10,A,7,10,A,7,-1.7,A,7,-10.6,A,7,51,A,7,995,A,7,40,A,7,8.2,A,7,11300,B,7,700,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,22,C,8 -12/27/1980,14:00,671,1415,109,1,9,1,1,9,108,1,13,129,1,9,1,1,9,128,1,13,485,1,18,10,A,7,10,A,7,-1.1,A,7,-8.3,A,7,58,A,7,993,A,7,30,A,7,6.7,A,7,11300,B,7,700,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,79,C,8 -12/27/1980,15:00,557,1415,153,1,9,6,1,9,151,1,13,173,1,9,4,1,9,171,1,13,572,1,18,10,A,7,10,A,7,-0.6,A,7,-10.0,A,7,49,A,7,993,A,7,20,A,7,6.7,A,7,11300,B,7,610,A,7,0.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/27/1980,16:00,383,1415,109,1,9,1,1,9,108,1,13,120,1,9,1,1,9,120,1,13,372,1,18,10,A,7,10,A,7,-1.1,A,7,-7.2,A,7,64,A,7,993,A,7,40,A,7,7.2,A,7,3200,B,7,670,A,7,0.7,E,8,0.000,F,8,0.00,?,0,0,1,D,9,71,C,8 -12/27/1980,17:00,162,1415,39,1,13,1,1,9,39,1,13,44,1,13,0,1,9,44,1,13,129,1,21,10,A,7,10,A,7,-2.2,A,7,-4.4,A,7,85,A,7,993,A,7,30,A,7,6.2,A,7,1600,B,7,670,A,7,0.8,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/27/1980,18:00,4,271,3,1,13,0,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,-3.3,A,7,-3.3,A,7,100,A,7,993,A,7,30,A,7,8.2,A,7,1300,B,7,120,A,7,0.9,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/27/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-3.3,A,7,-3.3,A,7,100,A,7,994,A,7,20,A,7,7.7,A,7,1600,B,7,120,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/27/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.8,A,7,-2.8,A,7,100,A,7,994,A,7,40,A,7,7.7,A,7,11300,B,7,270,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/27/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-2.2,A,7,-2.2,A,7,100,A,7,993,A,7,30,A,7,8.2,A,7,8000,B,7,240,A,7,0.9,E,8,0.000,?,0,0.00,?,0,0,1,D,9,66,C,8 -12/27/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.7,A,7,-1.7,A,7,100,A,7,993,A,7,30,A,7,9.3,A,7,6400,B,7,240,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/27/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.1,A,7,-1.1,A,7,100,A,7,993,A,7,40,A,7,7.2,A,7,9700,B,7,270,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/27/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.7,A,7,-1.7,A,7,100,A,7,992,A,7,20,A,7,7.2,A,7,16100,B,7,340,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/28/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.7,A,7,-1.7,A,7,100,A,7,991,A,7,40,A,7,7.2,A,7,16100,B,7,340,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/28/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-1.1,A,7,-1.1,A,7,100,A,7,991,A,7,30,A,7,6.7,A,7,12900,B,7,340,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/28/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-0.6,A,7,100,A,7,991,A,7,40,A,7,7.2,A,7,12900,B,7,240,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/28/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,-0.6,A,7,-0.6,A,7,100,A,7,991,A,7,30,A,7,7.7,A,7,12900,B,7,210,A,7,1.0,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/28/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.6,A,7,0.6,A,7,100,A,7,990,A,7,40,A,7,7.2,A,7,2400,B,7,150,A,7,1.1,E,8,0.000,?,0,0.00,?,0,5,1,D,9,45,C,8 -12/28/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.6,A,7,0.6,A,7,100,A,7,990,A,7,50,A,7,7.7,A,7,2400,B,7,150,A,7,1.1,E,8,0.000,?,0,0.00,?,0,3,1,D,9,45,C,8 -12/28/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,0.6,A,7,0.6,A,7,100,A,7,990,A,7,40,A,7,7.2,A,7,4000,B,7,150,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,08:00,26,672,14,1,13,0,1,9,14,1,13,16,1,13,0,1,9,16,1,13,47,1,21,10,A,7,10,A,7,0.6,A,7,0.6,A,7,100,A,7,991,A,7,30,A,7,8.8,A,7,4000,B,7,120,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,09:00,230,1415,79,1,13,1,1,9,79,1,13,86,1,13,0,1,9,86,1,13,231,1,21,10,A,7,10,A,7,1.1,A,7,1.1,A,7,100,A,7,990,A,7,30,A,7,8.8,A,7,4000,B,7,120,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,10:00,439,1415,173,1,9,1,1,9,173,1,13,188,1,9,1,1,9,188,1,13,522,1,18,10,A,7,10,A,7,1.7,A,7,1.7,A,7,100,A,7,991,A,7,30,A,7,9.3,A,7,4000,B,7,120,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,11:00,597,1415,147,1,9,0,1,9,147,1,13,168,1,9,0,1,9,168,1,13,583,1,18,10,A,7,10,A,7,2.2,A,7,2.2,A,7,100,A,7,991,A,7,30,A,7,8.8,A,7,2400,B,7,120,A,7,1.2,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -12/28/1980,12:00,692,1415,173,1,9,2,1,9,172,1,13,199,1,9,2,1,9,198,1,13,707,1,18,10,A,7,10,A,7,2.2,A,7,2.2,A,7,100,A,7,990,A,7,30,A,7,8.8,A,7,2400,B,7,120,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,13:00,718,1415,166,1,9,1,1,9,165,1,13,192,1,9,1,1,9,191,1,13,700,1,18,10,A,7,10,A,7,2.8,A,7,2.8,A,7,100,A,7,989,A,7,30,A,7,9.3,A,7,2400,B,7,120,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,20,C,8 -12/28/1980,14:00,673,1415,151,1,9,1,1,9,151,1,13,175,1,9,1,1,9,175,1,13,633,1,18,10,A,7,10,A,7,3.9,A,7,3.9,A,7,100,A,7,988,A,7,30,A,7,7.7,A,7,2400,B,7,120,A,7,1.3,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -12/28/1980,15:00,559,1415,126,1,9,1,1,9,126,1,13,145,1,9,1,1,9,145,1,13,504,1,18,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,988,A,7,40,A,7,7.7,A,7,2400,B,7,150,A,7,1.4,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -12/28/1980,16:00,386,1415,83,1,9,1,1,9,83,1,13,95,1,9,0,1,9,95,1,13,312,1,18,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,988,A,7,30,A,7,7.7,A,7,2400,B,7,150,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,17:00,165,1415,33,1,13,0,1,9,33,1,13,37,1,13,0,1,9,37,1,13,115,1,21,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,989,A,7,40,A,7,7.7,A,7,1600,B,7,90,A,7,1.4,E,8,0.000,F,8,0.00,?,0,8,1,D,9,45,C,8 -12/28/1980,18:00,4,271,3,1,13,0,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,989,A,7,40,A,7,6.7,A,7,1600,B,7,90,A,7,1.4,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -12/28/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,989,A,7,40,A,7,7.7,A,7,1600,B,7,90,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,21,C,8 -12/28/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,4.4,A,7,100,A,7,989,A,7,40,A,7,6.7,A,7,1600,B,7,90,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,5.0,A,7,100,A,7,989,A,7,40,A,7,7.7,A,7,1600,B,7,90,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,5.0,A,7,100,A,7,988,A,7,30,A,7,7.2,A,7,1600,B,7,90,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,5.6,A,7,100,A,7,988,A,7,30,A,7,6.2,A,7,1600,B,7,90,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/28/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,5.6,A,7,100,A,7,987,A,7,30,A,7,7.2,A,7,1600,B,7,90,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/29/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,985,A,7,20,A,7,5.2,A,7,4800,B,7,120,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,10,C,8 -12/29/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,985,A,7,30,A,7,5.2,A,7,4800,B,7,180,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,45,C,8 -12/29/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,985,A,7,30,A,7,5.7,A,7,11300,B,7,210,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,984,A,7,20,A,7,5.2,A,7,16100,B,7,270,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,983,A,7,10,A,7,5.7,A,7,16100,B,7,270,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,983,A,7,20,A,7,4.1,A,7,16100,B,7,270,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,983,A,7,20,A,7,5.2,A,7,16100,B,7,240,A,7,1.5,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/29/1980,08:00,26,672,11,1,13,0,1,9,11,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,5.6,A,7,5.6,A,7,100,A,7,983,A,7,360,A,7,4.1,A,7,12900,B,7,210,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,09:00,229,1415,60,1,13,0,1,9,60,1,13,67,1,13,0,1,9,67,1,13,197,1,21,10,A,7,10,A,7,5.6,A,7,5.6,A,7,100,A,7,983,A,7,10,A,7,5.2,A,7,6400,B,7,210,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/29/1980,10:00,439,1415,129,1,9,1,1,9,129,1,13,144,1,9,1,1,9,144,1,13,449,1,18,10,A,7,10,A,7,6.1,A,7,6.1,A,7,100,A,7,983,A,7,10,A,7,4.1,A,7,11300,B,7,210,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,11:00,597,1415,188,1,9,1,1,9,188,1,13,211,1,9,1,1,9,210,1,13,686,1,18,10,A,7,10,A,7,8.3,A,7,6.7,A,7,89,A,7,983,A,7,10,A,7,5.2,A,7,11300,B,7,240,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,12:00,693,1415,228,1,9,0,1,9,228,1,13,256,1,9,0,1,9,256,1,13,851,1,18,10,A,7,10,A,7,7.2,A,7,6.7,A,7,96,A,7,982,A,7,30,A,7,6.2,A,7,11300,B,7,270,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,13:00,719,1415,231,1,9,1,1,9,230,1,13,260,1,9,1,1,9,259,1,13,878,1,18,10,A,7,10,A,7,7.8,A,7,6.7,A,7,93,A,7,981,A,7,20,A,7,5.7,A,7,11300,B,7,310,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,02,C,8 -12/29/1980,14:00,675,1415,245,1,9,1,1,9,245,1,13,273,1,9,1,1,9,272,1,13,868,1,18,10,A,7,10,A,7,8.9,A,7,6.1,A,7,83,A,7,980,A,7,20,A,7,7.7,A,7,11300,B,7,460,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,15:00,562,1415,199,1,9,1,1,9,198,1,13,219,1,9,1,1,9,219,1,13,675,1,18,10,A,7,10,A,7,10.0,A,7,6.7,A,7,80,A,7,980,A,7,30,A,7,5.2,A,7,11300,B,7,550,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,16:00,388,1415,126,1,9,1,1,9,126,1,13,139,1,9,1,1,9,139,1,13,410,1,18,10,A,7,10,A,7,10.6,A,7,6.1,A,7,74,A,7,980,A,7,20,A,7,4.6,A,7,11300,B,7,700,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,17:00,168,1415,49,1,13,117,1,9,35,1,13,52,1,13,64,1,9,45,1,13,62,1,21,7,A,7,7,A,7,9.4,A,7,5.6,A,7,77,A,7,980,A,7,20,A,7,3.6,A,7,11300,B,7,700,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,18:00,5,295,4,1,13,3,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,8,A,7,3,A,7,7.2,A,7,3.9,A,7,80,A,7,980,A,7,10,A,7,3.1,A,7,24100,B,7,77777,A,7,1.3,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,3.3,A,7,74,A,7,981,A,7,360,A,7,3.6,A,7,24100,B,7,4880,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,03,C,8 -12/29/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.8,A,7,3.3,A,7,74,A,7,981,A,7,360,A,7,3.6,A,7,24100,B,7,4880,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,3.3,A,7,77,A,7,981,A,7,360,A,7,3.6,A,7,24100,B,7,1520,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,7.2,A,7,2.8,A,7,74,A,7,981,A,7,340,A,7,3.1,A,7,24100,B,7,1520,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.7,A,7,2.2,A,7,74,A,7,980,A,7,360,A,7,3.1,A,7,24100,B,7,1520,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/29/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,2.8,A,7,83,A,7,980,A,7,360,A,7,3.1,A,7,24100,B,7,2130,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,2.8,A,7,79,A,7,979,A,7,360,A,7,2.6,A,7,24100,B,7,2740,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/30/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,6.1,A,7,2.8,A,7,79,A,7,978,A,7,10,A,7,2.6,A,7,24100,B,7,2290,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,2.8,A,7,86,A,7,978,A,7,10,A,7,1.5,A,7,24100,B,7,2290,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,2.8,A,7,86,A,7,979,A,7,0,A,7,0.0,A,7,24100,B,7,2130,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.6,A,7,2.8,A,7,83,A,7,979,A,7,340,A,7,1.5,A,7,24100,B,7,2130,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,2.8,A,7,89,A,7,979,A,7,0,A,7,0.0,A,7,24100,B,7,1980,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,2.8,A,7,89,A,7,980,A,7,0,A,7,0.0,A,7,24100,B,7,2130,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/30/1980,08:00,25,672,5,1,13,0,1,9,5,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,4.4,A,7,2.8,A,7,89,A,7,981,A,7,0,A,7,0.0,A,7,24100,B,7,1220,A,7,1.2,E,8,0.000,F,8,0.00,?,0,5,1,D,9,00,C,8 -12/30/1980,09:00,228,1415,35,1,13,3,1,9,35,1,13,41,1,13,0,1,9,41,1,13,132,1,21,10,A,7,10,A,7,4.4,A,7,3.9,A,7,96,A,7,981,A,7,20,A,7,2.6,A,7,11300,B,7,700,A,7,1.3,E,8,0.000,F,8,0.00,?,0,8,1,D,9,80,C,8 -12/30/1980,10:00,439,1415,78,1,9,8,1,9,76,1,13,91,1,9,4,1,9,90,1,13,307,1,18,10,A,7,10,A,7,7.2,A,7,6.1,A,7,93,A,7,982,A,7,350,A,7,4.1,A,7,11300,B,7,760,A,7,1.5,E,8,0.000,F,8,0.00,?,0,5,1,D,9,61,C,8 -12/30/1980,11:00,598,1415,91,1,9,10,1,9,87,1,13,109,1,9,6,1,9,106,1,13,386,1,18,10,A,7,10,A,7,7.2,A,7,6.1,A,7,93,A,7,982,A,7,350,A,7,3.6,A,7,11300,B,7,2130,A,7,1.5,E,8,0.000,F,8,0.00,?,0,5,1,D,9,61,C,8 -12/30/1980,12:00,694,1415,107,1,9,0,1,9,107,1,13,128,1,9,0,1,9,128,1,13,488,1,18,10,A,7,10,A,7,6.7,A,7,6.7,A,7,100,A,7,982,A,7,360,A,7,5.2,A,7,6400,B,7,760,A,7,1.6,E,8,0.000,F,8,0.00,?,0,3,1,D,9,45,C,8 -12/30/1980,13:00,721,1415,131,1,9,1,1,9,131,1,13,155,1,9,1,1,9,155,1,13,586,1,18,10,A,7,10,A,7,6.7,A,7,6.7,A,7,100,A,7,981,A,7,360,A,7,4.1,A,7,6400,B,7,760,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,45,C,8 -12/30/1980,14:00,677,1415,145,1,9,0,1,9,145,1,13,168,1,9,0,1,9,168,1,13,616,1,18,10,A,7,10,A,7,6.7,A,7,6.7,A,7,100,A,7,981,A,7,350,A,7,4.1,A,7,11300,B,7,180,A,7,1.6,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -12/30/1980,15:00,564,1415,126,1,9,3,1,9,125,1,13,145,1,9,2,1,9,144,1,13,504,1,18,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,981,A,7,320,A,7,3.1,A,7,11300,B,7,640,A,7,1.5,E,8,0.000,F,8,0.00,?,0,0,1,D,9,51,C,8 -12/30/1980,16:00,391,1415,80,1,9,2,1,9,79,1,13,91,1,9,1,1,9,91,1,13,303,1,18,10,A,7,10,A,7,6.7,A,7,6.1,A,7,96,A,7,981,A,7,320,A,7,3.1,A,7,11300,B,7,670,A,7,1.5,E,8,0.000,F,8,0.00,?,0,5,1,D,9,61,C,8 -12/30/1980,17:00,171,1415,30,1,13,0,1,9,30,1,13,34,1,13,0,1,9,34,1,13,108,1,21,10,A,7,10,A,7,5.6,A,7,5.0,A,7,96,A,7,981,A,7,350,A,7,3.1,A,7,11300,B,7,1520,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,61,C,8 -12/30/1980,18:00,6,318,3,1,13,0,1,9,3,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,5.6,A,7,5.0,A,7,96,A,7,981,A,7,330,A,7,1.5,A,7,24100,B,7,1830,A,7,1.4,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,5.0,A,7,4.4,A,7,96,A,7,982,A,7,360,A,7,3.6,A,7,24100,B,7,370,A,7,1.4,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/30/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,4.4,A,7,2.8,A,7,89,A,7,983,A,7,10,A,7,2.6,A,7,24100,B,7,790,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,2.8,A,7,93,A,7,983,A,7,20,A,7,2.1,A,7,24100,B,7,910,A,7,1.3,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.9,A,7,2.2,A,7,89,A,7,983,A,7,360,A,7,2.6,A,7,24100,B,7,910,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,2.2,A,7,93,A,7,983,A,7,360,A,7,2.6,A,7,16100,B,7,640,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/30/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,1.7,A,7,89,A,7,983,A,7,10,A,7,2.6,A,7,16100,B,7,610,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,01:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,1.1,A,7,86,A,7,982,A,7,20,A,7,2.6,A,7,11300,B,7,580,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/31/1980,02:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,1.1,A,7,86,A,7,982,A,7,10,A,7,2.6,A,7,11300,B,7,580,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,03:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,1.1,A,7,89,A,7,982,A,7,10,A,7,2.1,A,7,11300,B,7,550,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,04:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,0.6,A,7,89,A,7,982,A,7,20,A,7,2.1,A,7,11300,B,7,490,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,05:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,0.6,A,7,89,A,7,982,A,7,50,A,7,1.5,A,7,11300,B,7,490,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,06:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,0.6,A,7,85,A,7,982,A,7,10,A,7,1.5,A,7,11300,B,7,550,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,07:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,0.6,A,7,85,A,7,982,A,7,0,A,7,0.0,A,7,11300,B,7,550,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/31/1980,08:00,25,649,11,1,13,0,1,9,11,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,2.2,A,7,0.6,A,7,89,A,7,982,A,7,40,A,7,1.5,A,7,11300,B,7,550,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,09:00,228,1415,63,1,13,0,1,9,63,1,13,70,1,13,0,1,9,70,1,13,203,1,21,10,A,7,10,A,7,2.8,A,7,0.6,A,7,85,A,7,983,A,7,340,A,7,1.5,A,7,24100,B,7,640,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,10:00,439,1415,138,1,9,0,1,9,138,1,13,153,1,9,0,1,9,153,1,13,467,1,18,10,A,7,10,A,7,3.3,A,7,1.1,A,7,86,A,7,983,A,7,60,A,7,2.1,A,7,16100,B,7,760,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,11:00,598,1415,213,1,9,1,1,9,213,1,13,236,1,9,1,1,9,236,1,13,736,1,18,10,A,7,10,A,7,3.3,A,7,1.1,A,7,86,A,7,983,A,7,0,A,7,0.0,A,7,16100,B,7,550,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,12:00,695,1415,144,1,9,2,1,9,143,1,13,168,1,9,1,1,9,167,1,13,617,1,18,10,A,7,10,A,7,2.8,A,7,1.1,A,7,89,A,7,983,A,7,0,A,7,0.0,A,7,6400,B,7,270,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/31/1980,13:00,723,1415,241,1,9,2,1,9,240,1,13,271,1,9,2,1,9,270,1,13,904,1,18,10,A,7,10,A,7,3.9,A,7,1.7,A,7,86,A,7,982,A,7,130,A,7,2.1,A,7,9700,B,7,490,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/31/1980,14:00,679,1415,230,1,9,1,1,9,230,1,13,258,1,9,1,1,9,257,1,13,843,1,18,10,A,7,10,A,7,3.9,A,7,1.1,A,7,82,A,7,981,A,7,140,A,7,2.6,A,7,6400,B,7,370,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/31/1980,15:00,567,1415,188,1,9,1,1,9,188,1,13,209,1,9,1,1,9,209,1,13,661,1,18,10,A,7,10,A,7,3.3,A,7,0.6,A,7,82,A,7,980,A,7,140,A,7,2.6,A,7,8000,B,7,400,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/31/1980,16:00,394,1415,131,1,9,1,1,9,131,1,13,144,1,9,1,1,9,144,1,13,423,1,18,10,A,7,10,A,7,3.3,A,7,1.7,A,7,89,A,7,980,A,7,160,A,7,3.1,A,7,8000,B,7,400,A,7,1.2,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/31/1980,17:00,174,1415,49,1,13,1,1,9,49,1,13,54,1,13,0,1,9,54,1,13,153,1,21,10,A,7,10,A,7,3.3,A,7,0.6,A,7,82,A,7,980,A,7,160,A,7,2.6,A,7,8000,B,7,520,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,05,C,8 -12/31/1980,18:00,6,342,4,1,13,0,1,9,4,1,13,0,1,13,0,1,9,0,1,13,0,1,21,10,A,7,10,A,7,3.3,A,7,1.1,A,7,86,A,7,980,A,7,110,A,7,2.6,A,7,11300,B,7,670,A,7,1.1,E,8,0.000,F,8,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,19:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,3.3,A,7,1.7,A,7,89,A,7,981,A,7,160,A,7,2.6,A,7,11300,B,7,670,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,02,C,8 -12/31/1980,20:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,1.7,A,7,92,A,7,981,A,7,160,A,7,2.6,A,7,11300,B,7,270,A,7,1.2,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,21:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,1.1,A,7,89,A,7,981,A,7,150,A,7,2.6,A,7,11300,B,7,270,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,22:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,1.1,A,7,89,A,7,981,A,7,180,A,7,2.1,A,7,16100,B,7,520,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,23:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.8,A,7,0.6,A,7,85,A,7,981,A,7,170,A,7,2.6,A,7,16100,B,7,610,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 -12/31/1980,24:00,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,10,A,7,10,A,7,2.2,A,7,0.6,A,7,89,A,7,980,A,7,180,A,7,2.6,A,7,16100,B,7,550,A,7,1.1,E,8,0.000,?,0,0.00,?,0,0,1,D,9,00,C,8 diff --git a/smart_control/simulator/step_function_occupancy.py b/smart_control/simulator/step_function_occupancy.py index 9de06f7c..ca21bc5e 100644 --- a/smart_control/simulator/step_function_occupancy.py +++ b/smart_control/simulator/step_function_occupancy.py @@ -16,8 +16,8 @@ import gin import pandas as pd -from smart_control.models.base_occupancy import BaseOccupancy -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_occupancy import BaseOccupancy +from smart_buildings.smart_control.utils import conversion_utils @gin.configurable diff --git a/smart_control/simulator/step_function_occupancy_test.py b/smart_control/simulator/step_function_occupancy_test.py index 7ee743a7..dd64e19e 100644 --- a/smart_control/simulator/step_function_occupancy_test.py +++ b/smart_control/simulator/step_function_occupancy_test.py @@ -1,10 +1,8 @@ -"""Tests for step_function_occupancy_model.""" - from absl.testing import absltest from absl.testing import parameterized import pandas as pd -from smart_control.simulator import step_function_occupancy +from smart_buildings.smart_control.simulator import step_function_occupancy class StepFunctionOccupancyModelTest(parameterized.TestCase): diff --git a/smart_control/simulator/stochastic_convection_simulator.py b/smart_control/simulator/stochastic_convection_simulator.py index a78b8250..9a632461 100644 --- a/smart_control/simulator/stochastic_convection_simulator.py +++ b/smart_control/simulator/stochastic_convection_simulator.py @@ -1,9 +1,10 @@ """Stochastic simulator of convection flow in bldg. A convection simulator that randomly shuffles control volumes as a stochastic -imitation of convection. +imitation of convection We specify probability of a control volume getting shuffled, as well as maximum -distance that any given control volume can be moved. +distance that any given +control volume can be moved. """ import collections @@ -14,7 +15,7 @@ import gin import numpy as np -from smart_control.simulator import base_convection_simulator +from smart_buildings.smart_control.simulator import base_convection_simulator @gin.configurable @@ -45,6 +46,16 @@ def __init__(self, p: float, distance: int, seed: Optional[int]): if seed is not None: random.seed(seed) + @property + def p(self) -> float: + """The shuffling probability.""" + return self._p + + @property + def distance(self) -> int: + """The max distance a CV can move.""" + return self._distance + def apply_convection( self, room_dict: dict[str, MutableSequence[tuple[int, int]]], diff --git a/smart_control/simulator/stochastic_occupancy.py b/smart_control/simulator/stochastic_occupancy.py index a93239b1..962937e1 100644 --- a/smart_control/simulator/stochastic_occupancy.py +++ b/smart_control/simulator/stochastic_occupancy.py @@ -19,7 +19,6 @@ transition processes when `debug_print` is enabled. """ -# Modify the code to include debug prints import datetime import enum from typing import Optional, Union @@ -28,8 +27,8 @@ import numpy as np import pandas as pd -from smart_control.models.base_occupancy import BaseOccupancy -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_occupancy import BaseOccupancy +from smart_buildings.smart_control.utils import conversion_utils debug_print = False # Set to False to disable debugging @@ -54,26 +53,13 @@ def __init__( random_state: np.random.RandomState, time_zone: Union[datetime.tzinfo, str] = "UTC", ): - # Validate that the time bounds are in chronological order - if not ( + assert ( earliest_expected_arrival_hour < latest_expected_arrival_hour < earliest_expected_departure_hour < latest_expected_departure_hour - ): - raise ValueError( - "Arrival and departure hours must be strictly increasing: " - "earliest_arrival < latest_arrival < earliest_departure < " - "latest_departure. " - f"Got: {earliest_expected_arrival_hour}, " - f"{latest_expected_arrival_hour}, " - f"{earliest_expected_departure_hour}, " - f"{latest_expected_departure_hour}." - ) - - # Validate lunch time bounds - if lunch_start_hour >= lunch_end_hour: - raise ValueError("lunch_start_hour must be before lunch_end_hour.") + ) + assert lunch_start_hour < lunch_end_hour self._earliest_expected_arrival_hour = earliest_expected_arrival_hour self._latest_expected_arrival_hour = latest_expected_arrival_hour diff --git a/smart_control/simulator/stochastic_occupancy_test.py b/smart_control/simulator/stochastic_occupancy_test.py index fb17cd70..818a5ada 100644 --- a/smart_control/simulator/stochastic_occupancy_test.py +++ b/smart_control/simulator/stochastic_occupancy_test.py @@ -1,13 +1,11 @@ -"""Tests for stochastic_occupancy.""" - from absl.testing import absltest from absl.testing import parameterized import numpy as np import pandas as pd -from smart_control.simulator.stochastic_occupancy import LIGHTSWITCHOccupancy -from smart_control.simulator.stochastic_occupancy import OccupancyStateEnum -from smart_control.simulator.stochastic_occupancy import ZoneOccupant +from smart_buildings.smart_control.simulator.stochastic_occupancy import LIGHTSWITCHOccupancy +from smart_buildings.smart_control.simulator.stochastic_occupancy import OccupancyStateEnum +from smart_buildings.smart_control.simulator.stochastic_occupancy import ZoneOccupant # fmt: off # pylint: disable=line-too-long @@ -98,42 +96,6 @@ def test_peek(self, tz): self.assertEqual(OccupancyStateEnum.WORK, state) current_time += STEP_SIZE - def test_zone_occupant_invalid_hour_order(self): - """ValueError when arrival/departure hours are not strictly increasing.""" - random_state = np.random.RandomState(seed=SEED) - - with self.assertRaisesRegex( - ValueError, 'Arrival and departure hours must be strictly increasing' - ): - ZoneOccupant( - earliest_expected_arrival_hour=8, - latest_expected_arrival_hour=17, # > earliest_departure (16) - earliest_expected_departure_hour=16, - latest_expected_departure_hour=18, - lunch_start_hour=12, - lunch_end_hour=14, - step_size=STEP_SIZE, - random_state=random_state, - ) - - def test_zone_occupant_invalid_lunch_hours(self): - """ValueError when lunch_start_hour >= lunch_end_hour.""" - random_state = np.random.RandomState(seed=SEED) - - with self.assertRaisesRegex( - ValueError, 'lunch_start_hour must be before lunch_end_hour' - ): - ZoneOccupant( - earliest_expected_arrival_hour=8, - latest_expected_arrival_hour=10, - earliest_expected_departure_hour=16, - latest_expected_departure_hour=18, - lunch_start_hour=14, # >= lunch_end_hour - lunch_end_hour=12, - step_size=STEP_SIZE, - random_state=random_state, - ) - if __name__ == '__main__': absltest.main() diff --git a/smart_control/simulator/tf_simulator.py b/smart_control/simulator/tf_simulator.py index f911da68..b141d80a 100644 --- a/smart_control/simulator/tf_simulator.py +++ b/smart_control/simulator/tf_simulator.py @@ -2,7 +2,7 @@ Iterative methods that loop through each control volume sequentially are very slow with geometries that have many control volumes (CV). The -TFSimulator, instead, processes the finite differences as a set of +TFSimulator, instead, processe the finite differences as a set of tensor operations. """ @@ -16,14 +16,14 @@ import pandas as pd import tensorflow as tf -from smart_control.simulator import building as building_py -from smart_control.simulator import hvac_floorplan_based as hvac_py -from smart_control.simulator import simulator_flexible_floor_plan as simulator -from smart_control.simulator import weather_controller as weather_controller_py +from smart_buildings.smart_control.simulator import building as building_py +from smart_buildings.smart_control.simulator import hvac_floorplan_based as hvac_py +from smart_buildings.smart_control.simulator import simulator_flexible_floor_plan as simulator +from smart_buildings.smart_control.simulator import weather_controller as weather_controller_py # List of neighbors for a specific CV. NeighborCoordinates = Sequence[simulator.CVCoordinates] -# Neighbors, indexable by a specific i,j coord. +# Neighors, indexable by a specific i,j coord. Neighbors = Sequence[Sequence[NeighborCoordinates]] @@ -271,7 +271,7 @@ def get_cv_mapping( def get_cv_dimension_tensors( control_volume_cm: float, boundary_cv_mapping: BoundaryCVMapping, - shape: tuple[int, int], + shape=tuple[int, int], ) -> tuple[tf.Tensor, tf.Tensor]: """Returns horizontal and vertical CV dimension tensors. @@ -500,8 +500,6 @@ def __init__( iteration_limit: int, iteration_warning: int, start_timestamp: pd.Timestamp, - relative_convergence_threshold: float | None = 1e-6, - relative_convergence_streak: int = 20, ): super().__init__( @@ -513,8 +511,6 @@ def __init__( iteration_limit, iteration_warning, start_timestamp, - relative_convergence_threshold=relative_convergence_threshold, - relative_convergence_streak=relative_convergence_streak, ) # Get a mapping of all the boundary CVs that interface between interior @@ -549,16 +545,6 @@ def __init__( ) = get_oriented_conductivity_tensors( self.building.conductivity, self._boundary_cv_mapping ) - # radiative heat transfer addition - self.include_radiative_heat_transfer = ( - building.include_radiative_heat_transfer - ) - # self.interior_wall_mask = building.interior_wall_mask - - # interior mass addition - self.include_interior_mass = building.include_interior_mass - if self.include_interior_mass: - self._initialize_interior_mass_tensors(building) def _get_tensor_exterior_mask( self, building: building_py.Building @@ -572,196 +558,19 @@ def _get_tensor_exterior_mask( exterior_mask[i][j] = True return tf.convert_to_tensor(exterior_mask) - def _initialize_interior_mass_tensors( - self, building: building_py.FloorPlanBasedBuilding - ) -> None: - """Initializes tensors for interior mass calculations.""" - # Convert interior mass properties to tensors - self._t_interior_mass_mask = tf.convert_to_tensor( - building.interior_mass_mask, dtype=tf.bool - ) - self._t_interior_mass_conductivity = tf.convert_to_tensor( - building.interior_mass_conductivity, dtype=tf.float32 - ) - self._t_interior_mass_heat_capacity = tf.convert_to_tensor( - building.interior_mass_heat_capacity, dtype=tf.float32 - ) - self._t_interior_mass_density = tf.convert_to_tensor( - building.interior_mass_density, dtype=tf.float32 - ) - - # Calculate t_0_mass = (rho_mass * C_mass * z^2) / (k_mass * delta_t) - # z is the floor height in meters (characteristic length for heat exchange) - z = building.floor_height_cm / 100.0 - - # Compute t_0_mass for each CV (will be 0 where there's no interior mass) - self._t_0_mass = tf.where( - self._t_interior_mass_mask, - ( - self._t_interior_mass_density - * self._t_interior_mass_heat_capacity - * z - * z - ) - / (self._t_interior_mass_conductivity * self._time_step_sec), - tf.constant(0.0, dtype=tf.float32), - ) - - def update_interior_mass_temperatures( - self, air_temperature_estimates: np.ndarray - ) -> tuple[np.ndarray, float]: - r"""Tensorized version of interior mass temperature update. - - Overrides the parent class's iterative implementation with a tensor-based - approach for efficiency. The heat exchange occurs through the vertical - direction (height z) of the control volume. - - Equations: - -------------------- - After the air CV temperatures converge, update the interior mass - temperatures using element-wise tensor operations: - - $$T_{\text{mass}} = - \frac{T+t_{0,\text{mass}}\odot T_{\text{mass}}^{(-)}}{1+t_{0,\text{mass}}} - $$ - - where $\odot$ represents element-wise multiplication and the division is - element-wise (broadcasting the scalar denominator). - - The temporal parameter tensor is defined as: - - $$t_{0,\text{mass},i,j} = \begin{cases} - \frac{\rho_{\text{mass}}c_{\text{mass}}z^2}{k_{\text{mass}}\Delta t} - & \text{if CV has interior mass} \\ - 0 & \text{otherwise} - \end{cases}$$ - - This formulation is consistent with the air CV energy balance where the - interior mass coupling term is $\frac{k_{\text{mass}} u v}{z} - (T_{\text{mass},i,j} - T_{i,j})$. - - Nomenclature and Units: - ----------------------- - - $T$: Converged air temperature tensor at new time step [K] - - $T_{\text{mass}}$: Interior mass temperature tensor at new time step [K] - - $T_{\text{mass}}^{(-)}$: Interior mass temperature tensor at previous - time step [K] - - $t_{0,\text{mass}}$: Temporal parameter tensor for interior mass - [dimensionless] - - $k_{\text{mass}}$: Thermal conductivity of interior mass - [$\mathrm{W/(m \cdot K)}$] - - $\rho_{\text{mass}}$: Density of interior mass [$\mathrm{kg/m^3}$] - - $c_{\text{mass}}$: Specific heat capacity of interior mass - [$\mathrm{J/(kg \cdot K)}$] - - $z$: CV height (floor height), characteristic length for heat exchange - [$\mathrm{m}$] - - $\Delta t$: Time step [$\mathrm{s}$] - - Args: - air_temperature_estimates: Current air temperature estimates for each CV. - - Returns: - Tuple of (updated interior mass temperatures, maximum temperature change) - """ - if not self.include_interior_mass: - return self.building.interior_mass_temp.copy(), 0.0 - - # Convert air temperatures to tensor - t_air_temp = tf.convert_to_tensor( - air_temperature_estimates, dtype=tf.float32 - ) - - # Convert previous interior mass temperature to tensor - t_temp_mass_prev = tf.convert_to_tensor( - self.building.interior_mass_temp, dtype=tf.float32 - ) - - # Calculate numerator: T + t_0_mass * T_mass^(-) - numerator = tf.math.add( - t_air_temp, tf.math.multiply(self._t_0_mass, t_temp_mass_prev) - ) - - # Calculate denominator: 1 + t_0_mass - denominator = tf.math.add( - tf.constant(1.0, dtype=tf.float32), self._t_0_mass - ) - - # Update interior mass temperature - t_temp_mass_new = tf.math.divide(numerator, denominator) - - # Apply mask to only update where interior mass exists - t_temp_mass_new = tf.where( - self._t_interior_mass_mask, t_temp_mass_new, t_temp_mass_prev - ) - - # Calculate maximum change for convergence checking - t_delta = tf.math.subtract(t_temp_mass_new, t_temp_mass_prev) - max_delta = np.max(tf.math.abs(t_delta)) - - # Return as numpy arrays - return t_temp_mass_new.numpy(), max_delta - def update_temperature_estimates( self, temperature_estimates: np.ndarray, ambient_temperature: float, convection_coefficient: float, ) -> tuple[np.ndarray, float]: - r"""Iterates across all CVs and updates the temperature estimate. + """Iterates across all CVs and updates the temperature estimate. Corner and edge CVs are exposed to thermal exchange with the ambient air - through convection. This tensorized implementation overrides the parent - class's iterative approach for computational efficiency. - - Equations: - -------------------- - The tensorized heat balance equation for air CV with interior mass - coupling is: - - $$\begin{multline} - T = \left[Q_x + Vz\left[K_1U^{-1}T_1 + H_1T_\infty + K_3U^{-1}T_3 + - H_3T_\infty\right] \right. \\ - \left. + Uz\left[K_2V^{-1}T_2 + H_2T_\infty + K_4V^{-1}T_4 + - H_4T_\infty\right] \right. \\ - \left. + K_{\text{mass}}UVz^{-1}T_{\text{mass}} + Q_{\text{lwx}} + - \frac{C\rho UVz}{\Delta t}T^{(-)}\right] \\ - \cdot \left[Vz\left[K_1U^{-1} + H_1 + K_3U^{-1} + H_3\right] + - Uz\left[K_2V^{-1} + H_2 + K_4V^{-1} + H_4\right] \right. \\ - \left. + K_{\text{mass}}UVz^{-1} + - \frac{C\rho UVz}{\Delta t}\right]^{-1} - \end{multline}$$ - - where the shifted temperature tensors represent neighboring CVs: - - $T_1 = \text{shift}(T, \text{LEFT})$ - - $T_2 = \text{shift}(T, \text{DOWN})$ - - $T_3 = \text{shift}(T, \text{RIGHT})$ - - $T_4 = \text{shift}(T, \text{UP})$ - - Nomenclature and Units: - ----------------------- - - $T$: Air temperature tensor at new time step [K] - - $T^{(-)}$: Air temperature tensor at previous time step [K] - - $T_1, T_2, T_3, T_4$: Temperature tensors of neighboring CVs - (left, down, right, up) [K] - - $T_{\text{mass}}$: Interior mass temperature tensor [K] - - $T_\infty$: Ambient temperature (scalar) [K] - - $Q_x$: External heat source tensor [$\mathrm{W}$] - - $Q_{\text{lwx}}$: Longwave radiative exchange tensor [$\mathrm{W}$] - - $K_1, K_2, K_3, K_4$: Thermal conductivity tensors for left, down, - right, up faces [$\mathrm{W/(m \cdot K)}$] - - $K_{\text{mass}}$: Interior mass conductivity tensor - [$\mathrm{W/(m \cdot K)}$] - - $H_1, H_2, H_3, H_4$: Convection coefficient tensors for boundary CVs - [$\mathrm{W/(m^2 \cdot K)}$] - - $U, V$: CV dimensions in x and y directions [$\mathrm{m}$] - - $z$: CV height (floor height) [$\mathrm{m}$] - - $C$: Specific heat capacity tensor [$\mathrm{J/(kg \cdot K)}$] - - $\rho$: Density tensor [$\mathrm{kg/m^3}$] - - $\Delta t$: Time step [$\mathrm{s}$] - - References: - ----------- - - Equation 22 derived in go/smart-buildings-simulator-design + through convection. + + This method implements Equation 22, derived in + go/smart-buildings-simulator-design. Args: temperature_estimates: Current temperature estimate for each CV, will be @@ -784,9 +593,6 @@ def _get_input_tensors( tf.Tensor, tf.Tensor, tf.Tensor, - tf.Tensor, - tf.Tensor, - tf.Tensor, ]: """Returns the input matrices as tensors.""" # Convert a bunch of numpy arrays into TF tensors. @@ -799,46 +605,6 @@ def _get_input_tensors( building.heat_capacity, dtype=tf.float32 ) t_z = tf.constant(building.floor_height_cm / 100.0, dtype=tf.float32) - if self.include_radiative_heat_transfer: - t_ifa_inv = tf.convert_to_tensor(building.ifa_inv, dtype=tf.float32) - # For radiative heat transfer, we need to combine interior wall and - # interior mass temperatures if interior mass is enabled - if self.include_interior_mass: - interior_mask_all = ( - building.interior_wall_mask | building.interior_mass_mask - ) - temperature_estimates_temp = np.zeros_like(temperature_estimates) - temperature_estimates_temp[building.interior_mass_mask] = ( - building.interior_mass_temp[building.interior_mass_mask] - ) - temperature_estimates_temp[building.interior_wall_mask] = ( - temperature_estimates[building.interior_wall_mask] - ) - t_temp_interior_wall = tf.convert_to_tensor( - temperature_estimates_temp[interior_mask_all], dtype=tf.float32 - ) - else: - t_temp_interior_wall = tf.convert_to_tensor( - temperature_estimates[building.interior_wall_mask], - dtype=tf.float32, - ) - # Ensure t_temp_interior_wall is a column vector for matrix - # multiplication - t_temp_interior_wall = tf.reshape(t_temp_interior_wall, [-1, 1]) - else: - # Create minimal zero tensors with appropriate shapes - # These won't be used when radiative heat transfer is disabled - t_ifa_inv = tf.zeros((1, 1), dtype=tf.float32) # Minimal shape - t_temp_interior_wall = tf.zeros((1,), dtype=tf.float32) # Minimal shape - - # Interior mass temperature tensor - if self.include_interior_mass: - t_temp_mass = tf.convert_to_tensor( - building.interior_mass_temp, dtype=tf.float32 - ) - else: - t_temp_mass = tf.zeros((1, 1), dtype=tf.float32) # Minimal shape - return ( t_temp, t_temp_old, @@ -847,9 +613,6 @@ def _get_input_tensors( t_density, t_heat_capacity, t_z, - t_ifa_inv, - t_temp_interior_wall, - t_temp_mass, ) def _get_neighbor_temps( @@ -907,20 +670,11 @@ def _get_denominator( dt3 = tf.math.multiply(dt3, self._t_v) dt3 = tf.math.multiply(dt3, t_heat_capacity) dt3 = tf.scalar_mul(t_z, dt3) - dt3 = tf.math.multiply(dt3, t_heat_capacity) dt3 = tf.math.divide(dt3, t_delta_t) - # Add interior mass coupling term: K_mass * U * V / Z - dt4 = tf.zeros_like(dt3) - if self.include_interior_mass: - dt4 = tf.math.multiply(self._t_interior_mass_conductivity, self._t_u) - dt4 = tf.math.multiply(dt4, self._t_v) - dt4 = tf.math.divide(dt4, t_z) - - # Sum up u-z, u-v surface transfer, absorption, and interior mass terms. + # Sum up u-z, u-v surface transfer and absorption terms. t_denom = tf.math.add(dt1, dt2) t_denom = tf.math.add(t_denom, dt3) - t_denom = tf.math.add(t_denom, dt4) return t_denom def _get_numerator( @@ -945,9 +699,6 @@ def _get_numerator( t_temp_inf: tf.Tensor, t_input_q: tf.Tensor, t_temp_minus: tf.Tensor, - t_ifa_inv: tf.Tensor, - t_temp_interior_wall: tf.Tensor, - t_temp_mass: tf.Tensor, ) -> tf.Tensor: """Returns the numerator matrix from Eqn 22 as a tensor.""" @@ -980,46 +731,13 @@ def _get_numerator( nt3 = tf.math.multiply(nt3, self._t_v) nt3 = tf.math.multiply(nt3, t_heat_capacity) nt3 = tf.scalar_mul(t_z, nt3) - nt3 = tf.math.multiply(nt3, t_heat_capacity) nt3 = tf.math.multiply(nt3, t_temp_minus) nt3 = tf.math.divide(nt3, t_delta_t) - # add ratdative heat transfer sigma*ifa_inv@(T-)^4 - nt4 = tf.zeros_like(t_temp_minus) - if self.include_radiative_heat_transfer: - sigma = tf.constant(5.67e-8, dtype=tf.float32) - t_temp_interior_wall_4 = tf.math.pow(t_temp_interior_wall, 4) - # Ensure both tensors have the same dtype for matrix multiplication - nt4_temp = tf.linalg.matmul(t_ifa_inv, t_temp_interior_wall_4) - nt4_temp = tf.math.multiply(nt4_temp, sigma) - - # Use tensor_scatter_nd_update to update specific indices - indices = tf.where(self.building.lwx_index >= 0) - # Extract the specific elements from nt4_temp and flatten to match nt4 - # shape - updates = tf.gather( - tf.squeeze( - nt4_temp - ), # Remove the extra dimension from [26,1] to [26] - self.building.lwx_index[self.building.lwx_index >= 0], - ) - nt4 = tf.tensor_scatter_nd_update(nt4, indices, updates) - - # Add interior mass coupling term: K_mass * U * V / Z * T_mass - nt5 = tf.zeros_like(t_temp_minus) - if self.include_interior_mass: - nt5 = tf.math.multiply(self._t_interior_mass_conductivity, self._t_u) - nt5 = tf.math.multiply(nt5, self._t_v) - nt5 = tf.math.multiply(nt5, t_temp_mass) - nt5 = tf.math.divide(nt5, t_z) - - # Add the u-z, u-v surface transfer, absorption, external source, - # and interior mass terms. + # Add the u-z, u-v surface transfer, absorption and external source terms. t_numer = tf.math.add(nt1, nt2) t_numer = tf.math.add(t_numer, nt3) t_numer = tf.math.add(t_numer, t_input_q) - t_numer = tf.math.add(t_numer, nt4) - t_numer = tf.math.add(t_numer, nt5) return t_numer # Get the inputs to the equation as Tensors from the building. @@ -1031,9 +749,6 @@ def _get_numerator( t_density, t_heat_capacity, t_z, - t_ifa_inv, - t_temp_interior_wall, - t_temp_mass, ) = _get_input_tensors(self.building) ( @@ -1108,9 +823,6 @@ def _get_numerator( t_temp_inf, t_input_q, t_temp_minus, - t_ifa_inv, - t_temp_interior_wall, - t_temp_mass, ) # Finally, perform an elementwise division - not a matrix inversion. @@ -1124,8 +836,4 @@ def _get_numerator( t_delta = tf.math.subtract(t_temperature_estimates, t_temp_old) - # Note: Interior mass temperatures are updated by the parent class's - # finite_differences_timestep() method after this function returns. - # Do NOT update them here to avoid double-updating. - return t_temperature_estimates.numpy(), np.max(tf.math.abs(t_delta)) diff --git a/smart_control/simulator/tf_simulator_test.py b/smart_control/simulator/tf_simulator_test.py index 35637bfa..3c69e3f0 100644 --- a/smart_control/simulator/tf_simulator_test.py +++ b/smart_control/simulator/tf_simulator_test.py @@ -1,23 +1,17 @@ -"""Tests for Tensorflow-enabled Finite Difference calculator.""" - from unittest import mock from absl.testing import absltest import numpy as np -from numpy.testing import assert_array_almost_equal import pandas as pd +from smart_buildings.smart_control.simulator import air_handler as air_handler_py +from smart_buildings.smart_control.simulator import building as building_py +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import hvac_floorplan_based as floorplan_hvac_py +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import tf_simulator as tf_simulator_py +from smart_buildings.smart_control.simulator import weather_controller as weather_controller_py import tensorflow as tf -from smart_control.simulator import air_handler as air_handler_py -from smart_control.simulator import boiler as boiler_py -from smart_control.simulator import building as building_py -from smart_control.simulator import hvac_floorplan_based as floorplan_hvac_py -from smart_control.simulator import setpoint_schedule -from smart_control.simulator import simulator_flexible_floor_plan as simulator_py -from smart_control.simulator import tf_simulator as tf_simulator_py -from smart_control.simulator import weather_controller as weather_controller_py -from smart_control.simulator.simulator_flexible_floor_plan_test import FlexibleFloorplanSimulatorTest # pylint: disable=line-too-long - class TFSimulatorTest(absltest.TestCase): @@ -127,77 +121,29 @@ def _create_test_building(self): return b - def _create_test_building_radiative(self): - cv_size_cm = 20.0 - floor_height_cm = 300.0 - initial_temp = 292.0 - inside_air_properties = building_py.MaterialProperties( - conductivity=50.0, heat_capacity=700.0, density=1.0 - ) - inside_wall_properties = building_py.MaterialProperties( - conductivity=2.0, heat_capacity=1000.0, density=1800.0 - ) - building_exterior_properties = building_py.MaterialProperties( - conductivity=0.05, heat_capacity=1000.0, density=3000.0 - ) - - floor_plan = self._create_test_floor_plan() - zone_map = self._create_test_floor_plan() - - inside_air_radiative_properties = building_py.RadiationProperties( - alpha=0.0, epsilon=0.0, tau=1.0, rho=None - ) - inside_wall_radiative_properties = building_py.RadiationProperties( - alpha=0.4, epsilon=0.6, tau=0.0, rho=None - ) - building_exterior_radiative_properties = building_py.RadiationProperties( - alpha=0.65, epsilon=0.35, tau=0.0, rho=None - ) - - b = building_py.FloorPlanBasedBuilding( - cv_size_cm=cv_size_cm, - floor_height_cm=floor_height_cm, - initial_temp=initial_temp, - inside_air_properties=inside_air_properties, - inside_wall_properties=inside_wall_properties, - building_exterior_properties=building_exterior_properties, - floor_plan=floor_plan, - floor_plan_filepath=None, - zone_map=zone_map, - zone_map_filepath=None, - buffer_from_walls=0, - inside_air_radiative_properties=inside_air_radiative_properties, - inside_wall_radiative_properties=inside_wall_radiative_properties, - building_exterior_radiative_properties=building_exterior_radiative_properties, # pylint: disable=line-too-long - include_radiative_heat_transfer=True, - view_factor_method="ScriptF", - ) - - return b - def _create_small_hvac(self): """Returns hvac matching zones for small test building.""" reheat_water_setpoint = 260 water_pump_differential_head = 3 water_pump_efficiency = 0.6 - boiler = boiler_py.Boiler( + hot_water_system = hot_water_system_py.construct_hot_water_system( reheat_water_setpoint, water_pump_differential_head, water_pump_efficiency, - "boiler_id", + "hws_id", ) recirculation = 0.3 heating_air_temp_setpoint = 270 cooling_air_temp_setpoint = 288 - fan_differential_pressure = 20000.0 + fan_static_pressure = 20000.0 fan_efficiency = 0.8 air_handler = air_handler_py.AirHandler( recirculation, heating_air_temp_setpoint, cooling_air_temp_setpoint, - fan_differential_pressure, + fan_static_pressure, fan_efficiency, ) @@ -220,10 +166,10 @@ def _create_small_hvac(self): hvac = floorplan_hvac_py.FloorPlanBasedHvac( zone_identifier=zone_identifier, air_handler=air_handler, - boiler=boiler, + hot_water_system=hot_water_system, schedule=schedule, vav_max_air_flow_rate=0.45, - vav_reheat_max_water_flow_rate=0.02, + vav_reheat_max_water_flow_factor=0.03688555555, ) return hvac @@ -759,346 +705,6 @@ def test_finite_difference_convergence(self): ) self.assertTrue(result) - def test_finite_difference_convergence_with_radiative_heat_transfer(self): - """Tests that the FD problem with radiative heat transfer converges within - a fixed number of steps.""" - weather_controller = mock.create_autospec( - weather_controller_py.WeatherController - ) - time_step_sec = 300.0 - hvac = self._create_small_hvac() - convergence_threshold = 0.1 - iteration_limit = 100 - iteration_warning = 2 - start_timestamp = pd.Timestamp("2012-12-21") - - building = self._create_test_building_radiative() - - tf_simulator = tf_simulator_py.TFSimulator( - building, - hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - - result = tf_simulator.finite_differences_timestep( - ambient_temperature=285.0, convection_coefficient=12.0 - ) - self.assertTrue(result) - - def test_compare_temperature_estimates_iterative_approach(self): - """Tests that the temperature estimates from TFSimulator match those from - SimulatorFlexibleGeometries when using radiative heat transfer. - - Creates two simulators with identical buildings, HVAC and parameters: - 1. A SimulatorFlexibleGeometries instance (baseline) - 2. A TFSimulator instance (under test) - - Runs one timestep on both and verifies their temperature arrays match - exactly. - This validates that TFSimulator's radiative heat transfer calculations - produce the same results as the original implementation. - """ - weather_controller = mock.create_autospec( - weather_controller_py.WeatherController - ) - time_step_sec = 300.0 - convergence_threshold = 1e-3 - iteration_limit = 300 - iteration_warning = 30 - start_timestamp = pd.Timestamp("2012-12-21") - - # Create baseline simulator - simulator = FlexibleFloorplanSimulatorTest() - simulator_hvac = simulator._create_small_hvac() - simulator_building = simulator._create_small_building( - initial_temp=292.0, - include_radiative_heat_transfer=False, - include_interior_mass=False, - ) - simulator_simulator = simulator_py.SimulatorFlexibleGeometries( - simulator_building, - simulator_hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - simulator_result = simulator_simulator.finite_differences_timestep( - ambient_temperature=315.0, convection_coefficient=12.0 - ) - - building = simulator_building # self._create_test_building_radiative() - - tf_simulator = tf_simulator_py.TFSimulator( - building, - simulator_hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - - result = tf_simulator.finite_differences_timestep( - ambient_temperature=315.0, convection_coefficient=12.0 - ) - - self.assertTrue(result) - self.assertTrue(simulator_result) - with self.subTest("CV temperatures match"): - assert_array_almost_equal( - tf_simulator.building.temp, simulator_simulator.building.temp - ) - - def test_compare_temperature_estimates_iterative_approach_with_lwx(self): - """Tests that the temperature estimates from TFSimulator match those from - SimulatorFlexibleGeometries when using lwx (interior radiative heat - exchange). - - Creates two simulators with identical buildings, HVAC and parameters: - 1. A SimulatorFlexibleGeometries instance (baseline) - 2. A TFSimulator instance (under test) - - Runs one timestep on both and verifies their temperature arrays match - exactly. - This validates that TFSimulator's radiative heat transfer calculations - produce the same results as the original implementation. - """ - weather_controller = mock.create_autospec( - weather_controller_py.WeatherController - ) - time_step_sec = 300.0 - convergence_threshold = 1e-3 - iteration_limit = 300 - iteration_warning = 30 - start_timestamp = pd.Timestamp("2012-12-21") - - # Create baseline simulator - simulator = FlexibleFloorplanSimulatorTest() - simulator_hvac = simulator._create_small_hvac() - simulator_building = simulator._create_small_building( - initial_temp=292.0, include_radiative_heat_transfer=True - ) - - simulator_simulator = simulator_py.SimulatorFlexibleGeometries( - simulator_building, - simulator_hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - simulator_result = simulator_simulator.finite_differences_timestep( - ambient_temperature=315.0, convection_coefficient=12.0 - ) - - building = simulator_building - - tf_simulator = tf_simulator_py.TFSimulator( - building, - simulator_hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - - result = tf_simulator.finite_differences_timestep( - ambient_temperature=315.0, convection_coefficient=12.0 - ) - - self.assertTrue(result) - self.assertTrue(simulator_result) - with self.subTest("CV temperatures match"): - assert_array_almost_equal( - tf_simulator.building.temp, simulator_simulator.building.temp - ) - - def test_compare_temperature_estimates_iterative_approach_with_interior_mass(self): # pylint: disable=line-too-long - """Tests that temperature estimates from TFSimulator match those from - SimulatorFlexibleGeometries when using interior mass heat transfer - - Creates two simulators with identical buildings, HVAC and parameters: - 1. A SimulatorFlexibleGeometries instance (baseline/iterative approach) - 2. A TFSimulator instance (tensor approach under test) - - Runs one timestep on both and verifies their temperature arrays match - exactly, including both air CV temperatures and interior mass temperatures. - This validates that TFSimulator's interior mass heat transfer calculations - produce the same results as the original iterative implementation. - """ - weather_controller = mock.create_autospec( - weather_controller_py.WeatherController - ) - time_step_sec = 300.0 - convergence_threshold = 1e-3 - iteration_limit = 300 - iteration_warning = 30 - start_timestamp = pd.Timestamp("2012-12-21") - - # Create baseline simulator with interior mass - simulator = FlexibleFloorplanSimulatorTest() - simulator_hvac = simulator._create_small_hvac() - - _, simulator_building = simulator._create_simulator_and_building( - convergence_threshold=0.001, - initial_temp=292.0, - iteration_limit=100, - include_interior_mass=True, - include_radiative_heat_transfer=False, - ) - simulator_simulator = simulator_py.SimulatorFlexibleGeometries( - simulator_building, - simulator_hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - - # Create TFSimulator with the same building - building = simulator_building - tf_simulator = tf_simulator_py.TFSimulator( - building, - simulator_hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - - result = tf_simulator.finite_differences_timestep( - ambient_temperature=315.0, convection_coefficient=12.0 - ) - - simulator_result = simulator_simulator.finite_differences_timestep( - ambient_temperature=315.0, convection_coefficient=12.0 - ) - - self.assertTrue(result) - self.assertTrue(simulator_result) - - # Compare air CV temperatures - with self.subTest("Air CV temperatures match"): - assert_array_almost_equal( - tf_simulator.building.temp, - simulator_simulator.building.temp, - decimal=5, - ) - - # Compare interior mass temperatures - with self.subTest("Interior mass temperatures match"): - assert_array_almost_equal( - tf_simulator.building.interior_mass_temp, - simulator_simulator.building.interior_mass_temp, - decimal=5, - ) - - def test_compare_temperature_estimates_iterative_approach_with_interior_mass_and_lwx(self): # pylint: disable=line-too-long - """Tests that temperature estimates from TFSimulator match those from - SimulatorFlexibleGeometries when using interior mass heat transfer - and lwx (interior radiative heat exchange). - - Creates two simulators with identical buildings, HVAC and parameters: - 1. A SimulatorFlexibleGeometries instance (baseline/iterative approach) - 2. A TFSimulator instance (tensor approach under test) - - Runs one timestep on both and verifies their temperature arrays match - exactly, including both air CV temperatures and interior mass temperatures. - This validates that TFSimulator's interior mass heat transfer calculations - produce the same results as the original iterative implementation. - Note that interior mass convergence can be slow (due to the large thermal - mass and small conductivity), so setting a too low convergence threshold - may cause the test to fail. - """ - weather_controller = mock.create_autospec( - weather_controller_py.WeatherController - ) - time_step_sec = 300.0 - convergence_threshold = 1e-3 - iteration_limit = 500 - iteration_warning = 30 - start_timestamp = pd.Timestamp("2012-12-21") - - # Create baseline simulator with interior mass - simulator = FlexibleFloorplanSimulatorTest() - simulator_hvac = simulator._create_small_hvac() - - _, simulator_building = simulator._create_simulator_and_building( - convergence_threshold=0.001, - initial_temp=292.0, - iteration_limit=100, - include_interior_mass=True, - include_radiative_heat_transfer=True, - ) - - simulator_simulator = simulator_py.SimulatorFlexibleGeometries( - simulator_building, - simulator_hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - - # Create TFSimulator with the same building - building = simulator_building - tf_simulator = tf_simulator_py.TFSimulator( - building, - simulator_hvac, - weather_controller, - time_step_sec, - convergence_threshold, - iteration_limit, - iteration_warning, - start_timestamp, - ) - - result = tf_simulator.finite_differences_timestep( - ambient_temperature=315.0, convection_coefficient=12.0 - ) - - simulator_result = simulator_simulator.finite_differences_timestep( - ambient_temperature=315.0, convection_coefficient=12.0 - ) - - self.assertTrue(result) - self.assertTrue(simulator_result) - - # Compare air CV temperatures - with self.subTest("Air CV temperatures match"): - assert_array_almost_equal( - tf_simulator.building.temp, - simulator_simulator.building.temp, - decimal=5, - ) - - # Compare interior mass temperatures - with self.subTest("Interior mass temperatures match"): - assert_array_almost_equal( - tf_simulator.building.interior_mass_temp, - simulator_simulator.building.interior_mass_temp, - decimal=5, - ) - if __name__ == "__main__": absltest.main() diff --git a/smart_control/simulator/thermal_diffuser_utils.py b/smart_control/simulator/thermal_diffuser_utils.py index c9cbd36a..94faefba 100644 --- a/smart_control/simulator/thermal_diffuser_utils.py +++ b/smart_control/simulator/thermal_diffuser_utils.py @@ -13,7 +13,7 @@ import cv2 import numpy as np -from smart_control.simulator import building_utils +from smart_buildings.smart_control.simulator import building_utils Coordinates2D = Union[Tuple[int, int], np.ndarray] # pylint: disable=invalid-name RoomIndicesDict = Dict[str, Collection[Coordinates2D]] @@ -181,6 +181,7 @@ def diffuser_allocation_switch( spacing: int = 10, interior_walls: Optional[building_utils.InteriorWalls] = None, buffer_from_walls: int = 2, + min_room_size: int = 350, ) -> Collection[Coordinates2D]: """Switches between random and even assignment of thermal diffusers. @@ -210,10 +211,15 @@ def diffuser_allocation_switch( they may not line up correctly on account of being from different photo sources. buffer_from_walls: how far to place a thermal diffuser away from a wall. + min_room_size: The minimum number of control volumes a room must have to + allocate diffusers. Returns: a list of inds to place diffusers. """ + # if room is too small. do not place diffusers + if len(room_cv_indices) < min_room_size: + return [] if _rectangularity_test(room_cv_indices, threshold=0.1): inds = _determine_equal_spacing_for_thermal_diffusers( diff --git a/smart_control/simulator/thermal_diffuser_utils_test.py b/smart_control/simulator/thermal_diffuser_utils_test.py index da2dbe0a..0ccd2249 100644 --- a/smart_control/simulator/thermal_diffuser_utils_test.py +++ b/smart_control/simulator/thermal_diffuser_utils_test.py @@ -1,10 +1,8 @@ -"""Tests for thermal_diffuser_utils.""" - from absl.testing import absltest from absl.testing import parameterized import numpy as np -from smart_control.simulator import thermal_diffuser_utils +from smart_buildings.smart_control.simulator import thermal_diffuser_utils def _create_small_room(): @@ -106,7 +104,9 @@ def test_diffuser_allocation_switch( self, room_generating_func, expected_output ): room_inds = room_generating_func() - output = thermal_diffuser_utils.diffuser_allocation_switch(room_inds) + output = thermal_diffuser_utils.diffuser_allocation_switch( + room_inds, min_room_size=1 + ) np.testing.assert_array_equal(output, expected_output) diff --git a/smart_control/simulator/thermostat.py b/smart_control/simulator/thermostat.py index 4b64edfb..409fdcf8 100644 --- a/smart_control/simulator/thermostat.py +++ b/smart_control/simulator/thermostat.py @@ -1,6 +1,6 @@ """Models a thermostat in the simulation. -The thermostat is given a SetpointSchedule, which defines for any given time +The theromstat is given a SetpointSchedule, which defines for any given time the deadband. The SetpointSchedule also determines when the thermostat should operate in Comfort mode or Eco mode. @@ -8,19 +8,19 @@ goes beneath the heating setpoint, Heat mode is activated until the temperature reaches midway between the 2 setpoints. Similarly, if the temperature is higher than the cooling setpoint, the thermostat enters Cool mode until the mid-point. -Otherwise, it enters Off mode. +Otherways, it enters Off mode. In Eco mode, there is an additional state, Passive Cool mode. Upon entering -Eco mode, the thermostat is initially placed in this state, and remains that +Eco mode, the thermostate is initially placed in this state, and remains that way until the temperature cools beyond the eco heating setpoint, upon which the -thermostat operates as it did in Comfort mode. +thermostat operates as it did in Comfort mode """ import enum import pandas as pd -from smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import setpoint_schedule class Thermostat: @@ -127,6 +127,7 @@ def update( if ( self._current_mode == self.Mode.PASSIVE_COOL and zone_temp > temperature_window[0] + and zone_temp < temperature_window[1] ): self._current_mode = self.Mode.PASSIVE_COOL else: diff --git a/smart_control/simulator/thermostat_test.py b/smart_control/simulator/thermostat_test.py index 58bc7f02..2b4bd760 100644 --- a/smart_control/simulator/thermostat_test.py +++ b/smart_control/simulator/thermostat_test.py @@ -1,10 +1,8 @@ -"""Tests for thermostat.""" - from absl.testing import absltest import pandas as pd -from smart_control.simulator import setpoint_schedule -from smart_control.simulator import thermostat +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import thermostat def get_mock_schedule(): diff --git a/smart_control/simulator/vav.py b/smart_control/simulator/vav.py index 980579b3..eb2541f5 100644 --- a/smart_control/simulator/vav.py +++ b/smart_control/simulator/vav.py @@ -1,15 +1,15 @@ """Models a Variable Air Volume device for the simulation.""" +import math from typing import Optional, Tuple import uuid - import pandas as pd - -from smart_control.proto import smart_control_building_pb2 -from smart_control.simulator import boiler as boiler_py -from smart_control.simulator import smart_device -from smart_control.simulator import thermostat -from smart_control.utils import constants +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.simulator import air_handler as air_handler_py +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import smart_device +from smart_buildings.smart_control.simulator import thermostat +from smart_buildings.smart_control.utils import constants class Vav(smart_device.SmartDevice): @@ -17,25 +17,32 @@ class Vav(smart_device.SmartDevice): Attributes: max_air_flow_rate: Air flow rate when damper is fully open. - reheat_max_water_flow_rate: Water flow rate when valve is fully open. + reheat_max_water_flow_factor: Water flow factor when valve is fully open + (m^3/h). reheat_valve_setting: Proportion of water the valve is allowing through [0, 1]. damper_setting: Proportion of air the damper is allowing through [0, 1]. thermostat: Thermostat which controls VAV. - boiler: Boiler supplying hot water to the VAV. + hot_water_system: Hot water system supplying hot water to the VAV. flow_rate_demand: the flow rate demand - reheat_demand: the reheat demand + reheat_flow_factor: the reheat demand zone_air_temperature: the average temperature in the zone + max_air_flow_static_pressure: The minimum pressure at which the design max + air flow rate can be reached. """ def __init__( self, max_air_flow_rate: float, - reheat_max_water_flow_rate: float, + reheat_max_water_flow_factor: float, therm: thermostat.Thermostat, - boiler: boiler_py.Boiler, + hot_water_system: hot_water_system_py.HotWaterSystem, + air_handler: air_handler_py.AirHandler, device_id: Optional[str] = None, zone_id: Optional[str] = None, + max_air_flow_static_pressure: Optional[float] = 20000.0, + initial_zone_air_heating_temperature_setpoint: float = 294.0, + initial_zone_air_cooling_temperature_setpoint: float = 297.0, ): observable_fields = { 'supply_air_damper_percentage_command': smart_device.AttributeInfo( @@ -47,6 +54,16 @@ def __init__( 'zone_air_temperature_sensor': smart_device.AttributeInfo( 'zone_air_temperature', float ), + 'zone_air_heating_temperature_setpoint_sensor': ( + smart_device.AttributeInfo( + 'zone_air_heating_temperature_setpoint', float + ) + ), + 'zone_air_cooling_temperature_setpoint_sensor': ( + smart_device.AttributeInfo( + 'zone_air_cooling_temperature_setpoint', float + ) + ), } action_fields = { 'supply_air_damper_percentage_command': smart_device.AttributeInfo( @@ -68,29 +85,44 @@ def __init__( ) self._init_max_air_flow_rate = max_air_flow_rate - self._init_reheat_max_water_flow_rate = reheat_max_water_flow_rate + self._reheat_max_water_flow_factor = reheat_max_water_flow_factor self._init_reheat_valve_setting = 0.0 self._init_damper_setting = 0.1 self._init_thermostat = therm self._init_zone_air_temperature = 0 + self._zone_air_heating_temperature_setpoint = ( + initial_zone_air_heating_temperature_setpoint + ) + self._zone_air_cooling_temperature_setpoint = ( + initial_zone_air_cooling_temperature_setpoint + ) self.reset() - self._boiler = boiler + self._hot_water_system = hot_water_system + self._air_handler = air_handler + self._max_air_flow_static_pressure = max_air_flow_static_pressure def reset(self): self._max_air_flow_rate = self._init_max_air_flow_rate - self._reheat_max_water_flow_rate = self._init_reheat_max_water_flow_rate self._reheat_valve_setting = self._init_reheat_valve_setting self._damper_setting = self._init_damper_setting self._thermostat = self._init_thermostat self._zone_air_temperature = self._init_zone_air_temperature + @property + def zone_air_heating_temperature_setpoint(self) -> float: + return self._zone_air_heating_temperature_setpoint + + @property + def zone_air_cooling_temperature_setpoint(self) -> float: + return self._zone_air_cooling_temperature_setpoint + @property def thermostat(self) -> thermostat.Thermostat: return self._thermostat @property - def boiler(self) -> boiler_py.Boiler: - return self._boiler + def hot_water_system(self) -> hot_water_system_py.HotWaterSystem: + return self._hot_water_system @property def reheat_valve_setting(self) -> float: @@ -108,10 +140,7 @@ def max_air_flow_rate(self) -> float: @max_air_flow_rate.setter def max_air_flow_rate(self, value: float): - if value <= 0: - raise ValueError( - f'Maximum air flow rate must be greater than 0 (got {value}).' - ) + assert value > 0 self._max_air_flow_rate = value @property @@ -126,11 +155,42 @@ def damper_setting(self, value: float): @property def flow_rate_demand(self) -> float: - return self._damper_setting * self._max_air_flow_rate + return self._compute_flow_rate_demand() + + def _compute_flow_rate_demand(self) -> float: + """Returns the flow rate demand of the VAV. + + This assumes that the flow rate of each VAV is not impacted by the flow + from other VAVs. This allows us to not consider the damper positions of the + other VAVs, which simplifies things considerably. + + Thus, we can compute the flow rate demand as: first getting the ratio of + static pressure to design static pressure. Then using the ratio to adjust + the max air flow rate, so that when the static pressure is at the design + value, the max air flow rate is reached. The sqrt is used because pressure + and airflow have a quadratic relationship. + """ + + flow_rate_demand = ( + self._damper_setting + * self._max_air_flow_rate + * math.sqrt( + self._air_handler.supply_air_static_pressure_sensor + / self._max_air_flow_static_pressure + ) + ) + + # we will assume that there is always a minimal flow rate demand, even when + # the damper is closed. This is to avoid dividing by zero. + return max(flow_rate_demand, 0.00001) @property - def reheat_demand(self) -> float: - return self._reheat_valve_setting * self._reheat_max_water_flow_rate + def air_handler(self) -> air_handler_py.AirHandler: + return self._air_handler + + @property + def reheat_flow_factor(self) -> float: + return self._reheat_valve_setting * self._reheat_max_water_flow_factor @property def zone_air_temperature(self) -> float: @@ -145,9 +205,12 @@ def compute_reheat_energy_rate( supply_air_temp: Temperature in K of input air. input_water_temp: Temperature in K of input water. """ - reheat_flow_rate = ( - self._reheat_valve_setting * self._reheat_max_water_flow_rate - ) + if self._hot_water_system.flow_factor_sum == 0: + reheat_flow_rate = 0.0 + else: + reheat_flow_rate = self._hot_water_system.total_flow_rate * ( + self.reheat_flow_factor / self._hot_water_system.flow_factor_sum + ) return ( reheat_flow_rate * constants.WATER_HEAT_CAPACITY @@ -165,30 +228,16 @@ def compute_zone_supply_temp( supply_air_temp: Temperature in K of input air. input_water_temp: Temperature in K of input water. """ - - # Ensure damper_setting and max_air_flow_rate are positive - if self.damper_setting <= 0: - raise ValueError( - f'Damper setting must be greater than 0, got {self.damper_setting}.' - ) - if self._max_air_flow_rate <= 0: - raise ValueError( - 'Maximum air flow rate must be greater than 0, ' - f'got {self._max_air_flow_rate}.' - ) - - reheat_flow_rate = ( - self._reheat_valve_setting * self._reheat_max_water_flow_rate - ) - air_flow_rate = self._damper_setting * self._max_air_flow_rate - - # Ensure air_flow_rate is positive to avoid ZeroDivisionError - if air_flow_rate <= 0: - raise ValueError( - 'Air flow rate must be > 0 to compute zone supply temp. ' - f'damper_setting={self.damper_setting}, ' - f'max_air_flow_rate={self._max_air_flow_rate}.' + assert self.damper_setting > 0 + assert self._max_air_flow_rate > 0 + + if self._hot_water_system.flow_factor_sum == 0: + reheat_flow_rate = 0.0 + else: + reheat_flow_rate = self._hot_water_system.total_flow_rate * ( + self.reheat_flow_factor / self._hot_water_system.flow_factor_sum ) + air_flow_rate = self.flow_rate_demand heat_difference = ( constants.AIR_HEAT_CAPACITY * air_flow_rate @@ -218,7 +267,7 @@ def compute_energy_applied_to_zone( zone_supply_temp = self.compute_zone_supply_temp( supply_air_temp, input_water_temp ) - air_flow_rate = self._damper_setting * self._max_air_flow_rate + air_flow_rate = self.flow_rate_demand return ( air_flow_rate * constants.AIR_HEAT_CAPACITY @@ -235,6 +284,14 @@ def update_settings( current_timestamp: Pandas timestamp representing current time. """ self._zone_air_temperature = zone_temp + + temperature_window = ( + self._thermostat.get_setpoint_schedule().get_temperature_window( + current_timestamp + ) + ) + self._zone_air_heating_temperature_setpoint = temperature_window[0] + self._zone_air_cooling_temperature_setpoint = temperature_window[1] mode = self._thermostat.update(zone_temp, current_timestamp) if mode == thermostat.Thermostat.Mode.HEAT: self.damper_setting = 1.0 @@ -265,10 +322,12 @@ def output( """ self._zone_air_temperature = zone_temp q_zone = self.compute_energy_applied_to_zone( - zone_temp, supply_air_temp, self.boiler.reheat_water_setpoint + zone_temp, + supply_air_temp, + self.hot_water_system.supply_water_temperature_sensor, ) temp_vav_supply = self.compute_zone_supply_temp( - supply_air_temp, self.boiler.reheat_water_setpoint + supply_air_temp, self.hot_water_system.supply_water_temperature_sensor ) return q_zone, temp_vav_supply diff --git a/smart_control/simulator/vav_test.py b/smart_control/simulator/vav_test.py index 3b69e2e5..17ec9495 100644 --- a/smart_control/simulator/vav_test.py +++ b/smart_control/simulator/vav_test.py @@ -1,14 +1,14 @@ -"""Tests for vav.""" +import math from absl.testing import absltest from absl.testing import parameterized import pandas as pd - -from smart_control.simulator import boiler -from smart_control.simulator import setpoint_schedule -from smart_control.simulator import thermostat -from smart_control.simulator import vav -from smart_control.utils import constants +from smart_buildings.smart_control.simulator import air_handler +from smart_buildings.smart_control.simulator import hot_water_system as hot_water_system_py +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.simulator import thermostat +from smart_buildings.smart_control.simulator import vav +from smart_buildings.smart_control.utils import constants def _get_default_thermostat(): @@ -27,28 +27,52 @@ def _get_default_thermostat(): return t -def _get_default_boiler(): +def _get_default_hws(): reheat_water_setpoint = 260 water_pump_differential_head = 3 water_pump_efficiency = 0.6 - b = boiler.Boiler( + hws = hot_water_system_py.construct_hot_water_system( reheat_water_setpoint, water_pump_differential_head, water_pump_efficiency, - 'boiler_id', + 'hws_id', + ) + return hws + + +def _get_default_air_handler(): + recirculation = 0.65 + + supply_air_temperature_setpoint = 290 + fan_static_pressure = 20000.0 + fan_efficiency = 0.8 + return air_handler.AirHandler( + recirculation=recirculation, + supply_air_temperature_setpoint=supply_air_temperature_setpoint, + fan_static_pressure=fan_static_pressure, + fan_efficiency=fan_efficiency, ) - return b def compute_zone_supply_temp( reheat_valve_setting, - reheat_max_water_flow_rate, + reheat_max_water_flow_factor, damper_setting, max_air_flow_rate, supply_air_temp, input_water_temp, + differential_pressure, + header_resistance=0.0, ): - reheat_flow_rate = reheat_valve_setting * reheat_max_water_flow_rate + reheat_flow_factor = reheat_valve_setting * reheat_max_water_flow_factor + + if reheat_flow_factor == 0: + reheat_flow_rate = 0.0 + else: + reheat_flow_rate = reheat_flow_factor * math.sqrt( + differential_pressure / (1 + reheat_flow_factor**2 * header_resistance) + ) + air_flow_rate = damper_setting * max_air_flow_rate return ( ( @@ -68,44 +92,56 @@ class VavTest(parameterized.TestCase): def test_init(self): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() + b = _get_default_hws() + a = _get_default_air_handler() v = vav.Vav( max_air_flow_rate, - reheat_max_water_flow_rate, + reheat_max_water_flow_factor, t, b, - 'device_id', - 'zone_id', + a, + device_id='device_id', + zone_id='zone_id', + initial_zone_air_heating_temperature_setpoint=290.0, + initial_zone_air_cooling_temperature_setpoint=300.0, ) self.assertEqual(v.max_air_flow_rate, max_air_flow_rate) - self.assertEqual(v._reheat_max_water_flow_rate, reheat_max_water_flow_rate) + self.assertEqual( + v._reheat_max_water_flow_factor, reheat_max_water_flow_factor + ) self.assertEqual(v.thermostat, t) - self.assertEqual(v.boiler, b) + self.assertEqual(v.hot_water_system, b) self.assertEqual(v.reheat_valve_setting, 0) self.assertEqual(v.damper_setting, 0.1) self.assertEqual(v.zone_air_temperature, 0) self.assertEqual(v._device_id, 'device_id') self.assertEqual(v._zone_id, 'zone_id') + self.assertEqual(v.zone_air_heating_temperature_setpoint, 290.0) + self.assertEqual(v.zone_air_cooling_temperature_setpoint, 300.0) def test_init_default(self): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) self.assertIsNotNone(v._device_id) self.assertIsNotNone(v._zone_id) + self.assertEqual(v.zone_air_heating_temperature_setpoint, 294.0) + self.assertEqual(v.zone_air_cooling_temperature_setpoint, 297.0) def test_setters(self): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) v.reheat_valve_setting += 0.1 v.max_air_flow_rate += 0.1 @@ -117,10 +153,11 @@ def test_setters(self): def test_setters_raise_error(self): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) with self.assertRaises(ValueError): v.reheat_valve_setting = 1.1 @@ -131,32 +168,15 @@ def test_setters_raise_error(self): with self.assertRaises(ValueError): v.damper_setting = -0.1 - @parameterized.parameters(0.0, -0.5) - def test_max_air_flow_rate_setter_raises_value_error(self, invalid_value): - """ValueError when max_air_flow_rate is set to 0 or negative.""" - t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav( - max_air_flow_rate=0.6, - reheat_max_water_flow_rate=0.4, - therm=t, - boiler=b, - ) - - with self.assertRaisesRegex( - ValueError, 'Maximum air flow rate must be greater than 0' - ): - v.max_air_flow_rate = invalid_value - @parameterized.parameters( - (pd.Timestamp('2021-05-09 14:00'), 293, 0.1, 0.0), - (pd.Timestamp('2021-05-10 09:00'), 296, 1.0, 0.0), - (pd.Timestamp('2021-05-12 09:00'), 291, 1.0, 1.0), - (pd.Timestamp('2021-05-12 17:59'), 291, 1.0, 1.0), - (pd.Timestamp('2021-05-11 03:00'), 288, 1.0, 1.0), - (pd.Timestamp('2021-05-11 03:00'), 291, 0.1, 0.0), - (pd.Timestamp('2021-05-11 22:00'), 298, 1.0, 0.0), - (pd.Timestamp('2021-05-11 22:00'), 297, 0.1, 0.0), + (pd.Timestamp('2021-05-09 14:00'), 293, 0.1, 0.0, 290, 297), + (pd.Timestamp('2021-05-10 09:00'), 296, 1.0, 0.0, 292, 295), + (pd.Timestamp('2021-05-12 09:00'), 291, 1.0, 1.0, 292, 295), + (pd.Timestamp('2021-05-12 17:59'), 291, 1.0, 1.0, 292, 295), + (pd.Timestamp('2021-05-11 03:00'), 288, 1.0, 1.0, 290, 297), + (pd.Timestamp('2021-05-11 03:00'), 291, 0.1, 0.0, 290, 297), + (pd.Timestamp('2021-05-11 22:00'), 298, 1.0, 0.0, 290, 297), + (pd.Timestamp('2021-05-11 22:00'), 297, 0.1, 0.0, 290, 297), ) def test_update_settings( self, @@ -164,18 +184,27 @@ def test_update_settings( zone_temp, expected_damper_setting, expected_reheat_valve_setting, + expected_heating_setpoint, + expected_cooling_setpoint, ): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() t._previous_timestamp = current_timestamp - pd.Timedelta( 60.0, unit='minute' ) - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) v.update_settings(zone_temp, current_timestamp) self.assertEqual(expected_damper_setting, v._damper_setting) self.assertEqual(expected_reheat_valve_setting, v._reheat_valve_setting) + self.assertEqual( + expected_heating_setpoint, v.zone_air_heating_temperature_setpoint + ) + self.assertEqual( + expected_cooling_setpoint, v.zone_air_cooling_temperature_setpoint + ) @parameterized.parameters( (0.5, 0.4, 270, 260), @@ -186,19 +215,21 @@ def test_update_settings( def test_compute_reheat_energy_rate( self, reheat_valve_setting, - reheat_max_water_flow_rate, + reheat_max_water_flow_factor, input_water_temp, supply_air_temp, ): max_air_flow_rate = 0.6 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) v.reheat_valve_setting = reheat_valve_setting + v._hot_water_system.add_demand(v.reheat_flow_factor) + total_flow_rate = v._hot_water_system.total_flow_rate expected = ( - reheat_valve_setting - * reheat_max_water_flow_rate + total_flow_rate * constants.WATER_HEAT_CAPACITY * (input_water_temp - supply_air_temp) ) @@ -219,47 +250,52 @@ def test_compute_zone_supply_temp( reheat_valve_setting, damper_setting, max_air_flow_rate, - reheat_max_water_flow_rate, + reheat_max_water_flow_factor, input_water_temp, supply_air_temp, ): t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) v.reheat_valve_setting = reheat_valve_setting v.damper_setting = damper_setting + v._hot_water_system.add_demand(v.reheat_flow_factor) expected = compute_zone_supply_temp( reheat_valve_setting, - reheat_max_water_flow_rate, + reheat_max_water_flow_factor, damper_setting, max_air_flow_rate, supply_air_temp, input_water_temp, + v._hot_water_system.differential_pressure_setpoint, + v._hot_water_system._header_resistance, ) self.assertEqual( v.compute_zone_supply_temp(supply_air_temp, input_water_temp), expected ) - def test_compute_zone_supply_temp_raises_value_error(self): + def test_compute_zone_supply_temp_asserts_error(self): reheat_valve_setting = 0.5 max_air_flow_rate = 0.3 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 input_water_temp = 270 supply_air_temp = 260 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) v.reheat_valve_setting = reheat_valve_setting v.damper_setting = 0 - with self.assertRaises(ValueError): + with self.assertRaises(AssertionError): v.compute_zone_supply_temp(supply_air_temp, input_water_temp) v.damper_setting = 0.5 v._max_air_flow_rate = 0 - with self.assertRaises(ValueError): + with self.assertRaises(AssertionError): v.compute_zone_supply_temp(supply_air_temp, input_water_temp) @parameterized.parameters( @@ -276,10 +312,11 @@ def test_compute_energy_applied_to_zone( damper_setting, max_air_flow_rate, ): - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) v.damper_setting = damper_setting expected = 0 @@ -315,24 +352,28 @@ def test_update_heat(self, zone_temp, supply_air_temp): # This should produce a different result depending on the mode the # thermostat is in. max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) time = pd.Timestamp(year=2021, month=5, day=5, hour=11) - + v.update_settings(zone_temp, time) + v._hot_water_system.add_demand(v.reheat_flow_factor) self.assertEqual(t.update(zone_temp, time), thermostat.Thermostat.Mode.HEAT) damper_setting = 1.0 reheat_valve_setting = 1.0 zone_supply_temp = compute_zone_supply_temp( reheat_valve_setting, - reheat_max_water_flow_rate, + reheat_max_water_flow_factor, damper_setting, max_air_flow_rate, supply_air_temp, - b.reheat_water_setpoint, + b.supply_water_temperature_setpoint, + v._hot_water_system.differential_pressure_setpoint, + v._hot_water_system._header_resistance, ) q_zone = ( @@ -358,10 +399,11 @@ def test_update_cool(self, zone_temp, supply_air_temp): # This should produce a different result depending on the mode the # thermostat is in. max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) time = pd.Timestamp(year=2021, month=5, day=5, hour=11) @@ -371,11 +413,13 @@ def test_update_cool(self, zone_temp, supply_air_temp): zone_supply_temp = compute_zone_supply_temp( reheat_valve_setting, - reheat_max_water_flow_rate, + reheat_max_water_flow_factor, damper_setting, max_air_flow_rate, supply_air_temp, - b.reheat_water_setpoint, + b.supply_water_temperature_setpoint, + v._hot_water_system.differential_pressure_setpoint, + v._hot_water_system._header_resistance, ) q_zone = ( @@ -401,10 +445,11 @@ def test_update_off(self, zone_temp, supply_air_temp): # This should produce a different result depending on the mode the # thermostat is in. max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) time = pd.Timestamp(year=2021, month=5, day=5, hour=11) @@ -417,11 +462,13 @@ def test_update_off(self, zone_temp, supply_air_temp): v.damper_setting = 0.6 zone_supply_temp = compute_zone_supply_temp( reheat_valve_setting, - reheat_max_water_flow_rate, + reheat_max_water_flow_factor, damper_setting, max_air_flow_rate, supply_air_temp, - b.reheat_water_setpoint, + b.supply_water_temperature_setpoint, + v._hot_water_system.differential_pressure_sensor, + v._hot_water_system._header_resistance, ) q_zone = ( @@ -436,10 +483,11 @@ def test_update_off(self, zone_temp, supply_air_temp): def test_observable_field_names(self): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) self.assertSameElements( v.observable_field_names(), @@ -447,19 +495,30 @@ def test_observable_field_names(self): 'supply_air_damper_percentage_command', 'supply_air_flowrate_setpoint', 'zone_air_temperature_sensor', + 'zone_air_heating_temperature_setpoint_sensor', + 'zone_air_cooling_temperature_setpoint_sensor', ], ) @parameterized.parameters( ('supply_air_damper_percentage_command', 'damper_setting'), ('supply_air_flowrate_setpoint', 'max_air_flow_rate'), + ( + 'zone_air_heating_temperature_setpoint_sensor', + 'zone_air_heating_temperature_setpoint', + ), + ( + 'zone_air_cooling_temperature_setpoint_sensor', + 'zone_air_cooling_temperature_setpoint', + ), ) def test_observations(self, observation_name, attribute_name): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) observed_value = v.get_observation( observation_name, pd.Timestamp('2021-09-01 10:10:00') @@ -468,10 +527,11 @@ def test_observations(self, observation_name, attribute_name): def test_zone_air_temperature_sensor(self): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) observed_value = v.get_observation( 'zone_air_temperature_sensor', pd.Timestamp('2021-09-01 10:10:00') @@ -488,10 +548,11 @@ def test_zone_air_temperature_sensor(self): def test_action_field_names(self): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) self.assertSameElements( v.action_field_names(), ['supply_air_damper_percentage_command'] @@ -499,10 +560,11 @@ def test_action_field_names(self): def test_action_supply_air_flowrate_setpoint(self): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) new_value = 0.8 v.set_action( @@ -515,10 +577,11 @@ def test_action_supply_air_flowrate_setpoint(self): def test_output_does_not_change_settings(self): max_air_flow_rate = 0.6 - reheat_max_water_flow_rate = 0.4 + reheat_max_water_flow_factor = 0.4 t = _get_default_thermostat() - b = _get_default_boiler() - v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_rate, t, b) + b = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav(max_air_flow_rate, reheat_max_water_flow_factor, t, b, a) v.damper_setting = 0.6 v.reheat_valve_setting = 0.7 @@ -528,6 +591,31 @@ def test_output_does_not_change_settings(self): self.assertEqual(v.damper_setting, 0.6) self.assertEqual(v.reheat_valve_setting, 0.7) + def test_flow_rate_demand(self): + max_air_flow_rate = 0.6 + reheat_max_water_flow_rate = 0.4 + t = _get_default_thermostat() + hws = _get_default_hws() + a = _get_default_air_handler() + v = vav.Vav( + max_air_flow_rate=max_air_flow_rate, + reheat_max_water_flow_factor=reheat_max_water_flow_rate, + therm=t, + hot_water_system=hws, + air_handler=a, + ) + v.damper_setting = 0.6 + v._max_air_flow_rate = 0.6 + v._max_air_flow_static_pressure = 20000.0 + a.supply_air_static_pressure_setpoint = 20000.0 + self.assertEqual(v.flow_rate_demand, 0.36) + + a.supply_air_static_pressure_setpoint = 10000.0 + self.assertEqual(v.flow_rate_demand, 0.36 * math.sqrt(0.5)) + + a.supply_air_static_pressure_setpoint = 0.0 + self.assertEqual(v.flow_rate_demand, 0.00001) + if __name__ == '__main__': absltest.main() diff --git a/smart_control/simulator/weather/conftest.py b/smart_control/simulator/weather/conftest.py new file mode 100644 index 00000000..cf675937 --- /dev/null +++ b/smart_control/simulator/weather/conftest.py @@ -0,0 +1,172 @@ +"""Test fixtures and factories for weather related functionality.""" + +import pandas as pd +from smart_buildings.smart_control.simulator import weather_controller + +ReplayWeatherController = weather_controller.ReplayWeatherController + + +# FACTORIES + + +def create_replay_weather_controller( + csv_filepath: str | None = None, +) -> ReplayWeatherController: + """Returns a default ReplayWeatherController object for test purposes.""" + return ReplayWeatherController( + local_weather_path=csv_filepath, + convection_coefficient=100.0, + humidity_column='Humidity', + ) + + +# EXAMPLE DATA + + +START_TIMESTAMP = pd.Timestamp('2023-08-29 08:29:00', tz='UTC') +EXPECTED_FORECAST_PERIODS = [ + { + 'start_timestamp': pd.Timestamp('2023-08-29 08:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 09:00:00+0000', tz='UTC'), + 'temp': 289.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 09:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 10:00:00+0000', tz='UTC'), + 'temp': 289.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 10:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 11:00:00+0000', tz='UTC'), + 'temp': 288.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 11:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 12:00:00+0000', tz='UTC'), + 'temp': 288.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 12:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 13:00:00+0000', tz='UTC'), + 'temp': 288.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 13:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 14:00:00+0000', tz='UTC'), + 'temp': 288.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 14:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 15:00:00+0000', tz='UTC'), + 'temp': 287.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 15:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 16:00:00+0000', tz='UTC'), + 'temp': 289.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 16:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 17:00:00+0000', tz='UTC'), + 'temp': 291.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 17:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 18:00:00+0000', tz='UTC'), + 'temp': 293.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 18:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 19:00:00+0000', tz='UTC'), + 'temp': 294.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 19:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 20:00:00+0000', tz='UTC'), + 'temp': 296.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 20:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 21:00:00+0000', tz='UTC'), + 'temp': 297.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 21:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 22:00:00+0000', tz='UTC'), + 'temp': 297.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 22:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-29 23:00:00+0000', tz='UTC'), + 'temp': 298.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-29 23:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-30 00:00:00+0000', tz='UTC'), + 'temp': 299.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-30 00:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-30 01:00:00+0000', tz='UTC'), + 'temp': 298.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-30 01:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-30 02:00:00+0000', tz='UTC'), + 'temp': 298.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-30 02:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-30 03:00:00+0000', tz='UTC'), + 'temp': 297.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-30 03:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-30 04:00:00+0000', tz='UTC'), + 'temp': 294.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-30 04:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-30 05:00:00+0000', tz='UTC'), + 'temp': 293.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-30 05:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-30 06:00:00+0000', tz='UTC'), + 'temp': 292.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-30 06:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-30 07:00:00+0000', tz='UTC'), + 'temp': 292.15, + 'temp_unit': 'Kelvin', + }, + { + 'start_timestamp': pd.Timestamp('2023-08-30 07:00:00+0000', tz='UTC'), + 'end_timestamp': pd.Timestamp('2023-08-30 08:00:00+0000', tz='UTC'), + 'temp': 292.15, + 'temp_unit': 'Kelvin', + }, +] diff --git a/smart_control/simulator/weather/replay_weather_service.py b/smart_control/simulator/weather/replay_weather_service.py new file mode 100644 index 00000000..0a9dbce6 --- /dev/null +++ b/smart_control/simulator/weather/replay_weather_service.py @@ -0,0 +1,85 @@ +"""Weather service using replay weather data, for use in simulation.""" + +import dataclasses + +import pandas as pd +from smart_buildings.smart_control.services.weather import base_forecast +from smart_buildings.smart_control.services.weather import base_forecast_period +from smart_buildings.smart_control.services.weather import base_weather_service +from smart_buildings.smart_control.simulator import weather_controller +from smart_buildings.smart_control.utils import temperature_conversion + +ReplayWeatherController = weather_controller.ReplayWeatherController + + +@dataclasses.dataclass(frozen=True) +class ReplayHourlyForecastPeriod(base_forecast_period.BaseForecastPeriod): + """Hourly forecast period returned by the ReplayWeatherService.""" + + +@dataclasses.dataclass(frozen=True) +class ReplayHourlyForecast(base_forecast.BaseForecast): + """Hourly forecast returned by the ReplayWeatherService.""" + + +class ReplayWeatherService(base_weather_service.BaseWeatherService): + """Weather forecast service for use in simulation. + + Uses the ReplayWeatherController to fetch historical weather data, which is + treated as the upcoming forecast (from the perspective of the current + simulation time). + """ + + def __init__(self, controller: ReplayWeatherController): + self._controller = controller + + def get_hourly_forecast( + self, + start_timestamp: pd.Timestamp | None = None, + n_hours: int = 24, + temp_unit: str = "K", + normalize_to_start: bool = False, + ) -> ReplayHourlyForecast: + """Fetches hourly forecast data starting at the given timestamp. + + FYI: Although the replay temperatures are provided in Fahrenheit in the + CSV files, the ReplayWeatherController converts them to Kelvin. + + Args: + start_timestamp: The timestamp to start fetching forecast data from. + n_hours: The number of hours to fetch forecast data for. + temp_unit: The unit of temperatures to be returned (e.g. "Fahrenheit", + "Celsius", or "Kelvin"), or just the first letter. Temperatures will be + converted from Kelvin as necessary. + normalize_to_start: If False (default), returns forecasts on the hour + (e.g. 10:00, 11:00, etc.), or whatever was returned by the service. If + True and start_timestamp is provided, returns forecasts normalized to + the start_timestamp (e.g. 10:05, 11:05, etc.). Uses linear interpolation + to calculate forecast values at the normalized times. + + Returns: + A ReplayHourlyForecast object containing the specified number of periods. + """ + if start_timestamp is None: + raise ValueError( + "start_timestamp must be provided for ReplayWeatherService." + ) + + if not normalize_to_start: + # Provide forecast periods "on the hour", starting with the current hour: + start_timestamp = start_timestamp.floor(freq="H") + + periods = [] + display_unit = temperature_conversion.assign_temp_unit(temp_unit) + for i in range(n_hours): + current_time = start_timestamp + pd.Timedelta(hours=i) + temp_k = self._controller.get_current_temp(current_time) # in Kelvin + periods.append( + ReplayHourlyForecastPeriod( + start_timestamp=current_time, + end_timestamp=current_time + pd.Timedelta(hours=1), + temp=temperature_conversion.from_kelvin(temp_k, display_unit), + temp_unit=display_unit, + ) + ) + return ReplayHourlyForecast(periods=periods) diff --git a/smart_control/simulator/weather/replay_weather_service_test.py b/smart_control/simulator/weather/replay_weather_service_test.py new file mode 100644 index 00000000..88669262 --- /dev/null +++ b/smart_control/simulator/weather/replay_weather_service_test.py @@ -0,0 +1,108 @@ +import dataclasses +import random + +from absl.testing import absltest +import pandas as pd +from smart_buildings.smart_control.simulator.weather import conftest +from smart_buildings.smart_control.simulator.weather import replay_weather_service + +ReplayHourlyForecast = replay_weather_service.ReplayHourlyForecast +ReplayHourlyForecastPeriod = replay_weather_service.ReplayHourlyForecastPeriod +ReplayWeatherService = replay_weather_service.ReplayWeatherService + +START_TIMESTAMP = conftest.START_TIMESTAMP +EXPECTED_FORECAST_PERIODS = conftest.EXPECTED_FORECAST_PERIODS + + +class ReplayHourlyForecastTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.periods = [ + ReplayHourlyForecastPeriod(**p) for p in EXPECTED_FORECAST_PERIODS + ] + self.forecast = ReplayHourlyForecast(periods=self.periods) + + def test_initialization(self): + self.assertIsInstance(self.forecast, ReplayHourlyForecast) + self.assertEqual(self.forecast.periods, self.periods) + + def test_validates_periods_sorted(self): + periods = self.periods.copy() + random.shuffle(periods) # out of order + with self.assertRaisesRegex( + ValueError, + "Periods must be sorted by start_timestamp in ascending order.", + ): + ReplayHourlyForecast(periods=periods) + + +class ReplayWeatherServiceTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.controller = conftest.create_replay_weather_controller() + self.service = ReplayWeatherService(self.controller) + + def test_get_hourly_forecast(self): + forecast = self.service.get_hourly_forecast(start_timestamp=START_TIMESTAMP) + self.assertIsInstance(forecast, ReplayHourlyForecast) + + periods = forecast.periods + + with self.subTest(name="forecast_periods"): + types = set([type(p) for p in periods]) + self.assertEqual(types, {ReplayHourlyForecastPeriod}) + + with self.subTest(name="expected_values"): + self.assertEqual( + [dataclasses.asdict(p) for p in periods], + EXPECTED_FORECAST_PERIODS, + ) + + with self.subTest(name="24_hours_by_default"): + self.assertLen(periods, 24) + + with self.subTest(name="hourly_durations"): + durations = set([p.duration for p in periods]) + self.assertEqual(durations, {pd.Timedelta(hours=1)}) + + with self.subTest(name="sorted_by_start_time_ascending"): + start_times = [p.start_timestamp for p in periods] + self.assertEqual(start_times, sorted(start_times)) + + def test_get_hourly_forecast_start_time_not_provided(self): + with self.assertRaisesRegex( + ValueError, "start_timestamp must be provided" + ): + self.service.get_hourly_forecast() + + def test_get_hourly_forecast_n_hours(self): + n_hours = 5 + forecast = self.service.get_hourly_forecast( + start_timestamp=START_TIMESTAMP, n_hours=n_hours + ) + self.assertIsInstance(forecast, ReplayHourlyForecast) + self.assertLen(forecast.periods, n_hours) + + def test_get_hourly_forecast_insufficient_data(self): + start_timestamp = self.controller.max_time - pd.Timedelta(hours=1) + with self.assertRaisesRegex(ValueError, "Timestamp not in range"): + self.service.get_hourly_forecast( + start_timestamp=start_timestamp, n_hours=3 + ) + + def test_get_hourly_forecast_with_normalize_to_start(self): + start_timestamp = START_TIMESTAMP + pd.Timedelta(minutes=5) + forecast = self.service.get_hourly_forecast( + start_timestamp=start_timestamp, n_hours=1, normalize_to_start=True + ) + self.assertIsInstance(forecast, ReplayHourlyForecast) + self.assertEqual( + forecast.first_period.start_timestamp.minute, + start_timestamp.minute, + ) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/simulator/weather_controller.py b/smart_control/simulator/weather_controller.py index 7bd1aab4..955ec0fd 100644 --- a/smart_control/simulator/weather_controller.py +++ b/smart_control/simulator/weather_controller.py @@ -8,9 +8,8 @@ import gin import numpy as np import pandas as pd - -from smart_control.proto import smart_control_building_pb2 -from smart_control.utils import conversion_utils as utils +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.utils import conversion_utils as utils TemperatureBounds = Tuple[float, float] @@ -173,11 +172,11 @@ class ReplayWeatherController(BaseWeatherController): def __init__( self, - local_weather_path: str = WEATHER_CSV_FILEPATH, + local_weather_path: str | None = WEATHER_CSV_FILEPATH, convection_coefficient: float = 12.0, humidity_column: str = 'Humidity', ): - self.local_weather_path = local_weather_path + self.local_weather_path = local_weather_path or WEATHER_CSV_FILEPATH self.weather_df = self.read_weather_csv(self.local_weather_path) self.convection_coefficient = convection_coefficient self.humidity_column = humidity_column @@ -226,6 +225,11 @@ def max_time(self) -> pd.Timestamp: """Latest timestamp in the weather data.""" return max(self.weather_df['Time']) + @property + def timestamp_range(self) -> tuple[pd.Timestamp, pd.Timestamp]: + """Range of timestamps available in the weather data.""" + return (self.min_time, self.max_time) + @property def times_in_seconds(self) -> pd.Index: """Returns the timestamps of the weather data, as seconds since epoch.""" @@ -294,6 +298,6 @@ def get_current_humidity(self, timestamp: pd.Timestamp) -> float: """For a given timestamp, returns the current humidity level in percent.""" return self._get_interpolated_value(timestamp, self.humidities) - # pylint: disable=unused-argument def get_air_convection_coefficient(self, timestamp: pd.Timestamp) -> float: + del timestamp # unused by this implementation return self.convection_coefficient diff --git a/smart_control/simulator/weather_controller_test.py b/smart_control/simulator/weather_controller_test.py index f191ec90..2a183742 100644 --- a/smart_control/simulator/weather_controller_test.py +++ b/smart_control/simulator/weather_controller_test.py @@ -1,5 +1,3 @@ -"""Tests for weather_controller.""" - import math import os @@ -7,7 +5,7 @@ from absl.testing import parameterized import pandas as pd -from smart_control.simulator import weather_controller +from smart_buildings.smart_control.simulator import weather_controller # pylint: disable=g-long-lambda, unnecessary-lambda-assignment # TODO: consider using named functions instead @@ -123,34 +121,43 @@ def test_get_air_convection_coefficient(self): class ReplayWeatherControllerTest(parameterized.TestCase): - def setUp(self): super().setUp() data_path = os.path.join( os.path.dirname(__file__), 'local_weather_test_data.csv' ) + self.convection_coefficient = 10.0 self.controller = weather_controller.ReplayWeatherController( - local_weather_path=data_path, convection_coefficient=10.0 + local_weather_path=data_path, + convection_coefficient=self.convection_coefficient, ) - def test_replay_weather_controller(self): + def test_get_current_temp(self): temp = self.controller.get_current_temp( pd.Timestamp('2023-07-01 03:00:01+00:00') ) self.assertAlmostEqual(temp, 298.1500, places=5) - def test_replay_weather_controller_raises_error_before_range(self): + def test_get_current_temp_raises_error_before_range(self): weather_fn = lambda: self.controller.get_current_temp( pd.Timestamp('2023-05-01 03:00:01+00:00') ) self.assertRaises(ValueError, weather_fn) - def test_replay_weather_controller_raises_error_after_range(self): + def test_get_current_temp_raises_error_after_range(self): weather_fn = lambda: self.controller.get_current_temp( pd.Timestamp('2023-12-01 03:00:01+00:00') ) self.assertRaises(ValueError, weather_fn) + def test_get_air_convection_coefficient(self): + self.assertEqual( + self.controller.get_air_convection_coefficient( + pd.Timestamp('2023-07-01 03:00:01+00:00') + ), + self.convection_coefficient, + ) + class MoffettReplayWeatherControllerTest(parameterized.TestCase): """Tests for ReplayWeatherController using real weather data.""" @@ -164,21 +171,9 @@ def test_weather_df(self): self.assertEqual(self.controller.weather_df.shape, (3462, 15)) expected_columns = [ - 'Time', - 'StationName', - 'StationId', - 'Location', - 'TempC', - 'DewPointC', - 'BarometerMbar', - 'Rain', - 'RainTotal', - 'WindspeedKmph', - 'WindDirection', - 'SkyCoverage', - 'VisibilityKm', - 'Humidity', - 'TempF', + 'Time', 'StationName', 'StationId', 'Location', 'TempC', 'DewPointC', + 'BarometerMbar', 'Rain', 'RainTotal', 'WindspeedKmph', + 'WindDirection', 'SkyCoverage', 'VisibilityKm', 'Humidity', 'TempF' ] self.assertCountEqual( self.controller.weather_df.columns.tolist(), @@ -189,8 +184,12 @@ def test_time_range(self): min_time = pd.Timestamp('2023-06-30 17:00:00+00:00') max_time = pd.Timestamp('2023-11-22 16:00:00+00:00') - self.assertEqual(self.controller.min_time, min_time) - self.assertEqual(self.controller.max_time, max_time) + with self.subTest('min_and_max'): + self.assertEqual(self.controller.min_time, min_time) + self.assertEqual(self.controller.max_time, max_time) + + with self.subTest('timestamp_range'): + self.assertEqual(self.controller.timestamp_range, (min_time, max_time)) def test_times_in_seconds(self): self.assertIsInstance(self.controller.times_in_seconds, pd.Index) diff --git a/smart_control/utils/BUILD b/smart_control/utils/BUILD deleted file mode 100644 index bcb371a3..00000000 --- a/smart_control/utils/BUILD +++ /dev/null @@ -1,415 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Top-level BUILD for Smart Buildings Smart Control - -load("//devtools/python/blaze:pytype.bzl", "pytype_strict_library") -load("//devtools/python/blaze:strict.bzl", "py_strict_test") -load("//third_party/bazel_rules/rules_python/python:py_library.bzl", "py_library") -load("//third_party/bazel_rules/rules_python/python:py_test.bzl", "py_test") - -package( - default_applicable_licenses = ["//third_party/py/smart_buildings:license"], - default_visibility = ["//visibility:public"], -) - -py_library( - name = "constants", - srcs = ["constants.py"], -) - -py_library( - name = "conversion_utils", - srcs = ["conversion_utils.py"], - deps = [ - "//google/protobuf:timestamp_py_pb2", - "//third_party/py/holidays", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -py_strict_test( - name = "agent_utils_test", - srcs = ["agent_utils_test.py"], - deps = [ - ":agent_utils", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - "//third_party/py/tensorflow", - ], -) - -py_strict_test( - name = "bounded_action_normalizer_test", - srcs = ["bounded_action_normalizer_test.py"], - deps = [ - ":bounded_action_normalizer", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - "//third_party/py/tf_agents/specs", - ], -) - -py_strict_test( - name = "energy_utils_test", - srcs = ["energy_utils_test.py"], - deps = [ - ":energy_utils", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - ], -) - -py_strict_test( - name = "histogram_reducer_test", - srcs = ["histogram_reducer_test.py"], - deps = [ - ":histogram_reducer", - ":reader_lib", - "//third_party/py/absl/logging", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -py_strict_test( - name = "observation_normalizer_test", - srcs = ["observation_normalizer_test.py"], - deps = [ - ":observation_normalizer", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_normalization_py_pb2", - ], -) - -py_strict_test( - name = "reducer_test", - srcs = ["reducer_test.py"], - deps = [ - ":reducer", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/numpy", - "//third_party/py/pandas", - ], -) - -py_strict_test( - name = "regression_building_utils_test", - srcs = ["regression_building_utils_test.py"], - deps = [ - ":conversion_utils", - ":regression_building_utils", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_occupancy", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/simulator:setpoint_schedule", - ], -) - -py_strict_test( - name = "controller_read_write_test", - srcs = ["controller_read_write_test.py"], - deps = [ - ":controller_reader", - ":controller_writer", - ":reader_lib", - ":writer_lib", - "//net/proto2/contrib/pyutil:compare", - "//testing/pybase", - "//third_party/py/absl/testing:absltest", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_normalization_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/utils:conversion_utils", - ], -) - -py_strict_test( - name = "run_command_predictor_test", - srcs = ["run_command_predictor_test.py"], - deps = [ - ":conversion_utils", - ":reader_lib", - ":run_command_predictor", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/google/protobuf:use_fast_cpp_protos", # Automatically added go/proto_python_upb_flip - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -py_test( - name = "conversion_utils_test", - srcs = ["conversion_utils_test.py"], - deps = [ - ":conversion_utils", - "//testing/pybase", - "//third_party/py/absl/testing:absltest", - "//third_party/py/absl/testing:parameterized", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -pytype_strict_library( - name = "agent_utils", - srcs = ["agent_utils.py"], - deps = [ - "//third_party/py/numpy", - "//third_party/py/tensorflow", - ], -) - -pytype_strict_library( - name = "bounded_action_normalizer", - srcs = ["bounded_action_normalizer.py"], - deps = [ - "//third_party/py/numpy", - "//third_party/py/smart_buildings/smart_control/models:base_normalizer", - "//third_party/py/tf_agents/specs", - ], -) - -pytype_strict_library( - name = "building_image_generator", - srcs = ["building_image_generator.py"], - deps = [ - ":building_renderer", - ":real_building_temperature_array_generator", - "//third_party/py/PIL:pil", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/importlib_resources", - "//third_party/py/numpy", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - ], -) - -pytype_strict_library( - name = "building_renderer", - srcs = ["building_renderer.py"], - deps = [ - "//third_party/py/PIL:pil", - "//third_party/py/matplotlib", - "//third_party/py/mediapy", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/seaborn", - "//third_party/py/smart_buildings/smart_control/simulator:building_utils", - "//third_party/py/smart_buildings/smart_control/simulator:constants", - ], -) - -pytype_strict_library( - name = "energy_utils", - srcs = ["energy_utils.py"], - deps = [ - ":constants", - "//third_party/py/numpy", - ], -) - -pytype_strict_library( - name = "controller_reader", - srcs = ["controller_reader.py"], - deps = [ - ":constants", - ":reader_lib", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_normalization_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -pytype_strict_library( - name = "controller_writer", - srcs = ["controller_writer.py"], - deps = [ - ":constants", - ":writer_lib", - "//net/proto2/python/public", - "//pyglib:gfile", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/google/protobuf", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_normalization_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -pytype_strict_library( - name = "histogram_reducer", - srcs = ["histogram_reducer.py"], - deps = [ - ":reader_lib", - ":reducer", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - ], -) - -pytype_strict_library( - name = "observation_normalizer", - srcs = ["observation_normalizer.py"], - deps = [ - "//third_party/py/gin", - "//third_party/py/smart_buildings/smart_control/models:base_normalizer", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_normalization_py_pb2", - ], -) - -pytype_strict_library( - name = "plot_utils", - srcs = ["plot_utils.py"], - deps = [ - "//third_party/py/matplotlib", - "//third_party/py/numpy", - "//third_party/py/pandas", - ], -) - -pytype_strict_library( - name = "reader_lib", - srcs = ["reader_lib.py"], - deps = [ - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/importlib_resources", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_normalization_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) - -pytype_strict_library( - name = "real_building_temperature_array_generator", - srcs = ["real_building_temperature_array_generator.py"], - deps = [ - ":conversion_utils", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - ], -) - -pytype_strict_library( - name = "reducer", - srcs = ["reducer.py"], - deps = [ - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - ], -) - -pytype_strict_library( - name = "regression_building_utils", - srcs = ["regression_building_utils.py"], - deps = [ - ":conversion_utils", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/models:base_occupancy", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/simulator:setpoint_schedule", - ], -) - -pytype_strict_library( - name = "run_command_predictor", - srcs = ["run_command_predictor.py"], - deps = [ - ":conversion_utils", - ":reader_lib", - "//third_party/py/absl/logging", - "//third_party/py/gin", - "//third_party/py/numpy", - "//third_party/py/pandas", - "//third_party/py/sklearn", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - ], -) - -pytype_strict_library( - name = "test_utils", - srcs = ["test_utils.py"], - deps = [ - ":bounded_action_normalizer", - ":conversion_utils", - ":reader_lib", - "//testing/pybase", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/environment", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - "//third_party/py/smart_buildings/smart_control/simulator:setpoint_schedule", - ], -) - -pytype_strict_library( - name = "visual_logger", - srcs = ["visual_logger.py"], - deps = [ - ":building_renderer", - "//third_party/py/numpy", - "//third_party/py/pandas", - ], -) - -pytype_strict_library( - name = "writer_lib", - srcs = ["writer_lib.py"], - deps = [ - "//third_party/py/importlib_resources", - "//third_party/py/pandas", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_building_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_normalization_py_pb2", - "//third_party/py/smart_buildings/smart_control/proto:smart_control_reward_py_pb2", - ], -) diff --git a/smart_control/utils/__init__.py b/smart_control/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/smart_control/utils/agent_utils_test.py b/smart_control/utils/agent_utils_test.py index 46eb2bcc..7af44157 100644 --- a/smart_control/utils/agent_utils_test.py +++ b/smart_control/utils/agent_utils_test.py @@ -1,11 +1,9 @@ -"""Tests for agent_utils.""" - from absl.testing import absltest from absl.testing import parameterized import numpy as np import tensorflow as tf -from smart_control.utils import agent_utils +from smart_buildings.smart_control.utils import agent_utils class AgentUtilsTest(parameterized.TestCase): diff --git a/smart_control/utils/bounded_action_normalizer.py b/smart_control/utils/bounded_action_normalizer.py index 9f3103db..226fd421 100644 --- a/smart_control/utils/bounded_action_normalizer.py +++ b/smart_control/utils/bounded_action_normalizer.py @@ -3,7 +3,7 @@ import numpy as np from tf_agents import specs -from smart_control.models import base_normalizer +from smart_buildings.smart_control.models import base_normalizer # Due to floating point precision errors, it's possible that values will be # above/under the max/min thresholds by a small amount. ACTION_TOLERANCE @@ -103,10 +103,36 @@ def agent_value(self, setpoint_value: float) -> float: @property def setpoint_min(self) -> float: - """Returns the minimum setpoint value.""" + """Returns the minimum setpoint value. + + Deprecated alias. Prefer `min_native_value` instead. + """ return self._min_native_value @property def setpoint_max(self) -> float: + """Returns the maximum setpoint value. + + Deprecated alias. Prefer `max_native_value` instead. + """ + return self._max_native_value + + @property + def min_native_value(self) -> float: + """Returns the minimum setpoint value.""" + return self._min_native_value + + @property + def max_native_value(self) -> float: """Returns the maximum setpoint value.""" return self._max_native_value + + @property + def min_normalized_value(self) -> float: + """Returns a normalized version of the minimum native value.""" + return self._min_normalized_value + + @property + def max_normalized_value(self) -> float: + """Returns a normalized version of the maximum setpoint value.""" + return self._max_normalized_value diff --git a/smart_control/utils/bounded_action_normalizer_test.py b/smart_control/utils/bounded_action_normalizer_test.py index 601a9de8..077635d7 100644 --- a/smart_control/utils/bounded_action_normalizer_test.py +++ b/smart_control/utils/bounded_action_normalizer_test.py @@ -1,15 +1,23 @@ -"""Tests for action_normalizer.""" - from absl.testing import absltest from absl.testing import parameterized import numpy as np from tf_agents import specs -from smart_control.utils import bounded_action_normalizer +from smart_buildings.smart_control.utils import bounded_action_normalizer class ActionNormalizerTest(parameterized.TestCase): + def test_properties(self): + normalizer = bounded_action_normalizer.BoundedActionNormalizer( + min_native_value=200, max_native_value=300, + min_normalized_value=-1, max_normalized_value=1, + ) + self.assertEqual(normalizer.min_native_value, 200) + self.assertEqual(normalizer.max_native_value, 300) + self.assertEqual(normalizer.min_normalized_value, -1) + self.assertEqual(normalizer.max_normalized_value, 1) + @parameterized.named_parameters( ('min_native_value', -1, 200), ('mid_value', 0, 250), diff --git a/smart_control/utils/building_image_generator.py b/smart_control/utils/building_image_generator.py index d5ee17ea..63e28ed9 100644 --- a/smart_control/utils/building_image_generator.py +++ b/smart_control/utils/building_image_generator.py @@ -14,9 +14,9 @@ import numpy as np from PIL import Image -from smart_control.proto import smart_control_building_pb2 -from smart_control.utils import building_renderer -from smart_control.utils import real_building_temperature_array_generator as temp_array_gen +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.utils import building_renderer +from smart_buildings.smart_control.utils import real_building_temperature_array_generator as temp_array_gen if sys.version_info >= (3, 11): from importlib.resources.abc import Traversable # pylint: disable=g-import-not-at-top, g-importing-member diff --git a/smart_control/utils/building_renderer.py b/smart_control/utils/building_renderer.py index 76cf395f..4560aa71 100644 --- a/smart_control/utils/building_renderer.py +++ b/smart_control/utils/building_renderer.py @@ -13,8 +13,8 @@ from PIL import ImageDraw import seaborn as sn -from smart_control.simulator import building_utils -from smart_control.simulator import constants +from smart_buildings.smart_control.simulator import building_utils +from smart_buildings.smart_control.simulator import constants class BuildingRenderer: diff --git a/smart_control/utils/constants.py b/smart_control/utils/constants.py index eaf20457..6b2441fb 100644 --- a/smart_control/utils/constants.py +++ b/smart_control/utils/constants.py @@ -3,11 +3,6 @@ import os from typing import Final -# --------- Relative Filepaths --------------- - -# Path to the root directory of the project (where the main README is): -ROOT_DIR = os.path.join(os.path.dirname(__file__), '..', '..') - # --------- Thermal Constants --------------- AIR_HEAT_CAPACITY = 1006.0 # J/kg/K, standard atmosphere @@ -22,6 +17,9 @@ WATTS_PER_BTU_HR: float = 0.29307107 # Number of Watts in a BTU/hr HZ_PERCENT: float = 100.0 / 60.0 # Converts blower/pump Hz to Percentage Power +# --------- Pressure Constants --------------- +PASCALS_PER_BAR: float = 100000.0 # Number of Pascals in a bar. + # https://www.rapidtables.com/convert/power/hp-to-watt.html WATTS_PER_HORSEPOWER = 746.0 @@ -48,3 +46,22 @@ REWARD_RESPONSE_PREFIX = 'reward_response' DEVICE_INFO_PREFIX = 'device_info' ZONE_INFO_PREFIX = 'zone_info' + + +# ------------ File Paths ----------------- + +# Reference file paths in a way that works both internally and externally. +# Look for environment variable used by blaze / bazel internally. +# See: https://bazel.build/concepts/dependencies#data-dependencies +TEST_SRCDIR = os.environ.get('TEST_SRCDIR') +if TEST_SRCDIR: + REPO_DIRPATH = os.path.join( + TEST_SRCDIR, + 'google3', + 'third_party', + 'py', + 'smart_buildings', + 'smart_control', + ) +else: + REPO_DIRPATH = os.path.join(os.path.dirname(__file__), '..') diff --git a/smart_control/utils/constants_test.py b/smart_control/utils/constants_test.py new file mode 100644 index 00000000..292297e4 --- /dev/null +++ b/smart_control/utils/constants_test.py @@ -0,0 +1,31 @@ +import os + +from absl.testing import absltest + +from smart_buildings.smart_control.utils import constants + + +class ConstantsTest(absltest.TestCase): + + def test_repo_dirpath(self): + self.assertTrue(os.path.exists(constants.REPO_DIRPATH)) + + with self.subTest(name="contents"): + contents = os.listdir(constants.REPO_DIRPATH) + self.assertIn("README.md", contents) + self.assertIn("BUILD", contents) + self.assertIn("agents", contents) + self.assertIn("configs", contents) + self.assertIn("dataset", contents) + self.assertIn("environment", contents) + self.assertIn("llm", contents) + self.assertIn("models", contents) + self.assertIn("notebooks", contents) + self.assertIn("proto", contents) + self.assertIn("reinforcement_learning", contents) + self.assertIn("reward", contents) + self.assertIn("services", contents) + self.assertIn("simulator", contents) + self.assertIn("utils", contents) + + diff --git a/smart_control/utils/controller_read_write_test.py b/smart_control/utils/controller_read_write_test.py index 8fdc24af..99383838 100644 --- a/smart_control/utils/controller_read_write_test.py +++ b/smart_control/utils/controller_read_write_test.py @@ -1,17 +1,15 @@ -"""Tests for controller_reader and controller_writer.""" - import operator import os from absl.testing import absltest import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_normalization_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.utils import controller_reader -from smart_control.utils import controller_writer -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import controller_reader +from smart_buildings.smart_control.utils import controller_writer +from smart_buildings.smart_control.utils import conversion_utils DeviceInfo = smart_control_building_pb2.DeviceInfo ZoneInfo = smart_control_building_pb2.ZoneInfo diff --git a/smart_control/utils/controller_reader.py b/smart_control/utils/controller_reader.py index 34bcbf99..20565e9a 100644 --- a/smart_control/utils/controller_reader.py +++ b/smart_control/utils/controller_reader.py @@ -10,11 +10,11 @@ import gin import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_normalization_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.utils import constants -from smart_control.utils import reader_lib +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import constants +from smart_buildings.smart_control.utils import reader_lib T = TypeVar('T') @@ -149,14 +149,9 @@ def _select_shards( def _read_timestamp(filepath: str) -> pd.Timestamp: """Reads the timestamp from the filepath.""" - if not filepath: - raise ValueError('Filepath cannot be empty when reading timestamp.') - matches = re.findall(r'\d{4}\.\d{2}\.\d{2}\.\d{2}', filepath) - if not matches: - raise ValueError( - f'Could not extract timestamp from filepath: {filepath!r}' - ) - return pd.Timestamp(matches[-1]) + assert filepath + ts = pd.Timestamp(re.findall(r'\d{4}\.\d{2}\.\d{2}\.\d{2}', filepath)[-1]) + return ts def _between( timestamp: pd.Timestamp, diff --git a/smart_control/utils/controller_writer.py b/smart_control/utils/controller_writer.py index ad25c8ff..10b53ff4 100644 --- a/smart_control/utils/controller_writer.py +++ b/smart_control/utils/controller_writer.py @@ -9,11 +9,11 @@ from google.protobuf import message import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_normalization_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.utils import constants -from smart_control.utils import writer_lib +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import constants +from smart_buildings.smart_control.utils import writer_lib @gin.configurable @@ -35,6 +35,10 @@ def __init__(self, output_dir: str): os.makedirs(output_dir, exist_ok=True) logging.info('Writer lib output directory %s', self._output_dir) + @property + def output_dir(self) -> writer_lib.PathLocation: + return self._output_dir + def write_observation_response( self, observation_response: smart_control_building_pb2.ObservationResponse, diff --git a/smart_control/utils/controller_writer_test.py b/smart_control/utils/controller_writer_test.py new file mode 100644 index 00000000..9654b094 --- /dev/null +++ b/smart_control/utils/controller_writer_test.py @@ -0,0 +1,77 @@ +"""Tests for open source controller writer.""" + +import json +import os + +from absl.testing import absltest +import pandas as pd +import plotly.graph_objects as go + +from smart_buildings.smart_control.utils import controller_writer + + +class ControllerWriteGenericFilesTest(absltest.TestCase): + """Tests for generic file-writing methods.""" + + def setUp(self): + super().setUp() + self.working_dir = self.create_tempdir() + self.writer = controller_writer.ProtoWriter(self.working_dir) + + def _open(self, filepath, mode): + """Opens a file for reading. Can be overridden in corp codebase.""" + return self.writer._open(filepath, mode) + + def test_output_dir(self): + """Tests that the output directory is set correctly.""" + self.assertEqual(self.writer.output_dir, self.working_dir) + + def test_write_txt(self): + """Tests that the TXT file is written correctly.""" + filename = 'test.txt' + txt = 'testing 1, 2, 3' + self.writer.write_txt(txt, filename=filename) + + filepath = os.path.join(self.working_dir, filename) + self.assertTrue(os.path.exists(filepath)) + with self._open(filepath, 'r') as f: + self.assertEqual(f.read(), txt) + + def test_write_json(self): + """Tests that the JSON file is written correctly.""" + json_data = {'testing': [1, 2, 3]} + filename = 'test.json' + self.writer.write_json(json_data, filename=filename) + + filepath = os.path.join(self.working_dir, filename) + self.assertTrue(os.path.exists(filepath)) + with self._open(filepath, 'r') as f: + self.assertEqual(f.read(), json.dumps(json_data, indent=2)) + + def test_write_csv(self): + """Tests that the CSV file is written correctly.""" + df = pd.DataFrame({'testing': [1, 2, 3]}) + filename = 'test.csv' + self.writer.write_csv(df, filename=filename) + + filepath = os.path.join(self.working_dir, filename) + self.assertTrue(os.path.exists(filepath)) + with self._open(filepath, 'r') as f: + self.assertEqual(f.read(), df.to_csv(index=False)) + + def test_write_plot_html(self): + """Tests that the plot HTML file is written correctly.""" + fig = go.Figure() + fig.update_layout(title='My Plot Title') + + filename = 'test.html' + self.writer.write_plot_html(fig, filename=filename) + + filepath = os.path.join(self.working_dir, filename) + self.assertTrue(os.path.exists(filepath)) + with self._open(filepath, 'r') as f: + file_content = f.read() + self.assertIn('', file_content) + self.assertIn('', file_content) + self.assertIn('Plotly.newPlot', file_content) + self.assertIn('My Plot Title', file_content) diff --git a/smart_control/utils/conversion_utils.py b/smart_control/utils/conversion_utils.py index a8a98e31..63c888ca 100644 --- a/smart_control/utils/conversion_utils.py +++ b/smart_control/utils/conversion_utils.py @@ -8,12 +8,18 @@ import types from typing import Mapping, Tuple -from google.protobuf import timestamp_pb2 +from google3.google.protobuf import timestamp_pb2 import holidays import numpy as np import pandas as pd -from smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import temperature_conversion + +# TODO: b/505380216 - Refactor time related logic into "time_utils.py", and +# change external references to this file's temperature conversion function to +# reference the new temperature_conversion module / "thermal_utils.py" instead. + _COUNTRY = 'US' _SECONDS_IN_DAY = 24 * 3600 @@ -21,6 +27,11 @@ _DAYS_IN_WEEK = 7.0 +# Aliases temporarily kept here for backwards compatibility: +kelvin_to_fahrenheit = temperature_conversion.kelvin_to_fahrenheit +fahrenheit_to_kelvin = temperature_conversion.fahrenheit_to_kelvin + + def pandas_to_proto_timestamp( pandas_timestamp: pd.Timestamp, ) -> timestamp_pb2.Timestamp: @@ -64,30 +75,22 @@ def floor_plan_based_zone_identifier_to_id(identifier: str) -> str: def zone_id_to_coordinates(zone_id: str) -> Tuple[int, int]: - # Expect exactly "zone_id_(,)" (optional spaces after comma) - m = re.match(r'^zone_id_\((\d+),\s*(\d+)\)$', zone_id) - if not m: - raise ValueError( - f"Invalid zone_id format: {zone_id!r}. Expected 'zone_id_(,)'" - ) - return int(m.group(1)), int(m.group(2)) + p = r'^zone_id_[(](\d+), (\d+)[)]' + m = re.match(p, zone_id) + if m: + return int(m.group(1)), int(m.group(2)) + raise ValueError('Could not convert zone_id to coordinates!') def normalize_dow(dow: int) -> float: """Returns a normalized day of week, mapping [0, 6] to [-1., 1.].""" - if dow < 0 or dow > 6: - raise ValueError( - f'Day of week (dow) must be within the range [0, 6] (got {dow}).' - ) + assert dow <= 6 and dow >= 0 return (float(dow) - 3.0) / 3.0 def normalize_hod(hod: int) -> float: """Returns a normlized hour of day, mapping [0,23] to [-1., 1.].""" - if hod < 0 or hod > 23: - raise ValueError( - f'Hour of day (hod) must be within the range [0, 23] (got {hod}).' - ) + assert hod <= 23 and hod >= 0 return (float(hod) - 11.5) / 11.5 @@ -127,77 +130,33 @@ def get_radian_time( return 2.0 * np.pi * interval_frac -def kelvin_to_celsius(kelvin: float) -> float: - """Converts Kelvin to Celsius. - Args: - kelvin: Temperature in Kelvin. - - Returns: - The temperature in Celsius. - Raises: - A ValueError if the input value is negative. - """ - if kelvin <= 0.0: - raise ValueError('Temperature must be greater than absolute zero.') - return kelvin - 273.15 - - -def celsius_to_kelvin(celsius: float) -> float: - """Converts Celsius to Kelvin. - Args: - celsius: Temperature in Celsius. - - Returns: - The temperature in Kelvin. - - Raises: - A ValueError if the input value is less than absolute zero, -273.15°C. - """ - if celsius <= -273.15: - raise ValueError('Temperature must be greater than absolute zero.') - return celsius + 273.15 - - -def kelvin_to_fahrenheit(kelvin: float) -> float: - """Converts Kelvin to °F. - - Args: - kelvin: Temperature in Kelvin, where 273K = 32°F. - - Returns: - The temperature in °F. +# TODO(mjrossetti): Remove this function once all references are switched. +def get_reward_info_energy_use( + reward_info: smart_control_reward_pb2.RewardInfo, +) -> Mapping[str, float]: + # pylint: disable=line-too-long + """Converts to energy use in kWh for ac, blower, pump, and nat gas heating. - Raises: - A ValueError if the input value is negative. - """ - if kelvin <= 0.0: - raise ValueError('Temperature must be greater than absolute zero.') - celsius = kelvin - 273.15 - return celsius * 9.0 / 5.0 + 32.0 + NOTE: This function is now deprecated. Migration guide: + ```py + # OLD: + from smart_buildings.smart_control.utils import conversion_utils + conversion_utils.get_reward_info_energy_use(reward_info) -def fahrenheit_to_kelvin(fahrenheit: float) -> float: - """Converts °F to Kelvin. + # NEW: + from smart_buildings.smart_control.utils.proto_parsers import reward_info_parser + parser = reward_info_parser.RewardInfoParser(reward_info) + parser.get_energy_consumption() + ``` Args: - fahrenheit: Temperature in Kelvin, where 273K = 32°F. + reward_info: The reward info to convert to energy use. Returns: - The temperature in K. - - Raises: - A ValueError if the input value <= absolute 0, −459.67°F. + A dictionary mapping energy type to energy use in kWh. """ - if fahrenheit <= -495.67: - raise ValueError('Temperature must be greater than absolute zero.') - celsius = (fahrenheit - 32.0) * 5.0 / 9.0 - return celsius + 273.15 - - -def get_reward_info_energy_use( - reward_info: smart_control_reward_pb2.RewardInfo, -) -> Mapping[str, float]: - """Converts to energy use in kWh for ac, blower, pump, and nat gas heating.""" + # pylint: enable=line-too-long start_timestamp = proto_to_pandas_timestamp(reward_info.start_timestamp) end_timestamp = proto_to_pandas_timestamp(reward_info.end_timestamp) dt = (end_timestamp - start_timestamp).total_seconds() diff --git a/smart_control/utils/conversion_utils_test.py b/smart_control/utils/conversion_utils_test.py index 9c3beead..50e53579 100644 --- a/smart_control/utils/conversion_utils_test.py +++ b/smart_control/utils/conversion_utils_test.py @@ -1,12 +1,10 @@ -"""Tests for conversion_utils.""" - from absl.testing import absltest from absl.testing import parameterized import numpy as np import pandas as pd -from smart_control.proto import smart_control_reward_pb2 -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import conversion_utils class ConversionUtilsTest(parameterized.TestCase): @@ -46,26 +44,10 @@ def test_normalize_hod(self): self.assertEqual(conversion_utils.normalize_hod(0), -1.0) self.assertEqual(conversion_utils.normalize_hod(23), 1.0) - @parameterized.parameters(24, -1) - def test_normalize_hod_invalid_raises_error(self, invalid_hod): - """ValueError when hour of day is outside [0, 23].""" - with self.assertRaisesRegex( - ValueError, r'Hour of day \(hod\) must be within the range \[0, 23\]' - ): - conversion_utils.normalize_hod(invalid_hod) - def test_normalize_dow(self): self.assertEqual(conversion_utils.normalize_dow(0), -1.0) self.assertEqual(conversion_utils.normalize_dow(6), 1.0) - @parameterized.parameters(7, -1) - def test_normalize_dow_invalid_raises_error(self, invalid_dow): - """ValueError when day of week is outside [0, 6].""" - with self.assertRaisesRegex( - ValueError, r'Day of week \(dow\) must be within the range \[0, 6\]' - ): - conversion_utils.normalize_dow(invalid_dow) - @parameterized.parameters( (pd.Timestamp('2021-09-27 10:00:00-08:00'), 0), (pd.Timestamp('2021-10-10 18:25:00+02:00'), 6.0 / 7.0 * 2 * np.pi), @@ -79,30 +61,6 @@ def test_get_radian_dow(self, current_time, expected_radian): expected_radian, ) - @parameterized.parameters( - (32.0, 273.15), (-10.0, 249.817), (70.0, 294.261), (110.0, 316.483) - ) - def test_kelvin_to_fahrenheit(self, fahrenheit, kelvin): - self.assertAlmostEqual( - fahrenheit, conversion_utils.kelvin_to_fahrenheit(kelvin), places=2 - ) - - def test_kelvin_to_fahrenheit_invalid(self): - with self.assertRaises(ValueError): - _ = conversion_utils.kelvin_to_fahrenheit(0.0) - - @parameterized.parameters( - (32.0, 273.15), (-10.0, 249.817), (70.0, 294.261), (110.0, 316.483) - ) - def test_fahrenheit_to_kelvin(self, fahrenheit, kelvin): - self.assertAlmostEqual( - kelvin, conversion_utils.fahrenheit_to_kelvin(fahrenheit), places=2 - ) - - def test_fahrenheit_to_kelvin_invalid(self): - with self.assertRaises(ValueError): - _ = conversion_utils.fahrenheit_to_kelvin(-495.67) - @parameterized.parameters( (pd.Timestamp('2021-09-27 00:00:00+01'), 0), (pd.Timestamp('2021-10-10 23:59:59-07'), 6.28311258512742), diff --git a/smart_control/utils/energy_utils.py b/smart_control/utils/energy_utils.py index b5abe0e1..f1d1ca9e 100644 --- a/smart_control/utils/energy_utils.py +++ b/smart_control/utils/energy_utils.py @@ -1,10 +1,10 @@ """A collection of utility functions for Smart Building energy problems.""" +import dataclasses from typing import Optional, Sequence import numpy as np - -from smart_control.utils import constants +from smart_buildings.smart_control.utils import constants # Source: Thermodynamik, (1992), Hans Dieter Baehr, 8. Auflage, Springer Verlag # Tabelle 5.4, p. 213 @@ -28,6 +28,14 @@ _SUPPLY_STATIC_PRESSURE_OPERATIONAL_THRESH = 0.2 _DEFAULT_EER = 12.0 +# Physical and Conversion Constants +_WATTS_PER_BHP = 745.7 # BHP = Brake Horsepower +_BTU_H_TO_WATTS_FACTOR = 0.293071 + +# Water Properties Factor (Density * Specific Heat * 60 min/hr) +# Standard value for pure water at typical HW temperatures. +_WATER_HEAT_TRANSFER_FACTOR = 500.0 + def get_water_vapor_partial_pressure(temps: Sequence[float]) -> Sequence[float]: """Returns the partial pressure of moist air. @@ -63,22 +71,7 @@ def get_humidity_ratio( Returns: water mass to air mass ratio in kg Water / kg Air """ - if not (len(temps) == len(relative_humidities) == len(pressures)): # pylint: disable=superfluous-parens - raise ValueError( - f'Input arrays must have equal length. Got: temps={len(temps)}, ' - f'relative_humidities={len(relative_humidities)}, ' - f'pressures={len(pressures)}.' - ) - - # Sanity-check each RH and pressure using numpy - humidities_array = np.array(relative_humidities) - if np.any((humidities_array <= 0.0) | (humidities_array > 1.0)): - raise ValueError('Relative humidities must be in the range (0, 1].') - - pressures_array = np.array(pressures) - if np.any(pressures_array <= 0.0): - raise ValueError('Pressures must be greater than 0 (bar).') - + assert len(temps) == len(relative_humidities) == len(pressures) psat = [p / 1000.0 for p in get_water_vapor_partial_pressure(temps)] return [ 0.622 * psat[i] / (pressures[i] / relative_humidities[i] - psat[i]) @@ -112,22 +105,13 @@ def get_air_conditioning_energy_rate( Returns: Thermal power applied to heat the air to supply temp [W] """ - # Combined check for all input vector lengths - if not ( + assert ( len(air_flow_rates) == len(outside_temps) == len(outside_relative_humidities) == len(supply_temps) == len(ambient_pressures) - ): - raise ValueError( - 'All input vectors must be of the same length. ' - f'Got lengths: air_flow_rates={len(air_flow_rates)}, ' - f'outside_temps={len(outside_temps)}, ' - f'outside_relative_humidities={len(outside_relative_humidities)}, ' - f'supply_temps={len(supply_temps)}, ' - f'ambient_pressures={len(ambient_pressures)}.' - ) + ), 'All input vectors must be of the same length.' x = get_humidity_ratio( temps=outside_temps, @@ -192,12 +176,11 @@ def get_fan_power( if motor_factor is None: motor_factor = 0.85 - # If the caller explicitly passed brake_hp (even if 0.0), honor it - # otherwise fall back to design_hp × motor_factor - if brake_hp is not None: + if brake_hp: hp = brake_hp else: hp = motor_factor * design_hp + # Fan is operational if the supply_static_pressure > threshold for # supply fan. Exhaust fan doesn't report static pressure, so assume on # when fan_speed_percentage is > 0. @@ -598,3 +581,158 @@ def get_water_heating_energy_rate_primary_secondary( supply_water_temperature=boiler_outlet_temperature, return_water_temperature=blended_return_temperature, ) + + +def _validate_speed_percent(speed_percent: float | np.ndarray): + """Validates that the speed percentage is within the range (*, 100]. + + Args: + speed_percent (float or np.ndarray): Current VFD speed as a percentage. + + Raises: + ValueError if speed_percent is outside the range [0, 100]. + """ + if np.any(speed_percent > 100.0): + raise ValueError('Speed percentage must be less than or equal to 100.') + + +def calculate_pump_power(bhp: float, speed_percent: float): + """Estimates pump electrical power using the Third Pump Affinity Law. + + The third affinity law states that power is proportional to the + cube of the speed (P1/P2 = (N1/N2)^3). + + Args: + bhp (float): The Brake Horse Power required by the pump at 100% speed. + speed_percent (float): Current VFD speed as a percentage can be negative + but less than 100.. + + Returns: + float or np.ndarray: Estimated power consumption in Watts. + + Raises: + ValueError if speed_percent is outside the range [0, 100]. + """ + _validate_speed_percent(speed_percent) + + rated_watts = bhp * _WATTS_PER_BHP + speed_ratio = np.maximum(speed_percent, 0.0) / 100.0 + return rated_watts * (speed_ratio**3) + + +def estimate_flow_gpm(rated_gpm: float, speed_percent: float) -> float: + """Estimates fluid flow using the First Pump Affinity Law. + + The first affinity law states that flow is directly proportional + to the pump rotational speed (Q1/Q2 = N1/N2). + + Args: + rated_gpm (float): The design flow rate of the pump at 100% speed. + speed_percent (float): Current VFD speed as a percentage (0-100). + + Returns: + float: Estimated flow in Gallons Per Minute (GPM). + + Raises: + ValueError if speed_percent if greater than 100. + """ + _validate_speed_percent(speed_percent) + + speed_ratio = np.maximum(speed_percent, 0.0) / 100.0 + return rated_gpm * speed_ratio + + +@dataclasses.dataclass +class ASHPEstimates: + """Represents the estimated power consumption and flow for an ASHP system. + + Attributes: + flow_gpm: Total estimated system flow in Gallons Per Minute. + hp_watts: Electrical power used by ASHP consumers in Watts. + pump_watts: Combined power used by hydronic pumps in Watts. + total_watts: Sum of all electrical consumers in Watts. + """ + + flow_gpm: float | np.ndarray + hp_watts: float | np.ndarray + pump_watts: float | np.ndarray + total_watts: float | np.ndarray + + +class ASHPSystemEstimator: + """Estimator for electrical use of an Air Source Heat Pump (ASHP) system. + + This library calculates the power consumption of both hydronic pumps and + heat pump units using thermodynamic principles and centrifugal pump + affinity laws. It is designed to handle both scalar inputs and NumPy + arrays for time-series analysis. + + Attributes: + cop (float): The Coefficient of Performance (COP) of the heat pump. + """ + + def __init__(self, hp_cop: float = 3.4): + """Initializes the estimator with specific equipment performance metrics. + + Args: + hp_cop (float): The Coefficient of Performance (COP) of the heat pump. + Default is 3.4, based on Aermec NRK technical data. + """ + self.cop = hp_cop + + def estimate_interval_power( + self, + hws_f: float | np.ndarray, + hwr_f: float | np.ndarray, + p1_speed: float | np.ndarray, + p2_speed: float | np.ndarray, + p1_bhp: float, + p2_bhp: float, + p1_rated_gpm: float, + p2_rated_gpm: float, + ): + """Calculates total system power consumption for a specific interval. + + Calculates the heat pump's electrical draw by deriving thermal load from + the temperature delta and estimated flow, then adds the individual + draw of the hydronic pumps. + + Args: + hws_f (float or np.ndarray): Hot Water Supply temperature in Fahrenheit. + hwr_f (float or np.ndarray): Hot Water Return temperature in Fahrenheit. + p1_speed (float or np.ndarray): VFD speed percentage for Pump 1. + p2_speed (float or np.ndarray): VFD speed percentage for Pump 2. + p1_bhp (float): Rated Brake Horse Power for Pump 1. + p2_bhp (float): Rated Brake Horse Power for Pump 2. + p1_rated_gpm (float): Rated GPM for Pump 1. + p2_rated_gpm (float): Rated GPM for Pump 2. + + Returns: + ASHPEstimates: An object containing the estimated flow and power. + """ + # 1. Estimate Flow + flow_p1 = estimate_flow_gpm(p1_rated_gpm, p1_speed) + flow_p2 = estimate_flow_gpm(p2_rated_gpm, p2_speed) + total_gpm = flow_p1 + flow_p2 + + # 2. Calculate Thermal Load (BTU/h) + # Formula: Q = GPM * FluidFactor * DeltaT + delta_t = np.maximum(hws_f - hwr_f, 0.0) + thermal_btu_h = total_gpm * _WATER_HEAT_TRANSFER_FACTOR * delta_t + + # 3. Convert Thermal to Electrical Watts + hp_watts = (thermal_btu_h * _BTU_H_TO_WATTS_FACTOR) / self.cop + + # 4. Calculate Pump Electrical Draw + p1_w = calculate_pump_power(p1_bhp, p1_speed) + p2_w = calculate_pump_power(p2_bhp, p2_speed) + + pump_watts = p1_w + p2_w + total_watts = hp_watts + pump_watts + + return ASHPEstimates( + flow_gpm=total_gpm, + hp_watts=hp_watts, + pump_watts=pump_watts, + total_watts=total_watts, + ) diff --git a/smart_control/utils/energy_utils_test.py b/smart_control/utils/energy_utils_test.py index 3a17a7c5..17a39285 100644 --- a/smart_control/utils/energy_utils_test.py +++ b/smart_control/utils/energy_utils_test.py @@ -1,9 +1,8 @@ -"""Tests for energy_utils.""" - from absl.testing import absltest from absl.testing import parameterized +import numpy as np -from smart_control.utils import energy_utils +from smart_buildings.smart_control.utils import energy_utils class EnergyUtilsTest(parameterized.TestCase): @@ -33,60 +32,16 @@ def test_get_humidity_ratio(self): actual = energy_utils.get_humidity_ratio([293], [0.6], [1.02]) self.assertAlmostEqual(expected, actual[0], 4) - def test_get_humidity_ratio_mismatched_lengths(self): - """ValueError when input arrays have different lengths.""" - with self.assertRaisesRegex( - ValueError, 'Input arrays must have equal length' - ): - energy_utils.get_humidity_ratio( - temps=[293, 300], # 2 elements - relative_humidities=[0.6], # 1 element - pressures=[1.02], # 1 element - ) - - @parameterized.parameters(1.5, 0.0, -0.1) - def test_get_humidity_ratio_invalid_relative_humidity(self, invalid_rh): - """ValueError when relative_humidity is outside (0, 1].""" - with self.assertRaisesRegex( - ValueError, r'Relative humidities must be in the range \(0, 1\]' - ): - energy_utils.get_humidity_ratio( - temps=[293], relative_humidities=[invalid_rh], pressures=[1.02] - ) - - @parameterized.parameters(-1.0, 0.0) - def test_get_humidity_ratio_invalid_pressure(self, invalid_pressure): - """ValueError when pressure <= 0.""" - with self.assertRaisesRegex( - ValueError, r'Pressures must be greater than 0' - ): - energy_utils.get_humidity_ratio( - temps=[293], relative_humidities=[0.6], pressures=[invalid_pressure] - ) - def test_get_air_conditioning_energy_rate(self): power = energy_utils.get_air_conditioning_energy_rate( air_flow_rates=[0.170], - outside_temps=[288], + outside_temps=[15 + 273.0], outside_relative_humidities=[0.75], - supply_temps=[393], + supply_temps=[120 + 273.0], ambient_pressures=[1.025], ) self.assertAlmostEqual(18230.6705, power[0], 4) - def test_get_air_conditioning_energy_rate_mismatched_lengths(self): - """ValueError when input vectors have different lengths.""" - with self.assertRaisesRegex( - ValueError, 'All input vectors must be of the same length' - ): - energy_utils.get_air_conditioning_energy_rate( - air_flow_rates=[0.170, 0.180], # 2 elements - outside_temps=[288], # 1 element - outside_relative_humidities=[0.75], - supply_temps=[393], - ambient_pressures=[1.025], - ) - @parameterized.named_parameters( ('brake_hp', None, 8.0, 100.0, 0.8, 0.85, 3, 17.904), ('design_hp', 10.0, None, None, None, None, 1, 6.3410), @@ -294,5 +249,59 @@ def test_get_water_heating_energy_rate_primary_secondary_invalid( ) +class ASHPSystemTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.estimator = energy_utils.ASHPSystemEstimator(hp_cop=3.4) + self.p_bhp = 5.0 + self.p_gpm = 100.0 + + @parameterized.parameters( + (100.0, 3728.5), # 100% speed -> Full BHP in Watts + (50.0, 466.06), # 50% speed -> 1/8th power (Affinity Law) + (0.0, 0.0), # 0% speed -> 0 Watts + (-10.0, 0.0), # Negative input safety + ) + def test_pump_power_scaling(self, speed, expected_watts): + calc = energy_utils.calculate_pump_power(self.p_bhp, speed) + self.assertAlmostEqual(calc, expected_watts, places=1) + + @parameterized.named_parameters([ + ('normal_heating', 130.0, 120.0, 100.0, 43098.7), + ('stagnant_water', 130.0, 130.0, 100.0, 0.0), + ('pumps_off', 130.0, 120.0, 0.0, 0.0), + ]) + def test_hp_consumption_logic(self, hws, hwr, speed, expected_hp_w): + # Testing HP electrical draw based on deltaT and Flow + result = self.estimator.estimate_interval_power( + hws, hwr, speed, 0, self.p_bhp, self.p_bhp, self.p_gpm, self.p_gpm + ) + self.assertAlmostEqual(result.hp_watts, expected_hp_w, places=1) + + def test_numpy_array_support(self): + """Verify the library handles time-series arrays correctly.""" + hws_series = np.array([130.0, 130.0, 130.0]) + hwr_series = np.array([120.0, 125.0, 130.0]) # Decreasing deltaT + speeds = np.array([100.0, 100.0, 100.0]) + + results = self.estimator.estimate_interval_power( + hws_series, + hwr_series, + speeds, + 0, + self.p_bhp, + self.p_bhp, + self.p_gpm, + self.p_gpm, + ) + + # Check that the output is also a numpy array of the same length + self.assertIsInstance(results.total_watts, np.ndarray) + self.assertLen(results.total_watts, 3) + # Verify the third interval (deltaT=0) is just pump power (~3728W) + self.assertAlmostEqual(results.total_watts[2], 3728.5, places=1) + + if __name__ == '__main__': absltest.main() diff --git a/smart_control/utils/environment_utils.py b/smart_control/utils/environment_utils.py index 03edaeb1..79a428f4 100644 --- a/smart_control/utils/environment_utils.py +++ b/smart_control/utils/environment_utils.py @@ -1,10 +1,15 @@ -"""Reinforcement learning environment utility functions.""" +"""Utility functions for use in gin configuration files. + +TODO(mjrossetti): Let's consider renaming this file to "gin_utils.py" or +"config_utils.py", because the functionality is more related to gin configs than +it is about the environment. +""" import gin import pandas as pd -from smart_control.proto import smart_control_normalization_pb2 -from smart_control.utils import bounded_action_normalizer +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.utils import bounded_action_normalizer @gin.configurable diff --git a/smart_control/utils/environment_utils_test.py b/smart_control/utils/environment_utils_test.py new file mode 100644 index 00000000..ea7d7fbf --- /dev/null +++ b/smart_control/utils/environment_utils_test.py @@ -0,0 +1,49 @@ +from absl.testing import absltest +import pandas as pd + +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.utils import bounded_action_normalizer +from smart_buildings.smart_control.utils import environment_utils + +BoundedActionNormalizer = bounded_action_normalizer.BoundedActionNormalizer +ContinuousVariableInfo = smart_control_normalization_pb2.ContinuousVariableInfo + + +class GinUtilsTest(absltest.TestCase): + + def test_local_time(self): + self.assertEqual( + pd.Timedelta('07:12:01'), environment_utils.local_time('07:12:01') + ) + + def test_to_timestamp(self): + self.assertEqual( + pd.Timestamp('2021-08-13 14:01:33'), + environment_utils.to_timestamp('2021-08-13 14:01:33'), + ) + + def test_set_observation_normalization_constants(self): + observation = environment_utils.set_observation_normalization_constants( + field_id='field_id', sample_mean=1.0, sample_variance=2.0 + ) + self.assertIsInstance(observation, ContinuousVariableInfo) + self.assertEqual(observation.id, 'field_id') + self.assertEqual(observation.sample_mean, 1.0) + self.assertEqual(observation.sample_variance, 2.0) + + def test_set_action_normalization_constants(self): + normalizer = environment_utils.set_action_normalization_constants( + min_native_value=0.0, + max_native_value=1.0, + min_normalized_value=-1.0, + max_normalized_value=1.0, + ) + self.assertIsInstance(normalizer, BoundedActionNormalizer) + self.assertEqual(normalizer.min_native_value, 0.0) + self.assertEqual(normalizer.max_native_value, 1.0) + self.assertEqual(normalizer.min_normalized_value, -1.0) + self.assertEqual(normalizer.max_normalized_value, 1.0) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/utils/histogram_reducer.py b/smart_control/utils/histogram_reducer.py index f8a1ce9f..c2e76b0d 100644 --- a/smart_control/utils/histogram_reducer.py +++ b/smart_control/utils/histogram_reducer.py @@ -7,7 +7,7 @@ representing each zone as a separate timeseries is rather inefficient. Reduce function converts a feature from individual timeseries into a histogram. -For example, devices d1, d2 have a zone_air_temperature timeseries, +For exammple, devices d1, d2 have a zone_air_temperature timeseries, the histogram reducer converts the timeseries into a counts on temperature bins, like 70, 71, 72, etc. and assigns a count to the bin. This reduces the dimensionality into a more compressed format if the number of the devices @@ -34,10 +34,10 @@ import numpy as np import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.utils import reader_lib -from smart_control.utils.reducer import BaseReducedSequence -from smart_control.utils.reducer import BaseReducer +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.utils import reader_lib +from smart_buildings.smart_control.utils.reducer import BaseReducedSequence +from smart_buildings.smart_control.utils.reducer import BaseReducer Feature = str # Measurement name Device = str # Device Identity diff --git a/smart_control/utils/histogram_reducer_test.py b/smart_control/utils/histogram_reducer_test.py index 481251ac..3cdfd0c3 100644 --- a/smart_control/utils/histogram_reducer_test.py +++ b/smart_control/utils/histogram_reducer_test.py @@ -1,5 +1,3 @@ -"""Unit Tests for HistogramReducer.""" - from typing import Sequence from absl import logging @@ -8,10 +6,10 @@ import numpy as np import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.utils import histogram_reducer -from smart_control.utils import reader_lib +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import histogram_reducer +from smart_buildings.smart_control.utils import reader_lib class TestReader(reader_lib.BaseReader): diff --git a/smart_control/utils/observation_normalizer.py b/smart_control/utils/observation_normalizer.py index f20568e3..5cab7be8 100644 --- a/smart_control/utils/observation_normalizer.py +++ b/smart_control/utils/observation_normalizer.py @@ -5,13 +5,17 @@ import gin -from smart_control.models import base_normalizer -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.models import base_normalizer +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 + +ContinuousVariableInfo = smart_control_normalization_pb2.ContinuousVariableInfo FieldNameKeyword = NewType('FieldNameKeyword', str) FieldName = NewType('FieldName', str) +NormalizationConstants = Mapping[FieldNameKeyword, ContinuousVariableInfo] + @gin.configurable class StandardScoreObservationNormalizer( @@ -31,25 +35,21 @@ class StandardScoreObservationNormalizer( ValueError if the field name is not matched in the normalization_constants. """ - def __init__( - self, - normalization_constants: Mapping[ - FieldNameKeyword, - smart_control_normalization_pb2.ContinuousVariableInfo, - ], - ): + def __init__(self, normalization_constants: NormalizationConstants): self._normalization_constants = normalization_constants + @property + def normalization_constants(self) -> NormalizationConstants: + return self._normalization_constants + def _get_normalization_constants( self, field_name: FieldName - ) -> smart_control_normalization_pb2.ContinuousVariableInfo: + ) -> ContinuousVariableInfo: """Returns normalization data for exact match or keyword-contain match.""" if field_name in self._normalization_constants: return self._normalization_constants[field_name] else: - return smart_control_normalization_pb2.ContinuousVariableInfo( - sample_mean=0.0, sample_variance=1.0 - ) + return ContinuousVariableInfo(sample_mean=0.0, sample_variance=1.0) def _normalize_one(self, field_name: FieldName, value: float) -> float: """Shifts and scales a native value based on its field name. diff --git a/smart_control/utils/observation_normalizer_test.py b/smart_control/utils/observation_normalizer_test.py index dd80808a..b6c05583 100644 --- a/smart_control/utils/observation_normalizer_test.py +++ b/smart_control/utils/observation_normalizer_test.py @@ -1,10 +1,8 @@ -"""Tests for observation_normalizer.""" - from absl.testing import absltest -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_normalization_pb2 -from smart_control.utils import observation_normalizer +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.utils import observation_normalizer _DEVICES = ['a', 'a', 'b', 'b', 'c', 'c'] _MEASUREMENTS = [ diff --git a/smart_control/utils/occupancy_features_utils.py b/smart_control/utils/occupancy_features_utils.py new file mode 100644 index 00000000..67ac1b89 --- /dev/null +++ b/smart_control/utils/occupancy_features_utils.py @@ -0,0 +1,247 @@ +"""Utility functions for processing smart building occupancy and observation data. + +This module provides tools to bridge raw building telemetry (handled via +Protocol Buffers) and downstream machine learning models or reinforcement +learning agents. It focuses on two primary areas of data transformation: + +1. Observation Context Enrichment: + Modifies incoming building observation responses by injecting spatial context + (floor numbers) into measurement names. For example, it appends a suffix like + '@floor3' to generic 'zone_air_temperature_sensor' readings. This allows + downstream spatial-aware agents to distinguish identical sensor types across + different levels of the building. + +2. Occupancy Feature Extraction: + Flattens multi-dimensional pandas DataFrames (representing building occupancy + histograms) into 1D feature arrays (numpy) suitable for direct input into ML + pipelines. It extracts both standard occupancy metrics (people per floor per + temperature bin) and "exposed" occupancy metrics (people explicitly + experiencing temperatures outside of defined comfort setpoints). + +Typical usage involves calling `assign_floor_to_observation_response` on +incoming telemetry streams and +`get_occupancy_features_from_zone_conditions_histogram` on +aggregated reward/state representations. +""" + +from collections.abc import Sequence + +from absl import logging +import numpy as np +import pandas as pd +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils.proto_parsers import reward_info_parser + +OCCUPANCY_AT_FLOOR_PREFIX = reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX +FLOOR_PREFIX = reward_info_parser.FLOOR_PREFIX + +# Default temperature bins (in Kelvin) used to group zone conditions. +OCCUPANCY_TEMPERATURE_HISTOGRAM_BINS = [ + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, +] + + +def get_zone_conditions_histogram( + reward_info: smart_control_reward_pb2.RewardInfo, + temperature_bins: Sequence[float], + zones: Sequence[smart_control_building_pb2.ZoneInfo], +) -> pd.DataFrame: + """Generates a histogram DataFrame of building zone conditions over temp bins.""" + return reward_info_parser.RewardInfoParser( + reward_info=reward_info, + ).get_zone_conditions_histogram_by_floor( + zones=zones, temp_unit="K", temp_bins=temperature_bins + ) + + +def append_floor_to_measurement_name(measurement_name: str, floor: int) -> str: + """Appends the floor suffix to a given measurement name. + + Args: + measurement_name: The original name of the measurement (e.g., + "zone_air_temp"). + floor: The integer floor number where the measurement device is located. + + Returns: + A new string with the floor appended (e.g., "zone_air_temp@floor3"). + """ + return f"{measurement_name}{reward_info_parser.FLOOR_PREFIX}{floor}" + + +def get_zone_info_mapping( + zone_infos: Sequence[smart_control_building_pb2.ZoneInfo], +) -> dict[str, smart_control_building_pb2.ZoneInfo]: + """Creates a flat mapping from individual device IDs to their parent ZoneInfo. + + A single zone can contain multiple devices. To quickly look up which zone + (and therefore which floor) a specific device belongs to, we flatten the + hierarchy into a direct dictionary lookup. + + Args: + zone_infos: A sequence of ZoneInfo protobuf objects representing the + building. + + Returns: + A dictionary where the key is a string `device_id` and the value is the + `ZoneInfo` object that contains that device. + """ + device_zone_mapping = {} + for zone_info in zone_infos: + for device in zone_info.devices: + device_zone_mapping[device] = zone_info + return device_zone_mapping + + +def get_occupancy_features_from_zone_conditions_histogram( + zone_conditions_histogram: pd.DataFrame, +) -> tuple[np.ndarray, np.ndarray]: + """Extracts 1D occupancy feature arrays from a 2D conditions histogram. + + This function flattens the matrix of floor-by-temperature occupancies into + two sets of 1D arrays suitable for ML model inputs: + 1. Standard occupancy features (occupancy at floor X at temperature Y). + 2. Exposed occupancy features (occupants explicitly outside comfort bounds). + + Args: + zone_conditions_histogram: A DataFrame where the index represents + temperature bins and columns represent specific metrics (including floor + occupancies and setpoint masks). + + Returns: + A tuple containing two numpy arrays: + - feature_names (1D array of strings): The generated names for each + feature. + - feature_values (1D array of np.float32): The corresponding numerical + values. + """ + # Isolate only the columns that contain floor-level occupancy data. + floor_cols = [ + col + for col in zone_conditions_histogram.columns + if col.startswith(reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX) + ] + + names = [] + values = [] + + # --- Pass 1: Extract Standard Occupancy Features --- + # For every floor, iterate through the temperature bins and record the + # occupancy. + for col in floor_cols: + for temp, row in zone_conditions_histogram.iterrows(): + names.append(f"{col}_h{temp:.1f}") + values.append(float(row[col])) + + # --- Pass 2: Extract Exposed Occupancy Features --- + # Exposed occupancy multiplies the actual occupancy by the setpoint mask. + # If the mask is 0 (comfortable), the exposed value is 0. + # If the mask is -1 or 1 (too cold/hot), the exposed value reflects the + # occupants affected. + for col in floor_cols: + for temp, row in zone_conditions_histogram.iterrows(): + names.append(f"{col}_exposed_h{temp:.1f}") + exposed_val = float(row[col]) * float(row["setpoint_mask"]) + values.append(exposed_val) + + # Cast the numerical values to float32, which is standard for TensorFlow/ML + # pipelines. + return np.array(names), np.array(values, dtype=np.float32) + + +def _assign_floor_to_single_request( + single_request: smart_control_building_pb2.SingleObservationRequest, + device_zone_mapping: dict[str, smart_control_building_pb2.ZoneInfo], +) -> None: + """Modifies a SingleObservationRequest in-place by appending its floor number. + + This is a private helper function to keep the main observation response + processing logic clean and flat. + + Args: + single_request: The protobuf request object to modify in-place. + device_zone_mapping: A dictionary mapping device IDs to their parent + zones. + """ + # If the device isn't mapped to a zone, we can't determine its floor. + if single_request.device_id not in device_zone_mapping: + logging.warning( + "A device with zone temperature '%s' is not assigned to a zone", + single_request.device_id, + ) + return + + # Extract the floor and update the measurement name directly on the protobuf. + floor = device_zone_mapping[single_request.device_id].floor + single_request.measurement_name = append_floor_to_measurement_name( + single_request.measurement_name, floor + ) + + +def assign_floor_to_observation_response( + observation_response_in: smart_control_building_pb2.ObservationResponse, + zone_infos: Sequence[smart_control_building_pb2.ZoneInfo], +) -> smart_control_building_pb2.ObservationResponse: + """Injects floor identifiers into the measurement names of an obs response. + + Because the downstream reinforcement learning agent often needs spatial + context (which floor a temperature reading came from), this function + intercepts the response payload and appends the floor number to specific + sensor names. + + Args: + observation_response_in: The original, unmodified observation response + from the building. + zone_infos: A sequence of building zones used to determine which device is + on which floor. + + Returns: + A completely new ObservationResponse protobuf with modified measurement + names. + The original input object is left unmutated. + """ + # Generate the lookup table to quickly find the floor for any given device ID. + device_zone_mapping = get_zone_info_mapping(zone_infos) + + # Create a copy of the input response to avoid mutating the original data. + observation_response_out = smart_control_building_pb2.ObservationResponse() + observation_response_out.CopyFrom(observation_response_in) + + # --- Phase 1: Update the Parent Request --- + # The response object echoes back the original request. We must update the + # measurement names in this echoed request. + for ( + single_req + ) in observation_response_out.request.single_observation_requests: + if ( + single_req.measurement_name + == reward_info_parser.ZONE_AIR_TEMPERATURE_SENSOR + ): + _assign_floor_to_single_request(single_req, device_zone_mapping) + + # --- Phase 2: Update the Individual Responses --- + # Now we update the actual array of responses returned by the building. + for single_resp in observation_response_out.single_observation_responses: + # Check the nested request inside the response to see if it's a temperature + # sensor. + if ( + single_resp.single_observation_request.measurement_name + == reward_info_parser.ZONE_AIR_TEMPERATURE_SENSOR + ): + _assign_floor_to_single_request( + single_resp.single_observation_request, device_zone_mapping + ) + + return observation_response_out diff --git a/smart_control/utils/occupancy_features_utils_test.py b/smart_control/utils/occupancy_features_utils_test.py new file mode 100644 index 00000000..d92632c5 --- /dev/null +++ b/smart_control/utils/occupancy_features_utils_test.py @@ -0,0 +1,296 @@ +import unittest + +import numpy as np +import pandas as pd +import pandas.testing as pdt +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import occupancy_features_utils +from smart_buildings.smart_control.utils.proto_parsers import reward_info_parser + +from google3.net.proto2.contrib.pyutil import compare + + +def _create_zone_info( + zone_id: str, floor: int, devices: list[str] | None = None +): + """Helper to create an actual ZoneInfo protobuf with optional devices.""" + return smart_control_building_pb2.ZoneInfo( + zone_id=zone_id, floor=floor, devices=devices or [] + ) + + +class TestGetZoneConditionsHistogram( + compare.Proto2Assertions, unittest.TestCase +): + + def setUp(self): + super().setUp() + # Define 6 temperature bins: [290, 292, 294, 296, 298, 300] + # Indices: 0: 290, 1: 292, 2: 294, 3: 296, 4: 298, 5: 300 + self.temperature_bins = [290.0, 292.0, 294.0, 296.0, 298.0, 300.0] + + def _create_zone_reward_info( + self, temp: float, heat_set: float, cool_set: float, occupancy: float + ): + """Helper to create a populated RewardInfo.ZoneRewardInfo proto.""" + zone_info = occupancy_features_utils.smart_control_reward_pb2.RewardInfo.ZoneRewardInfo( + zone_air_temperature=temp, + heating_setpoint_temperature=heat_set, + cooling_setpoint_temperature=cool_set, + average_occupancy=occupancy, + # Fields from proto not used by histogram logic, added for structural + # parity + air_flow_rate_setpoint=0.5, + air_flow_rate=0.5, + ) + return zone_info + + def _create_single_obs_request(self, device_id: str, measurement_name: str): + """Helper to create a SingleObservationRequest.""" + req = smart_control_building_pb2.SingleObservationRequest( + device_id=device_id, measurement_name=measurement_name + ) + return req + + # ==================================================================== + # get_zone_conditions_histogram Tests + # ==================================================================== + + def test_get_zone_conditions_histogram_standard_behavior(self): + """Tests standard aggregation across multiple floors and out-of-bounds temps.""" + zones = [ + _create_zone_info("zone_1", floor=1), + _create_zone_info("zone_2", floor=1), + _create_zone_info("zone_3", floor=2), + ] + reward_info = smart_control_reward_pb2.RewardInfo() + + # Zone 1: Temp 292 (Too cold). Occ: 5 -> Exposed: -5 + reward_info.zone_reward_infos["zone_1"].CopyFrom( + self._create_zone_reward_info(292.1, 294.0, 296.0, 5.0) + ) + # Zone 2: Temp 296 (Comfort). Occ: 10 -> Exposed: 0 + reward_info.zone_reward_infos["zone_2"].CopyFrom( + self._create_zone_reward_info(296.2, 294.0, 296.0, 10.0) + ) + # Zone 3: Temp 298 (Too hot). Occ: 3 -> Exposed: 3 + reward_info.zone_reward_infos["zone_3"].CopyFrom( + self._create_zone_reward_info(297.9, 294.0, 296.0, 3.0) + ) + # Missing Zone: Temp 294 (Comfort). Occ: 2 -> Exposed: 0 + reward_info.zone_reward_infos["zone_missing"].CopyFrom( + self._create_zone_reward_info(293.8, 294.0, 296.0, 2.0) + ) + + df = occupancy_features_utils.get_zone_conditions_histogram( + reward_info, self.temperature_bins, zones + ) + + # Build Expected DataFrame using the proper _OCCUPANCY_AT_FLOOR_PREFIX + expected_data = { + "occupancy_count": [0, 5, 2, 10, 3, 0], + "setpoint_mask": [-1, -1, 0, 0, 1, 1], + "setpoint_range": ["-", "-", "+", "+", "-", "-"], + "exposed_count": [0, -5, 0, 0, 3, 0], + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}0": [ + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + ], + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}1": [ + 0.0, + 0.5, + 0.0, + 0.5, + 0.0, + 0.0, + ], + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}2": [ + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + ], + } + expected_df = pd.DataFrame(expected_data, index=self.temperature_bins) + + pdt.assert_frame_equal(df, expected_df, check_dtype=False) + + def test_empty_reward_info(self): + """Tests behavior when no telemetry data is provided.""" + reward_info = smart_control_reward_pb2.RewardInfo() + zones = [_create_zone_info("zone_1", floor=1)] + + df = occupancy_features_utils.get_zone_conditions_histogram( + reward_info, self.temperature_bins, zones + ) + + expected_data = { + "occupancy_count": [0, 0, 0, 0, 0, 0], + "setpoint_mask": [0, 0, 0, 0, 0, 0], + "setpoint_range": ["-", "-", "-", "-", "-", "-"], + "exposed_count": [0, 0, 0, 0, 0, 0], + } + expected_df = pd.DataFrame(expected_data, index=self.temperature_bins) + pdt.assert_frame_equal(df, expected_df, check_dtype=False) + + def test_wide_setpoint_range(self): + """Tests that the global setpoint mask adapts to the widest zone requirements.""" + zones = [ + _create_zone_info("zone_1", floor=1), + _create_zone_info("zone_2", floor=1), + ] + reward_info = smart_control_reward_pb2.RewardInfo() + + reward_info.zone_reward_infos["zone_1"].CopyFrom( + self._create_zone_reward_info(294.0, 294.0, 296.0, 0.0) + ) + reward_info.zone_reward_infos["zone_2"].CopyFrom( + self._create_zone_reward_info(294.0, 290.0, 300.0, 0.0) + ) + + df = occupancy_features_utils.get_zone_conditions_histogram( + reward_info, self.temperature_bins, zones + ) + + expected_setpoint_range = pd.Series( + ["+"] * 6, index=self.temperature_bins, name="setpoint_range" + ) + pdt.assert_series_equal(df["setpoint_range"], expected_setpoint_range) + + expected_setpoint_mask = pd.Series( + [0] * 6, index=self.temperature_bins, name="setpoint_mask" + ) + pdt.assert_series_equal(df["setpoint_mask"], expected_setpoint_mask) + + # ==================================================================== + # Utility Mapping Tests + # ==================================================================== + + def test_append_floor_to_measurement_name(self): + name = "zone_air_temp" + floor = 3 + expected = f"zone_air_temp{reward_info_parser.FLOOR_PREFIX}3" + result = occupancy_features_utils.append_floor_to_measurement_name( + name, floor + ) + self.assertEqual(result, expected) + + def test_get_zone_info_mapping(self): + zone1 = _create_zone_info("zone_1", floor=1, devices=["dev_A", "dev_B"]) + zone2 = _create_zone_info("zone_2", floor=2, devices=["dev_C"]) + mapping = occupancy_features_utils.get_zone_info_mapping([zone1, zone2]) + + expected_mapping = {"dev_A": zone1, "dev_B": zone1, "dev_C": zone2} + self.assertDictEqual(mapping, expected_mapping) + + # ==================================================================== + # Occupancy Feature Extraction Tests + # ==================================================================== + + def test_get_occupancy_features_from_zone_conditions_histogram(self): + index = [290.0, 292.0] + data = { + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}1": [10.0, 0.0], + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}2": [5.0, 20.0], + "setpoint_mask": [-1.0, 0.0], + } + df = pd.DataFrame(data, index=index) + + names, values = ( + occupancy_features_utils.get_occupancy_features_from_zone_conditions_histogram( + df + ) + ) + + expected_names = [ + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}1_h290.0", + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}1_h292.0", + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}2_h290.0", + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}2_h292.0", + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}1_exposed_h290.0", + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}1_exposed_h292.0", + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}2_exposed_h290.0", + f"{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}2_exposed_h292.0", + ] + expected_values = [ + 10.0, + 0.0, + 5.0, + 20.0, + -10.0, + 0.0, + -5.0, + 0.0, + ] + + np.testing.assert_array_equal(names, expected_names) + np.testing.assert_array_almost_equal(values, expected_values) + + # ==================================================================== + # Observation Response Modification Tests + # ==================================================================== + + def test_assign_floor_to_observation_response(self): + zone_infos = [ + _create_zone_info("z1", floor=1, devices=["dev_1"]), + _create_zone_info("z2", floor=2, devices=["dev_2"]), + ] + + obs_response_in = smart_control_building_pb2.ObservationResponse() + + req1 = self._create_single_obs_request( + "dev_1", reward_info_parser.ZONE_AIR_TEMPERATURE_SENSOR + ) + req2 = self._create_single_obs_request("dev_2", "water_temperature") + req3 = self._create_single_obs_request( + "dev_missing", reward_info_parser.ZONE_AIR_TEMPERATURE_SENSOR + ) + + obs_response_in.request.single_observation_requests.extend( + [req1, req2, req3] + ) + + resp1 = obs_response_in.single_observation_responses.add() + resp1.single_observation_request.CopyFrom(req1) + resp2 = obs_response_in.single_observation_responses.add() + resp2.single_observation_request.CopyFrom(req2) + + obs_response_out = ( + occupancy_features_utils.assign_floor_to_observation_response( + obs_response_in, zone_infos + ) + ) + + # Build the expected ObservationResponse + expected_obs_response = smart_control_building_pb2.ObservationResponse() + req1_expected = self._create_single_obs_request( + "dev_1", + f"{reward_info_parser.ZONE_AIR_TEMPERATURE_SENSOR}{reward_info_parser.FLOOR_PREFIX}1", + ) + req2_expected = self._create_single_obs_request( + "dev_2", "water_temperature" + ) + req3_expected = self._create_single_obs_request( + "dev_missing", reward_info_parser.ZONE_AIR_TEMPERATURE_SENSOR + ) + expected_obs_response.request.single_observation_requests.extend( + [req1_expected, req2_expected, req3_expected] + ) + + resp1_expected = expected_obs_response.single_observation_responses.add() + resp1_expected.single_observation_request.CopyFrom(req1_expected) + resp2_expected = expected_obs_response.single_observation_responses.add() + resp2_expected.single_observation_request.CopyFrom(req2_expected) + + self.assertProto2Equal(obs_response_out, expected_obs_response) + + +if __name__ == "__main__": + unittest.main() diff --git a/smart_control/utils/plot_utils.py b/smart_control/utils/plot_utils.py index 4bab3485..f6a8c3b2 100644 --- a/smart_control/utils/plot_utils.py +++ b/smart_control/utils/plot_utils.py @@ -462,13 +462,13 @@ def update_metrics( metrics['timestamps'].append(current_timestamp) metrics['ambient_temps'].append(current_ambient_temp) metrics['boiler_thermal_energy_rates'].append( - hvac.boiler.compute_thermal_energy_rate( + hvac.hot_water_system.compute_thermal_energy_rate( return_water_temp=supply_air_temp, - outside_temp=hvac.boiler.reheat_water_setpoint, + outside_temp=hvac.hot_water_system.supply_water_temperature_setpoint, ) ) metrics['boiler_electrical_energy_rates'].append( - hvac.boiler.compute_pump_power() * 1000 + hvac.hot_water_system.compute_pump_power() * 1000 ) # TODO(judahg) verify this is correct metrics['air_handler_intake_fan_energy_rates'].append( hvac.air_handler.compute_intake_fan_energy_rate() @@ -476,9 +476,16 @@ def update_metrics( metrics['air_handler_exhaust_fan_energy_rates'].append( hvac.air_handler.compute_exhaust_fan_energy_rate() ) + if hasattr(hvac.air_handler, 'ahus'): + recirculation_input = { + ahu.device_id(): recirculation_temp for ahu in hvac.air_handler.ahus + } + else: + recirculation_input = recirculation_temp + metrics['air_handler_thermal_energy_rates'].append( hvac.air_handler.compute_thermal_energy_rate( - current_ambient_temp, recirculation_temp + recirculation_input, current_ambient_temp ) ) return metrics diff --git a/smart_control/utils/plot_utils_test.py b/smart_control/utils/plot_utils_test.py new file mode 100644 index 00000000..f9447c51 --- /dev/null +++ b/smart_control/utils/plot_utils_test.py @@ -0,0 +1,73 @@ +import unittest +from unittest import mock +import pandas as pd +from smart_buildings.smart_control.utils import plot_utils + + +class PlotUtilsTest(unittest.TestCase): + + def test_update_metrics_recirculation_input(self): + """Tests how recirculation_input is formed in update_metrics.""" + metrics = plot_utils.init_metrics() + current_timestamp = pd.Timestamp('2024-01-01 12:00:00') + current_ambient_temp = 290 + supply_air_temp = 295 + recirculation_temp = 298 + + # Mock HVAC and AirHandler components needed for update_metrics + mock_hvac = mock.Mock() + mock_hvac.hot_water_system.compute_thermal_energy_rate.return_value = 100 + mock_hvac.hot_water_system.compute_pump_power.return_value = 1 + mock_hvac.air_handler.compute_intake_fan_energy_rate.return_value = 10 + mock_hvac.air_handler.compute_exhaust_fan_energy_rate.return_value = 5 + mock_compute_thermal = mock.Mock(return_value=200) + mock_hvac.air_handler.compute_thermal_energy_rate = mock_compute_thermal + + # Scenario 1: hvac.air_handler does NOT have 'ahus' + # Ensure hasattr returns False for 'ahus' + del mock_hvac.air_handler.ahus + + plot_utils.update_metrics( + metrics, + current_timestamp, + current_ambient_temp, + supply_air_temp, + mock_hvac, + recirculation_temp, + ) + # In this case, recirculation_input should be just recirculation_temp. + mock_compute_thermal.assert_called_once_with( + recirculation_temp, current_ambient_temp + ) + self.assertEqual(metrics['air_handler_thermal_energy_rates'][-1], 200) + mock_compute_thermal.reset_mock() + + # Scenario 2: hvac.air_handler HAS 'ahus' + mock_ahu1 = mock.Mock() + mock_ahu1.device_id.return_value = 'ahu_1' + mock_ahu2 = mock.Mock() + mock_ahu2.device_id.return_value = 'ahu_2' + mock_hvac.air_handler.ahus = [mock_ahu1, mock_ahu2] + + plot_utils.update_metrics( + metrics, + current_timestamp, + current_ambient_temp, + supply_air_temp, + mock_hvac, + recirculation_temp, + ) + # In this case, recirculation_input should be a dict mapping device_ids + # to recirculation_temp. + expected_recirculation_input = { + 'ahu_1': recirculation_temp, + 'ahu_2': recirculation_temp, + } + mock_compute_thermal.assert_called_once_with( + expected_recirculation_input, current_ambient_temp + ) + self.assertEqual(metrics['air_handler_thermal_energy_rates'][-1], 200) + + +if __name__ == '__main__': + unittest.main() diff --git a/smart_control/utils/proto_parsers/conftest.py b/smart_control/utils/proto_parsers/conftest.py new file mode 100644 index 00000000..9c671d5e --- /dev/null +++ b/smart_control/utils/proto_parsers/conftest.py @@ -0,0 +1,50 @@ +"""Factories and helper functions for proto parser tests.""" + +import pandas as pd +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import test_utils + + +TIME_ZONE = 'US/Pacific' +START_TIMESTAMP = pd.Timestamp('2022-03-13 00:00:00', tz=TIME_ZONE) +END_TIMESTAMP = pd.Timestamp('2022-03-13 00:05:00', tz=TIME_ZONE) + + +def get_reward_info( + start_timestamp: pd.Timestamp = START_TIMESTAMP, + end_timestamp: pd.Timestamp = END_TIMESTAMP, +) -> smart_control_reward_pb2.RewardInfo: + """Returns a RewardInfo object, for testing purposes.""" + + # FYI the usual comfort range is between 293 and 297 K + zone_temp_occupancies = [ + # zone_id, zone_air_temp, zone_occupancy + ('zone_0', 295.0, 8.0), # IN_RANGE (71.33°F) + ('zone_1', 292.0, 4.0), # TOO_COLD_1 (65.93°F) + ('zone_2', 299.0, 2.0), # TOO_HOT_2 (78.53°F) + ] + + air_handler_energies = [ + # ahu_id, blower_electrical_energy_rate, ac_electrical_energy_rate + ('air_handler_0', 23.0, 15.0), + ('air_handler_1', 26.0, 22.0), + ] + + boiler_energies = [ + # hws_id, natural_gas_heating_energy_rate, pump_electrical_energy_rate + ('boiler_0', 200.1, 2.3), + ] + + heat_pump_energies = [ + # ashp_id, electricity_heating_energy_rate, pump_electrical_energy_rate + ('heat_pump_0', 150.0, 20.0), + ] + + return test_utils.get_test_reward_info( + zone_temp_occupancies=zone_temp_occupancies, + air_handler_energies=air_handler_energies, + boiler_energies=boiler_energies, + heat_pump_energies=heat_pump_energies, + start_timestamp=start_timestamp, + end_timestamp=end_timestamp, + ) diff --git a/smart_control/utils/proto_parsers/device_info_parser.py b/smart_control/utils/proto_parsers/device_info_parser.py new file mode 100644 index 00000000..576f8663 --- /dev/null +++ b/smart_control/utils/proto_parsers/device_info_parser.py @@ -0,0 +1,202 @@ +"""Device info parser makes it easier to work with DeviceInfo proto objects.""" + +from collections.abc import Sequence +import dataclasses +import functools +from typing import Any + +import pandas as pd + +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 + + +@dataclasses.dataclass(frozen=True) +class BaseDeviceField: + """Schema for a single device field record. + + Attributes: + device_id: The unique identifier of the device. + field_name: The name of the field. + field_type_id: The integer ID of the field's value type + (from building_pb2.DeviceInfo.ValueType). + field_type: String representation of the field type enum. + as_dict: Dictionary representation of the device field record. + """ + device_id: str + field_name: str + field_type_id: int + + @property + def field_type(self) -> str: + """String representation of the field type enum.""" + return building_pb2.DeviceInfo.ValueType.Name(self.field_type_id) + + @property + def as_dict(self) -> dict[str, Any]: + """Dictionary representation of the device field record.""" + return { + 'device_id': self.device_id, + 'field_name': self.field_name, + 'field_type_id': self.field_type_id, + 'field_type': self.field_type, + } + + +@dataclasses.dataclass(frozen=True) +class ObservableField(BaseDeviceField): + """Schema for a single observable field record.""" + + +@dataclasses.dataclass(frozen=True) +class ActionField(BaseDeviceField): + """Schema for a single action field record.""" + + +@dataclasses.dataclass(frozen=True) +class DeviceField(BaseDeviceField): + """Schema for a single device field record (observable and/or actionable). + + Attributes: + is_actionable: Whether the field is actionable. + is_observable: Whether the field is observable. + """ + is_observable: bool + is_actionable: bool + + @property + def as_dict(self) -> dict[str, Any]: + """Dictionary representation of the device field record.""" + return { + 'device_id': self.device_id, + 'field_name': self.field_name, + 'field_type_id': self.field_type_id, + 'field_type': self.field_type, + 'is_observable': self.is_observable, + 'is_actionable': self.is_actionable, + } + + +class DeviceInfoParser: + """A wrapper for the DeviceInfo proto.""" + + def __init__(self, device_info: building_pb2.DeviceInfo): + """Initializes the instance. + + Args: + device_info: The DeviceInfo object to parse. + """ + self._device_info = device_info + + @property + def device_id(self) -> str: + """The unique device identifier.""" + return self._device_info.device_id + + @property + def device_type_id(self) -> int: + """Integer representation of the device type enum.""" + return self._device_info.device_type + + @property + def device_type(self) -> str: + """String representation of the device type enum.""" + return building_pb2.DeviceInfo.DeviceType.Name(self.device_type_id) + + @property + def zone_id(self) -> str: + """The zone identifier where this device is located. + + In practice, this is often an empty string, because the zone to device + mappings are typically located in the zone info's devices / device_ids + property. + """ + return self._device_info.zone_id + + @property + def code(self) -> str: + """A human-readable identifier for the device.""" + return self._device_info.code + + @property + def namespace(self) -> str: + """The device namespace.""" + return self._device_info.namespace + + @property + def as_dict(self) -> dict[str, Any]: + """Dictionary representation of the device info, suitable for a DataFrame.""" + return { + 'device_id': self.device_id, + 'device_type_id': self.device_type_id, + 'device_type': self.device_type, + 'namespace': self.namespace, + 'code': self.code, + 'zone_id': self.zone_id, + } + + # DEVICE FIELDS + + @functools.cached_property + def observable_fields(self) -> Sequence[ObservableField]: + """Fields in the observation space.""" + return tuple(sorted( + (ObservableField( + device_id=self.device_id, + field_name=k, + field_type_id=v, + ) for k, v in self._device_info.observable_fields.items()), + key=lambda x: x.field_name + )) + + @functools.cached_property + def action_fields(self) -> Sequence[ActionField]: + """Fields in the action space.""" + return tuple(sorted( + (ActionField( + device_id=self.device_id, + field_name=k, + field_type_id=v, + ) for k, v in self._device_info.action_fields.items()), + key=lambda x: x.field_name + )) + + @functools.cached_property + def fields(self) -> Sequence[DeviceField]: + """All device fields (observable and/or actionable).""" + all_field_names = sorted( + set(self._device_info.observable_fields.keys()) + | set(self._device_info.action_fields.keys()) + ) + records = [] + for field_name in all_field_names: + field_type_id = ( + self._device_info.observable_fields[field_name] + if field_name in self._device_info.observable_fields + else self._device_info.action_fields[field_name] + ) + records.append( + DeviceField( + device_id=self.device_id, + field_name=field_name, + field_type_id=field_type_id, + is_observable=field_name in self._device_info.observable_fields, + is_actionable=field_name in self._device_info.action_fields, + ) + ) + return tuple(records) + + @property + def observable_fields_df(self) -> pd.DataFrame: + """The observable fields, in DataFrame format.""" + return pd.DataFrame(r.as_dict for r in self.observable_fields) + + @property + def action_fields_df(self) -> pd.DataFrame: + """The action fields, in DataFrame format.""" + return pd.DataFrame(r.as_dict for r in self.action_fields) + + @property + def fields_df(self) -> pd.DataFrame: + """All device fields (observable and/or actionable), in DataFrame format.""" + return pd.DataFrame(r.as_dict for r in self.fields) + diff --git a/smart_control/utils/proto_parsers/device_info_parser_test.py b/smart_control/utils/proto_parsers/device_info_parser_test.py new file mode 100644 index 00000000..c262280c --- /dev/null +++ b/smart_control/utils/proto_parsers/device_info_parser_test.py @@ -0,0 +1,144 @@ +from absl.testing import absltest + +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.utils.proto_parsers import device_info_parser + + +class DeviceInfoParserTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.device_info = building_pb2.DeviceInfo( + device_id='d1', + namespace='ns1', + code='c1', + zone_id='z1', + device_type=building_pb2.DeviceInfo.DeviceType.VAV, + observable_fields={ + 'obs_act': building_pb2.DeviceInfo.ValueType.VALUE_CONTINUOUS, + 'obs_only': building_pb2.DeviceInfo.ValueType.VALUE_INTEGER, + }, + action_fields={ + 'obs_act': building_pb2.DeviceInfo.ValueType.VALUE_CONTINUOUS, + 'act_only': building_pb2.DeviceInfo.ValueType.VALUE_BINARY, + }, + ) + self.parser = device_info_parser.DeviceInfoParser(self.device_info) + self.expected_observable_fields = [ + device_info_parser.ObservableField( + device_id='d1', + field_name='obs_act', + field_type_id=building_pb2.DeviceInfo.VALUE_CONTINUOUS, + ), + device_info_parser.ObservableField( + device_id='d1', + field_name='obs_only', + field_type_id=building_pb2.DeviceInfo.VALUE_INTEGER, + ), + ] + self.expected_action_fields = [ + device_info_parser.ActionField( + device_id='d1', + field_name='act_only', + field_type_id=building_pb2.DeviceInfo.VALUE_BINARY, + ), + device_info_parser.ActionField( + device_id='d1', + field_name='obs_act', + field_type_id=building_pb2.DeviceInfo.VALUE_CONTINUOUS, + ), + ] + self.expected_fields = [ + device_info_parser.DeviceField( + device_id='d1', + field_name='act_only', + field_type_id=building_pb2.DeviceInfo.VALUE_BINARY, + is_observable=False, + is_actionable=True, + ), + device_info_parser.DeviceField( + device_id='d1', + field_name='obs_act', + field_type_id=building_pb2.DeviceInfo.VALUE_CONTINUOUS, + is_observable=True, + is_actionable=True, + ), + device_info_parser.DeviceField( + device_id='d1', + field_name='obs_only', + field_type_id=building_pb2.DeviceInfo.VALUE_INTEGER, + is_observable=True, + is_actionable=False, + ), + ] + + def test_initialization(self): + self.assertIsInstance(self.parser, device_info_parser.DeviceInfoParser) + + def test_device_id(self): + self.assertEqual(self.parser.device_id, 'd1') + + def test_namespace(self): + self.assertEqual(self.parser.namespace, 'ns1') + + def test_code(self): + self.assertEqual(self.parser.code, 'c1') + + def test_zone_id(self): + self.assertEqual(self.parser.zone_id, 'z1') + + def test_device_type_id(self): + self.assertEqual( + self.parser.device_type_id, int(building_pb2.DeviceInfo.DeviceType.VAV) + ) + + def test_device_type(self): + self.assertEqual(self.parser.device_type, 'VAV') + + def test_as_dict(self): + expected_dict = { + 'device_id': 'd1', + 'device_type_id': building_pb2.DeviceInfo.DeviceType.VAV, + 'device_type': 'VAV', + 'namespace': 'ns1', + 'code': 'c1', + 'zone_id': 'z1', + } + self.assertEqual(self.parser.as_dict, expected_dict) + + # DEVICE FIELD TESTS + + def test_observable_fields(self): + self.assertCountEqual( + self.parser.observable_fields, self.expected_observable_fields + ) + + def test_observable_fields_df(self): + self.assertCountEqual( + self.parser.observable_fields_df.to_dict('records'), + [r.as_dict for r in self.expected_observable_fields], + ) + + def test_action_fields(self): + self.assertCountEqual( + self.parser.action_fields, self.expected_action_fields + ) + + def test_action_fields_df(self): + self.assertCountEqual( + self.parser.action_fields_df.to_dict('records'), + [r.as_dict for r in self.expected_action_fields], + ) + + def test_fields(self): + self.assertCountEqual(self.parser.fields, self.expected_fields) + + def test_fields_df(self): + self.assertCountEqual( + self.parser.fields_df.to_dict('records'), + [r.as_dict for r in self.expected_fields], + ) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/utils/proto_parsers/observation_response_parser.py b/smart_control/utils/proto_parsers/observation_response_parser.py new file mode 100644 index 00000000..fa235461 --- /dev/null +++ b/smart_control/utils/proto_parsers/observation_response_parser.py @@ -0,0 +1,92 @@ +"""Parsing and Conversion Utilities for ObservationResponse protos. + +Translates protos into data structures that are useful or easier to work with. +""" + +from functools import cached_property # pylint: disable=g-importing-member +import pandas as pd + +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.utils import conversion_utils + + +ObservationResponse = smart_control_building_pb2.ObservationResponse +SingleObservationResponse = smart_control_building_pb2.SingleObservationResponse + +OUTSIDE_AIR_TEMP = 'outside_air_temperature_sensor' + + +class ObservationResponseParser: + """Parses an ObservationResponse proto into a more usable format.""" + + def __init__( + self, + observation_response: ObservationResponse, + outside_air_temp_measurement_name: str = OUTSIDE_AIR_TEMP, + ): + self.observation_response = observation_response + self.outside_air_temp_measurement_name = outside_air_temp_measurement_name + + @property + def timestamp(self) -> pd.Timestamp: + """Returns the current local time, assumed to be in UTC (see proto).""" + return conversion_utils.proto_to_pandas_timestamp( + self.observation_response.timestamp + ) + + def get_local_time(self, time_zone: str = 'US/Pacific') -> pd.Timestamp: + """Returns the current local time in the building's time zone.""" + if self.timestamp.tz is None or str(self.timestamp.tz) != 'UTC': + raise ValueError('Timestamp expected to be in UTC.') + + return self.timestamp.tz_convert(time_zone) + + @cached_property + def single_observation_responses(self) -> list[SingleObservationResponse]: + return list(self.observation_response.single_observation_responses) + + @cached_property + def observations_df(self) -> pd.DataFrame: + """Converts an sequence of observations to a pandas dataframe.""" + records = [] + for response in self.single_observation_responses: + request = response.single_observation_request + records.append({ + 'device_id': request.device_id, + 'measurement_name': request.measurement_name, + 'is_valid': response.observation_valid, + 'continuous_value': response.continuous_value, + }) + return pd.DataFrame(records) + + @cached_property + def outside_air_temps_df(self) -> pd.DataFrame: + """Returns a DataFrame of current outside temperature(s). + + Assumes there can be more than one 'outside_air_temperature_sensor' + measurement, for example, one for each air handler unit. + + Returns: + The outside air temperature sensors in DataFrame format. + + Raises: + ValueError: If zero matching measurements are found. + """ + measurement_name = self.outside_air_temp_measurement_name + + df = self.observations_df + if df.empty: + raise ValueError('No observations found.') + + rows = df[df['measurement_name'].str.contains(measurement_name)] + if rows.empty: + raise ValueError(f"No '{measurement_name}' observation found.") + + return rows + + @cached_property + def outside_air_temp(self) -> float: + """Returns the (average) outside temperature in degrees Kelvin.""" + return float(self.outside_air_temps_df['continuous_value'].mean()) + + diff --git a/smart_control/utils/proto_parsers/observation_response_parser_test.py b/smart_control/utils/proto_parsers/observation_response_parser_test.py new file mode 100644 index 00000000..0eced010 --- /dev/null +++ b/smart_control/utils/proto_parsers/observation_response_parser_test.py @@ -0,0 +1,89 @@ +"""Tests for the ObservationResponseParser class.""" + +from absl.testing import absltest +import pandas as pd + +from smart_buildings.smart_control.utils import test_utils +from smart_buildings.smart_control.utils.proto_parsers import observation_response_parser + +Parser = observation_response_parser.ObservationResponseParser + +NAIVE_TIMESTAMP = pd.Timestamp('2022-03-13 12:00:00') +UTC_TIMESTAMP = pd.Timestamp('2022-03-13 12:00:00', tz='UTC') +LOCAL_TIMESTAMP = pd.Timestamp('2022-03-13 05:00:00', tz='US/Pacific') + + +class ObservationResponseParserTest(absltest.TestCase): + + def setUp(self): + super().setUp() + + self.observation_response = test_utils.get_test_observation_response( + timestamp=UTC_TIMESTAMP, + ) + self.parser = Parser(self.observation_response) + + def test_timestamp(self): + self.assertEqual(self.parser.timestamp, UTC_TIMESTAMP) + + def test_get_local_time(self): + self.assertEqual(self.parser.get_local_time(), LOCAL_TIMESTAMP) + + def test_single_observation_responses(self): + self.assertEqual( + self.parser.single_observation_responses, + self.observation_response.single_observation_responses, + ) + + def test_observations_df(self): + df = self.parser.observations_df + self.assertIsInstance(df, pd.DataFrame) + + with self.subTest(name='columns'): + self.assertEqual(df.columns.tolist(), [ + 'device_id', 'measurement_name', 'is_valid', 'continuous_value' + ]) + + with self.subTest(name='rows'): + self.assertLen(df, 4) + + def test_outside_air_temp(self): + # consider parameterizing these tests + + with self.subTest(name='no outside air temp'): + with self.assertRaises(ValueError): + self.parser.outside_air_temp # pylint: disable=pointless-statement + + with self.subTest(name='has outside air temp'): + observation_response = test_utils.get_test_observation_response( + timestamp=NAIVE_TIMESTAMP, + device_measurement_values=[ + ('device_0', 'measurement_0', 7.0), + ('device_0', 'measurement_1', 0.1), + ('device_1', 'measurement_0', 10.0), + ('device_1', 'measurement_1', -0.2), + ('device_2', 'outside_air_temperature_sensor', 295.0), + ], + ) + parser = Parser(observation_response) + self.assertEqual(parser.outside_air_temp, 295.0) + + with self.subTest(name='has multiple outside air temp'): + observation_response = test_utils.get_test_observation_response( + timestamp=NAIVE_TIMESTAMP, + device_measurement_values=[ + ('device_0', 'measurement_0', 7.0), + ('device_0', 'measurement_1', 0.1), + ('device_1', 'measurement_0', 10.0), + ('device_1', 'measurement_1', -0.2), + ('device_2', 'ac1_outside_air_temperature_sensor', 295.0), + ('device_3', 'ac2_outside_air_temperature_sensor', 305.0), + ], + ) + parser = Parser(observation_response) + self.assertLen(parser.outside_air_temps_df, 2) + self.assertEqual(parser.outside_air_temp, 300.0) # averages them + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/utils/proto_parsers/reward_info_parser.py b/smart_control/utils/proto_parsers/reward_info_parser.py new file mode 100644 index 00000000..e11e3068 --- /dev/null +++ b/smart_control/utils/proto_parsers/reward_info_parser.py @@ -0,0 +1,657 @@ +"""Parsing and Conversion Utilities for RewardInfo protos. + +Translates protos into data structures that are useful or easier to work with. +""" + +import collections +from collections.abc import Mapping, Sequence +from functools import cached_property # pylint: disable=g-importing-member +from typing import Any + +import numpy as np +import pandas as pd +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 as reward_pb2 +from smart_buildings.smart_control.utils import conversion_utils +from smart_buildings.smart_control.utils import temperature_conversion as tc + +proto_to_pandas_timestamp = conversion_utils.proto_to_pandas_timestamp + +WATT_SECONDS_KWH = conversion_utils._WATT_SECONDS_KWH # pylint: disable=protected-access + +TEMP_UNIT = tc.TempUnit.KELVIN +TEMP_BINS: Sequence[float] = ( + 290.0, + 291.0, + 292.0, + 293.0, + 294.0, + 295.0, + 296.0, + 297.0, + 298.0, + 299.0, + 300.0, +) + + +# Suffix appended to measurement names to indicate the floor number. +FLOOR_PREFIX = '@floor' + +# Prefix used in DataFrame columns to identify occupancy metrics for a +# specific floor. +OCCUPANCY_AT_FLOOR_PREFIX = 'occ@floor' + +# The exact string identifier used for zone air temperature sensors. +ZONE_AIR_TEMPERATURE_SENSOR = 'zone_air_temperature_sensor' + + +def get_comfort_diffs( + row: pd.Series, + use_magnitude_labels: bool = False, + label_max_degrees: int | None = 5, +) -> tuple[float, str]: + """Calculates a comfort label and differential for each zone. + + Args: + row: A `pandas.Series` containing the following attribute / column names: + + 'zone_air_temp' + + 'heating_setpoint_temp' + + 'cooling_setpoint_temp' + use_magnitude_labels: If True, the label will include the magnitude of the + temperature differential. + label_max_degrees: If provided and use_magnitude_labels is True, specifies + the maximum number of degrees outside comfort range to be used when + compiling the label. Must be a positive int. + + Returns: + A tuple containing the comfort differential and corresponding label. + + The comfort differential is the difference between the zone air temperature + and the desired temperature range, where zero means the temp is in range, + positive numbers are too hot, and negative numbers are too cold. + + The comfort label is one of: 'IN_RANGE', 'TOO_COLD', or 'TOO_HOT'. If + use_magnitude_labels is True, the label is appended with '_X', where X is + the number of degrees outside of comfort range, represented as a rounded + absolute integer value (potentially capped by label_max_degrees). + """ + zone_air_temp = float(row['zone_air_temp']) + comfort_min = float(row['heating_setpoint_temp']) + comfort_max = float(row['cooling_setpoint_temp']) + if comfort_min >= comfort_max: + raise ValueError('Invalid setpoint range. Expecting heating < cooling.') + + if comfort_min <= zone_air_temp <= comfort_max: + label = 'IN_RANGE' + diff = 0.0 + elif zone_air_temp < comfort_min: + label = 'TOO_COLD' + diff = zone_air_temp - comfort_min + elif zone_air_temp > comfort_max: + label = 'TOO_HOT' + diff = zone_air_temp - comfort_max + else: + raise ValueError('Invalid temperature values.') + + if use_magnitude_labels and label != 'IN_RANGE': + degrees_outside_range = round(abs(diff)) + if label_max_degrees is not None: + degrees_outside_range = min(degrees_outside_range, label_max_degrees) + label = f'{label}_{degrees_outside_range}' + + return diff, label + + +class RewardInfoParser: + """A parser for RewardInfo protos, converting them into more usable data structures.""" + + def __init__( + self, + reward_info: reward_pb2.RewardInfo, + comfort_diff_params: Mapping[str, Any] | None = None, + ): + """Initializes the RewardInfoParser. + + Args: + reward_info: The RewardInfo proto to parse. + comfort_diff_params: A dictionary of parameters to pass to the + get_comfort_diffs function (default is None). + """ + self.reward_info = reward_info + self.comfort_diff_params = comfort_diff_params or {} + + def _setup_temp_params( + self, + temp_unit: tc.TempUnit | str | None = None, + temp_bins: Sequence[float] | None = None, + ) -> tuple[tc.TempUnit, Sequence[float], tc.TempConversionFunction | None]: + """Validates and sets up temperature units and bins.""" + if temp_unit is not None: + unit = tc.assign_temp_unit(temp_unit) + else: + unit = TEMP_UNIT + + temp_convert = tc.assign_kelvin_conversion_function(unit) + + if temp_bins is None: + bins = TEMP_BINS + if temp_convert is not None: + bins = [temp_convert(b) for b in bins] + else: + bins = temp_bins + + return unit, bins, temp_convert + + # PROPERTIES AND ALIASES + + @cached_property + def start_timestamp(self) -> pd.Timestamp: + return proto_to_pandas_timestamp(self.reward_info.start_timestamp) + + @cached_property + def end_timestamp(self) -> pd.Timestamp: + return proto_to_pandas_timestamp(self.reward_info.end_timestamp) + + @cached_property + def dt(self) -> float: + """Returns the duration of the reward info in seconds.""" + return (self.end_timestamp - self.start_timestamp).total_seconds() + + @cached_property + def zone_reward_infos( + self, + ) -> Mapping[str, reward_pb2.RewardInfo.ZoneRewardInfo]: + return self.reward_info.zone_reward_infos + + @cached_property + def air_handler_reward_infos( + self, + ) -> Mapping[str, reward_pb2.RewardInfo.AirHandlerRewardInfo]: + return self.reward_info.air_handler_reward_infos + + @cached_property + def boiler_reward_infos( + self, + ) -> Mapping[str, reward_pb2.RewardInfo.BoilerRewardInfo]: + return self.reward_info.boiler_reward_infos + + @cached_property + def heat_pump_reward_infos( + self, + ) -> Mapping[str, reward_pb2.RewardInfo.HeatPumpRewardInfo]: + return self.reward_info.heat_pump_reward_infos + + # + # ZONE INFO + # + + def get_zone_conditions_histogram_by_floor( + self, + zones: Sequence[smart_control_building_pb2.ZoneInfo], + temp_unit: tc.TempUnit | str | None = None, + temp_bins: Sequence[float] | None = None, + ) -> pd.DataFrame: + """Generates a histogram DataFrame of building zone conditions by temp bin. + + This function aggregates telemetry data from multiple building zones. It + bins the current air temperature of each zone by floor, calculates the total + occupancy for each temperature bin, and determines how many occupants are + exposed to temperatures outside the established heating/cooling setpoints. + + Args: + zones: A list of Protobuf ZoneInfo objects containing metadata (like the + floor number) for each zone in the building. + temp_unit: The unit of temperature to use (default is Kelvin). + temp_bins: The temperature bins to use for the histogram (default is + TEMP_BINS). + + Returns: + pd.DataFrame: A DataFrame indexed by the `temperature_bins`. + Columns include: + - 'occupancy_count': Total occupants currently experiencing this + temperature. + - 'setpoint_mask': 0 if the temperature is within the global + setpoint + range, + -1 if below the heating setpoint, 1 if above the cooling setpoint. + - 'setpoint_range': String visualization ('-' for out of bounds, '+' + for in bounds). + - 'exposed_count': Number of occupants exposed to out-of-bounds + temperatures + (positive for too hot, negative for too cold). + - 'floor_X' (multiple): Normalized distribution of zone temperatures + for floor X. + """ + temp_unit, temp_bins, temp_convert = self._setup_temp_params( + temp_unit, temp_bins + ) + + # Convert bins to a numpy array for vectorized distance calculations later. + bins = np.array(temp_bins) + num_bins = len(bins) + + # Create a fast lookup dictionary to map a zone's ID to its floor number. + zone_floor_map = {zone.zone_id: zone.floor for zone in zones} + + # Use a defaultdict to dynamically allocate arrays for floors as we + # encounter them. + # This safely handles missing floors, negative floors (basements), or sparse + # floor maps. + temperature_count_by_floor = collections.defaultdict( + lambda: np.zeros(num_bins, dtype=float) + ) + + # Array to accumulate total occupancy per temperature bin across the whole + # building. + occupancy_count = np.zeros(num_bins) + + # Variables to track the absolute lowest heating setpoint and highest + # cooling setpoint across all zones, represented as indices of the `bins` + # array. + min_setpoint_ix = None + max_setpoint_ix = None + + def get_bin_idx(val: float) -> int: + """Helper function to find the index of the temperature bin closest to `val`.""" + return int(np.argmin(np.abs(bins - val))) + + # --- Step 1: Accumulate Zone Data --- + for zone_id, zone_reward in self.reward_info.zone_reward_infos.items(): + # Retrieve the floor for this zone. Default to 0 if the zone metadata is + # missing. + floor = zone_floor_map.get(zone_id, 0) + + # Find which temperature bin this zone's current air temperature falls + # into, and increment the count for this specific floor. + zone_air_temp = zone_reward.zone_air_temperature + heating_setpoint_temp = zone_reward.heating_setpoint_temperature + cooling_setpoint_temp = zone_reward.cooling_setpoint_temperature + if temp_convert: + zone_air_temp = temp_convert(zone_air_temp) + heating_setpoint_temp = temp_convert(heating_setpoint_temp) + cooling_setpoint_temp = temp_convert(cooling_setpoint_temp) + + temp_idx = get_bin_idx(zone_air_temp) + temperature_count_by_floor[floor][temp_idx] += 1 + + # Add this zone's occupants to the total count for this temperature bin. + occupancy_count[temp_idx] += zone_reward.average_occupancy + + # Find which bins correspond to this zone's specific setpoints. + heat_idx = get_bin_idx(heating_setpoint_temp) + cool_idx = get_bin_idx(cooling_setpoint_temp) + + # Expand the global acceptable setpoint bounds if this zone's bounds are + # wider. + if min_setpoint_ix is None: + min_setpoint_ix = heat_idx + max_setpoint_ix = cool_idx + else: + min_setpoint_ix = min(min_setpoint_ix, heat_idx) + max_setpoint_ix = max(max_setpoint_ix, cool_idx) + + # --- Step 2: Vectorized Setpoint Masking --- + # Initialize mask arrays. By default, assume all temperatures are + # out-of-bounds ("-"). + setpoint_mask = np.zeros(num_bins, dtype=int) + setpoint_range = np.full(num_bins, '-', dtype=object) + + # If we actually processed zones (meaning max_setpoint_ix is not None), + # slice the arrays to reflect the calculated global setpoint bounds. + if max_setpoint_ix is not None: + setpoint_mask[:min_setpoint_ix] = ( + -1 + ) # Temps below global heating setpoint + setpoint_mask[max_setpoint_ix + 1 :] = ( + 1 # Temps above global cooling setpoint + ) + setpoint_range[min_setpoint_ix : max_setpoint_ix + 1] = ( + '+' # Acceptable comfort range + ) + + # --- Step 3: Calculate Exposed Occupancy --- + # Round up occupancy (you can't have a fraction of a person) and cast to + # integer. + occupancy_count = np.ceil(occupancy_count).astype(int) + + # Multiply occupancy by the setpoint mask. + # Result: 0 = comfortable, negative values = cold occupants, + # positive values = hot occupants. + occupants_exposed = (occupancy_count * setpoint_mask).astype(int) + + # --- Step 4: Assemble the Base DataFrame --- + table_rows = { + 'occupancy_count': occupancy_count, + 'setpoint_mask': setpoint_mask, + 'setpoint_range': setpoint_range, + 'exposed_count': occupants_exposed, + } + + # --- Step 5: Normalize and Append Floor Distributions --- + # Sort the dictionary by floor number to ensure predictable column ordering. + for floor, count_arr in sorted(temperature_count_by_floor.items()): + total_floor_count = np.sum(count_arr) + # Normalize the array so it represents a probability + # distribution (summing to 1.0) + if total_floor_count > 0: + count_arr = count_arr / total_floor_count + + # Add this floor's normalized distribution to the final table. + table_rows[f'{OCCUPANCY_AT_FLOOR_PREFIX}{floor}'] = count_arr + + # Return the fully constructed DataFrame, using the specific + # temperature bins as the row index. + return pd.DataFrame(table_rows, index=bins) + + def get_zone_conditions_histogram( + self, + temp_unit: tc.TempUnit | str | None = None, + temp_bins: Sequence[float] | None = None, + ) -> pd.DataFrame: + """Summarizes the number of zones and occupants in each temperature bin. + + Zone temperatures are assigned to the bin with the closest numerical value. + + Args: + temp_unit: The unit of temperature to use (default is Kelvin). + temp_bins: The temperature bins to use for the histogram (default is + TEMP_BINS). + + Returns: + A pandas dataframe containing the number of zones and occupants in each + temperature bin. The dataframe is indexed by temperature and contains the + following columns: + + 'count of zones': The number of zones in each temperature bin. + + 'count of occupants': The number of occupants in each temperature bin. + + 'temperature setpoint range': A string indicating the temperature + setpoint range ('+' indicates in range, '-' indicates out of range). + + 'count of occupants exposed': The number of occupants exposed to + uncomfortable temperatures. + The dataframe is transposed so that the index is the metrics and the + columns are the temperature bins. + """ + temp_unit, temp_bins, temp_convert = self._setup_temp_params( + temp_unit, temp_bins + ) + + temperature_bins = np.array(temp_bins) + temperature_count = np.zeros(len(temperature_bins)) + occupancy_count = np.zeros(len(temperature_bins)) + setpoint_count = np.zeros(len(temperature_bins)) + + min_setpoint_ix = len(temperature_bins) + max_setpoint_ix = -1 + + for _, zone_reward_info in self.zone_reward_infos.items(): + zone_temp = zone_reward_info.zone_air_temperature + heating_setpoint_temp = zone_reward_info.heating_setpoint_temperature + cooling_setpoint_temp = zone_reward_info.cooling_setpoint_temperature + if temp_convert is not None: + zone_temp = temp_convert(zone_temp) + heating_setpoint_temp = temp_convert(heating_setpoint_temp) + cooling_setpoint_temp = temp_convert(cooling_setpoint_temp) + + bin_id = np.argmin(np.abs(temperature_bins - zone_temp)) + temperature_count[bin_id] += 1 + occupancy_count[bin_id] += zone_reward_info.average_occupancy + + bin_id = np.argmin(np.abs(temperature_bins - heating_setpoint_temp)) + if bin_id < min_setpoint_ix: + min_setpoint_ix = bin_id + + setpoint_count[bin_id] += 1 + + bin_id = np.argmin(np.abs(temperature_bins - cooling_setpoint_temp)) + if bin_id > max_setpoint_ix: + max_setpoint_ix = bin_id + setpoint_count[bin_id] += 1 + + setpoint_range = ['-'] * len(temperature_bins) + setpoint_mask = np.ones(len(temperature_bins)) + for ix in range(min_setpoint_ix, max_setpoint_ix + 1): + setpoint_range[ix] = '+' + setpoint_mask[ix] = 0 + + occupancy_count = np.ceil(occupancy_count) + + occupants_exposed = np.multiply(occupancy_count, setpoint_mask) + occupants_exposed = occupants_exposed.astype(int) + temperature_count = temperature_count.astype(int) + occupancy_count = occupancy_count.astype(int) + return pd.DataFrame( + { + 'count of zones': temperature_count, + 'count of occupants': occupancy_count, + 'temperature setpoint range': setpoint_range, + 'count of occupants exposed': occupants_exposed, + }, + index=[ + f'{temp}{temp_unit.deg_symbol}{temp_unit.abbrev}' + for temp in temperature_bins + ], + ).T + + @cached_property + def zone_conditions_histogram(self) -> pd.DataFrame: + return self.get_zone_conditions_histogram() + + @cached_property + def zone_occupancies_df(self) -> pd.DataFrame: + """Converts a sequence of zone occupancies to a pandas dataframe. + + Returns: + A pandas dataframe containing zone occupancy information. The dataframe is + indexed by zone_id and sorted by zone_id. The dataframe contains the + following columns: + + "zone_id": The zone id as an integer. + + "average_occupancy": The average occupancy of the zone. + + "heating_setpoint_temp": The heating setpoint temperature of the zone. + + "cooling_setpoint_temp": The cooling setpoint temperature of the zone. + + "zone_air_temp": The zone air temperature. + + "comfort_label": The comfort label of the zone. + + "comfort_diff": The comfort differential of the zone. + """ + records = [] + for zone_id, info in self.zone_reward_infos.items(): + records.append({ + 'zone_id': zone_id, + 'average_occupancy': info.average_occupancy, + 'heating_setpoint_temp': info.heating_setpoint_temperature, + 'cooling_setpoint_temp': info.cooling_setpoint_temperature, + 'zone_air_temp': info.zone_air_temperature, + }) + + df = pd.DataFrame(records) + df.set_index('zone_id', inplace=True) + df.sort_index(inplace=True) + df['zone_air_temp'] = df['zone_air_temp'].round(1) + df[['comfort_diff', 'comfort_label']] = df.apply( + get_comfort_diffs, axis=1, result_type='expand', + **self.comfort_diff_params + ) + return df + + @cached_property + def num_zones(self) -> int: + return len(self.zone_occupancies_df) + + @cached_property + def total_occupancy(self) -> int: + return int(self.zone_occupancies_df['average_occupancy'].sum()) + + @cached_property + def num_occupants_comfortable(self) -> int: + comfortable_zones_df = self.zone_occupancies_df[ + self.zone_occupancies_df['comfort_label'] == 'IN_RANGE' + ] + return int(comfortable_zones_df['average_occupancy'].sum()) + + @cached_property + def num_occupants_uncomfortable(self) -> int: + uncomfortable_zones_df = self.zone_occupancies_df[ + self.zone_occupancies_df['comfort_label'] != 'IN_RANGE' + ] + return int(uncomfortable_zones_df['average_occupancy'].sum()) + + @cached_property + def occupant_comfort_histogram(self) -> dict[str, int]: + """The number of occupants below, in, and above comfort setpoint range. + + Returns: + A dictionary mapping of comfort range labels like: + `{'TOO_HOT': 0, 'IN_RANGE': 10, 'TOO_COLD': 0}` + """ + groupby = self.zone_occupancies_df.groupby('comfort_label', observed=False) + return groupby['average_occupancy'].sum().to_dict() + + # + # ENERGY CONSUMPTION + # + + def watts_to_kwh(self, watts: float) -> float: + """Converts watts to kWh for the given device.""" + return watts * self.dt * WATT_SECONDS_KWH + + def get_energy_consumption(self) -> Mapping[str, float]: + """Returns a dictionary of energy consumption, in kWh, for each source.""" + + energy_use = collections.defaultdict(float) + + # AIR HANDLER REWARDS: + for ahu_info in self.air_handler_reward_infos.values(): + energy_use['air_handler_blower_electrical_energy'] += self.watts_to_kwh( + ahu_info.blower_electrical_energy_rate + ) + energy_use['air_handler_air_conditioning_electrical_energy'] += self.watts_to_kwh( # pylint: disable=line-too-long + ahu_info.air_conditioning_electrical_energy_rate + ) + + # BOILER REWARDS: + for blr_info in self.boiler_reward_infos.values(): + energy_use['boiler_natural_gas_heating_energy'] += self.watts_to_kwh( + blr_info.natural_gas_heating_energy_rate + ) + energy_use['boiler_pump_electrical_energy'] += self.watts_to_kwh( + blr_info.pump_electrical_energy_rate + ) + + # HEAT PUMP REWARDS: + for ashp_info in self.heat_pump_reward_infos.values(): + energy_use['heat_pump_electricity_heating_energy'] += self.watts_to_kwh( + ashp_info.electricity_heating_energy_rate + ) + energy_use['heat_pump_pump_electrical_energy'] += self.watts_to_kwh( + ashp_info.pump_electrical_energy_rate + ) + + return energy_use + + @cached_property + def energy_consumption_df(self) -> pd.DataFrame: + """Compiles a dataframe of energy consumption for each device. + + Descriptions come from the proto definitions. + + Returns: + A pandas dataframe containing energy consumption information. Contains + the following columns: + + 'device_type: The device type (AC or HWS). + + 'device_id: The device id. + + 'metric': The energy consumption metric name. + + 'description': A description of the energy consumption metric. + + 'value': The energy consumption (rate of consumption per second). + + 'unit': The energy consumption unit. + """ + records = [] + + # AIR HANDLER REWARDS: + for device_id, ahu_reward_info in self.air_handler_reward_infos.items(): + device_type = 'AHU' + records.append({ + 'device_type': device_type, + 'device_id': device_id, + 'metric': 'blower_electrical_energy_rate', + 'description': 'Cumulative electrical power in W applied to blowers.', + 'value': ahu_reward_info.blower_electrical_energy_rate, + 'unit': 'W' + }) + records.append({ + 'device_type': device_type, + 'device_id': device_id, + 'metric': 'air_conditioning_electrical_energy_rate', + 'description': ( + 'Cumulative electrical energy rate applied in W for air ' + 'conditioning. This represents the total power applied for ' + 'running refrigeration or heat pump cycles (includes running a ' + 'compressor and pumps to recirculate refrigerant).' + ), + 'value': ahu_reward_info.air_conditioning_electrical_energy_rate, + 'unit': 'W' + }) + + # BOILER REWARDS: + for device_id, blr_reward_info in self.boiler_reward_infos.items(): + device_type = 'BLR' + records.append({ + 'device_type': device_type, + 'device_id': device_id, + 'metric': 'pump_electrical_energy_rate', + 'description': ( + 'Cumulative electrical power in W for water recirculation pumps.' + ), + 'value': blr_reward_info.pump_electrical_energy_rate, + 'unit': 'W' + }) + records.append({ + 'device_type': device_type, + 'device_id': device_id, + 'metric': 'natural_gas_heating_energy_rate', + 'description': ( + 'Energy rate consumed in W by natural gas for heating water.' + ), + 'value': blr_reward_info.natural_gas_heating_energy_rate, + 'unit': 'W', + }) + + # HEAT PUMP REWARDS: + for device_id, ashp_reward_info in self.heat_pump_reward_infos.items(): + device_type = 'ASHP' + records.append({ + 'device_type': device_type, + 'device_id': device_id, + 'metric': 'electricity_heating_energy_rate', + 'description': ( + 'Energy rate consumed in W by electricity for heating water.' + ), + 'value': ashp_reward_info.electricity_heating_energy_rate, + 'unit': 'W', + }) + records.append({ + 'device_type': device_type, + 'device_id': device_id, + 'metric': 'pump_electrical_energy_rate', + 'description': ( + 'Cumulative electrical power in W for water recirculation pumps.' + ), + 'value': ashp_reward_info.pump_electrical_energy_rate, + 'unit': 'W', + }) + + df = pd.DataFrame(records) + if df.empty: + raise ValueError('No energy consumption data found.') + return df + + @cached_property + def energy_consumption_df_watts(self) -> pd.DataFrame: + """A version of the energy consumption data, where the unit is Watts.""" + df = self.energy_consumption_df.copy() + # filter out non-watts rows (in case we see some in the future) + df = df[df['unit'] == 'W'] + # get opinionated about the units, which are all currently in watts + df = df.rename(columns={'value': 'rate_watts'}) + df = df.drop(columns=['unit'], errors='ignore') + # calculate the energy consumption in kWh: + df['consumption_kwh'] = self.watts_to_kwh(df['rate_watts']) + return df diff --git a/smart_control/utils/proto_parsers/reward_info_parser_test.py b/smart_control/utils/proto_parsers/reward_info_parser_test.py new file mode 100644 index 00000000..f0e33574 --- /dev/null +++ b/smart_control/utils/proto_parsers/reward_info_parser_test.py @@ -0,0 +1,828 @@ +"""Tests for the RewardInfoParser class.""" + +from typing import Sequence +import unittest + +from absl.testing import absltest +from absl.testing import parameterized +import pandas as pd +import pandas.testing as pdt +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import conversion_utils +from smart_buildings.smart_control.utils.proto_parsers import conftest +from smart_buildings.smart_control.utils.proto_parsers import reward_info_parser + +from google3.net.proto2.contrib.pyutil import compare + +get_comfort_diffs = reward_info_parser.get_comfort_diffs + + +START_TIMESTAMP = conftest.START_TIMESTAMP +END_TIMESTAMP = conftest.END_TIMESTAMP + +HISTOGRAM_INDEX_NAMES = [ + 'count of zones', + 'count of occupants', + 'temperature setpoint range', + 'count of occupants exposed', +] + + +def _create_zone_info( + zone_id: str, floor: int, devices: list[str] | None = None +): + """Helper to create an actual ZoneInfo protobuf with optional devices.""" + return smart_control_building_pb2.ZoneInfo( + zone_id=zone_id, floor=floor, devices=devices or [] + ) + + +COMFORT_DIFFS_TEST_PARAMS = [ + # zone_air_temp, expected_diff, expected_label (with magnitude) + (287.0, -6.0, 'TOO_COLD_5'), # label uses capped diff value of 5 + (288.0, -5.0, 'TOO_COLD_5'), + (289.0, -4.0, 'TOO_COLD_4'), + (290.0, -3.0, 'TOO_COLD_3'), + (291.0, -2.0, 'TOO_COLD_2'), + (292.0, -1.0, 'TOO_COLD_1'), + (292.4, -0.6, 'TOO_COLD_1'), # label uses rounded diff value of -1 + (292.6, -0.4, 'TOO_COLD_0'), # label uses rounded diff value of 0 + (293.0, 0.0, 'IN_RANGE'), + (294.0, 0.0, 'IN_RANGE'), + (295.0, 0.0, 'IN_RANGE'), + (296.0, 0.0, 'IN_RANGE'), + (297.0, 0.0, 'IN_RANGE'), + (297.4, 0.4, 'TOO_HOT_0'), # label uses rounded diff value of 0 + (297.6, 0.6, 'TOO_HOT_1'), # label uses rounded diff value of 1 + (298.0, 1.0, 'TOO_HOT_1'), + (299.0, 2.0, 'TOO_HOT_2'), + (300.0, 3.0, 'TOO_HOT_3'), + (301.0, 4.0, 'TOO_HOT_4'), + (302.0, 5.0, 'TOO_HOT_5'), + (303.0, 6.0, 'TOO_HOT_5'), # label uses capped diff value of 5 +] + + +class ComfortDiffsTest(parameterized.TestCase): + """Tests for comfort differential functions.""" + + @parameterized.parameters(COMFORT_DIFFS_TEST_PARAMS) + def test_comfort_diffs_without_magnitude_labels( + self, zone_air_temp, expected_diff, expected_label + ): + row = pd.Series({ + 'zone_air_temp': zone_air_temp, + 'heating_setpoint_temp': 293.0, # comfort range min + 'cooling_setpoint_temp': 297.0, # comfort range max + }) + + label_no_magnitude = expected_label + if label_no_magnitude != 'IN_RANGE': + label_no_magnitude = label_no_magnitude.rsplit('_', 1)[0] + + diff, label = get_comfort_diffs(row, use_magnitude_labels=False) + self.assertAlmostEqual(diff, expected_diff, places=4) + self.assertEqual(label, label_no_magnitude) + + @parameterized.parameters(COMFORT_DIFFS_TEST_PARAMS) + def test_comfort_diffs_with_magnitude_labels( + self, zone_air_temp, expected_diff, expected_label + ): + row = pd.Series({ + 'zone_air_temp': zone_air_temp, + 'heating_setpoint_temp': 293.0, # comfort range min + 'cooling_setpoint_temp': 297.0, # comfort range max + }) + + diff, label = get_comfort_diffs(row, use_magnitude_labels=True) + self.assertAlmostEqual(diff, expected_diff, places=4) + self.assertEqual(label, expected_label) + + @parameterized.parameters( + # without a cap, the label can exceed the default of 5: + (287.0, None, -6.0, 'TOO_COLD_6'), + (303.0, None, 6.0, 'TOO_HOT_6'), + # with a custom cap, the label is capped to the custom value: + (289.0, 3, -4.0, 'TOO_COLD_3'), # capped to 3 + (290.0, 3, -3.0, 'TOO_COLD_3'), + (291.0, 3, -2.0, 'TOO_COLD_2'), + (301.0, 3, 4.0, 'TOO_HOT_3'), # capped to 3 + (300.0, 3, 3.0, 'TOO_HOT_3'), + (299.0, 3, 2.0, 'TOO_HOT_2'), + ) + def test_magnitude_labels_max_degrees( + self, zone_air_temp, max_degrees, expected_diff, expected_label + ): + row = pd.Series({ + 'zone_air_temp': zone_air_temp, + 'heating_setpoint_temp': 293.0, # comfort range min + 'cooling_setpoint_temp': 297.0, # comfort range max + }) + diff, label = get_comfort_diffs( + row, use_magnitude_labels=True, label_max_degrees=max_degrees + ) + self.assertAlmostEqual(diff, expected_diff, places=4) + self.assertEqual(label, expected_label) + + def test_comfort_diffs_invalid_setpoint_range(self): + invalid_row = pd.Series({ + 'zone_air_temp': 295.0, + 'heating_setpoint_temp': 298.0, # comfort range min + 'cooling_setpoint_temp': 296.0, # comfort range max + }) # min >= max is invalid + + error_message = 'Invalid setpoint range. Expecting heating < cooling.' + + with self.assertRaisesRegex(ValueError, error_message): + get_comfort_diffs(invalid_row) + + with self.assertRaisesRegex(ValueError, error_message): + get_comfort_diffs(invalid_row, use_magnitude_labels=True) + + def test_comfort_diffs_invalid_temperature_values(self): + invalid_row = pd.Series({ + 'zone_air_temp': None, # invalid value + 'heating_setpoint_temp': 293.0, + 'cooling_setpoint_temp': 297.0, + }) + + with self.subTest(name='without magnitude labels'): + with self.assertRaisesRegex(ValueError, 'Invalid temperature values.'): + get_comfort_diffs(invalid_row) + + with self.subTest(name='with magnitude labels'): + with self.assertRaisesRegex(ValueError, 'Invalid temperature values.'): + get_comfort_diffs(invalid_row, use_magnitude_labels=True) + + +class RewardInfoParserTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.reward_info = conftest.get_reward_info() + self.parser = reward_info_parser.RewardInfoParser( + reward_info=self.reward_info, + comfort_diff_params={'use_magnitude_labels': True}, + ) + + # PROPERTIES AND ALIASES + + def test_reward_info(self): + self.assertEqual(self.parser.reward_info, self.reward_info) + + def test_timestamps(self): + self.assertEqual(self.parser.start_timestamp, START_TIMESTAMP) + self.assertEqual(self.parser.end_timestamp, END_TIMESTAMP) + + def test_duration(self): + self.assertEqual(self.parser.dt, 300) + + def test_zone_reward_infos(self): + self.assertEqual( + self.parser.zone_reward_infos, self.reward_info.zone_reward_infos + ) + + def test_air_handler_reward_infos(self): + self.assertEqual( + self.parser.air_handler_reward_infos, + self.reward_info.air_handler_reward_infos, + ) + + def test_boiler_reward_infos(self): + self.assertEqual( + self.parser.boiler_reward_infos, + self.reward_info.boiler_reward_infos, + ) + + def test_heat_pump_reward_infos(self): + self.assertEqual( + self.parser.heat_pump_reward_infos, + self.reward_info.heat_pump_reward_infos, + ) + + # ZONE INFO + + def test_zone_conditions_histogram(self): + # It calls and returns the result of get_zone_conditions_histogram() method: + pd.testing.assert_frame_equal( + self.parser.get_zone_conditions_histogram(), + self.parser.zone_conditions_histogram, + ) + # See test_get_zone_conditions_histogram() below for more details. + + def test_get_zone_conditions_histogram(self): + histogram = self.parser.get_zone_conditions_histogram() + + self.assertIsInstance(histogram, pd.DataFrame) + + with self.subTest(name='index'): + self.assertEqual(histogram.index.tolist(), HISTOGRAM_INDEX_NAMES) + + with self.subTest(name='columns'): + expected_columns = [f'{temp}K' for temp in reward_info_parser.TEMP_BINS] + self.assertEqual(histogram.columns.tolist(), expected_columns) + + with self.subTest(name='zone counts'): + # number of zones in each temperature bin: + zone_counts = histogram.loc['count of zones',].to_dict() + expected = { + '290.0K': 0, + '291.0K': 0, + '292.0K': 1, + '293.0K': 0, + '294.0K': 0, + '295.0K': 1, + '296.0K': 0, + '297.0K': 0, + '298.0K': 0, + '299.0K': 1, + '300.0K': 0, + } + self.assertEqual(zone_counts, expected) + + with self.subTest(name='occupant counts'): + # number of occupants in each temperature bin: + occupant_counts = histogram.loc['count of occupants',].to_dict() + expected = { + '290.0K': 0, + '291.0K': 0, + '292.0K': 4, + '293.0K': 0, + '294.0K': 0, + '295.0K': 8, + '296.0K': 0, + '297.0K': 0, + '298.0K': 0, + '299.0K': 2, + '300.0K': 0, + } + self.assertEqual(occupant_counts, expected) + + with self.subTest(name='setpoint range'): + # labels indicating whether each bin is in the comfort range or not: + comfort_labels = histogram.loc['temperature setpoint range',].to_dict() + expected = { + '290.0K': '-', + '291.0K': '-', + '292.0K': '-', + '293.0K': '+', + '294.0K': '+', + '295.0K': '+', + '296.0K': '+', + '297.0K': '+', + '298.0K': '-', + '299.0K': '-', + '300.0K': '-', + } + self.assertEqual(comfort_labels, expected) + + with self.subTest(name='occupant exposure'): + # number of occupants outside of the comfort range (0 if in range): + occupant_exposure = histogram.loc['count of occupants exposed',].to_dict() + expected = { + '290.0K': 0, + '291.0K': 0, + '292.0K': 4, + '293.0K': 0, + '294.0K': 0, + '295.0K': 0, + '296.0K': 0, + '297.0K': 0, + '298.0K': 0, + '299.0K': 2, + '300.0K': 0, + } + self.assertEqual(occupant_exposure, expected) + + def test_get_zone_conditions_histogram_with_custom_params(self): + histogram = self.parser.get_zone_conditions_histogram( + temp_unit='F', temp_bins=[60, 65, 70] + ) + self.assertIsInstance(histogram, pd.DataFrame) + + with self.subTest(name='index'): + self.assertEqual(histogram.index.tolist(), HISTOGRAM_INDEX_NAMES) + + with self.subTest(name='columns'): + self.assertEqual(histogram.columns.tolist(), ['60°F', '65°F', '70°F']) + + with self.subTest(name='zone counts'): + # Zone temps in F are: [65.93, 71.33, 78.53] + # This row shows the number of zones in each temperature bin: + self.assertEqual( + histogram.loc['count of zones'].to_dict(), + {'60°F': 0, '65°F': 1, '70°F': 2}, + ) + + def test_get_zone_conditions_histogram_with_long_form_temp_unit(self): + histogram = self.parser.get_zone_conditions_histogram( + temp_unit='Kelvin', + ) + self.assertIsInstance(histogram, pd.DataFrame) + expected_columns = [f'{temp}K' for temp in reward_info_parser.TEMP_BINS] + self.assertEqual(histogram.columns.tolist(), expected_columns) + + def test_get_zone_conditions_histogram_with_unit_override_only(self): + """Tests unit override using default bins converted to that unit.""" + # Celsius: 0 C = 273.15 K. + # TEMP_BINS starts at 290.0 K, which is 16.85 C. + parser = reward_info_parser.RewardInfoParser(reward_info=self.reward_info) + histogram = parser.get_zone_conditions_histogram(temp_unit='C') + + # Default TEMP_BINS converted to C: + expected_bins = [b - 273.15 for b in reward_info_parser.TEMP_BINS] + column_names = [f'{b}°C' for b in expected_bins] + self.assertEqual(histogram.columns.tolist(), column_names) + + def test_zone_occupancies_df(self): + df = self.parser.zone_occupancies_df + self.assertIsInstance(df, pd.DataFrame) + + with self.subTest(name='indexed on zone_id'): + self.assertEqual(df.index.name, 'zone_id') + self.assertEqual(df.index.tolist(), ['zone_0', 'zone_1', 'zone_2']) + + with self.subTest(name='columns'): + self.assertEqual(df.columns.tolist(), [ + 'average_occupancy', 'heating_setpoint_temp', + 'cooling_setpoint_temp', 'zone_air_temp', 'comfort_diff', + 'comfort_label' + ]) + + with self.subTest(name='occupancy'): + # number of occupants in each zone: + self.assertEqual(df['average_occupancy'].to_dict(), { + 'zone_0': 8.0, + 'zone_1': 4.0, + 'zone_2': 2.0, + }) + + with self.subTest(name='conditions'): + self.assertEqual(df['heating_setpoint_temp'].to_dict(), { + 'zone_0': 293.0, + 'zone_1': 293.0, + 'zone_2': 293.0, + }) + + self.assertEqual(df['cooling_setpoint_temp'].to_dict(), { + 'zone_0': 297.0, + 'zone_1': 297.0, + 'zone_2': 297.0, + }) + + self.assertEqual(df['zone_air_temp'].to_dict(), { + 'zone_0': 295.0, + 'zone_1': 292.0, + 'zone_2': 299.0, + }) + + with self.subTest(name='comfort diffs'): + # how far each zone's temp is from being in range (0 if in range): + self.assertEqual(df['comfort_diff'].to_dict(), { + 'zone_0': 0.0, + 'zone_1': -1.0, + 'zone_2': 2.0, + }) + + with self.subTest(name='comfort labels'): + # category label for each zone: + self.assertEqual(df['comfort_label'].to_dict(), { + 'zone_0': 'IN_RANGE', + 'zone_1': 'TOO_COLD_1', + 'zone_2': 'TOO_HOT_2', + }) + + def test_zone_occupancies_df_with_default_comfort_diff_params(self): + parser = reward_info_parser.RewardInfoParser(self.reward_info) + self.assertEqual( + parser.zone_occupancies_df['comfort_label'].to_dict(), + { + 'zone_0': 'IN_RANGE', + 'zone_1': 'TOO_COLD', + 'zone_2': 'TOO_HOT', + }, + ) + + def test_zone_occupancies_df_with_custom_comfort_diff_params(self): + custom_params = {'use_magnitude_labels': True, 'label_max_degrees': 1} + parser = reward_info_parser.RewardInfoParser( + self.reward_info, comfort_diff_params=custom_params, + ) + self.assertEqual( + parser.zone_occupancies_df['comfort_label'].to_dict(), + { + 'zone_0': 'IN_RANGE', + 'zone_1': 'TOO_COLD_1', + 'zone_2': 'TOO_HOT_1', # 2.0 diff is capped at 1 for label + }, + ) + + def test_num_zones(self): + self.assertEqual(self.parser.num_zones, 3) + + def test_total_occupancy(self): + self.assertEqual(self.parser.total_occupancy, 14) + + def test_occupant_comfort_counts(self): + self.assertEqual(self.parser.num_occupants_comfortable, 8) + self.assertEqual(self.parser.num_occupants_uncomfortable, 6) + + self.assertEqual(self.parser.occupant_comfort_histogram, { + 'IN_RANGE': 8, + 'TOO_COLD_1': 4, + 'TOO_HOT_2': 2, + }) + + # ENERGY CONSUMPTION + + def _assert_device_energy_consumption( + self, + df: pd.DataFrame, + device_id: str, + expected_values: list[dict[str, float]], + ): + rows = df[df['device_id'] == device_id] + metrics = rows[['metric', 'rate_watts', 'consumption_kwh']] + + expected = pd.DataFrame(expected_values) + + pd.testing.assert_frame_equal( + metrics.sort_values('metric').reset_index(drop=True), + expected.sort_values('metric').reset_index(drop=True), + check_dtype=False, + check_index_type=False, + ) + + def test_energy_consumption_df(self): + df = self.parser.energy_consumption_df + self.assertIsInstance(df, pd.DataFrame) + + with self.subTest(name='row per device_id per metric (composite key)'): + no_dups = not df.duplicated(subset=['device_id', 'metric']).any() + self.assertTrue(no_dups) + + with self.subTest(name='columns include generic units and values'): + self.assertEqual(df.columns.tolist(), [ + 'device_type', 'device_id', + 'metric', 'description', + 'value', 'unit' + ]) + + def test_energy_consumption_df_watts(self): + df = self.parser.energy_consumption_df_watts + self.assertIsInstance(df, pd.DataFrame) + + with self.subTest(name='row per device_id per metric (composite key)'): + no_dups = not df.duplicated(subset=['device_id', 'metric']).any() + self.assertTrue(no_dups) + + with self.subTest(name='columns are watts-specific'): + self.assertEqual(df.columns.tolist(), [ + 'device_type', 'device_id', + 'metric', 'description', + 'rate_watts', 'consumption_kwh' + ]) + + with self.subTest(name='unique devices'): + unique_devices = df[['device_type', 'device_id']].drop_duplicates() + unique_devices.sort_values(by=['device_type', 'device_id'], inplace=True) + expected_devices = [ + {'device_type': 'AHU', 'device_id': 'air_handler_0'}, + {'device_type': 'AHU', 'device_id': 'air_handler_1'}, + {'device_type': 'ASHP', 'device_id': 'heat_pump_0'}, + {'device_type': 'BLR', 'device_id': 'boiler_0'}, + ] + self.assertEqual(unique_devices.to_dict('records'), expected_devices) + + with self.subTest(name='consumption metrics (air_handler_0)'): + rows = df[df['device_id'] == 'air_handler_0'] + metrics = rows[['metric', 'rate_watts', 'consumption_kwh']] + expected = pd.DataFrame([ + { + 'metric': 'blower_electrical_energy_rate', + 'rate_watts': 23.0, + 'consumption_kwh': 0.0019166666666666666 + }, + { + 'metric': 'air_conditioning_electrical_energy_rate', + 'rate_watts': 15.0, + 'consumption_kwh': 0.0012499999999999998 + } + ]) + pd.testing.assert_frame_equal( + metrics.sort_values('metric').reset_index(drop=True), + expected.sort_values('metric').reset_index(drop=True), + check_dtype=False, + check_index_type=False, + ) + + with self.subTest(name='consumption metrics (air_handler_1)'): + expected = [ + { + 'metric': 'blower_electrical_energy_rate', + 'rate_watts': 26.0, + 'consumption_kwh': 0.0021666666666666666 + }, + { + 'metric': 'air_conditioning_electrical_energy_rate', + 'rate_watts': 22.0, + 'consumption_kwh': 0.0018333333333333333 + } + ] + self._assert_device_energy_consumption(df, 'air_handler_1', expected) + + with self.subTest(name='consumption metrics (boiler_0)'): + expected = [ + { + 'metric': 'pump_electrical_energy_rate', + 'rate_watts': 2.3, + 'consumption_kwh': 0.00019166666666666668, + }, + { + 'metric': 'natural_gas_heating_energy_rate', + 'rate_watts': 200.1, + 'consumption_kwh': 0.016675, + }, + ] + self._assert_device_energy_consumption(df, 'boiler_0', expected) + + with self.subTest(name='consumption metrics (heat_pump_0)'): + expected = [ + { + 'metric': 'electricity_heating_energy_rate', + 'rate_watts': 150.0, + 'consumption_kwh': 0.0125, + }, + { + 'metric': 'pump_electrical_energy_rate', + 'rate_watts': 20.0, + 'consumption_kwh': 0.0016666666666666668, + }, + ] + self._assert_device_energy_consumption(df, 'heat_pump_0', expected) + + +def _get_zone_conditions_histogram_helper( + reward_info: smart_control_reward_pb2.RewardInfo, + temperature_bins: Sequence[float], + zones: Sequence[smart_control_building_pb2.ZoneInfo], +) -> pd.DataFrame: + """Generates a histogram DataFrame of building zone cond over temp bins.""" + return reward_info_parser.RewardInfoParser( + reward_info=reward_info, + ).get_zone_conditions_histogram_by_floor( + zones, temp_unit='K', temp_bins=temperature_bins + ) + + +class TestGetZoneConditionsHistogram( + compare.Proto2Assertions, unittest.TestCase +): + + def setUp(self): + super().setUp() + # Define 6 temperature bins: [290, 292, 294, 296, 298, 300] + # Indices: 0: 290, 1: 292, 2: 294, 3: 296, 4: 298, 5: 300 + self.temperature_bins = [290.0, 292.0, 294.0, 296.0, 298.0, 300.0] + + def _create_zone_reward_info( + self, temp: float, heat_set: float, cool_set: float, occupancy: float + ): + """Helper to create a populated RewardInfo.ZoneRewardInfo proto.""" + zone_info = smart_control_reward_pb2.RewardInfo.ZoneRewardInfo( + zone_air_temperature=temp, + heating_setpoint_temperature=heat_set, + cooling_setpoint_temperature=cool_set, + average_occupancy=occupancy, + # Fields from proto not used by histogram logic, added for structural + # parity + air_flow_rate_setpoint=0.5, + air_flow_rate=0.5, + ) + return zone_info + + def _create_single_obs_request(self, device_id: str, measurement_name: str): + """Helper to create a SingleObservationRequest.""" + req = smart_control_building_pb2.SingleObservationRequest( + device_id=device_id, measurement_name=measurement_name + ) + return req + + # ==================================================================== + # get_zone_conditions_histogram Tests + # ==================================================================== + + def test_get_zone_conditions_histogram_standard_behavior(self): + """Tests aggregation across multiple floors and out-of-bounds temps.""" + zones = [ + _create_zone_info('zone_1', floor=1), + _create_zone_info('zone_2', floor=1), + _create_zone_info('zone_3', floor=2), + ] + reward_info = smart_control_reward_pb2.RewardInfo() + + # Zone 1: Temp 292 (Too cold). Occ: 5 -> Exposed: -5 + reward_info.zone_reward_infos['zone_1'].CopyFrom( + self._create_zone_reward_info(292.1, 294.0, 296.0, 5.0) + ) + # Zone 2: Temp 296 (Comfort). Occ: 10 -> Exposed: 0 + reward_info.zone_reward_infos['zone_2'].CopyFrom( + self._create_zone_reward_info(296.2, 294.0, 296.0, 10.0) + ) + # Zone 3: Temp 298 (Too hot). Occ: 3 -> Exposed: 3 + reward_info.zone_reward_infos['zone_3'].CopyFrom( + self._create_zone_reward_info(297.9, 294.0, 296.0, 3.0) + ) + # Missing Zone: Temp 294 (Comfort). Occ: 2 -> Exposed: 0 + reward_info.zone_reward_infos['zone_missing'].CopyFrom( + self._create_zone_reward_info(293.8, 294.0, 296.0, 2.0) + ) + + df = _get_zone_conditions_histogram_helper( + reward_info, self.temperature_bins, zones + ) + + # Build Expected DataFrame using the proper _OCCUPANCY_AT_FLOOR_PREFIX + expected_data = { + 'occupancy_count': [0, 5, 2, 10, 3, 0], + 'setpoint_mask': [-1, -1, 0, 0, 1, 1], + 'setpoint_range': ['-', '-', '+', '+', '-', '-'], + 'exposed_count': [0, -5, 0, 0, 3, 0], + f'{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}0': [ + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + ], + f'{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}1': [ + 0.0, + 0.5, + 0.0, + 0.5, + 0.0, + 0.0, + ], + f'{reward_info_parser.OCCUPANCY_AT_FLOOR_PREFIX}2': [ + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + ], + } + expected_df = pd.DataFrame(expected_data, index=self.temperature_bins) + + pdt.assert_frame_equal(df, expected_df, check_dtype=False) + + def test_empty_reward_info(self): + """Tests behavior when no telemetry data is provided.""" + reward_info = smart_control_reward_pb2.RewardInfo() + zones = [_create_zone_info('zone_1', floor=1)] + + df = _get_zone_conditions_histogram_helper( + reward_info, self.temperature_bins, zones + ) + + expected_data = { + 'occupancy_count': [0, 0, 0, 0, 0, 0], + 'setpoint_mask': [0, 0, 0, 0, 0, 0], + 'setpoint_range': ['-', '-', '-', '-', '-', '-'], + 'exposed_count': [0, 0, 0, 0, 0, 0], + } + expected_df = pd.DataFrame(expected_data, index=self.temperature_bins) + pdt.assert_frame_equal(df, expected_df, check_dtype=False) + + def test_wide_setpoint_range(self): + """Tests the global setpoint mask adapts to the widest zone requirements.""" + zones = [ + _create_zone_info('zone_1', floor=1), + _create_zone_info('zone_2', floor=1), + ] + reward_info = smart_control_reward_pb2.RewardInfo() + + reward_info.zone_reward_infos['zone_1'].CopyFrom( + self._create_zone_reward_info(294.0, 294.0, 296.0, 0.0) + ) + reward_info.zone_reward_infos['zone_2'].CopyFrom( + self._create_zone_reward_info(294.0, 290.0, 300.0, 0.0) + ) + + df = _get_zone_conditions_histogram_helper( + reward_info, self.temperature_bins, zones + ) + + expected_setpoint_range = pd.Series( + ['+'] * 6, index=self.temperature_bins, name='setpoint_range' + ) + pdt.assert_series_equal(df['setpoint_range'], expected_setpoint_range) + + expected_setpoint_mask = pd.Series( + [0] * 6, index=self.temperature_bins, name='setpoint_mask' + ) + pdt.assert_series_equal(df['setpoint_mask'], expected_setpoint_mask) + + def test_get_zone_conditions_histogram_by_floor_with_conversion(self): + """Tests that units are converted from Kelvin to the specified unit.""" + # 294.261 K is approx 70 F + # 291.483 K is approx 65 F + # 297.039 K is approx 75 F + + zones = [_create_zone_info('zone_1', floor=1)] + reward_info = smart_control_reward_pb2.RewardInfo() + reward_info.zone_reward_infos['zone_1'].CopyFrom( + self._create_zone_reward_info(294.261, 291.483, 297.039, 10.0) + ) + + parser = reward_info_parser.RewardInfoParser(reward_info=reward_info) + df = parser.get_zone_conditions_histogram_by_floor( + zones, temp_bins=[65, 70, 75], temp_unit='F' + ) + + # Air temp 70F should be in bin 70. + self.assertEqual(df.loc[70, 'occupancy_count'], 10) + # Setpoints 65F and 75F. + self.assertEqual(df.loc[70, 'setpoint_range'], '+') + self.assertEqual(df.loc[65, 'setpoint_range'], '+') + self.assertEqual(df.loc[75, 'setpoint_range'], '+') + + +class RewardInfoParserLegacyEnergyConsumptionTest(absltest.TestCase): + """This uses the same setup as the original conversion_utils test.""" + + def setUp(self): + super().setUp() + + self.dt = 300 + start_time = pd.Timestamp('2021-05-03 12:13:00-5') + end_time = start_time + pd.Timedelta(self.dt, unit='second') + self.to_kwh = self.dt / 3600.0 / 1000.0 + + reward_info = smart_control_reward_pb2.RewardInfo() + # TIMESTAMPS: + reward_info.start_timestamp.CopyFrom( + conversion_utils.pandas_to_proto_timestamp(start_time) + ) + reward_info.end_timestamp.CopyFrom( + conversion_utils.pandas_to_proto_timestamp(end_time) + ) + # AIR HANDLERS: + reward_info.air_handler_reward_infos['air_handler_0'].CopyFrom( + smart_control_reward_pb2.RewardInfo.AirHandlerRewardInfo( + blower_electrical_energy_rate=100.0, + air_conditioning_electrical_energy_rate=20.0, + ) + ) + reward_info.air_handler_reward_infos['air_handler_1'].CopyFrom( + smart_control_reward_pb2.RewardInfo.AirHandlerRewardInfo( + blower_electrical_energy_rate=10.0, + air_conditioning_electrical_energy_rate=30.0, + ) + ) + # BOILERS: + reward_info.boiler_reward_infos['boiler_0'].CopyFrom( + smart_control_reward_pb2.RewardInfo.BoilerRewardInfo( + natural_gas_heating_energy_rate=250.0, + pump_electrical_energy_rate=30.0, + ) + ) + reward_info.boiler_reward_infos['boiler_1'].CopyFrom( + smart_control_reward_pb2.RewardInfo.BoilerRewardInfo( + natural_gas_heating_energy_rate=50.0, + pump_electrical_energy_rate=100.0, + ) + ) + # HEAT PUMPS: + reward_info.heat_pump_reward_infos['heat_pump_0'].CopyFrom( + smart_control_reward_pb2.RewardInfo.HeatPumpRewardInfo( + electricity_heating_energy_rate=150.0, + pump_electrical_energy_rate=20.0, + ) + ) + + self.reward_info = reward_info + self.parser = reward_info_parser.RewardInfoParser(self.reward_info) + + def test_get_energy_consumption(self): + energy_use = self.parser.get_energy_consumption() + + expected_energy_use = { + 'air_handler_blower_electrical_energy': 110.0 * self.to_kwh, + 'air_handler_air_conditioning_electrical_energy': 50.0 * self.to_kwh, + 'boiler_natural_gas_heating_energy': 300.0 * self.to_kwh, + 'boiler_pump_electrical_energy': 130 * self.to_kwh, + 'heat_pump_electricity_heating_energy': 150 * self.to_kwh, + 'heat_pump_pump_electrical_energy': 20 * self.to_kwh, + } + + for field in expected_energy_use: + self.assertAlmostEqual( + expected_energy_use[field], energy_use[field], places=5 + ) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/utils/proto_parsers/zone_info_parser.py b/smart_control/utils/proto_parsers/zone_info_parser.py new file mode 100644 index 00000000..27a16d65 --- /dev/null +++ b/smart_control/utils/proto_parsers/zone_info_parser.py @@ -0,0 +1,83 @@ +"""Zone info parser makes it easier to work with ZoneInfo proto objects.""" + +from collections.abc import Sequence +from typing import Any + +import pandas as pd +from smart_buildings.smart_control.proto import smart_control_building_pb2 + + +class ZoneInfoParser: + """A wrapper for the ZoneInfo proto.""" + + def __init__(self, zone_info: smart_control_building_pb2.ZoneInfo): + """Initializes the instance. + + Args: + zone_info: The ZoneInfo object to parse. + """ + self._zone_info = zone_info + + @property + def building_id(self) -> str: + """The building identifier.""" + return self._zone_info.building_id + + @property + def zone_id(self) -> str: + """The zone identifier.""" + return self._zone_info.zone_id + + @property + def zone_type_id(self) -> int: + """The integer representation of the zone type enum (e.g. 1 for ROOM).""" + return self._zone_info.zone_type + + @property + def zone_type(self) -> str: + """The string representation of the zone type enum (e.g. 'ROOM').""" + return smart_control_building_pb2.ZoneInfo.ZoneType.Name(self.zone_type_id) + + @property + def description(self) -> str: + """The zone description.""" + return self._zone_info.zone_description + + @property + def floor(self) -> int: + """The floor number.""" + return self._zone_info.floor + + @property + def area(self) -> float: + """The area of the zone.""" + return self._zone_info.area + + @property + def device_ids(self) -> Sequence[str]: + """Sequence of identifiers for devices associated with the zone.""" + return self._zone_info.devices + + @property + def as_dict(self) -> dict[str, Any]: + """Dictionary representation of the zone info, suitable for a DataFrame.""" + return { + 'building_id': self.building_id, + 'zone_id': self.zone_id, + 'zone_type_id': self.zone_type_id, + 'zone_type': self.zone_type, + 'description': self.description, + 'floor': self.floor, + 'area': self.area, + 'device_ids': list(self.device_ids), + } + + @property + def devices_df(self) -> pd.DataFrame: + """DataFrame representation of the devices associated with this zone.""" + return pd.DataFrame({ + 'building_id': self.building_id, + 'zone_id': self.zone_id, + 'device_id': device_id, + } for device_id in self.device_ids) + diff --git a/smart_control/utils/proto_parsers/zone_info_parser_test.py b/smart_control/utils/proto_parsers/zone_info_parser_test.py new file mode 100644 index 00000000..ca26c2a9 --- /dev/null +++ b/smart_control/utils/proto_parsers/zone_info_parser_test.py @@ -0,0 +1,74 @@ +from absl.testing import absltest +from smart_buildings.smart_control.proto import smart_control_building_pb2 as building_pb2 +from smart_buildings.smart_control.utils.proto_parsers import zone_info_parser + + +class ZoneInfoParserTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.zone_info = building_pb2.ZoneInfo( + zone_id='z1', + building_id='b1', + zone_description='desc1', + area=100.0, + devices=['d1', 'd2'], + zone_type=building_pb2.ZoneInfo.ZoneType.ROOM, + floor=1, + ) + self.parser = zone_info_parser.ZoneInfoParser(self.zone_info) + + def test_initialization(self): + self.assertIsInstance(self.parser, zone_info_parser.ZoneInfoParser) + + def test_zone_id(self): + self.assertEqual(self.parser.zone_id, 'z1') + + def test_building_id(self): + self.assertEqual(self.parser.building_id, 'b1') + + def test_description(self): + self.assertEqual(self.parser.description, 'desc1') + + def test_area(self): + self.assertEqual(self.parser.area, 100.0) + + def test_device_ids(self): + self.assertEqual(list(self.parser.device_ids), ['d1', 'd2']) + + def test_zone_type_id(self): + self.assertEqual( + self.parser.zone_type_id, int(building_pb2.ZoneInfo.ZoneType.ROOM) + ) + + def test_zone_type(self): + self.assertEqual(self.parser.zone_type, 'ROOM') + + def test_floor(self): + self.assertEqual(self.parser.floor, 1) + + def test_as_dict(self): + expected_dict = { + 'building_id': 'b1', + 'zone_id': 'z1', + 'zone_type_id': 1, + 'zone_type': 'ROOM', + 'description': 'desc1', + 'area': 100.0, + 'floor': 1, + 'device_ids': ['d1', 'd2'], + } + self.assertEqual(self.parser.as_dict, expected_dict) + + def test_devices_df(self): + expected_records = [ + {'building_id': 'b1', 'zone_id': 'z1', 'device_id': 'd1'}, + {'building_id': 'b1', 'zone_id': 'z1', 'device_id': 'd2'}, + ] + self.assertCountEqual( + self.parser.devices_df.to_dict('records'), expected_records + ) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/utils/reader_lib.py b/smart_control/utils/reader_lib.py index 11e1c53a..3c1986dc 100644 --- a/smart_control/utils/reader_lib.py +++ b/smart_control/utils/reader_lib.py @@ -7,9 +7,9 @@ import gin import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_normalization_pb2 -from smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 VariableId = NewType('VariableId', str) diff --git a/smart_control/utils/real_building_temperature_array_generator.py b/smart_control/utils/real_building_temperature_array_generator.py index c6df812b..c198a488 100644 --- a/smart_control/utils/real_building_temperature_array_generator.py +++ b/smart_control/utils/real_building_temperature_array_generator.py @@ -1,12 +1,12 @@ -"""Utility to go from list of VAV temperatues, to a teperature array.""" +"""Utility to go from list of VAV temperatures, to a temperature array.""" from typing import Mapping, Sequence import numpy as np import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.utils import conversion_utils as utils +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.utils import conversion_utils as utils Room = Sequence[tuple[int, int]] diff --git a/smart_control/utils/reducer_test.py b/smart_control/utils/reducer_test.py index fed5abaa..a599c131 100644 --- a/smart_control/utils/reducer_test.py +++ b/smart_control/utils/reducer_test.py @@ -1,10 +1,8 @@ -"""Tests for reducer.""" - from absl.testing import absltest import numpy as np import pandas as pd -from smart_control.utils import reducer +from smart_buildings.smart_control.utils import reducer class ReducerTest(absltest.TestCase): diff --git a/smart_control/utils/regression_building_utils.py b/smart_control/utils/regression_building_utils.py index edd52e49..f07dd7d0 100644 --- a/smart_control/utils/regression_building_utils.py +++ b/smart_control/utils/regression_building_utils.py @@ -10,11 +10,11 @@ import numpy as np import pandas as pd -from smart_control.models.base_occupancy import BaseOccupancy -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.simulator.setpoint_schedule import SetpointSchedule -from smart_control.utils import conversion_utils +from smart_buildings.smart_control.models.base_occupancy import BaseOccupancy +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.simulator.setpoint_schedule import SetpointSchedule +from smart_buildings.smart_control.utils import conversion_utils _ValueType = smart_control_building_pb2.DeviceInfo.ValueType _ActionResponseType = ( @@ -45,6 +45,28 @@ _COS_RAD = 'cos' +def get_nearest_timestamp_index( + target_timestamp: pd.Timestamp, timestamps: list[pd.Timestamp] +) -> int: + """Returns the index of the nearest timestamp in timestamps to target_timestamp.""" + deltas = [ + np.abs((ts - target_timestamp).total_seconds()) for ts in timestamps + ] + return np.argmin(deltas) + + +def drop_tz(ts: pd.Timestamp) -> pd.Timestamp: + """Drops the Timezone information, but keeps local time. + + Args: + ts: A timestamp in local time in any timezone. + + Returns: + A timestamp in local time without timezone. + """ + return ts.tz_localize(None) + + @gin.configurable def get_consolidated_time_features( n_hod: int, n_dow: int @@ -101,13 +123,7 @@ def expand_time_features( feature_names = get_time_feature_names(n, label) - if len(feature_names) != (len(sin_component) + len(cos_component)): - raise ValueError( - f'Mismatch between number of feature names ({len(feature_names)}) ' - 'and combined sine/cosine components ' - f'({len(sin_component) + len(cos_component)}). ' - 'This indicates an internal logic error in feature expansion.' - ) + assert len(feature_names) == len(sin_component) + len(cos_component) return { feature_name: value for feature_name, value in zip( @@ -249,11 +265,11 @@ def get_action_map( action_map[_TIMESTAMP] = timestamp for single_action_response in action_response.single_action_responses: + request = single_action_response.request if ( single_action_response.response_type == smart_control_building_pb2.SingleActionResponse.ACCEPTED ): - request = single_action_response.request action_map[(_ACTION_PREFIX, request.device_id, request.setpoint_name)] = ( request.continuous_value @@ -390,13 +406,7 @@ def get_matching_indexes( input_indexes.append(ts_input) output_indexes.append(ts_output) - if len(output_indexes) != len(input_indexes): - raise ValueError( - 'Mismatch in matched input and output index lengths: ' - f'input_indexes={len(input_indexes)}, ' - f'output_indexes={len(output_indexes)}. ' - 'Matching logic failed to produce equal-length sequences.' - ) + assert len(output_indexes) == len(input_indexes) return input_indexes, output_indexes @@ -562,6 +572,8 @@ def create_action_response( single_response.response_type = ( _ActionResponseType.REJECTED_INVALID_DEVICE ) + logging.info('Action tuple %s not in device action tuples', action_tuple) + logging.info('Device action tuples: %s', device_action_tuples) action_response.single_action_responses.append(single_response) continue diff --git a/smart_control/utils/regression_building_utils_test.py b/smart_control/utils/regression_building_utils_test.py index 43e61ac6..deee01f7 100644 --- a/smart_control/utils/regression_building_utils_test.py +++ b/smart_control/utils/regression_building_utils_test.py @@ -1,14 +1,12 @@ -"""Tests for regression_building_utils.""" - from absl.testing import absltest import pandas as pd -from smart_control.models.base_occupancy import BaseOccupancy -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.simulator.setpoint_schedule import SetpointSchedule -from smart_control.utils import conversion_utils -from smart_control.utils import regression_building_utils +from smart_buildings.smart_control.models.base_occupancy import BaseOccupancy +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.simulator.setpoint_schedule import SetpointSchedule +from smart_buildings.smart_control.utils import conversion_utils +from smart_buildings.smart_control.utils import regression_building_utils class RegressionBuildingUtilsTest(absltest.TestCase): @@ -132,25 +130,7 @@ def test_get_feature_map(self): ('dow', 'sin_000'): 0.7818314824680298, ('d0', 's0'): 294.5, } - - # this assertion passes on Linux, but fails on intel-based Macs, - # due to floating point math differences: - # self.assertDictEqual(expected_feature_map, feature_map) - - # ... equality assertions when applicable: - for key in ['timestamp', ('d0', 's0')]: - self.assertEqual(feature_map[key], expected_feature_map[key]) - - # ... almost-equal assertions for the sin and cos values: - for key in [ - ('hod', 'cos_000'), - ('hod', 'sin_000'), - ('dow', 'cos_000'), - ('dow', 'sin_000'), - ]: - self.assertAlmostEqual( - feature_map[key], expected_feature_map[key], places=7 - ) + self.assertDictEqual(expected_feature_map, feature_map) def test_get_observation_sequence(self): req_ts = pd.Timestamp('2021-01-12 00:00') @@ -569,7 +549,7 @@ def test_get_zone_reward_infos_valid(self): zone_infos, device_infos = self._get_test_zone_device_infos() current_observation_mapping = { ('d0', 'zone_air_temperature_sensor'): 295.0, - ('d1', 'zone_air_temperature_sensor'): 293.0, + ('d1', 'zone_air_temperature_sensor'): 293.0 } zone_reward_infos = regression_building_utils.get_zone_reward_infos( current_timestamp=current_timestamp, diff --git a/smart_control/utils/run_command_predictor.py b/smart_control/utils/run_command_predictor.py index abcee4c9..c2276a6e 100644 --- a/smart_control/utils/run_command_predictor.py +++ b/smart_control/utils/run_command_predictor.py @@ -27,9 +27,9 @@ from sklearn.metrics import classification_report from sklearn.model_selection import train_test_split -from smart_control.proto import smart_control_building_pb2 -from smart_control.utils import conversion_utils -from smart_control.utils import reader_lib +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.utils import conversion_utils +from smart_buildings.smart_control.utils import reader_lib _SEED = 191 _TEST_PROPORTION = 0.1 diff --git a/smart_control/utils/run_command_predictor_test.py b/smart_control/utils/run_command_predictor_test.py index b8953bde..8ac41da2 100644 --- a/smart_control/utils/run_command_predictor_test.py +++ b/smart_control/utils/run_command_predictor_test.py @@ -1,16 +1,14 @@ -"""Unit test for run_command_predictor.""" - from typing import Sequence from absl.testing import absltest from absl.testing import parameterized import pandas as pd -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.utils import conversion_utils -from smart_control.utils import reader_lib -from smart_control.utils import run_command_predictor +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.utils import conversion_utils +from smart_buildings.smart_control.utils import reader_lib +from smart_buildings.smart_control.utils import run_command_predictor # Create 2 dimensions, with ON and OFF examples _TEST_SAMPLE_SIZE_ON = 100 diff --git a/smart_control/utils/serialization.py b/smart_control/utils/serialization.py new file mode 100644 index 00000000..d2087140 --- /dev/null +++ b/smart_control/utils/serialization.py @@ -0,0 +1,30 @@ +"""JSON-serialization utilities.""" + +from typing import Any +import pandas as pd + +SerializableData = dict[str, Any] + + +def to_serializable(data: Any) -> Any: + """Converts native types to JSON-serializable types. + + Handles dictionaries, lists, tuples, sets, pandas Timestamps, and Exceptions. + + Ensures data can be saved to a JSON file. + + Args: + data: The data to convert. + + Returns: + The data as JSON-serializable types. + """ + if isinstance(data, dict): + return {k: to_serializable(v) for k, v in data.items()} + if isinstance(data, (list, tuple, set)): + return [to_serializable(v) for v in data] + if isinstance(data, pd.Timestamp): + return str(data) + if isinstance(data, Exception): + return str(data) + return data diff --git a/smart_control/utils/serialization_test.py b/smart_control/utils/serialization_test.py new file mode 100644 index 00000000..efc3ea3f --- /dev/null +++ b/smart_control/utils/serialization_test.py @@ -0,0 +1,68 @@ +import json + +from absl.testing import absltest +import pandas as pd + +from smart_buildings.smart_control.utils import serialization + + +class SerializationTest(absltest.TestCase): + + def test_to_serializable_dict(self): + data = {"a": 1, "b": [2, 3]} + result = serialization.to_serializable(data) + self.assertEqual(result, data) + json.dumps(result) + + def test_to_serializable_list(self): + data = [1, 2, 3] + result = serialization.to_serializable(data) + self.assertEqual(result, data) + json.dumps(result) + + def test_to_serializable_tuple(self): + data = (1, 2, 3) + result = serialization.to_serializable(data) + self.assertEqual(result, [1, 2, 3]) + json.dumps(result) + + def test_to_serializable_set(self): + data = {1, 2, 3} + result = serialization.to_serializable(data) + self.assertCountEqual(result, [1, 2, 3]) + json.dumps(result) + + def test_to_serializable_timestamp(self): + data = pd.Timestamp("2026-01-01 00:00:00", tz="UTC") + result = serialization.to_serializable(data) + self.assertEqual( + result, "2026-01-01 00:00:00+00:00" + ) + json.dumps(result) + + def test_to_serializable_exception(self): + data = ValueError("test error") + result = serialization.to_serializable(data) + self.assertEqual(result, "test error") + json.dumps(result) + + def test_to_serializable_nested(self): + data = { + "error": ValueError("boom"), + "times": [pd.Timestamp("2026-01-01", tz="UTC")], + "others": {1, 2}, + } + result = serialization.to_serializable(data) + self.assertEqual(result["error"], "boom") + self.assertEqual(result["times"], ["2026-01-01 00:00:00+00:00"]) + self.assertCountEqual(result["others"], [1, 2]) + json.dumps(result) + + def test_to_serializable_unmodified(self): + result = serialization.to_serializable(1.5) + self.assertEqual(result, 1.5) + json.dumps(result) + + +if __name__ == "__main__": + absltest.main() diff --git a/smart_control/utils/temperature_conversion.py b/smart_control/utils/temperature_conversion.py new file mode 100644 index 00000000..6d573973 --- /dev/null +++ b/smart_control/utils/temperature_conversion.py @@ -0,0 +1,189 @@ +"""Thermal utilities, including constants and conversion functions. + +This is the place for all logic related to temperature, pressure, volume, +and other thermodynamic physical quantities and their units. +""" + +# TODO: b/505380216 - Rename this file to be called "thermal_utils.py" + +import enum +from typing import Callable, Final, Mapping + +TempConversionFunction = Callable[[float], float] + + +@enum.unique +class TempUnit(str, enum.Enum): + """Temperature units.""" + + KELVIN: Final[str] = 'Kelvin' + CELSIUS: Final[str] = 'Celsius' + FAHRENHEIT: Final[str] = 'Fahrenheit' + + @property + def abbrev(self) -> str: + """The single letter abbreviation for the temperature unit.""" + return self.value[0].upper() + + @property + def deg_symbol(self) -> str: + """The degree symbol for the temperature unit. Kelvin does not use one.""" + return '' if self == TempUnit.KELVIN else '°' + + +TEMP_UNITS: Final = tuple(TempUnit) +TEMP_UNIT_ABBREVIATIONS_MAP: Final[Mapping[str, TempUnit]] = { + unit.value[0].upper(): unit for unit in TEMP_UNITS +} + +CELSIUS_TO_KELVIN_OFFSET = 273.15 + +ABSOLUTE_ZERO_KELVIN = 0.0 +ABSOLUTE_ZERO_CELSIUS = -CELSIUS_TO_KELVIN_OFFSET +ABSOLUTE_ZERO_FAHRENHEIT = -459.67 + + +def assign_temp_unit(temp_unit: TempUnit | str) -> TempUnit: + """Assigns and validates a given temperature display unit. + + Args: + temp_unit: The desired temperature unit (e.g. "Kelvin", "Celsius", or + "Fahrenheit"). Alternatively, you can use just the first letter, or a + TempUnit enum. This provides a more flexible experience, because + "Fahrenheit" is easily misspelled, and some services only provide the + first letter of the unit. + + Returns: + A valid official long-form temperature display unit. + """ + try: + first_letter = temp_unit[0].upper() + return TEMP_UNIT_ABBREVIATIONS_MAP[first_letter] + except (IndexError, KeyError) as e: + raise ValueError( + f'Unable to assign a valid temperature unit from: {temp_unit}.' + ) from e + + +# +# FROM KELVIN +# + + +def kelvin_to_celsius(temp_k: float) -> float: + """Converts Kelvin temperature to Celsius. + + Args: + temp_k: Temperature in Kelvin. + + Returns: + The corresponding temperature in Celsius. + + Raises: + A ValueError if the input value is less than or equal to absolute zero. + """ + if temp_k <= ABSOLUTE_ZERO_KELVIN: + raise ValueError('Temperature must be greater than absolute zero.') + return temp_k - CELSIUS_TO_KELVIN_OFFSET + + +def kelvin_to_fahrenheit(temp_k: float) -> float: + """Converts Kelvin temperature to Fahrenheit. + + Args: + temp_k: Temperature in Kelvin. + + Returns: + The corresponding temperature in Fahrenheit. + + Raises: + A ValueError if the input value is less than or equal to absolute zero. + """ + if temp_k <= ABSOLUTE_ZERO_KELVIN: + raise ValueError('Temperature must be greater than absolute zero.') + temp_c = temp_k - CELSIUS_TO_KELVIN_OFFSET + return temp_c * 9.0 / 5.0 + 32.0 + + +KELVIN_CONVERSION_FUNCTIONS_MAP: Final[ + Mapping[TempUnit, TempConversionFunction | None] +] = { + TempUnit.KELVIN: None, + TempUnit.CELSIUS: kelvin_to_celsius, + TempUnit.FAHRENHEIT: kelvin_to_fahrenheit, +} + + +def assign_kelvin_conversion_function( + temp_unit: str, +) -> TempConversionFunction | None: + """Assigns an appropriate temperature conversion function, from Kelvin. + + The conversion function converts temperatures from Kelvin to the specified + display unit. + + Args: + temp_unit: The temperature unit to be converted to (e.g. "Kelvin", + "Celsius", or "Fahrenheit"), or just the first letter. + + Returns: + The temperature conversion function (or None, if no conversion is needed). + """ + return KELVIN_CONVERSION_FUNCTIONS_MAP[assign_temp_unit(temp_unit)] + + +def from_kelvin(temp_k: float, temp_unit: str) -> float: + """Converts temperature from Kelvin to the specified display unit. + + Args: + temp_k: Temperature in Kelvin. + temp_unit: The temperature unit to be converted to (e.g. "Kelvin", + "Celsius", or "Fahrenheit"), or just the first letter. + + Returns: + The corresponding temperature in the specified display unit. + """ + conversion_function = assign_kelvin_conversion_function(temp_unit) + if conversion_function: + return conversion_function(temp_k) + return temp_k + + +# +# FROM FAHRENHEIT +# + + +def fahrenheit_to_kelvin(temp_f: float) -> float: + """Converts Fahrenheit temperature to Kelvin. + + Args: + temp_f: Temperature in Fahrenheit. + + Returns: + The corresponding temperature in Kelvin. + + Raises: + A ValueError if the input value is less than or equal to absolute zero. + """ + if temp_f <= ABSOLUTE_ZERO_FAHRENHEIT: + raise ValueError('Temperature must be greater than absolute zero.') + temp_c = (temp_f - 32.0) * 5.0 / 9.0 + return temp_c + CELSIUS_TO_KELVIN_OFFSET + + +def fahrenheit_to_celsius(temp_f: float) -> float: + """Converts Fahrenheit temperature to Celsius. + + Args: + temp_f: Temperature in Fahrenheit. + + Returns: + The corresponding temperature in Celsius. + + Raises: + A ValueError if the input value is less than or equal to absolute zero. + """ + if temp_f <= ABSOLUTE_ZERO_FAHRENHEIT: + raise ValueError('Temperature must be greater than absolute zero.') + return (temp_f - 32.0) * 5.0 / 9.0 diff --git a/smart_control/utils/temperature_conversion_test.py b/smart_control/utils/temperature_conversion_test.py new file mode 100644 index 00000000..48b1b60b --- /dev/null +++ b/smart_control/utils/temperature_conversion_test.py @@ -0,0 +1,154 @@ +"""Tests for temperature conversion functions.""" + +from absl.testing import absltest +from absl.testing import parameterized + +from smart_buildings.smart_control.utils import temperature_conversion as tc + + +class TempUnitTest(parameterized.TestCase): + + @parameterized.parameters( + (tc.TempUnit.KELVIN, 'K'), + (tc.TempUnit.CELSIUS, 'C'), + (tc.TempUnit.FAHRENHEIT, 'F'), + ) + def test_abbrev(self, temp_unit, expected_abbrev): + self.assertEqual(temp_unit.abbrev, expected_abbrev) + + @parameterized.parameters( + (tc.TempUnit.KELVIN, ''), + (tc.TempUnit.CELSIUS, '°'), + (tc.TempUnit.FAHRENHEIT, '°'), + ) + def test_deg_symbol(self, temp_unit, expected_symbol): + self.assertEqual(temp_unit.deg_symbol, expected_symbol) + + +class AssignTempUnitTest(parameterized.TestCase): + + @parameterized.parameters( + ('Kelvin', tc.TempUnit.KELVIN), + ('Celsius', tc.TempUnit.CELSIUS), + ('Fahrenheit', tc.TempUnit.FAHRENHEIT), + ('K', tc.TempUnit.KELVIN), + ('C', tc.TempUnit.CELSIUS), + ('F', tc.TempUnit.FAHRENHEIT), + ('k', tc.TempUnit.KELVIN), + ('c', tc.TempUnit.CELSIUS), + ('f', tc.TempUnit.FAHRENHEIT), + (tc.TempUnit.KELVIN, tc.TempUnit.KELVIN), + (tc.TempUnit.CELSIUS, tc.TempUnit.CELSIUS), + (tc.TempUnit.FAHRENHEIT, tc.TempUnit.FAHRENHEIT), + ) + def test_assign_temp_unit_valid(self, temp_unit_input, expected_temp_unit): + self.assertEqual(tc.assign_temp_unit(temp_unit_input), expected_temp_unit) + + @parameterized.parameters(('X'), ('')) + def test_assign_temp_unit_raises_value_error(self, temp_unit_input): + with self.assertRaises(ValueError): + tc.assign_temp_unit(temp_unit_input) + + @parameterized.parameters((None), (123)) + def test_assign_temp_unit_raises_type_error(self, temp_unit_input): + with self.assertRaises(TypeError): + tc.assign_temp_unit(temp_unit_input) + + +class TemperatureConversionsTest(parameterized.TestCase): + + # FROM KELVIN + + @parameterized.parameters( + (32.0, 273.15), (-10.0, 249.817), (70.0, 294.261), (110.0, 316.483) + ) + def test_k_to_f(self, temp_f, temp_k): + self.assertAlmostEqual(tc.kelvin_to_fahrenheit(temp_k), temp_f, places=2) + + @parameterized.parameters((0.0), (-1.0)) + def test_k_to_f_invalid(self, temp_k): + with self.assertRaises(ValueError): + tc.kelvin_to_fahrenheit(temp_k) + + @parameterized.parameters( + (0.0, 273.15), (-23.33, 249.817), (21.11, 294.261), (43.33, 316.483) + ) + def test_k_to_c(self, temp_c, temp_k): + self.assertAlmostEqual(tc.kelvin_to_celsius(temp_k), temp_c, places=2) + + @parameterized.parameters((0.0), (-1.0)) + def test_k_to_c_invalid(self, temp_k): + with self.assertRaises(ValueError): + tc.kelvin_to_celsius(temp_k) + + @parameterized.parameters( + (273.15, 'Fahrenheit', 32.0), + (273.15, 'F', 32.0), + (273.15, 'f', 32.0), + (273.15, 'Celsius', 0.0), + (273.15, 'C', 0.0), + (273.15, 'c', 0.0), + (273.15, 'Kelvin', 273.15), + (273.15, 'K', 273.15), + (273.15, 'k', 273.15), + ) + def test_from_kelvin(self, temp_k, temp_unit, expected_temp): + display_temp = tc.from_kelvin(temp_k=temp_k, temp_unit=temp_unit) + self.assertAlmostEqual(display_temp, expected_temp) + + def test_from_kelvin_invalid_unit(self): + with self.assertRaisesRegex( + ValueError, + 'Unable to assign a valid temperature unit from: OOPS' + ): + tc.from_kelvin(temp_k=273.15, temp_unit='OOPS') + + @parameterized.parameters( + ('Kelvin', None), + ('K', None), + ('k', None), + ('Celsius', tc.kelvin_to_celsius), + ('C', tc.kelvin_to_celsius), + ('c', tc.kelvin_to_celsius), + ('Fahrenheit', tc.kelvin_to_fahrenheit), + ('F', tc.kelvin_to_fahrenheit), + ('f', tc.kelvin_to_fahrenheit), + ) + def test_kelvin_conversion_function_assignment(self, unit, expected_function): + self.assertEqual( + tc.assign_kelvin_conversion_function(temp_unit=unit), expected_function + ) + + def test_kelvin_conversion_function_assignment_invalid_unit(self): + with self.assertRaisesRegex( + ValueError, 'Unable to assign a valid temperature unit from: OOPS' + ): + tc.assign_kelvin_conversion_function(temp_unit='OOPS') + + # FROM FAHRENHEIT + + @parameterized.parameters( + (32.0, 273.15), (-10.0, 249.817), (70.0, 294.261), (110.0, 316.483) + ) + def test_f_to_k(self, temp_f, temp_k): + self.assertAlmostEqual(tc.fahrenheit_to_kelvin(temp_f), temp_k, places=2) + + @parameterized.parameters((-495.67), (-500.0)) + def test_f_to_k_invalid(self, temp_f): + with self.assertRaises(ValueError): + tc.fahrenheit_to_kelvin(temp_f) + + @parameterized.parameters( + (32.0, 0.0), (-10.0, -23.33), (70.0, 21.11), (110.0, 43.33) + ) + def test_f_to_c(self, temp_f, temp_c): + self.assertAlmostEqual(tc.fahrenheit_to_celsius(temp_f), temp_c, places=2) + + @parameterized.parameters((-495.67), (-500.0)) + def test_f_to_c_invalid(self, temp_f): + with self.assertRaises(ValueError): + tc.fahrenheit_to_celsius(temp_f) + + +if __name__ == '__main__': + absltest.main() diff --git a/smart_control/utils/test_utils.py b/smart_control/utils/test_utils.py index 8c30932f..9728952a 100644 --- a/smart_control/utils/test_utils.py +++ b/smart_control/utils/test_utils.py @@ -1,16 +1,19 @@ """Test utilities for replay_building.""" -from typing import Sequence, Tuple +from collections.abc import Sequence import pandas as pd -from smart_control.environment.environment import ActionConfig -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_reward_pb2 -from smart_control.simulator import setpoint_schedule -from smart_control.utils import conversion_utils -from smart_control.utils.bounded_action_normalizer import BoundedActionNormalizer -from smart_control.utils.reader_lib import BaseReader +from smart_buildings.smart_control.environment import environment +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 +from smart_buildings.smart_control.simulator import setpoint_schedule +from smart_buildings.smart_control.utils import bounded_action_normalizer +from smart_buildings.smart_control.utils import conversion_utils +from smart_buildings.smart_control.utils import reader_lib as base_reader + + +BoundedActionNormalizer = bounded_action_normalizer.BoundedActionNormalizer def get_test_setpoint_schedule() -> setpoint_schedule.SetpointSchedule: @@ -29,7 +32,7 @@ def get_test_setpoint_schedule() -> setpoint_schedule.SetpointSchedule: def get_test_action_response( timestamp: pd.Timestamp, - device_setpoint_values: Sequence[Tuple[str, str, float]], + device_setpoint_values: Sequence[tuple[str, str, float]], ) -> smart_control_building_pb2.ActionResponse: """Returns an ActionResponse for unit testing.""" @@ -87,13 +90,13 @@ def get_zone_infos() -> Sequence[smart_control_building_pb2.ZoneInfo]: return [z0, z1] -def get_action_config() -> ActionConfig: +def get_action_config() -> environment.ActionConfig: action_normalizer_inits = { 'a0': BoundedActionNormalizer(0, 100, -1, 1), 'a1': BoundedActionNormalizer(-10, 10, -1, 1), } - return ActionConfig(action_normalizer_inits) + return environment.ActionConfig(action_normalizer_inits) def get_replay_action_responses() -> ( @@ -173,7 +176,7 @@ def get_test_observation_request() -> ( def get_observation_request( - device_measurements: Sequence[Tuple[str, str]], + device_measurements: Sequence[tuple[str, str]], ) -> smart_control_building_pb2.ObservationRequest: """Returns a test observation request.""" single_observation_requests = [] @@ -190,9 +193,15 @@ def get_observation_request( def get_test_observation_response( timestamp: pd.Timestamp, - device_measurement_values: Sequence[Tuple[str, str, float]], + device_measurement_values: Sequence[tuple[str, str, float]] | None = None, ) -> smart_control_building_pb2.ObservationResponse: """Returns test observation responses.""" + device_measurement_values = device_measurement_values or [ + ('device_0', 'measurement_0', 7.0), + ('device_0', 'measurement_1', 0.1), + ('device_1', 'measurement_0', 10.0), + ('device_1', 'measurement_1', -0.2), + ] request_ts = conversion_utils.pandas_to_proto_timestamp( pd.Timestamp(timestamp) ) @@ -407,11 +416,12 @@ def get_test_reward_infos() -> Sequence[smart_control_reward_pb2.RewardInfo]: def get_test_reward_info( - zone_temp_occupancies: Sequence[Tuple[str, float, float]], - air_handler_energies: Sequence[Tuple[str, float, float]], - boiler_energies: Sequence[Tuple[str, float, float]], + zone_temp_occupancies: Sequence[tuple[str, float, float]], + air_handler_energies: Sequence[tuple[str, float, float]], + boiler_energies: Sequence[tuple[str, float, float]], start_timestamp: pd.Timestamp, end_timestamp: pd.Timestamp, + heat_pump_energies: Sequence[tuple[str, float, float]] = (), ) -> smart_control_reward_pb2.RewardInfo: """Creates RewardInfos for unit tests.""" heating_setpoint_temperature = 293.0 @@ -429,9 +439,7 @@ def get_test_reward_info( ), ) - for zone_temp_occupancy in zone_temp_occupancies: - zone_id, zone_air_temp, zone_occupancy = zone_temp_occupancy - + for zone_id, zone_air_temp, zone_occupancy in zone_temp_occupancies: zone_info = smart_control_reward_pb2.RewardInfo.ZoneRewardInfo( heating_setpoint_temperature=heating_setpoint_temperature, cooling_setpoint_temperature=cooling_setpoint_temperature, @@ -443,32 +451,43 @@ def get_test_reward_info( info.zone_reward_infos[zone_id].CopyFrom(zone_info) - for air_handler_energy in air_handler_energies: - ( - air_handler_id, - blower_electrical_energy_rate, - air_conditioning_electrical_energy_rate, - ) = air_handler_energy + for ( + air_handler_id, + blower_electrical_energy_rate, + air_conditioning_electrical_energy_rate, + ) in air_handler_energies: air_handler_info = smart_control_reward_pb2.RewardInfo.AirHandlerRewardInfo( blower_electrical_energy_rate=blower_electrical_energy_rate, air_conditioning_electrical_energy_rate=air_conditioning_electrical_energy_rate, # pylint: disable=line-too-long ) info.air_handler_reward_infos[air_handler_id].CopyFrom(air_handler_info) - for boiler_energy in boiler_energies: - boiler_id, natural_gas_heating_energy_rate, pump_electrical_energy_rate = ( - boiler_energy - ) + for ( + boiler_id, + natural_gas_heating_energy_rate, + pump_electrical_energy_rate, + ) in boiler_energies: boiler_info = smart_control_reward_pb2.RewardInfo.BoilerRewardInfo( natural_gas_heating_energy_rate=natural_gas_heating_energy_rate, pump_electrical_energy_rate=pump_electrical_energy_rate, ) info.boiler_reward_infos[boiler_id].CopyFrom(boiler_info) + for ( + heat_pump_id, + electricity_heating_energy_rate, + pump_electrical_energy_rate, + ) in heat_pump_energies: + heat_pump_info = smart_control_reward_pb2.RewardInfo.HeatPumpRewardInfo( + electricity_heating_energy_rate=electricity_heating_energy_rate, + pump_electrical_energy_rate=pump_electrical_energy_rate, + ) + info.heat_pump_reward_infos[heat_pump_id].CopyFrom(heat_pump_info) + return info -class TestReader(BaseReader): +class TestReader(base_reader.BaseReader): """Implementation of BaseReader for test.""" def read_observation_responses( diff --git a/smart_control/utils/visual_logger.py b/smart_control/utils/visual_logger.py index 037dc052..0dad325e 100644 --- a/smart_control/utils/visual_logger.py +++ b/smart_control/utils/visual_logger.py @@ -5,7 +5,7 @@ import numpy as np import pandas as pd -from smart_control.utils import building_renderer +from smart_buildings.smart_control.utils import building_renderer class VisualLogger: diff --git a/smart_control/utils/writer_lib.py b/smart_control/utils/writer_lib.py index dee56c85..2c0b5e5f 100644 --- a/smart_control/utils/writer_lib.py +++ b/smart_control/utils/writer_lib.py @@ -1,15 +1,17 @@ """Utilities to write smart control protos to endpoint.""" import abc +import json import os import sys -from typing import Mapping, NewType, Sequence, TypeAlias +from typing import Any, IO, Mapping, NewType, Sequence, TypeAlias import pandas as pd - -from smart_control.proto import smart_control_building_pb2 -from smart_control.proto import smart_control_normalization_pb2 -from smart_control.proto import smart_control_reward_pb2 +import plotly.graph_objects as go +import plotly.io as pio +from smart_buildings.smart_control.proto import smart_control_building_pb2 +from smart_buildings.smart_control.proto import smart_control_normalization_pb2 +from smart_buildings.smart_control.proto import smart_control_reward_pb2 if sys.version_info >= (3, 11): from importlib.resources.abc import Traversable # pylint: disable=g-import-not-at-top, g-importing-member @@ -18,12 +20,21 @@ PathLocation: TypeAlias = Traversable | os.PathLike[str] | str +SerializableData: TypeAlias = dict[str, Any] + VariableId = NewType('VariableId', str) class BaseWriter(metaclass=abc.ABCMeta): """Abstract base class for writing the building and reward protos.""" + @property + @abc.abstractmethod + def output_dir(self) -> PathLocation: + """The output directory for the writer.""" + + # PROTO WRITING METHODS + @abc.abstractmethod def write_observation_response( self, @@ -83,6 +94,44 @@ def write_zone_infos( ) -> None: """Writes the zone infos to endpoint.""" + # GENERIC FILE WRITING METHODS + + def _open(self, filepath: PathLocation, mode: str) -> IO[Any]: + """Opens a file for reading. Can be overridden in corp codebase.""" + if 'b' in mode: + return open(filepath, mode) + return open(filepath, mode, encoding='utf-8') + + def _write_content(self, content: Any, filepath: PathLocation) -> None: + """Writes content to a file in the output directory.""" + with self._open(filepath, 'w') as f: + f.write(content) + + def write_txt(self, text: str, filename: str) -> None: + """Writes a string to a text file in the output directory.""" + filepath = os.path.join(self.output_dir, filename) + self._write_content(text, filepath) + + def write_json(self, data: SerializableData, filename: str) -> None: + """Writes a dictionary as a JSON file in the output directory.""" + filepath = os.path.join(self.output_dir, filename) + content_json = json.dumps(data, indent=2) + self._write_content(content_json, filepath) + + def write_csv( + self, df: pd.DataFrame, filename: str, index: bool = False + ) -> None: + """Writes a Pandas DataFrame as a CSV file in the output directory.""" + filepath = os.path.join(self.output_dir, filename) + content_csv = df.to_csv(index=index) + self._write_content(content_csv, filepath) + + def write_plot_html(self, fig: go.Figure, filename: str) -> None: + """Writes a Plotly figure as an HTML file in the output directory.""" + filepath = os.path.join(self.output_dir, filename) + content_html = pio.to_html(fig, full_html=True) + self._write_content(content_html, filepath) + class BaseWriterFactory(metaclass=abc.ABCMeta): """Abstract base class for creating a writer."""