├── .gitignore ├── monitoring ├── Dockerfile └── prometheus.yml ├── config └── prometheus.config ├── requirements.txt ├── Dockerfile ├── LICENSE ├── modules ├── pipeline.py ├── transform.py ├── trainer.py ├── tuner.py └── components.py ├── README.md ├── main.ipynb ├── prediction.ipynb └── data └── heart.csv /.gitignore: -------------------------------------------------------------------------------- 1 | /outputs/ 2 | /modules/__pycache__/ 3 | 4 | *.zip 5 | *.png 6 | *.jpg -------------------------------------------------------------------------------- /monitoring/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM prom/prometheus:latest 2 | 3 | COPY prometheus.yml /etc/prometheus/prometheus.yml -------------------------------------------------------------------------------- /config/prometheus.config: -------------------------------------------------------------------------------- 1 | prometheus_config { 2 | enable: true, 3 | path: "/monitoring/prometheus/metrics" 4 | } -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | absl==0.0 2 | absl_py==1.3.0 3 | keras==2.9.0 4 | keras_tuner==1.1.3 5 | tensorflow==2.9.2 6 | tensorflow_model_analysis==0.41.1 7 | tensorflow_transform==1.10.1 8 | tfx==1.10.0 9 | -------------------------------------------------------------------------------- /monitoring/prometheus.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 15s 3 | evaluation_interval: 15s 4 | external_labels: 5 | monitor: "tf-serving-monitor" 6 | 7 | scrape_configs: 8 | - job_name: "prometheus" 9 | scrape_interval: 5s 10 | metrics_path: /monitoring/prometheus/metrics 11 | static_configs: 12 | - targets: ["hf-pred.herokuapp.com"] 13 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM tensorflow/serving:2.8.0 2 | 3 | COPY ./outputs/serving_model /models/heart-failure-model 4 | COPY ./config /model_config 5 | 6 | ENV MODEL_NAME=heart-failure-model 7 | ENV MONITORING_CONFIG="/model_config/prometheus.config" 8 | ENV PORT=8501 9 | 10 | RUN echo '#!/bin/bash \n\n\ 11 | env\n\ 12 | tensorflow_model_server --port=8500 --rest_api_port=${PORT} \ 13 | --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} \ 14 | --monitoring_config_file=${MONITORING_CONFIG} \ 15 | "$@"' > /usr/bin/tf_serving_entrypoint.sh \ 16 | && chmod +x /usr/bin/tf_serving_entrypoint.sh -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Abdul Azis 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /modules/pipeline.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Abdul Azis 3 | Date: 12/11/2022 4 | This is the pipeline.py module. 5 | Usage: 6 | - Create TFX Pipeline 7 | """ 8 | 9 | from typing import Text 10 | 11 | from absl import logging 12 | from tfx.orchestration import metadata, pipeline 13 | 14 | 15 | def init_pipeline(pipeline_root: Text, pipeline_name, metadata_path, components): 16 | """Initiate tfx pipeline 17 | 18 | Args: 19 | pipeline_root (Text): a path to th pipeline directory 20 | pipeline_name (str): pipeline name 21 | metadata_path (str): a path to the metadata directory 22 | components (dict): tfx components 23 | 24 | Returns: 25 | pipeline.Pipeline: pipeline orchestration 26 | """ 27 | 28 | logging.info(f"Pipeline root set to: {pipeline_root}") 29 | 30 | beam_args = [ 31 | "--direct_running_mode=multi_processing", 32 | "----direct_num_workers=0", 33 | ] 34 | 35 | return pipeline.Pipeline( 36 | pipeline_name=pipeline_name, 37 | pipeline_root=pipeline_root, 38 | components=components, 39 | enable_cache=True, 40 | metadata_connection_config=metadata.sqlite_metadata_connection_config( 41 | metadata_path, 42 | ), 43 | eam_pipeline_args=beam_args, 44 | ) 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Submission 2: Heart Failure Prediction 2 | 3 | Nama: Abdul Azis 4 | 5 | Username dicoding: zizz1181 6 | 7 | | | Deskripsi | 8 | | ----------- | ----------- | 9 | | Dataset | [Heart Failure Prediction Dataset](https://www.kaggle.com/datasets/fedesoriano/heart-failure-prediction) | 10 | | Masalah | Gagal jantung adalah kondisi ketika jantung melemah sehingga tidak mampu memompa darah yang cukup ke seluruh tubuh. Kondisi ini dapat terjadi pada siapa saja, tetapi lebih sering terjadi pada orang berusia di atas 65 tahun. Penyakit gagal jantung ini merupakan salah satu penyakit yang mematikan dan kematian yang disebabkan oleh penyakit ini pada umumnya masih termasuk yang tertinggi saat ini.| 11 | | Solusi machine learning | Dari permasalahan diatas dengan memanfaatkan teknologi, machine learning menjadi salah satu solusi untuk membantu mengurangi tingkat kematian yang cukup tinggi akibat penyakit ini. Dengan sebuah sistem prediksi penyakit gagal jantung, diharapkan para tenaga medis maupun masyarakat dapat terbantu untuk dapat mendeteksi penyakit ini lebih awal. | 12 | | Metode pengolahan | Data yang digunakan pada proyek ini terdapat dua tipe data, yaitu data kategorikal dan numerik. Metode yang digunakan untuk mengelolah data tersebut yaitu mentransformasikan data kategorikal menjadi bentuk one-hot encoding dan menormalisasikan data numerik kedalam range data yang sama. | 13 | | Arsitektur model | Model yang dibangun cukup sederhana hanya menggunakan Dense layer dan Dropout layer sebagai hidden layer pada model neural network dan memiliki 1 output layer | 14 | | Metrik evaluasi | Metric yang digunakan pada model yaitu AUC, Precision, Recall, BinaryAccuracy, TruePositive, FalsePositive, TrueNegative, FalseNegative untuk mengevaluasi performa model sebuah klasifikasi | 15 | | Performa model | Model yang dibuat menghasilkan performa yang cukup baik dalam memberikan sebuah prediksi dan dari pelatihan yang dilakukan menghasilkan binary_accuracy sebesar 87% dan val_binary_acuracy sebesar 85%, hasil seperti ini sudah cukup baik untuk sebuah sistem klasifikasi namun masih bisa ditingkatkan lagi | 16 | | Opsi deployment | Proyek machine learning ini dideploy menggunakan salah satu platfrom as a service yaitu HEROKU yang menyediakan layanan gratis untuk mendeploy sebuah proyek. | 17 | | Web app | | 18 | | Monitoring | Monitoring pada proyek ini dapat dilakukan dengan menggunakan layanan open-source yaitu prometheus. Contohnya setiap perubahan jumlah request yang dilakukan kepada sistem ini dapat dimonitoring dengan baik dan dapat menampilkan status dari setiap request yang diterima | 19 | -------------------------------------------------------------------------------- /modules/transform.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Abdul Azis 3 | Date: 12/11/2022 4 | This is the transform.py module. 5 | Usage: 6 | - Transform feature and label data 7 | """ 8 | 9 | import tensorflow as tf 10 | import tensorflow_transform as tft 11 | 12 | CATEGORICAL_FEATURES = { 13 | "Sex": 2, 14 | "ChestPainType": 4, 15 | "RestingECG": 3, 16 | "ExerciseAngina": 2, 17 | "ST_Slope": 3, 18 | } 19 | 20 | NUMERICAL_FEATURES = [ 21 | "Age", 22 | "RestingBP", 23 | "Cholesterol", 24 | "FastingBS", 25 | "MaxHR", 26 | "Oldpeak", 27 | ] 28 | 29 | LABEL_KEY = "HeartDisease" 30 | 31 | 32 | def transformed_name(key): 33 | """Transform feature key 34 | 35 | Args: 36 | key (str): the key to be transformed 37 | 38 | Returns: 39 | str: transformed key 40 | """ 41 | 42 | return f"{key}_xf" 43 | 44 | 45 | def convert_num_to_one_hot(label_tensor, num_labels=2): 46 | """Convert a label (0 or 1) into a one-hot vector 47 | 48 | Args: 49 | label_tensor (int): label tensor (0 or 1) 50 | num_labels (int, optional): num of label. Defaults to 2. 51 | 52 | Returns: 53 | tf.Tensor: label tensor 54 | """ 55 | 56 | one_hot_tensor = tf.one_hot(label_tensor, num_labels) 57 | return tf.reshape(one_hot_tensor, [-1, num_labels]) 58 | 59 | 60 | def replace_nan(tensor): 61 | """Replace nan value with zero number 62 | 63 | Args: 64 | tensor (list): list data with na data that want to replace 65 | 66 | Returns: 67 | list with replaced nan value 68 | """ 69 | tensor = tf.cast(tensor, tf.float64) 70 | return tf.where( 71 | tf.math.is_nan(tensor), 72 | tft.mean(tensor), 73 | tensor 74 | ) 75 | 76 | 77 | def preprocessing_fn(inputs): 78 | """Preprocess input features into transformed features 79 | 80 | Args: 81 | inputs (dict): map from feature keys to raw features 82 | 83 | Returns: 84 | dict: map from features keys to transformed features 85 | """ 86 | 87 | outputs = {} 88 | 89 | for keys, values in CATEGORICAL_FEATURES.items(): 90 | int_value = tft.compute_and_apply_vocabulary( 91 | inputs[keys], top_k=values+1) 92 | outputs[transformed_name(keys)] = convert_num_to_one_hot( 93 | int_value, num_labels=values+1) 94 | 95 | for feature in NUMERICAL_FEATURES: 96 | inputs[feature] = replace_nan(inputs[feature]) 97 | outputs[transformed_name(feature)] = tft.scale_to_0_1(inputs[feature]) 98 | 99 | outputs[transformed_name(LABEL_KEY)] = tf.cast(inputs[LABEL_KEY], tf.int64) 100 | 101 | return outputs 102 | -------------------------------------------------------------------------------- /main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Import library yang dibutuhkan" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": null, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import os\n", 17 | "from tfx.orchestration.beam.beam_dag_runner import BeamDagRunner\n", 18 | "from modules import components, pipeline" 19 | ] 20 | }, 21 | { 22 | "cell_type": "markdown", 23 | "metadata": {}, 24 | "source": [ 25 | "# Set variabel" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": null, 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "PIPELANE_NAME = \"heart-failure-pipeline\"\n", 35 | "\n", 36 | "# Pipeline inputs\n", 37 | "DATA_ROOT = \"data\"\n", 38 | "TRANSFORM_MODULE_FILE = \"modules/transform.py\"\n", 39 | "TUNER_MODULE_FILE = \"modules/tuner.py\"\n", 40 | "TRAINER_MODULE_FILE = \"modules/trainer.py\"\n", 41 | "\n", 42 | "# Pipeline outputs\n", 43 | "OUTPUT_BASE = \"outputs\"\n", 44 | "\n", 45 | "serving_model_dir = os.path.join(OUTPUT_BASE, \"serving_model\")\n", 46 | "pipeline_root = os.path.join(OUTPUT_BASE, PIPELANE_NAME)\n", 47 | "metadata_path = os.path.join(pipeline_root, \"metadata.sqlite\")" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "# Menjalankan ML Pipeline" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": null, 60 | "metadata": {}, 61 | "outputs": [], 62 | "source": [ 63 | "components_args = {\n", 64 | " \"data_dir\": DATA_ROOT,\n", 65 | " \"trainer_module\": TRAINER_MODULE_FILE,\n", 66 | " \"tuner_module\": TUNER_MODULE_FILE,\n", 67 | " \"transform_module\": TRANSFORM_MODULE_FILE,\n", 68 | " \"train_steps\": 1000,\n", 69 | " \"eval_steps\": 800,\n", 70 | " \"serving_model_dir\": serving_model_dir,\n", 71 | "}\n", 72 | "\n", 73 | "components = components.init_components(components_args)\n", 74 | "\n", 75 | "pipeline = pipeline.init_pipeline(\n", 76 | " pipeline_root, \n", 77 | " PIPELANE_NAME, \n", 78 | " metadata_path, \n", 79 | " components\n", 80 | ")\n", 81 | "BeamDagRunner().run(pipeline)" 82 | ] 83 | } 84 | ], 85 | "metadata": { 86 | "kernelspec": { 87 | "display_name": "Python 3.8.0 ('heart-failure')", 88 | "language": "python", 89 | "name": "python3" 90 | }, 91 | "language_info": { 92 | "codemirror_mode": { 93 | "name": "ipython", 94 | "version": 3 95 | }, 96 | "file_extension": ".py", 97 | "mimetype": "text/x-python", 98 | "name": "python", 99 | "nbconvert_exporter": "python", 100 | "pygments_lexer": "ipython3", 101 | "version": "3.8.0" 102 | }, 103 | "orig_nbformat": 4, 104 | "vscode": { 105 | "interpreter": { 106 | "hash": "4fbe767d8aceeb3d12b8ace95af708050548c1a4397082100e570a29d46fdef1" 107 | } 108 | } 109 | }, 110 | "nbformat": 4, 111 | "nbformat_minor": 2 112 | } 113 | -------------------------------------------------------------------------------- /prediction.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import tensorflow as tf\n", 10 | "import pandas as pd\n", 11 | "import requests\n", 12 | "import json\n", 13 | "import base64\n", 14 | "import random" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": null, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "df = pd.read_csv(\"data/heart.csv\")\n", 24 | "df.pop(\"HeartDisease\")\n", 25 | "\n", 26 | "columns = df.columns.values\n", 27 | "rand = random.randint(0, len(columns))\n", 28 | "\n", 29 | "features = df.values[rand]\n", 30 | "\n", 31 | "inputs = {key: value for key, value in zip(columns, features)}\n", 32 | "inputs" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": null, 38 | "metadata": {}, 39 | "outputs": [], 40 | "source": [ 41 | "def string_feature(value):\n", 42 | " return tf.train.Feature(\n", 43 | " bytes_list=tf.train.BytesList(\n", 44 | " value=[bytes(value, \"utf-8\")]\n", 45 | " ),\n", 46 | " )\n", 47 | " \n", 48 | "def float_feature(value):\n", 49 | " return tf.train.Feature(\n", 50 | " float_list=tf.train.FloatList(\n", 51 | " value=[value]\n", 52 | " ),\n", 53 | " )\n", 54 | " \n", 55 | "def int_feature(value):\n", 56 | " return tf.train.Feature(\n", 57 | " int64_list=tf.train.Int64List(\n", 58 | " value=[value]\n", 59 | " ),\n", 60 | " )" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": null, 66 | "metadata": {}, 67 | "outputs": [], 68 | "source": [ 69 | "def prepare_json(inputs: dict):\n", 70 | " feature_spec = dict()\n", 71 | " \n", 72 | " for keys, values in inputs.items():\n", 73 | " if isinstance(values, float):\n", 74 | " feature_spec[keys] = float_feature(values)\n", 75 | " elif isinstance(values, int):\n", 76 | " feature_spec[keys] = int_feature(values)\n", 77 | " elif isinstance(values, str):\n", 78 | " feature_spec[keys] = string_feature(values)\n", 79 | " \n", 80 | " example = tf.train.Example(\n", 81 | " features=tf.train.Features(feature=feature_spec)\n", 82 | " ).SerializeToString()\n", 83 | " \n", 84 | " result = [\n", 85 | " {\n", 86 | " \"examples\": {\n", 87 | " \"b64\": base64.b64encode(example).decode()\n", 88 | " }\n", 89 | " }\n", 90 | " ]\n", 91 | " \n", 92 | " return json.dumps({\n", 93 | " \"signature_name\": \"serving_default\",\n", 94 | " \"instances\": result,\n", 95 | " })" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": null, 101 | "metadata": {}, 102 | "outputs": [], 103 | "source": [ 104 | "def make_predictions(inputs):\n", 105 | " json_data = prepare_json(inputs)\n", 106 | " \n", 107 | " endpoint = \"https://hf-pred.herokuapp.com/v1/models/heart-failure-model:predict\"\n", 108 | " response = requests.post(endpoint, data=json_data)\n", 109 | "\n", 110 | " prediction = response.json()[\"predictions\"][0][0]\n", 111 | " \n", 112 | " if prediction < 0.6:\n", 113 | " return \"Normal\"\n", 114 | " else:\n", 115 | " return \"Heart Disease\"" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": null, 121 | "metadata": {}, 122 | "outputs": [], 123 | "source": [ 124 | "make_predictions(inputs)" 125 | ] 126 | } 127 | ], 128 | "metadata": { 129 | "kernelspec": { 130 | "display_name": "Python 3.8.0 ('heart-failure')", 131 | "language": "python", 132 | "name": "python3" 133 | }, 134 | "language_info": { 135 | "codemirror_mode": { 136 | "name": "ipython", 137 | "version": 3 138 | }, 139 | "file_extension": ".py", 140 | "mimetype": "text/x-python", 141 | "name": "python", 142 | "nbconvert_exporter": "python", 143 | "pygments_lexer": "ipython3", 144 | "version": "3.8.0" 145 | }, 146 | "orig_nbformat": 4, 147 | "vscode": { 148 | "interpreter": { 149 | "hash": "4fbe767d8aceeb3d12b8ace95af708050548c1a4397082100e570a29d46fdef1" 150 | } 151 | } 152 | }, 153 | "nbformat": 4, 154 | "nbformat_minor": 2 155 | } 156 | -------------------------------------------------------------------------------- /modules/trainer.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Abdul Azis 3 | Date: 12/11/2022 4 | This is the trainer.py module. 5 | Usage: 6 | - Training model in TFX Pipeline 7 | """ 8 | 9 | import os 10 | 11 | import tensorflow as tf 12 | import tensorflow_transform as tft 13 | from keras import layers 14 | from transform import (CATEGORICAL_FEATURES, LABEL_KEY, NUMERICAL_FEATURES, 15 | transformed_name) 16 | from tuner import input_fn 17 | 18 | 19 | def get_serve_tf_examples_fn(model, tf_transform_output): 20 | """Return a function that parses a serialized tf.Example""" 21 | 22 | model.tft_layer = tf_transform_output.transform_features_layer() 23 | 24 | @tf.function(input_signature=[ 25 | tf.TensorSpec(shape=[None], dtype=tf.string, name="examples"), 26 | ]) 27 | def serve_tf_examples_fn(serialized_tf_examples): 28 | """Return the output to be used in the serving signature.""" 29 | 30 | feature_spec = tf_transform_output.raw_feature_spec() 31 | feature_spec.pop(LABEL_KEY) 32 | 33 | parsed_features = tf.io.parse_example( 34 | serialized_tf_examples, feature_spec, 35 | ) 36 | 37 | transformed_features = model.tft_layer(parsed_features) 38 | outputs = model(transformed_features) 39 | 40 | return {"outputs": outputs} 41 | 42 | return serve_tf_examples_fn 43 | 44 | 45 | def get_model(hyperparameters): 46 | """This model defines a keras Model 47 | 48 | Args: 49 | hyperparameters (kt.HyperParameters): object that contains best hyperparameters 50 | from tuner 51 | 52 | Returns: 53 | tf.keras.Model: model as a Keras object 54 | """ 55 | 56 | input_features = [] 57 | 58 | for key, dim in CATEGORICAL_FEATURES.items(): 59 | input_features.append( 60 | layers.Input(shape=(dim+1,), name=transformed_name(key)) 61 | ) 62 | 63 | for feature in NUMERICAL_FEATURES: 64 | input_features.append( 65 | layers.Input(shape=(1,), name=transformed_name(feature)) 66 | ) 67 | 68 | concatenate = layers.concatenate(input_features) 69 | deep = layers.Dense( 70 | hyperparameters["dense_unit"], activation=tf.nn.relu)(concatenate) 71 | 72 | for _ in range(hyperparameters["num_hidden_layers"]): 73 | deep = layers.Dense( 74 | hyperparameters["dense_unit"], activation=tf.nn.relu)(deep) 75 | deep = layers.Dropout(hyperparameters["dropout_rate"])(deep) 76 | 77 | outputs = layers.Dense(1, activation=tf.nn.sigmoid)(deep) 78 | 79 | model = tf.keras.Model(inputs=input_features, outputs=outputs) 80 | 81 | model.compile( 82 | optimizer=tf.keras.optimizers.Adam( 83 | learning_rate=hyperparameters["learning_rate"]), 84 | loss=tf.keras.losses.BinaryCrossentropy(), 85 | metrics=["binary_accuracy"], 86 | ) 87 | 88 | model.summary() 89 | 90 | return model 91 | 92 | 93 | def run_fn(fn_args): 94 | """Train the model based on given args 95 | 96 | Args: 97 | fn_args (FnArgs): Holds args used to train the model as name/value pairs. 98 | """ 99 | 100 | hyperparameters = fn_args.hyperparameters["values"] 101 | log_dir = os.path.join(os.path.dirname(fn_args.serving_model_dir), "logs") 102 | 103 | tf_transform_output = tft.TFTransformOutput(fn_args.transform_output) 104 | 105 | train_set = input_fn(fn_args.train_files, tf_transform_output) 106 | eval_set = input_fn(fn_args.eval_files, tf_transform_output) 107 | 108 | model = get_model(hyperparameters) 109 | 110 | tensorboard_callback = tf.keras.callbacks.TensorBoard( 111 | log_dir=log_dir, 112 | update_freq="batch" 113 | ) 114 | 115 | early_stop_callbacks = tf.keras.callbacks.EarlyStopping( 116 | monitor="val_binary_accuracy", 117 | mode="max", 118 | verbose=1, 119 | patience=10, 120 | ) 121 | 122 | model_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint( 123 | fn_args.serving_model_dir, 124 | monitor="val_binary_accuracy", 125 | mode="max", 126 | verbose=1, 127 | save_best_only=True, 128 | ) 129 | 130 | callbacks = [ 131 | tensorboard_callback, 132 | early_stop_callbacks, 133 | model_checkpoint_callback 134 | ] 135 | 136 | model.fit( 137 | x=train_set, 138 | steps_per_epoch=fn_args.train_steps, 139 | validation_data=eval_set, 140 | validation_steps=fn_args.eval_steps, 141 | callbacks=callbacks, 142 | epochs=hyperparameters["tuner/initial_epoch"], 143 | verbose=1, 144 | ) 145 | 146 | signatures = { 147 | "serving_default": get_serve_tf_examples_fn( 148 | model, tf_transform_output, 149 | ) 150 | } 151 | 152 | model.save( 153 | fn_args.serving_model_dir, 154 | save_format="tf", 155 | signatures=signatures, 156 | ) 157 | -------------------------------------------------------------------------------- /modules/tuner.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Abdul Azis 3 | Date: 12/11/2022 4 | This is the tuner.py module. 5 | Usage: 6 | - Tuning model hyperparameters to get the best hyperparameters 7 | """ 8 | 9 | from typing import Any, Dict, NamedTuple, Text 10 | 11 | import keras_tuner as kt 12 | import tensorflow as tf 13 | import tensorflow_transform as tft 14 | from keras import layers 15 | from keras_tuner.engine import base_tuner 16 | from transform import (CATEGORICAL_FEATURES, LABEL_KEY, NUMERICAL_FEATURES, 17 | transformed_name) 18 | 19 | NUM_EPOCHS = 5 20 | 21 | TunerFnResult = NamedTuple("TunerFnResult", [ 22 | ("tuner", base_tuner.BaseTuner), 23 | ("fit_kwargs", Dict[Text, Any]), 24 | ]) 25 | 26 | early_stop = tf.keras.callbacks.EarlyStopping( 27 | monitor="val_binary_accuracy", 28 | mode="max", 29 | verbose=1, 30 | patience=10, 31 | ) 32 | 33 | 34 | def gzip_reader_fn(filenames): 35 | """Loads compression data 36 | 37 | Args: 38 | filenames (str): a path to the data directory 39 | 40 | Returns: 41 | TfRecord: Compressed data 42 | """ 43 | 44 | return tf.data.TFRecordDataset(filenames, compression_type="GZIP") 45 | 46 | 47 | def input_fn(file_pattern, tf_transform_output, batch_size=64): 48 | """Generated features and labels for tuning/training 49 | 50 | Args: 51 | file_pattern: input tf_record file pattern 52 | tf_transform_output: a TFTransformOutput 53 | batch_size: representing the number of consecutive elements of 54 | returned dataset to combine in a single batch. Defaults to 64. 55 | 56 | Returns: 57 | a dataset that contains (featurs, indices) tuple where features 58 | is a dictionary of Tensors, and indices is a single Tensor of 59 | label indices 60 | """ 61 | 62 | transform_feature_spec = ( 63 | tf_transform_output.transformed_feature_spec().copy() 64 | ) 65 | 66 | dataset = tf.data.experimental.make_batched_features_dataset( 67 | file_pattern=file_pattern, 68 | batch_size=batch_size, 69 | features=transform_feature_spec, 70 | reader=gzip_reader_fn, 71 | label_key=transformed_name(LABEL_KEY) 72 | ) 73 | 74 | return dataset 75 | 76 | 77 | def get_model_tuner(hyperparameters): 78 | """This function defines a keras Model 79 | 80 | Args: 81 | hyperparameters (kt.HyperParameters): object to setting hyperparameters 82 | 83 | Returns: 84 | tf.keras.Model: model as a Keras object 85 | """ 86 | 87 | num_hidden_layers = hyperparameters.Choice( 88 | "num_hidden_layers", 89 | values=[1, 2, 3], 90 | ) 91 | dense_unit = hyperparameters.Int( 92 | "dense_unit", 93 | min_value=16, 94 | max_value=256, 95 | step=32, 96 | ) 97 | dropout_rate = hyperparameters.Float( 98 | "dropout_rate", 99 | min_value=0.1, 100 | max_value=0.9, 101 | step=0.1, 102 | ) 103 | learning_rate = hyperparameters.Choice( 104 | "learning_rate", 105 | values=[1e-2, 1e-3, 1e-4] 106 | ) 107 | 108 | input_features = [] 109 | 110 | for key, dim in CATEGORICAL_FEATURES.items(): 111 | input_features.append( 112 | layers.Input(shape=(dim+1,), name=transformed_name(key)) 113 | ) 114 | 115 | for feature in NUMERICAL_FEATURES: 116 | input_features.append( 117 | layers.Input(shape=(1,), name=transformed_name(feature)) 118 | ) 119 | 120 | concatenate = layers.concatenate(input_features) 121 | deep = layers.Dense(dense_unit, activation=tf.nn.relu)(concatenate) 122 | 123 | for _ in range(num_hidden_layers): 124 | deep = layers.Dense(dense_unit, activation=tf.nn.relu)(deep) 125 | deep = layers.Dropout(dropout_rate)(deep) 126 | 127 | outputs = layers.Dense(1, activation=tf.nn.sigmoid)(deep) 128 | 129 | model = tf.keras.Model(inputs=input_features, outputs=outputs) 130 | 131 | model.compile( 132 | optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate), 133 | loss=tf.keras.losses.BinaryCrossentropy(), 134 | metrics=["binary_accuracy"], 135 | ) 136 | 137 | model.summary() 138 | 139 | return model 140 | 141 | 142 | def tuner_fn(fn_args): 143 | """Tuning the model to get the best hyperparameters based on given args 144 | 145 | Args: 146 | fn_args (FnArgs): Holds args used to train the model as name/value pair 147 | 148 | Returns: 149 | TunerFnResult (NamedTuple): object to run model tuner 150 | """ 151 | 152 | tf_transform_output = tft.TFTransformOutput(fn_args.transform_graph_path) 153 | 154 | train_set = input_fn(fn_args.train_files[0], tf_transform_output,) 155 | eval_set = input_fn(fn_args.eval_files[0], tf_transform_output,) 156 | 157 | tuner = kt.Hyperband( 158 | hypermodel=get_model_tuner, 159 | objective=kt.Objective( 160 | "val_loss", 161 | direction="min", 162 | ), 163 | max_epochs=NUM_EPOCHS, 164 | factor=3, 165 | directory=fn_args.working_dir, 166 | project_name="kt_hyperband", 167 | ) 168 | 169 | return TunerFnResult( 170 | tuner=tuner, 171 | fit_kwargs={ 172 | "x": train_set, 173 | "validation_data": eval_set, 174 | "steps_per_epoch": fn_args.train_steps, 175 | "validation_steps": fn_args.eval_steps, 176 | "callbacks": [early_stop] 177 | }, 178 | ) 179 | -------------------------------------------------------------------------------- /modules/components.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Abdul Azis 3 | Date: 12/11/2022 4 | This is the components.py module. 5 | Usage: 6 | - Create TFX Pipeline Components 7 | """ 8 | 9 | import os 10 | 11 | import tensorflow_model_analysis as tfma 12 | from tfx.components import (CsvExampleGen, Evaluator, ExampleValidator, Pusher, 13 | SchemaGen, StatisticsGen, Trainer, Transform, 14 | Tuner) 15 | from tfx.dsl.components.common.resolver import Resolver 16 | from tfx.dsl.input_resolution.strategies.latest_blessed_model_strategy import \ 17 | LatestBlessedModelStrategy 18 | from tfx.proto import example_gen_pb2, pusher_pb2, trainer_pb2 19 | from tfx.types import Channel 20 | from tfx.types.standard_artifacts import Model, ModelBlessing 21 | 22 | 23 | def init_components(args): 24 | """Initiate tfx pipeline components 25 | 26 | Args: 27 | args (dict): args that containts some dependencies 28 | 29 | Returns: 30 | tuple: TFX pipeline components 31 | """ 32 | output = example_gen_pb2.Output( 33 | split_config=example_gen_pb2.SplitConfig(splits=[ 34 | example_gen_pb2.SplitConfig.Split(name="train", hash_buckets=8), 35 | example_gen_pb2.SplitConfig.Split(name="eval", hash_buckets=2), 36 | ]) 37 | ) 38 | 39 | example_gen = CsvExampleGen( 40 | input_base=args["data_dir"], 41 | output_config=output, 42 | ) 43 | 44 | statistics_gen = StatisticsGen( 45 | examples=example_gen.outputs["examples"], 46 | ) 47 | 48 | schema_gen = SchemaGen( 49 | statistics=statistics_gen.outputs["statistics"], 50 | ) 51 | 52 | example_validator = ExampleValidator( 53 | statistics=statistics_gen.outputs["statistics"], 54 | schema=schema_gen.outputs["schema"], 55 | ) 56 | 57 | transform = Transform( 58 | examples=example_gen.outputs["examples"], 59 | schema=schema_gen.outputs["schema"], 60 | module_file=os.path.abspath(args["transform_module"]), 61 | ) 62 | 63 | tuner = Tuner( 64 | module_file=os.path.abspath(args["tuner_module"]), 65 | examples=transform.outputs["transformed_examples"], 66 | transform_graph=transform.outputs["transform_graph"], 67 | schema=schema_gen.outputs["schema"], 68 | train_args=trainer_pb2.TrainArgs( 69 | splits=["train"], 70 | num_steps=args["train_steps"], 71 | ), 72 | eval_args=trainer_pb2.EvalArgs( 73 | splits=["eval"], 74 | num_steps=args["eval_steps"], 75 | ), 76 | ) 77 | 78 | trainer = Trainer( 79 | module_file=args["trainer_module"], 80 | examples=transform.outputs["transformed_examples"], 81 | transform_graph=transform.outputs["transform_graph"], 82 | schema=schema_gen.outputs["schema"], 83 | hyperparameters=tuner.outputs["best_hyperparameters"], 84 | train_args=trainer_pb2.TrainArgs( 85 | splits=["train"], 86 | num_steps=args["train_steps"], 87 | ), 88 | eval_args=trainer_pb2.EvalArgs( 89 | splits=["eval"], 90 | num_steps=args["eval_steps"] 91 | ), 92 | ) 93 | 94 | model_resolver = Resolver( 95 | strategy_class=LatestBlessedModelStrategy, 96 | model=Channel(type=Model), 97 | model_blessing=Channel(type=ModelBlessing), 98 | ).with_id("Latest_blessed_model_resolve") 99 | 100 | eval_config = tfma.EvalConfig( 101 | model_specs=[tfma.ModelSpec(label_key="HeartDisease")], 102 | slicing_specs=[ 103 | tfma.SlicingSpec(), 104 | tfma.SlicingSpec(feature_keys=["Sex"]), 105 | ], 106 | metrics_specs=[ 107 | tfma.MetricsSpec(metrics=[ 108 | tfma.MetricConfig(class_name="AUC"), 109 | tfma.MetricConfig(class_name="Precision"), 110 | tfma.MetricConfig(class_name="Recall"), 111 | tfma.MetricConfig(class_name="ExampleCount"), 112 | tfma.MetricConfig(class_name="TruePositives"), 113 | tfma.MetricConfig(class_name="FalsePositives"), 114 | tfma.MetricConfig(class_name="TrueNegatives"), 115 | tfma.MetricConfig(class_name="FalseNegatives"), 116 | tfma.MetricConfig( 117 | class_name="BinaryAccuracy", 118 | threshold=tfma.MetricThreshold( 119 | value_threshold=tfma.GenericValueThreshold( 120 | lower_bound={"value": .6}, 121 | ), 122 | change_threshold=tfma.GenericChangeThreshold( 123 | direction=tfma.MetricDirection.HIGHER_IS_BETTER, 124 | absolute={"value": 1e-4}, 125 | ), 126 | ), 127 | ), 128 | ]), 129 | ], 130 | ) 131 | 132 | evaluator = Evaluator( 133 | examples=example_gen.outputs["examples"], 134 | model=trainer.outputs["model"], 135 | baseline_model=model_resolver.outputs["model"], 136 | eval_config=eval_config, 137 | ) 138 | 139 | pusher = Pusher( 140 | model=trainer.outputs["model"], 141 | model_blessing=evaluator.outputs["blessing"], 142 | push_destination=pusher_pb2.PushDestination( 143 | filesystem=pusher_pb2.PushDestination.Filesystem( 144 | base_directory=args["serving_model_dir"], 145 | ), 146 | ), 147 | ) 148 | 149 | return ( 150 | example_gen, 151 | statistics_gen, 152 | schema_gen, 153 | example_validator, 154 | transform, 155 | tuner, 156 | trainer, 157 | model_resolver, 158 | evaluator, 159 | pusher, 160 | ) 161 | -------------------------------------------------------------------------------- /data/heart.csv: -------------------------------------------------------------------------------- 1 | Age,Sex,ChestPainType,RestingBP,Cholesterol,FastingBS,RestingECG,MaxHR,ExerciseAngina,Oldpeak,ST_Slope,HeartDisease 2 | 40,M,ATA,140,289,0,Normal,172,N,0,Up,0 3 | 49,F,NAP,160,180,0,Normal,156,N,1,Flat,1 4 | 37,M,ATA,130,283,0,ST,98,N,0,Up,0 5 | 48,F,ASY,138,214,0,Normal,108,Y,1.5,Flat,1 6 | 54,M,NAP,150,195,0,Normal,122,N,0,Up,0 7 | 39,M,NAP,120,339,0,Normal,170,N,0,Up,0 8 | 45,F,ATA,130,237,0,Normal,170,N,0,Up,0 9 | 54,M,ATA,110,208,0,Normal,142,N,0,Up,0 10 | 37,M,ASY,140,207,0,Normal,130,Y,1.5,Flat,1 11 | 48,F,ATA,120,284,0,Normal,120,N,0,Up,0 12 | 37,F,NAP,130,211,0,Normal,142,N,0,Up,0 13 | 58,M,ATA,136,164,0,ST,99,Y,2,Flat,1 14 | 39,M,ATA,120,204,0,Normal,145,N,0,Up,0 15 | 49,M,ASY,140,234,0,Normal,140,Y,1,Flat,1 16 | 42,F,NAP,115,211,0,ST,137,N,0,Up,0 17 | 54,F,ATA,120,273,0,Normal,150,N,1.5,Flat,0 18 | 38,M,ASY,110,196,0,Normal,166,N,0,Flat,1 19 | 43,F,ATA,120,201,0,Normal,165,N,0,Up,0 20 | 60,M,ASY,100,248,0,Normal,125,N,1,Flat,1 21 | 36,M,ATA,120,267,0,Normal,160,N,3,Flat,1 22 | 43,F,TA,100,223,0,Normal,142,N,0,Up,0 23 | 44,M,ATA,120,184,0,Normal,142,N,1,Flat,0 24 | 49,F,ATA,124,201,0,Normal,164,N,0,Up,0 25 | 44,M,ATA,150,288,0,Normal,150,Y,3,Flat,1 26 | 40,M,NAP,130,215,0,Normal,138,N,0,Up,0 27 | 36,M,NAP,130,209,0,Normal,178,N,0,Up,0 28 | 53,M,ASY,124,260,0,ST,112,Y,3,Flat,0 29 | 52,M,ATA,120,284,0,Normal,118,N,0,Up,0 30 | 53,F,ATA,113,468,0,Normal,127,N,0,Up,0 31 | 51,M,ATA,125,188,0,Normal,145,N,0,Up,0 32 | 53,M,NAP,145,518,0,Normal,130,N,0,Flat,1 33 | 56,M,NAP,130,167,0,Normal,114,N,0,Up,0 34 | 54,M,ASY,125,224,0,Normal,122,N,2,Flat,1 35 | 41,M,ASY,130,172,0,ST,130,N,2,Flat,1 36 | 43,F,ATA,150,186,0,Normal,154,N,0,Up,0 37 | 32,M,ATA,125,254,0,Normal,155,N,0,Up,0 38 | 65,M,ASY,140,306,1,Normal,87,Y,1.5,Flat,1 39 | 41,F,ATA,110,250,0,ST,142,N,0,Up,0 40 | 48,F,ATA,120,177,1,ST,148,N,0,Up,0 41 | 48,F,ASY,150,227,0,Normal,130,Y,1,Flat,0 42 | 54,F,ATA,150,230,0,Normal,130,N,0,Up,0 43 | 54,F,NAP,130,294,0,ST,100,Y,0,Flat,1 44 | 35,M,ATA,150,264,0,Normal,168,N,0,Up,0 45 | 52,M,NAP,140,259,0,ST,170,N,0,Up,0 46 | 43,M,ASY,120,175,0,Normal,120,Y,1,Flat,1 47 | 59,M,NAP,130,318,0,Normal,120,Y,1,Flat,0 48 | 37,M,ASY,120,223,0,Normal,168,N,0,Up,0 49 | 50,M,ATA,140,216,0,Normal,170,N,0,Up,0 50 | 36,M,NAP,112,340,0,Normal,184,N,1,Flat,0 51 | 41,M,ASY,110,289,0,Normal,170,N,0,Flat,1 52 | 50,M,ASY,130,233,0,Normal,121,Y,2,Flat,1 53 | 47,F,ASY,120,205,0,Normal,98,Y,2,Flat,1 54 | 45,M,ATA,140,224,1,Normal,122,N,0,Up,0 55 | 41,F,ATA,130,245,0,Normal,150,N,0,Up,0 56 | 52,F,ASY,130,180,0,Normal,140,Y,1.5,Flat,0 57 | 51,F,ATA,160,194,0,Normal,170,N,0,Up,0 58 | 31,M,ASY,120,270,0,Normal,153,Y,1.5,Flat,1 59 | 58,M,NAP,130,213,0,ST,140,N,0,Flat,1 60 | 54,M,ASY,150,365,0,ST,134,N,1,Up,0 61 | 52,M,ASY,112,342,0,ST,96,Y,1,Flat,1 62 | 49,M,ATA,100,253,0,Normal,174,N,0,Up,0 63 | 43,F,NAP,150,254,0,Normal,175,N,0,Up,0 64 | 45,M,ASY,140,224,0,Normal,144,N,0,Up,0 65 | 46,M,ASY,120,277,0,Normal,125,Y,1,Flat,1 66 | 50,F,ATA,110,202,0,Normal,145,N,0,Up,0 67 | 37,F,ATA,120,260,0,Normal,130,N,0,Up,0 68 | 45,F,ASY,132,297,0,Normal,144,N,0,Up,0 69 | 32,M,ATA,110,225,0,Normal,184,N,0,Up,0 70 | 52,M,ASY,160,246,0,ST,82,Y,4,Flat,1 71 | 44,M,ASY,150,412,0,Normal,170,N,0,Up,0 72 | 57,M,ATA,140,265,0,ST,145,Y,1,Flat,1 73 | 44,M,ATA,130,215,0,Normal,135,N,0,Up,0 74 | 52,M,ASY,120,182,0,Normal,150,N,0,Flat,1 75 | 44,F,ASY,120,218,0,ST,115,N,0,Up,0 76 | 55,M,ASY,140,268,0,Normal,128,Y,1.5,Flat,1 77 | 46,M,NAP,150,163,0,Normal,116,N,0,Up,0 78 | 32,M,ASY,118,529,0,Normal,130,N,0,Flat,1 79 | 35,F,ASY,140,167,0,Normal,150,N,0,Up,0 80 | 52,M,ATA,140,100,0,Normal,138,Y,0,Up,0 81 | 49,M,ASY,130,206,0,Normal,170,N,0,Flat,1 82 | 55,M,NAP,110,277,0,Normal,160,N,0,Up,0 83 | 54,M,ATA,120,238,0,Normal,154,N,0,Up,0 84 | 63,M,ASY,150,223,0,Normal,115,N,0,Flat,1 85 | 52,M,ATA,160,196,0,Normal,165,N,0,Up,0 86 | 56,M,ASY,150,213,1,Normal,125,Y,1,Flat,1 87 | 66,M,ASY,140,139,0,Normal,94,Y,1,Flat,1 88 | 65,M,ASY,170,263,1,Normal,112,Y,2,Flat,1 89 | 53,F,ATA,140,216,0,Normal,142,Y,2,Flat,0 90 | 43,M,TA,120,291,0,ST,155,N,0,Flat,1 91 | 55,M,ASY,140,229,0,Normal,110,Y,0.5,Flat,0 92 | 49,F,ATA,110,208,0,Normal,160,N,0,Up,0 93 | 39,M,ASY,130,307,0,Normal,140,N,0,Up,0 94 | 52,F,ATA,120,210,0,Normal,148,N,0,Up,0 95 | 48,M,ASY,160,329,0,Normal,92,Y,1.5,Flat,1 96 | 39,F,NAP,110,182,0,ST,180,N,0,Up,0 97 | 58,M,ASY,130,263,0,Normal,140,Y,2,Flat,1 98 | 43,M,ATA,142,207,0,Normal,138,N,0,Up,0 99 | 39,M,NAP,160,147,1,Normal,160,N,0,Up,0 100 | 56,M,ASY,120,85,0,Normal,140,N,0,Up,0 101 | 41,M,ATA,125,269,0,Normal,144,N,0,Up,0 102 | 65,M,ASY,130,275,0,ST,115,Y,1,Flat,1 103 | 51,M,ASY,130,179,0,Normal,100,N,0,Up,0 104 | 40,F,ASY,150,392,0,Normal,130,N,2,Flat,1 105 | 40,M,ASY,120,466,1,Normal,152,Y,1,Flat,1 106 | 46,M,ASY,118,186,0,Normal,124,N,0,Flat,1 107 | 57,M,ATA,140,260,1,Normal,140,N,0,Up,0 108 | 48,F,ASY,120,254,0,ST,110,N,0,Up,0 109 | 34,M,ATA,150,214,0,ST,168,N,0,Up,0 110 | 50,M,ASY,140,129,0,Normal,135,N,0,Up,0 111 | 39,M,ATA,190,241,0,Normal,106,N,0,Up,0 112 | 59,F,ATA,130,188,0,Normal,124,N,1,Flat,0 113 | 57,M,ASY,150,255,0,Normal,92,Y,3,Flat,1 114 | 47,M,ASY,140,276,1,Normal,125,Y,0,Up,0 115 | 38,M,ATA,140,297,0,Normal,150,N,0,Up,0 116 | 49,F,NAP,130,207,0,ST,135,N,0,Up,0 117 | 33,F,ASY,100,246,0,Normal,150,Y,1,Flat,1 118 | 38,M,ASY,120,282,0,Normal,170,N,0,Flat,1 119 | 59,F,ASY,130,338,1,ST,130,Y,1.5,Flat,1 120 | 35,F,TA,120,160,0,ST,185,N,0,Up,0 121 | 34,M,TA,140,156,0,Normal,180,N,0,Flat,1 122 | 47,F,NAP,135,248,1,Normal,170,N,0,Flat,1 123 | 52,F,NAP,125,272,0,Normal,139,N,0,Up,0 124 | 46,M,ASY,110,240,0,ST,140,N,0,Up,0 125 | 58,F,ATA,180,393,0,Normal,110,Y,1,Flat,1 126 | 58,M,ATA,130,230,0,Normal,150,N,0,Up,0 127 | 54,M,ATA,120,246,0,Normal,110,N,0,Up,0 128 | 34,F,ATA,130,161,0,Normal,190,N,0,Up,0 129 | 48,F,ASY,108,163,0,Normal,175,N,2,Up,0 130 | 54,F,ATA,120,230,1,Normal,140,N,0,Up,0 131 | 42,M,NAP,120,228,0,Normal,152,Y,1.5,Flat,0 132 | 38,M,NAP,145,292,0,Normal,130,N,0,Up,0 133 | 46,M,ASY,110,202,0,Normal,150,Y,0,Flat,1 134 | 56,M,ASY,170,388,0,ST,122,Y,2,Flat,1 135 | 56,M,ASY,150,230,0,ST,124,Y,1.5,Flat,1 136 | 61,F,ASY,130,294,0,ST,120,Y,1,Flat,0 137 | 49,M,NAP,115,265,0,Normal,175,N,0,Flat,1 138 | 43,F,ATA,120,215,0,ST,175,N,0,Up,0 139 | 39,M,ATA,120,241,0,ST,146,N,2,Up,0 140 | 54,M,ASY,140,166,0,Normal,118,Y,0,Flat,1 141 | 43,M,ASY,150,247,0,Normal,130,Y,2,Flat,1 142 | 52,M,ASY,160,331,0,Normal,94,Y,2.5,Flat,1 143 | 50,M,ASY,140,341,0,ST,125,Y,2.5,Flat,1 144 | 47,M,ASY,160,291,0,ST,158,Y,3,Flat,1 145 | 53,M,ASY,140,243,0,Normal,155,N,0,Up,0 146 | 56,F,ATA,120,279,0,Normal,150,N,1,Flat,1 147 | 39,M,ASY,110,273,0,Normal,132,N,0,Up,0 148 | 42,M,ATA,120,198,0,Normal,155,N,0,Up,0 149 | 43,F,ATA,120,249,0,ST,176,N,0,Up,0 150 | 50,M,ATA,120,168,0,Normal,160,N,0,Up,0 151 | 54,M,ASY,130,603,1,Normal,125,Y,1,Flat,1 152 | 39,M,ATA,130,215,0,Normal,120,N,0,Up,0 153 | 48,M,ATA,100,159,0,Normal,100,N,0,Up,0 154 | 40,M,ATA,130,275,0,Normal,150,N,0,Up,0 155 | 55,M,ASY,120,270,0,Normal,140,N,0,Up,0 156 | 41,M,ATA,120,291,0,ST,160,N,0,Up,0 157 | 56,M,ASY,155,342,1,Normal,150,Y,3,Flat,1 158 | 38,M,ASY,110,190,0,Normal,150,Y,1,Flat,1 159 | 49,M,ASY,140,185,0,Normal,130,N,0,Up,0 160 | 44,M,ASY,130,290,0,Normal,100,Y,2,Flat,1 161 | 54,M,ATA,160,195,0,ST,130,N,1,Up,0 162 | 59,M,ASY,140,264,1,LVH,119,Y,0,Flat,1 163 | 49,M,ASY,128,212,0,Normal,96,Y,0,Flat,1 164 | 47,M,ATA,160,263,0,Normal,174,N,0,Up,0 165 | 42,M,ATA,120,196,0,Normal,150,N,0,Up,0 166 | 52,F,ATA,140,225,0,Normal,140,N,0,Up,0 167 | 46,M,TA,140,272,1,Normal,175,N,2,Flat,1 168 | 50,M,ASY,140,231,0,ST,140,Y,5,Flat,1 169 | 48,M,ATA,140,238,0,Normal,118,N,0,Up,0 170 | 58,M,ASY,135,222,0,Normal,100,N,0,Up,0 171 | 58,M,NAP,140,179,0,Normal,160,N,0,Up,0 172 | 29,M,ATA,120,243,0,Normal,160,N,0,Up,0 173 | 40,M,NAP,140,235,0,Normal,188,N,0,Up,0 174 | 53,M,ATA,140,320,0,Normal,162,N,0,Up,0 175 | 49,M,NAP,140,187,0,Normal,172,N,0,Up,0 176 | 52,M,ASY,140,266,0,Normal,134,Y,2,Flat,1 177 | 43,M,ASY,140,288,0,Normal,135,Y,2,Flat,1 178 | 54,M,ASY,140,216,0,Normal,105,N,1.5,Flat,1 179 | 59,M,ATA,140,287,0,Normal,150,N,0,Up,0 180 | 37,M,NAP,130,194,0,Normal,150,N,0,Up,0 181 | 46,F,ASY,130,238,0,Normal,90,N,0,Up,0 182 | 52,M,ASY,130,225,0,Normal,120,Y,2,Flat,1 183 | 51,M,ATA,130,224,0,Normal,150,N,0,Up,0 184 | 52,M,ASY,140,404,0,Normal,124,Y,2,Flat,1 185 | 46,M,ASY,110,238,0,ST,140,Y,1,Flat,0 186 | 54,F,ATA,160,312,0,Normal,130,N,0,Up,0 187 | 58,M,NAP,160,211,1,ST,92,N,0,Flat,1 188 | 58,M,ATA,130,251,0,Normal,110,N,0,Up,0 189 | 41,M,ASY,120,237,1,Normal,138,Y,1,Flat,1 190 | 50,F,ASY,120,328,0,Normal,110,Y,1,Flat,0 191 | 53,M,ASY,180,285,0,ST,120,Y,1.5,Flat,1 192 | 46,M,ASY,180,280,0,ST,120,N,0,Up,0 193 | 50,M,ATA,170,209,0,ST,116,N,0,Up,0 194 | 48,M,ATA,130,245,0,Normal,160,N,0,Up,0 195 | 45,M,NAP,135,192,0,Normal,110,N,0,Up,0 196 | 41,F,ATA,125,184,0,Normal,180,N,0,Up,0 197 | 62,F,TA,160,193,0,Normal,116,N,0,Up,0 198 | 49,M,ASY,120,297,0,Normal,132,N,1,Flat,0 199 | 42,M,ATA,150,268,0,Normal,136,N,0,Up,0 200 | 53,M,ASY,120,246,0,Normal,116,Y,0,Flat,1 201 | 57,F,TA,130,308,0,Normal,98,N,1,Flat,0 202 | 47,M,TA,110,249,0,Normal,150,N,0,Up,0 203 | 46,M,NAP,120,230,0,Normal,150,N,0,Up,0 204 | 42,M,NAP,160,147,0,Normal,146,N,0,Up,0 205 | 31,F,ATA,100,219,0,ST,150,N,0,Up,0 206 | 56,M,ATA,130,184,0,Normal,100,N,0,Up,0 207 | 50,M,ASY,150,215,0,Normal,140,Y,0,Up,0 208 | 35,M,ATA,120,308,0,LVH,180,N,0,Up,0 209 | 35,M,ATA,110,257,0,Normal,140,N,0,Flat,1 210 | 28,M,ATA,130,132,0,LVH,185,N,0,Up,0 211 | 54,M,ASY,125,216,0,Normal,140,N,0,Flat,1 212 | 48,M,ASY,106,263,1,Normal,110,N,0,Flat,1 213 | 50,F,NAP,140,288,0,Normal,140,Y,0,Flat,1 214 | 56,M,NAP,130,276,0,Normal,128,Y,1,Up,0 215 | 56,F,NAP,130,219,0,ST,164,N,0,Up,0 216 | 47,M,ASY,150,226,0,Normal,98,Y,1.5,Flat,1 217 | 30,F,TA,170,237,0,ST,170,N,0,Up,0 218 | 39,M,ASY,110,280,0,Normal,150,N,0,Flat,1 219 | 54,M,NAP,120,217,0,Normal,137,N,0,Up,0 220 | 55,M,ATA,140,196,0,Normal,150,N,0,Up,0 221 | 29,M,ATA,140,263,0,Normal,170,N,0,Up,0 222 | 46,M,ASY,130,222,0,Normal,112,N,0,Flat,1 223 | 51,F,ASY,160,303,0,Normal,150,Y,1,Flat,1 224 | 48,F,NAP,120,195,0,Normal,125,N,0,Up,0 225 | 33,M,NAP,120,298,0,Normal,185,N,0,Up,0 226 | 55,M,ATA,120,256,1,Normal,137,N,0,Up,0 227 | 50,M,ASY,145,264,0,Normal,150,N,0,Flat,1 228 | 53,M,NAP,120,195,0,Normal,140,N,0,Up,0 229 | 38,M,ASY,92,117,0,Normal,134,Y,2.5,Flat,1 230 | 41,M,ATA,120,295,0,Normal,170,N,0,Up,0 231 | 37,F,ASY,130,173,0,ST,184,N,0,Up,0 232 | 37,M,ASY,130,315,0,Normal,158,N,0,Up,0 233 | 40,M,NAP,130,281,0,Normal,167,N,0,Up,0 234 | 38,F,ATA,120,275,0,Normal,129,N,0,Up,0 235 | 41,M,ASY,112,250,0,Normal,142,N,0,Up,0 236 | 54,F,ATA,140,309,0,ST,140,N,0,Up,0 237 | 39,M,ATA,120,200,0,Normal,160,Y,1,Flat,0 238 | 41,M,ASY,120,336,0,Normal,118,Y,3,Flat,1 239 | 55,M,TA,140,295,0,Normal,136,N,0,Flat,1 240 | 48,M,ASY,160,355,0,Normal,99,Y,2,Flat,1 241 | 48,M,ASY,160,193,0,Normal,102,Y,3,Flat,1 242 | 55,M,ATA,145,326,0,Normal,155,N,0,Up,0 243 | 54,M,ASY,200,198,0,Normal,142,Y,2,Flat,1 244 | 55,M,ATA,160,292,1,Normal,143,Y,2,Flat,1 245 | 43,F,ATA,120,266,0,Normal,118,N,0,Up,0 246 | 48,M,ASY,160,268,0,Normal,103,Y,1,Flat,1 247 | 54,M,TA,120,171,0,Normal,137,N,2,Up,0 248 | 54,M,NAP,120,237,0,Normal,150,Y,1.5,Flat,1 249 | 48,M,ASY,122,275,1,ST,150,Y,2,Down,1 250 | 45,M,ASY,130,219,0,ST,130,Y,1,Flat,1 251 | 49,M,ASY,130,341,0,Normal,120,Y,1,Flat,1 252 | 44,M,ASY,135,491,0,Normal,135,N,0,Flat,1 253 | 48,M,ASY,120,260,0,Normal,115,N,2,Flat,1 254 | 61,M,ASY,125,292,0,ST,115,Y,0,Up,0 255 | 62,M,ATA,140,271,0,Normal,152,N,1,Up,0 256 | 55,M,ASY,145,248,0,Normal,96,Y,2,Flat,1 257 | 53,F,NAP,120,274,0,Normal,130,N,0,Up,0 258 | 55,F,ATA,130,394,0,LVH,150,N,0,Up,0 259 | 36,M,NAP,150,160,0,Normal,172,N,0,Up,0 260 | 51,F,NAP,150,200,0,Normal,120,N,0.5,Up,0 261 | 55,F,ATA,122,320,0,Normal,155,N,0,Up,0 262 | 46,M,ATA,140,275,0,Normal,165,Y,0,Up,0 263 | 54,F,ATA,120,221,0,Normal,138,N,1,Up,0 264 | 46,M,ASY,120,231,0,Normal,115,Y,0,Flat,1 265 | 59,M,ASY,130,126,0,Normal,125,N,0,Flat,1 266 | 47,M,NAP,140,193,0,Normal,145,Y,1,Flat,1 267 | 54,M,ATA,160,305,0,Normal,175,N,0,Up,0 268 | 52,M,ASY,130,298,0,Normal,110,Y,1,Flat,1 269 | 34,M,ATA,98,220,0,Normal,150,N,0,Up,0 270 | 54,M,ASY,130,242,0,Normal,91,Y,1,Flat,1 271 | 47,F,NAP,130,235,0,Normal,145,N,2,Flat,0 272 | 45,M,ASY,120,225,0,Normal,140,N,0,Up,0 273 | 32,F,ATA,105,198,0,Normal,165,N,0,Up,0 274 | 55,M,ASY,140,201,0,Normal,130,Y,3,Flat,1 275 | 55,M,NAP,120,220,0,LVH,134,N,0,Up,0 276 | 45,F,ATA,180,295,0,Normal,180,N,0,Up,0 277 | 59,M,NAP,180,213,0,Normal,100,N,0,Up,0 278 | 51,M,NAP,135,160,0,Normal,150,N,2,Flat,1 279 | 52,M,ASY,170,223,0,Normal,126,Y,1.5,Flat,1 280 | 57,F,ASY,180,347,0,ST,126,Y,0.8,Flat,0 281 | 54,F,ATA,130,253,0,ST,155,N,0,Up,0 282 | 60,M,NAP,120,246,0,LVH,135,N,0,Up,0 283 | 49,M,ASY,150,222,0,Normal,122,N,2,Flat,1 284 | 51,F,NAP,130,220,0,Normal,160,Y,2,Up,0 285 | 55,F,ATA,110,344,0,ST,160,N,0,Up,0 286 | 42,M,ASY,140,358,0,Normal,170,N,0,Up,0 287 | 51,F,NAP,110,190,0,Normal,120,N,0,Up,0 288 | 59,M,ASY,140,169,0,Normal,140,N,0,Up,0 289 | 53,M,ATA,120,181,0,Normal,132,N,0,Up,0 290 | 48,F,ATA,133,308,0,ST,156,N,2,Up,0 291 | 36,M,ATA,120,166,0,Normal,180,N,0,Up,0 292 | 48,M,NAP,110,211,0,Normal,138,N,0,Up,0 293 | 47,F,ATA,140,257,0,Normal,135,N,1,Up,0 294 | 53,M,ASY,130,182,0,Normal,148,N,0,Up,0 295 | 65,M,ASY,115,0,0,Normal,93,Y,0,Flat,1 296 | 32,M,TA,95,0,1,Normal,127,N,0.7,Up,1 297 | 61,M,ASY,105,0,1,Normal,110,Y,1.5,Up,1 298 | 50,M,ASY,145,0,1,Normal,139,Y,0.7,Flat,1 299 | 57,M,ASY,110,0,1,ST,131,Y,1.4,Up,1 300 | 51,M,ASY,110,0,1,Normal,92,N,0,Flat,1 301 | 47,M,ASY,110,0,1,ST,149,N,2.1,Up,1 302 | 60,M,ASY,160,0,1,Normal,149,N,0.4,Flat,1 303 | 55,M,ATA,140,0,0,ST,150,N,0.2,Up,0 304 | 53,M,ASY,125,0,1,Normal,120,N,1.5,Up,1 305 | 62,F,ASY,120,0,1,ST,123,Y,1.7,Down,1 306 | 51,M,ASY,95,0,1,Normal,126,N,2.2,Flat,1 307 | 51,F,ASY,120,0,1,Normal,127,Y,1.5,Up,1 308 | 55,M,ASY,115,0,1,Normal,155,N,0.1,Flat,1 309 | 53,M,ATA,130,0,0,ST,120,N,0.7,Down,0 310 | 58,M,ASY,115,0,1,Normal,138,N,0.5,Up,1 311 | 57,M,ASY,95,0,1,Normal,182,N,0.7,Down,1 312 | 65,M,ASY,155,0,0,Normal,154,N,1,Up,0 313 | 60,M,ASY,125,0,1,Normal,110,N,0.1,Up,1 314 | 41,M,ASY,125,0,1,Normal,176,N,1.6,Up,1 315 | 34,M,ASY,115,0,1,Normal,154,N,0.2,Up,1 316 | 53,M,ASY,80,0,0,Normal,141,Y,2,Down,0 317 | 74,M,ATA,145,0,1,ST,123,N,1.3,Up,1 318 | 57,M,NAP,105,0,1,Normal,148,N,0.3,Flat,1 319 | 56,M,ASY,140,0,1,Normal,121,Y,1.8,Up,1 320 | 61,M,ASY,130,0,1,Normal,77,N,2.5,Flat,1 321 | 68,M,ASY,145,0,1,Normal,136,N,1.8,Up,1 322 | 59,M,NAP,125,0,1,Normal,175,N,2.6,Flat,1 323 | 63,M,ASY,100,0,1,Normal,109,N,-0.9,Flat,1 324 | 38,F,ASY,105,0,1,Normal,166,N,2.8,Up,1 325 | 62,M,ASY,115,0,1,Normal,128,Y,2.5,Down,1 326 | 46,M,ASY,100,0,1,ST,133,N,-2.6,Flat,1 327 | 42,M,ASY,105,0,1,Normal,128,Y,-1.5,Down,1 328 | 45,M,NAP,110,0,0,Normal,138,N,-0.1,Up,0 329 | 59,M,ASY,125,0,1,Normal,119,Y,0.9,Up,1 330 | 52,M,ASY,95,0,1,Normal,82,Y,0.8,Flat,1 331 | 60,M,ASY,130,0,1,ST,130,Y,1.1,Down,1 332 | 60,M,NAP,115,0,1,Normal,143,N,2.4,Up,1 333 | 56,M,ASY,115,0,1,ST,82,N,-1,Up,1 334 | 38,M,NAP,100,0,0,Normal,179,N,-1.1,Up,0 335 | 40,M,ASY,95,0,1,ST,144,N,0,Up,1 336 | 51,M,ASY,130,0,1,Normal,170,N,-0.7,Up,1 337 | 62,M,TA,120,0,1,LVH,134,N,-0.8,Flat,1 338 | 72,M,NAP,160,0,0,LVH,114,N,1.6,Flat,0 339 | 63,M,ASY,150,0,1,ST,154,N,3.7,Up,1 340 | 63,M,ASY,140,0,1,LVH,149,N,2,Up,1 341 | 64,F,ASY,95,0,1,Normal,145,N,1.1,Down,1 342 | 43,M,ASY,100,0,1,Normal,122,N,1.5,Down,1 343 | 64,M,ASY,110,0,1,Normal,114,Y,1.3,Down,1 344 | 61,M,ASY,110,0,1,Normal,113,N,1.4,Flat,1 345 | 52,M,ASY,130,0,1,Normal,120,N,0,Flat,1 346 | 51,M,ASY,120,0,1,Normal,104,N,0,Flat,1 347 | 69,M,ASY,135,0,0,Normal,130,N,0,Flat,1 348 | 59,M,ASY,120,0,0,Normal,115,N,0,Flat,1 349 | 48,M,ASY,115,0,1,Normal,128,N,0,Flat,1 350 | 69,M,ASY,137,0,0,ST,104,Y,1.6,Flat,1 351 | 36,M,ASY,110,0,1,Normal,125,Y,1,Flat,1 352 | 53,M,ASY,120,0,1,Normal,120,N,0,Flat,1 353 | 43,M,ASY,140,0,0,ST,140,Y,0.5,Up,1 354 | 56,M,ASY,120,0,0,ST,100,Y,-1,Down,1 355 | 58,M,ASY,130,0,0,ST,100,Y,1,Flat,1 356 | 55,M,ASY,120,0,0,ST,92,N,0.3,Up,1 357 | 67,M,TA,145,0,0,LVH,125,N,0,Flat,1 358 | 46,M,ASY,115,0,0,Normal,113,Y,1.5,Flat,1 359 | 53,M,ATA,120,0,0,Normal,95,N,0,Flat,1 360 | 38,M,NAP,115,0,0,Normal,128,Y,0,Flat,1 361 | 53,M,NAP,105,0,0,Normal,115,N,0,Flat,1 362 | 62,M,NAP,160,0,0,Normal,72,Y,0,Flat,1 363 | 47,M,ASY,160,0,0,Normal,124,Y,0,Flat,1 364 | 56,M,NAP,155,0,0,ST,99,N,0,Flat,1 365 | 56,M,ASY,120,0,0,ST,148,N,0,Flat,1 366 | 56,M,NAP,120,0,0,Normal,97,N,0,Flat,0 367 | 64,F,ASY,200,0,0,Normal,140,Y,1,Flat,1 368 | 61,M,ASY,150,0,0,Normal,117,Y,2,Flat,1 369 | 68,M,ASY,135,0,0,ST,120,Y,0,Up,1 370 | 57,M,ASY,140,0,0,Normal,120,Y,2,Flat,1 371 | 63,M,ASY,150,0,0,Normal,86,Y,2,Flat,1 372 | 60,M,ASY,135,0,0,Normal,63,Y,0.5,Up,1 373 | 66,M,ASY,150,0,0,Normal,108,Y,2,Flat,1 374 | 63,M,ASY,185,0,0,Normal,98,Y,0,Up,1 375 | 59,M,ASY,135,0,0,Normal,115,Y,1,Flat,1 376 | 61,M,ASY,125,0,0,Normal,105,Y,0,Down,1 377 | 73,F,NAP,160,0,0,ST,121,N,0,Up,1 378 | 47,M,NAP,155,0,0,Normal,118,Y,1,Flat,1 379 | 65,M,ASY,160,0,1,ST,122,N,1.2,Flat,1 380 | 70,M,ASY,140,0,1,Normal,157,Y,2,Flat,1 381 | 50,M,ASY,120,0,0,ST,156,Y,0,Up,1 382 | 60,M,ASY,160,0,0,ST,99,Y,0.5,Flat,1 383 | 50,M,ASY,115,0,0,Normal,120,Y,0.5,Flat,1 384 | 43,M,ASY,115,0,0,Normal,145,Y,2,Flat,1 385 | 38,F,ASY,110,0,0,Normal,156,N,0,Flat,1 386 | 54,M,ASY,120,0,0,Normal,155,N,0,Flat,1 387 | 61,M,ASY,150,0,0,Normal,105,Y,0,Flat,1 388 | 42,M,ASY,145,0,0,Normal,99,Y,0,Flat,1 389 | 53,M,ASY,130,0,0,LVH,135,Y,1,Flat,1 390 | 55,M,ASY,140,0,0,Normal,83,N,0,Flat,1 391 | 61,M,ASY,160,0,1,ST,145,N,1,Flat,1 392 | 51,M,ASY,140,0,0,Normal,60,N,0,Flat,1 393 | 70,M,ASY,115,0,0,ST,92,Y,0,Flat,1 394 | 61,M,ASY,130,0,0,LVH,115,N,0,Flat,1 395 | 38,M,ASY,150,0,1,Normal,120,Y,0.7,Flat,1 396 | 57,M,ASY,160,0,1,Normal,98,Y,2,Flat,1 397 | 38,M,ASY,135,0,1,Normal,150,N,0,Flat,1 398 | 62,F,TA,140,0,1,Normal,143,N,0,Flat,1 399 | 58,M,ASY,170,0,1,ST,105,Y,0,Flat,1 400 | 52,M,ASY,165,0,1,Normal,122,Y,1,Up,1 401 | 61,M,NAP,200,0,1,ST,70,N,0,Flat,1 402 | 50,F,ASY,160,0,1,Normal,110,N,0,Flat,1 403 | 51,M,ASY,130,0,1,ST,163,N,0,Flat,1 404 | 65,M,ASY,145,0,1,ST,67,N,0.7,Flat,1 405 | 52,M,ASY,135,0,1,Normal,128,Y,2,Flat,1 406 | 47,M,NAP,110,0,1,Normal,120,Y,0,Flat,1 407 | 35,M,ASY,120,0,1,Normal,130,Y,1.2,Flat,1 408 | 57,M,ASY,140,0,1,Normal,100,Y,0,Flat,1 409 | 62,M,ASY,115,0,1,Normal,72,Y,-0.5,Flat,1 410 | 59,M,ASY,110,0,1,Normal,94,N,0,Flat,1 411 | 53,M,NAP,160,0,1,LVH,122,Y,0,Flat,1 412 | 62,M,ASY,150,0,1,ST,78,N,2,Flat,1 413 | 54,M,ASY,180,0,1,Normal,150,N,1.5,Flat,1 414 | 56,M,ASY,125,0,1,Normal,103,Y,1,Flat,1 415 | 56,M,NAP,125,0,1,Normal,98,N,-2,Flat,1 416 | 54,M,ASY,130,0,1,Normal,110,Y,3,Flat,1 417 | 66,F,ASY,155,0,1,Normal,90,N,0,Flat,1 418 | 63,M,ASY,140,260,0,ST,112,Y,3,Flat,1 419 | 44,M,ASY,130,209,0,ST,127,N,0,Up,0 420 | 60,M,ASY,132,218,0,ST,140,Y,1.5,Down,1 421 | 55,M,ASY,142,228,0,ST,149,Y,2.5,Up,1 422 | 66,M,NAP,110,213,1,LVH,99,Y,1.3,Flat,0 423 | 66,M,NAP,120,0,0,ST,120,N,-0.5,Up,0 424 | 65,M,ASY,150,236,1,ST,105,Y,0,Flat,1 425 | 60,M,NAP,180,0,0,ST,140,Y,1.5,Flat,0 426 | 60,M,NAP,120,0,1,Normal,141,Y,2,Up,1 427 | 60,M,ATA,160,267,1,ST,157,N,0.5,Flat,1 428 | 56,M,ATA,126,166,0,ST,140,N,0,Up,0 429 | 59,M,ASY,140,0,0,ST,117,Y,1,Flat,1 430 | 62,M,ASY,110,0,0,Normal,120,Y,0.5,Flat,1 431 | 63,M,NAP,133,0,0,LVH,120,Y,1,Flat,1 432 | 57,M,ASY,128,0,1,ST,148,Y,1,Flat,1 433 | 62,M,ASY,120,220,0,ST,86,N,0,Up,0 434 | 63,M,ASY,170,177,0,Normal,84,Y,2.5,Down,1 435 | 46,M,ASY,110,236,0,Normal,125,Y,2,Flat,1 436 | 63,M,ASY,126,0,0,ST,120,N,1.5,Down,0 437 | 60,M,ASY,152,0,0,ST,118,Y,0,Up,0 438 | 58,M,ASY,116,0,0,Normal,124,N,1,Up,1 439 | 64,M,ASY,120,0,1,ST,106,N,2,Flat,1 440 | 63,M,NAP,130,0,0,ST,111,Y,0,Flat,1 441 | 74,M,NAP,138,0,0,Normal,116,N,0.2,Up,0 442 | 52,M,NAP,128,0,0,ST,180,N,3,Up,1 443 | 69,M,ASY,130,0,1,ST,129,N,1,Flat,1 444 | 51,M,ASY,128,0,1,ST,125,Y,1.2,Flat,1 445 | 60,M,ASY,130,186,1,ST,140,Y,0.5,Flat,1 446 | 56,M,ASY,120,100,0,Normal,120,Y,1.5,Flat,1 447 | 55,M,NAP,136,228,0,ST,124,Y,1.6,Flat,1 448 | 54,M,ASY,130,0,0,ST,117,Y,1.4,Flat,1 449 | 77,M,ASY,124,171,0,ST,110,Y,2,Up,1 450 | 63,M,ASY,160,230,1,Normal,105,Y,1,Flat,1 451 | 55,M,NAP,0,0,0,Normal,155,N,1.5,Flat,1 452 | 52,M,NAP,122,0,0,Normal,110,Y,2,Down,1 453 | 64,M,ASY,144,0,0,ST,122,Y,1,Flat,1 454 | 60,M,ASY,140,281,0,ST,118,Y,1.5,Flat,1 455 | 60,M,ASY,120,0,0,Normal,133,Y,2,Up,0 456 | 58,M,ASY,136,203,1,Normal,123,Y,1.2,Flat,1 457 | 59,M,ASY,154,0,0,ST,131,Y,1.5,Up,0 458 | 61,M,NAP,120,0,0,Normal,80,Y,0,Flat,1 459 | 40,M,ASY,125,0,1,Normal,165,N,0,Flat,1 460 | 61,M,ASY,134,0,1,ST,86,N,1.5,Flat,1 461 | 41,M,ASY,104,0,0,ST,111,N,0,Up,0 462 | 57,M,ASY,139,277,1,ST,118,Y,1.9,Flat,1 463 | 63,M,ASY,136,0,0,Normal,84,Y,0,Flat,1 464 | 59,M,ASY,122,233,0,Normal,117,Y,1.3,Down,1 465 | 51,M,ASY,128,0,0,Normal,107,N,0,Up,0 466 | 59,M,NAP,131,0,0,Normal,128,Y,2,Down,1 467 | 42,M,NAP,134,240,0,Normal,160,N,0,Up,0 468 | 55,M,NAP,120,0,0,ST,125,Y,2.5,Flat,1 469 | 63,F,ATA,132,0,0,Normal,130,N,0.1,Up,0 470 | 62,M,ASY,152,153,0,ST,97,Y,1.6,Up,1 471 | 56,M,ATA,124,224,1,Normal,161,N,2,Flat,0 472 | 53,M,ASY,126,0,0,Normal,106,N,0,Flat,1 473 | 68,M,ASY,138,0,0,Normal,130,Y,3,Flat,1 474 | 53,M,ASY,154,0,1,ST,140,Y,1.5,Flat,1 475 | 60,M,NAP,141,316,1,ST,122,Y,1.7,Flat,1 476 | 62,M,ATA,131,0,0,Normal,130,N,0.1,Up,0 477 | 59,M,ASY,178,0,1,LVH,120,Y,0,Flat,1 478 | 51,M,ASY,132,218,1,LVH,139,N,0.1,Up,0 479 | 61,M,ASY,110,0,1,Normal,108,Y,2,Down,1 480 | 57,M,ASY,130,311,1,ST,148,Y,2,Flat,1 481 | 56,M,NAP,170,0,0,LVH,123,Y,2.5,Flat,1 482 | 58,M,ATA,126,0,1,Normal,110,Y,2,Flat,1 483 | 69,M,NAP,140,0,1,ST,118,N,2.5,Down,1 484 | 67,M,TA,142,270,1,Normal,125,N,2.5,Up,1 485 | 58,M,ASY,120,0,0,LVH,106,Y,1.5,Down,1 486 | 65,M,ASY,134,0,0,Normal,112,Y,1.1,Flat,1 487 | 63,M,ATA,139,217,1,ST,128,Y,1.2,Flat,1 488 | 55,M,ATA,110,214,1,ST,180,N,0.4,Up,0 489 | 57,M,ASY,140,214,0,ST,144,Y,2,Flat,1 490 | 65,M,TA,140,252,0,Normal,135,N,0.3,Up,0 491 | 54,M,ASY,136,220,0,Normal,140,Y,3,Flat,1 492 | 72,M,NAP,120,214,0,Normal,102,Y,1,Flat,1 493 | 75,M,ASY,170,203,1,ST,108,N,0,Flat,1 494 | 49,M,TA,130,0,0,ST,145,N,3,Flat,1 495 | 51,M,NAP,137,339,0,Normal,127,Y,1.7,Flat,1 496 | 60,M,ASY,142,216,0,Normal,110,Y,2.5,Flat,1 497 | 64,F,ASY,142,276,0,Normal,140,Y,1,Flat,1 498 | 58,M,ASY,132,458,1,Normal,69,N,1,Down,0 499 | 61,M,ASY,146,241,0,Normal,148,Y,3,Down,1 500 | 67,M,ASY,160,384,1,ST,130,Y,0,Flat,1 501 | 62,M,ASY,135,297,0,Normal,130,Y,1,Flat,1 502 | 65,M,ASY,136,248,0,Normal,140,Y,4,Down,1 503 | 63,M,ASY,130,308,0,Normal,138,Y,2,Flat,1 504 | 69,M,ASY,140,208,0,ST,140,Y,2,Flat,1 505 | 51,M,ASY,132,227,1,ST,138,N,0.2,Up,0 506 | 62,M,ASY,158,210,1,Normal,112,Y,3,Down,1 507 | 55,M,NAP,136,245,1,ST,131,Y,1.2,Flat,1 508 | 75,M,ASY,136,225,0,Normal,112,Y,3,Flat,1 509 | 40,M,NAP,106,240,0,Normal,80,Y,0,Up,0 510 | 67,M,ASY,120,0,1,Normal,150,N,1.5,Down,1 511 | 58,M,ASY,110,198,0,Normal,110,N,0,Flat,1 512 | 60,M,ASY,136,195,0,Normal,126,N,0.3,Up,0 513 | 63,M,ASY,160,267,1,ST,88,Y,2,Flat,1 514 | 35,M,NAP,123,161,0,ST,153,N,-0.1,Up,0 515 | 62,M,TA,112,258,0,ST,150,Y,1.3,Flat,1 516 | 43,M,ASY,122,0,0,Normal,120,N,0.5,Up,1 517 | 63,M,NAP,130,0,1,ST,160,N,3,Flat,0 518 | 68,M,NAP,150,195,1,Normal,132,N,0,Flat,1 519 | 65,M,ASY,150,235,0,Normal,120,Y,1.5,Flat,1 520 | 48,M,NAP,102,0,1,ST,110,Y,1,Down,1 521 | 63,M,ASY,96,305,0,ST,121,Y,1,Up,1 522 | 64,M,ASY,130,223,0,ST,128,N,0.5,Flat,0 523 | 61,M,ASY,120,282,0,ST,135,Y,4,Down,1 524 | 50,M,ASY,144,349,0,LVH,120,Y,1,Up,1 525 | 59,M,ASY,124,160,0,Normal,117,Y,1,Flat,1 526 | 55,M,ASY,150,160,0,ST,150,N,0,Up,0 527 | 45,M,NAP,130,236,0,Normal,144,N,0.1,Up,0 528 | 65,M,ASY,144,312,0,LVH,113,Y,1.7,Flat,1 529 | 61,M,ATA,139,283,0,Normal,135,N,0.3,Up,0 530 | 49,M,NAP,131,142,0,Normal,127,Y,1.5,Flat,1 531 | 72,M,ASY,143,211,0,Normal,109,Y,1.4,Flat,1 532 | 50,M,ASY,133,218,0,Normal,128,Y,1.1,Flat,1 533 | 64,M,ASY,143,306,1,ST,115,Y,1.8,Flat,1 534 | 55,M,ASY,116,186,1,ST,102,N,0,Flat,1 535 | 63,M,ASY,110,252,0,ST,140,Y,2,Flat,1 536 | 59,M,ASY,125,222,0,Normal,135,Y,2.5,Down,1 537 | 56,M,ASY,130,0,0,LVH,122,Y,1,Flat,1 538 | 62,M,NAP,133,0,1,ST,119,Y,1.2,Flat,1 539 | 74,M,ASY,150,258,1,ST,130,Y,4,Down,1 540 | 54,M,ASY,130,202,1,Normal,112,Y,2,Flat,1 541 | 57,M,ASY,110,197,0,LVH,100,N,0,Up,0 542 | 62,M,NAP,138,204,0,ST,122,Y,1.2,Flat,1 543 | 76,M,NAP,104,113,0,LVH,120,N,3.5,Down,1 544 | 54,F,ASY,138,274,0,Normal,105,Y,1.5,Flat,1 545 | 70,M,ASY,170,192,0,ST,129,Y,3,Down,1 546 | 61,F,ATA,140,298,1,Normal,120,Y,0,Up,0 547 | 48,M,ASY,132,272,0,ST,139,N,0.2,Up,0 548 | 48,M,NAP,132,220,1,ST,162,N,0,Flat,1 549 | 61,M,TA,142,200,1,ST,100,N,1.5,Down,1 550 | 66,M,ASY,112,261,0,Normal,140,N,1.5,Up,1 551 | 68,M,TA,139,181,1,ST,135,N,0.2,Up,0 552 | 55,M,ASY,172,260,0,Normal,73,N,2,Flat,1 553 | 62,M,NAP,120,220,0,LVH,86,N,0,Up,0 554 | 71,M,NAP,144,221,0,Normal,108,Y,1.8,Flat,1 555 | 74,M,TA,145,216,1,Normal,116,Y,1.8,Flat,1 556 | 53,M,NAP,155,175,1,ST,160,N,0.3,Up,0 557 | 58,M,NAP,150,219,0,ST,118,Y,0,Flat,1 558 | 75,M,ASY,160,310,1,Normal,112,Y,2,Down,0 559 | 56,M,NAP,137,208,1,ST,122,Y,1.8,Flat,1 560 | 58,M,NAP,137,232,0,ST,124,Y,1.4,Flat,1 561 | 64,M,ASY,134,273,0,Normal,102,Y,4,Down,1 562 | 54,M,NAP,133,203,0,ST,137,N,0.2,Up,0 563 | 54,M,ATA,132,182,0,ST,141,N,0.1,Up,0 564 | 59,M,ASY,140,274,0,Normal,154,Y,2,Flat,0 565 | 55,M,ASY,135,204,1,ST,126,Y,1.1,Flat,1 566 | 57,M,ASY,144,270,1,ST,160,Y,2,Flat,1 567 | 61,M,ASY,141,292,0,ST,115,Y,1.7,Flat,1 568 | 41,M,ASY,150,171,0,Normal,128,Y,1.5,Flat,0 569 | 71,M,ASY,130,221,0,ST,115,Y,0,Flat,1 570 | 38,M,ASY,110,289,0,Normal,105,Y,1.5,Down,1 571 | 55,M,ASY,158,217,0,Normal,110,Y,2.5,Flat,1 572 | 56,M,ASY,128,223,0,ST,119,Y,2,Down,1 573 | 69,M,ASY,140,110,1,Normal,109,Y,1.5,Flat,1 574 | 64,M,ASY,150,193,0,ST,135,Y,0.5,Flat,1 575 | 72,M,ASY,160,123,1,LVH,130,N,1.5,Flat,1 576 | 69,M,ASY,142,210,1,ST,112,Y,1.5,Flat,1 577 | 56,M,ASY,137,282,1,Normal,126,Y,1.2,Flat,1 578 | 62,M,ASY,139,170,0,ST,120,Y,3,Flat,1 579 | 67,M,ASY,146,369,0,Normal,110,Y,1.9,Flat,1 580 | 57,M,ASY,156,173,0,LVH,119,Y,3,Down,1 581 | 69,M,ASY,145,289,1,ST,110,Y,1.8,Flat,1 582 | 51,M,ASY,131,152,1,LVH,130,Y,1,Flat,1 583 | 48,M,ASY,140,208,0,Normal,159,Y,1.5,Up,1 584 | 69,M,ASY,122,216,1,LVH,84,Y,0,Flat,1 585 | 69,M,NAP,142,271,0,LVH,126,N,0.3,Up,0 586 | 64,M,ASY,141,244,1,ST,116,Y,1.5,Flat,1 587 | 57,M,ATA,180,285,1,ST,120,N,0.8,Flat,1 588 | 53,M,ASY,124,243,0,Normal,122,Y,2,Flat,1 589 | 37,M,NAP,118,240,0,LVH,165,N,1,Flat,0 590 | 67,M,ASY,140,219,0,ST,122,Y,2,Flat,1 591 | 74,M,NAP,140,237,1,Normal,94,N,0,Flat,1 592 | 63,M,ATA,136,165,0,ST,133,N,0.2,Up,0 593 | 58,M,ASY,100,213,0,ST,110,N,0,Up,0 594 | 61,M,ASY,190,287,1,LVH,150,Y,2,Down,1 595 | 64,M,ASY,130,258,1,LVH,130,N,0,Flat,1 596 | 58,M,ASY,160,256,1,LVH,113,Y,1,Up,1 597 | 60,M,ASY,130,186,1,LVH,140,Y,0.5,Flat,1 598 | 57,M,ASY,122,264,0,LVH,100,N,0,Flat,1 599 | 55,M,NAP,133,185,0,ST,136,N,0.2,Up,0 600 | 55,M,ASY,120,226,0,LVH,127,Y,1.7,Down,1 601 | 56,M,ASY,130,203,1,Normal,98,N,1.5,Flat,1 602 | 57,M,ASY,130,207,0,ST,96,Y,1,Flat,0 603 | 61,M,NAP,140,284,0,Normal,123,Y,1.3,Flat,1 604 | 61,M,NAP,120,337,0,Normal,98,Y,0,Flat,1 605 | 74,M,ASY,155,310,0,Normal,112,Y,1.5,Down,1 606 | 68,M,NAP,134,254,1,Normal,151,Y,0,Up,0 607 | 51,F,ASY,114,258,1,LVH,96,N,1,Up,0 608 | 62,M,ASY,160,254,1,ST,108,Y,3,Flat,1 609 | 53,M,ASY,144,300,1,ST,128,Y,1.5,Flat,1 610 | 62,M,ASY,158,170,0,ST,138,Y,0,Flat,1 611 | 46,M,ASY,134,310,0,Normal,126,N,0,Flat,1 612 | 54,F,ASY,127,333,1,ST,154,N,0,Flat,1 613 | 62,M,TA,135,139,0,ST,137,N,0.2,Up,0 614 | 55,M,ASY,122,223,1,ST,100,N,0,Flat,1 615 | 58,M,ASY,140,385,1,LVH,135,N,0.3,Up,0 616 | 62,M,ATA,120,254,0,LVH,93,Y,0,Flat,1 617 | 70,M,ASY,130,322,0,LVH,109,N,2.4,Flat,1 618 | 67,F,NAP,115,564,0,LVH,160,N,1.6,Flat,0 619 | 57,M,ATA,124,261,0,Normal,141,N,0.3,Up,1 620 | 64,M,ASY,128,263,0,Normal,105,Y,0.2,Flat,0 621 | 74,F,ATA,120,269,0,LVH,121,Y,0.2,Up,0 622 | 65,M,ASY,120,177,0,Normal,140,N,0.4,Up,0 623 | 56,M,NAP,130,256,1,LVH,142,Y,0.6,Flat,1 624 | 59,M,ASY,110,239,0,LVH,142,Y,1.2,Flat,1 625 | 60,M,ASY,140,293,0,LVH,170,N,1.2,Flat,1 626 | 63,F,ASY,150,407,0,LVH,154,N,4,Flat,1 627 | 59,M,ASY,135,234,0,Normal,161,N,0.5,Flat,0 628 | 53,M,ASY,142,226,0,LVH,111,Y,0,Up,0 629 | 44,M,NAP,140,235,0,LVH,180,N,0,Up,0 630 | 61,M,TA,134,234,0,Normal,145,N,2.6,Flat,1 631 | 57,F,ASY,128,303,0,LVH,159,N,0,Up,0 632 | 71,F,ASY,112,149,0,Normal,125,N,1.6,Flat,0 633 | 46,M,ASY,140,311,0,Normal,120,Y,1.8,Flat,1 634 | 53,M,ASY,140,203,1,LVH,155,Y,3.1,Down,1 635 | 64,M,TA,110,211,0,LVH,144,Y,1.8,Flat,0 636 | 40,M,TA,140,199,0,Normal,178,Y,1.4,Up,0 637 | 67,M,ASY,120,229,0,LVH,129,Y,2.6,Flat,1 638 | 48,M,ATA,130,245,0,LVH,180,N,0.2,Flat,0 639 | 43,M,ASY,115,303,0,Normal,181,N,1.2,Flat,0 640 | 47,M,ASY,112,204,0,Normal,143,N,0.1,Up,0 641 | 54,F,ATA,132,288,1,LVH,159,Y,0,Up,0 642 | 48,F,NAP,130,275,0,Normal,139,N,0.2,Up,0 643 | 46,F,ASY,138,243,0,LVH,152,Y,0,Flat,0 644 | 51,F,NAP,120,295,0,LVH,157,N,0.6,Up,0 645 | 58,M,NAP,112,230,0,LVH,165,N,2.5,Flat,1 646 | 71,F,NAP,110,265,1,LVH,130,N,0,Up,0 647 | 57,M,NAP,128,229,0,LVH,150,N,0.4,Flat,1 648 | 66,M,ASY,160,228,0,LVH,138,N,2.3,Up,0 649 | 37,F,NAP,120,215,0,Normal,170,N,0,Up,0 650 | 59,M,ASY,170,326,0,LVH,140,Y,3.4,Down,1 651 | 50,M,ASY,144,200,0,LVH,126,Y,0.9,Flat,1 652 | 48,M,ASY,130,256,1,LVH,150,Y,0,Up,1 653 | 61,M,ASY,140,207,0,LVH,138,Y,1.9,Up,1 654 | 59,M,TA,160,273,0,LVH,125,N,0,Up,1 655 | 42,M,NAP,130,180,0,Normal,150,N,0,Up,0 656 | 48,M,ASY,122,222,0,LVH,186,N,0,Up,0 657 | 40,M,ASY,152,223,0,Normal,181,N,0,Up,1 658 | 62,F,ASY,124,209,0,Normal,163,N,0,Up,0 659 | 44,M,NAP,130,233,0,Normal,179,Y,0.4,Up,0 660 | 46,M,ATA,101,197,1,Normal,156,N,0,Up,0 661 | 59,M,NAP,126,218,1,Normal,134,N,2.2,Flat,1 662 | 58,M,NAP,140,211,1,LVH,165,N,0,Up,0 663 | 49,M,NAP,118,149,0,LVH,126,N,0.8,Up,1 664 | 44,M,ASY,110,197,0,LVH,177,N,0,Up,1 665 | 66,M,ATA,160,246,0,Normal,120,Y,0,Flat,1 666 | 65,F,ASY,150,225,0,LVH,114,N,1,Flat,1 667 | 42,M,ASY,136,315,0,Normal,125,Y,1.8,Flat,1 668 | 52,M,ATA,128,205,1,Normal,184,N,0,Up,0 669 | 65,F,NAP,140,417,1,LVH,157,N,0.8,Up,0 670 | 63,F,ATA,140,195,0,Normal,179,N,0,Up,0 671 | 45,F,ATA,130,234,0,LVH,175,N,0.6,Flat,0 672 | 41,F,ATA,105,198,0,Normal,168,N,0,Up,0 673 | 61,M,ASY,138,166,0,LVH,125,Y,3.6,Flat,1 674 | 60,F,NAP,120,178,1,Normal,96,N,0,Up,0 675 | 59,F,ASY,174,249,0,Normal,143,Y,0,Flat,1 676 | 62,M,ATA,120,281,0,LVH,103,N,1.4,Flat,1 677 | 57,M,NAP,150,126,1,Normal,173,N,0.2,Up,0 678 | 51,F,ASY,130,305,0,Normal,142,Y,1.2,Flat,1 679 | 44,M,NAP,120,226,0,Normal,169,N,0,Up,0 680 | 60,F,TA,150,240,0,Normal,171,N,0.9,Up,0 681 | 63,M,TA,145,233,1,LVH,150,N,2.3,Down,0 682 | 57,M,ASY,150,276,0,LVH,112,Y,0.6,Flat,1 683 | 51,M,ASY,140,261,0,LVH,186,Y,0,Up,0 684 | 58,F,ATA,136,319,1,LVH,152,N,0,Up,1 685 | 44,F,NAP,118,242,0,Normal,149,N,0.3,Flat,0 686 | 47,M,NAP,108,243,0,Normal,152,N,0,Up,1 687 | 61,M,ASY,120,260,0,Normal,140,Y,3.6,Flat,1 688 | 57,F,ASY,120,354,0,Normal,163,Y,0.6,Up,0 689 | 70,M,ATA,156,245,0,LVH,143,N,0,Up,0 690 | 76,F,NAP,140,197,0,ST,116,N,1.1,Flat,0 691 | 67,F,ASY,106,223,0,Normal,142,N,0.3,Up,0 692 | 45,M,ASY,142,309,0,LVH,147,Y,0,Flat,1 693 | 45,M,ASY,104,208,0,LVH,148,Y,3,Flat,0 694 | 39,F,NAP,94,199,0,Normal,179,N,0,Up,0 695 | 42,F,NAP,120,209,0,Normal,173,N,0,Flat,0 696 | 56,M,ATA,120,236,0,Normal,178,N,0.8,Up,0 697 | 58,M,ASY,146,218,0,Normal,105,N,2,Flat,1 698 | 35,M,ASY,120,198,0,Normal,130,Y,1.6,Flat,1 699 | 58,M,ASY,150,270,0,LVH,111,Y,0.8,Up,1 700 | 41,M,NAP,130,214,0,LVH,168,N,2,Flat,0 701 | 57,M,ASY,110,201,0,Normal,126,Y,1.5,Flat,0 702 | 42,M,TA,148,244,0,LVH,178,N,0.8,Up,0 703 | 62,M,ATA,128,208,1,LVH,140,N,0,Up,0 704 | 59,M,TA,178,270,0,LVH,145,N,4.2,Down,0 705 | 41,F,ATA,126,306,0,Normal,163,N,0,Up,0 706 | 50,M,ASY,150,243,0,LVH,128,N,2.6,Flat,1 707 | 59,M,ATA,140,221,0,Normal,164,Y,0,Up,0 708 | 61,F,ASY,130,330,0,LVH,169,N,0,Up,1 709 | 54,M,ASY,124,266,0,LVH,109,Y,2.2,Flat,1 710 | 54,M,ASY,110,206,0,LVH,108,Y,0,Flat,1 711 | 52,M,ASY,125,212,0,Normal,168,N,1,Up,1 712 | 47,M,ASY,110,275,0,LVH,118,Y,1,Flat,1 713 | 66,M,ASY,120,302,0,LVH,151,N,0.4,Flat,0 714 | 58,M,ASY,100,234,0,Normal,156,N,0.1,Up,1 715 | 64,F,NAP,140,313,0,Normal,133,N,0.2,Up,0 716 | 50,F,ATA,120,244,0,Normal,162,N,1.1,Up,0 717 | 44,F,NAP,108,141,0,Normal,175,N,0.6,Flat,0 718 | 67,M,ASY,120,237,0,Normal,71,N,1,Flat,1 719 | 49,F,ASY,130,269,0,Normal,163,N,0,Up,0 720 | 57,M,ASY,165,289,1,LVH,124,N,1,Flat,1 721 | 63,M,ASY,130,254,0,LVH,147,N,1.4,Flat,1 722 | 48,M,ASY,124,274,0,LVH,166,N,0.5,Flat,1 723 | 51,M,NAP,100,222,0,Normal,143,Y,1.2,Flat,0 724 | 60,F,ASY,150,258,0,LVH,157,N,2.6,Flat,1 725 | 59,M,ASY,140,177,0,Normal,162,Y,0,Up,1 726 | 45,F,ATA,112,160,0,Normal,138,N,0,Flat,0 727 | 55,F,ASY,180,327,0,ST,117,Y,3.4,Flat,1 728 | 41,M,ATA,110,235,0,Normal,153,N,0,Up,0 729 | 60,F,ASY,158,305,0,LVH,161,N,0,Up,1 730 | 54,F,NAP,135,304,1,Normal,170,N,0,Up,0 731 | 42,M,ATA,120,295,0,Normal,162,N,0,Up,0 732 | 49,F,ATA,134,271,0,Normal,162,N,0,Flat,0 733 | 46,M,ASY,120,249,0,LVH,144,N,0.8,Up,1 734 | 56,F,ASY,200,288,1,LVH,133,Y,4,Down,1 735 | 66,F,TA,150,226,0,Normal,114,N,2.6,Down,0 736 | 56,M,ASY,130,283,1,LVH,103,Y,1.6,Down,1 737 | 49,M,NAP,120,188,0,Normal,139,N,2,Flat,1 738 | 54,M,ASY,122,286,0,LVH,116,Y,3.2,Flat,1 739 | 57,M,ASY,152,274,0,Normal,88,Y,1.2,Flat,1 740 | 65,F,NAP,160,360,0,LVH,151,N,0.8,Up,0 741 | 54,M,NAP,125,273,0,LVH,152,N,0.5,Down,0 742 | 54,F,NAP,160,201,0,Normal,163,N,0,Up,0 743 | 62,M,ASY,120,267,0,Normal,99,Y,1.8,Flat,1 744 | 52,F,NAP,136,196,0,LVH,169,N,0.1,Flat,0 745 | 52,M,ATA,134,201,0,Normal,158,N,0.8,Up,0 746 | 60,M,ASY,117,230,1,Normal,160,Y,1.4,Up,1 747 | 63,F,ASY,108,269,0,Normal,169,Y,1.8,Flat,1 748 | 66,M,ASY,112,212,0,LVH,132,Y,0.1,Up,1 749 | 42,M,ASY,140,226,0,Normal,178,N,0,Up,0 750 | 64,M,ASY,120,246,0,LVH,96,Y,2.2,Down,1 751 | 54,M,NAP,150,232,0,LVH,165,N,1.6,Up,0 752 | 46,F,NAP,142,177,0,LVH,160,Y,1.4,Down,0 753 | 67,F,NAP,152,277,0,Normal,172,N,0,Up,0 754 | 56,M,ASY,125,249,1,LVH,144,Y,1.2,Flat,1 755 | 34,F,ATA,118,210,0,Normal,192,N,0.7,Up,0 756 | 57,M,ASY,132,207,0,Normal,168,Y,0,Up,0 757 | 64,M,ASY,145,212,0,LVH,132,N,2,Flat,1 758 | 59,M,ASY,138,271,0,LVH,182,N,0,Up,0 759 | 50,M,NAP,140,233,0,Normal,163,N,0.6,Flat,1 760 | 51,M,TA,125,213,0,LVH,125,Y,1.4,Up,0 761 | 54,M,ATA,192,283,0,LVH,195,N,0,Up,1 762 | 53,M,ASY,123,282,0,Normal,95,Y,2,Flat,1 763 | 52,M,ASY,112,230,0,Normal,160,N,0,Up,1 764 | 40,M,ASY,110,167,0,LVH,114,Y,2,Flat,1 765 | 58,M,NAP,132,224,0,LVH,173,N,3.2,Up,1 766 | 41,F,NAP,112,268,0,LVH,172,Y,0,Up,0 767 | 41,M,NAP,112,250,0,Normal,179,N,0,Up,0 768 | 50,F,NAP,120,219,0,Normal,158,N,1.6,Flat,0 769 | 54,F,NAP,108,267,0,LVH,167,N,0,Up,0 770 | 64,F,ASY,130,303,0,Normal,122,N,2,Flat,0 771 | 51,F,NAP,130,256,0,LVH,149,N,0.5,Up,0 772 | 46,F,ATA,105,204,0,Normal,172,N,0,Up,0 773 | 55,M,ASY,140,217,0,Normal,111,Y,5.6,Down,1 774 | 45,M,ATA,128,308,0,LVH,170,N,0,Up,0 775 | 56,M,TA,120,193,0,LVH,162,N,1.9,Flat,0 776 | 66,F,ASY,178,228,1,Normal,165,Y,1,Flat,1 777 | 38,M,TA,120,231,0,Normal,182,Y,3.8,Flat,1 778 | 62,F,ASY,150,244,0,Normal,154,Y,1.4,Flat,1 779 | 55,M,ATA,130,262,0,Normal,155,N,0,Up,0 780 | 58,M,ASY,128,259,0,LVH,130,Y,3,Flat,1 781 | 43,M,ASY,110,211,0,Normal,161,N,0,Up,0 782 | 64,F,ASY,180,325,0,Normal,154,Y,0,Up,0 783 | 50,F,ASY,110,254,0,LVH,159,N,0,Up,0 784 | 53,M,NAP,130,197,1,LVH,152,N,1.2,Down,0 785 | 45,F,ASY,138,236,0,LVH,152,Y,0.2,Flat,0 786 | 65,M,TA,138,282,1,LVH,174,N,1.4,Flat,1 787 | 69,M,TA,160,234,1,LVH,131,N,0.1,Flat,0 788 | 69,M,NAP,140,254,0,LVH,146,N,2,Flat,1 789 | 67,M,ASY,100,299,0,LVH,125,Y,0.9,Flat,1 790 | 68,F,NAP,120,211,0,LVH,115,N,1.5,Flat,0 791 | 34,M,TA,118,182,0,LVH,174,N,0,Up,0 792 | 62,F,ASY,138,294,1,Normal,106,N,1.9,Flat,1 793 | 51,M,ASY,140,298,0,Normal,122,Y,4.2,Flat,1 794 | 46,M,NAP,150,231,0,Normal,147,N,3.6,Flat,1 795 | 67,M,ASY,125,254,1,Normal,163,N,0.2,Flat,1 796 | 50,M,NAP,129,196,0,Normal,163,N,0,Up,0 797 | 42,M,NAP,120,240,1,Normal,194,N,0.8,Down,0 798 | 56,F,ASY,134,409,0,LVH,150,Y,1.9,Flat,1 799 | 41,M,ASY,110,172,0,LVH,158,N,0,Up,1 800 | 42,F,ASY,102,265,0,LVH,122,N,0.6,Flat,0 801 | 53,M,NAP,130,246,1,LVH,173,N,0,Up,0 802 | 43,M,NAP,130,315,0,Normal,162,N,1.9,Up,0 803 | 56,M,ASY,132,184,0,LVH,105,Y,2.1,Flat,1 804 | 52,M,ASY,108,233,1,Normal,147,N,0.1,Up,0 805 | 62,F,ASY,140,394,0,LVH,157,N,1.2,Flat,0 806 | 70,M,NAP,160,269,0,Normal,112,Y,2.9,Flat,1 807 | 54,M,ASY,140,239,0,Normal,160,N,1.2,Up,0 808 | 70,M,ASY,145,174,0,Normal,125,Y,2.6,Down,1 809 | 54,M,ATA,108,309,0,Normal,156,N,0,Up,0 810 | 35,M,ASY,126,282,0,LVH,156,Y,0,Up,1 811 | 48,M,NAP,124,255,1,Normal,175,N,0,Up,0 812 | 55,F,ATA,135,250,0,LVH,161,N,1.4,Flat,0 813 | 58,F,ASY,100,248,0,LVH,122,N,1,Flat,0 814 | 54,F,NAP,110,214,0,Normal,158,N,1.6,Flat,0 815 | 69,F,TA,140,239,0,Normal,151,N,1.8,Up,0 816 | 77,M,ASY,125,304,0,LVH,162,Y,0,Up,1 817 | 68,M,NAP,118,277,0,Normal,151,N,1,Up,0 818 | 58,M,ASY,125,300,0,LVH,171,N,0,Up,1 819 | 60,M,ASY,125,258,0,LVH,141,Y,2.8,Flat,1 820 | 51,M,ASY,140,299,0,Normal,173,Y,1.6,Up,1 821 | 55,M,ASY,160,289,0,LVH,145,Y,0.8,Flat,1 822 | 52,M,TA,152,298,1,Normal,178,N,1.2,Flat,0 823 | 60,F,NAP,102,318,0,Normal,160,N,0,Up,0 824 | 58,M,NAP,105,240,0,LVH,154,Y,0.6,Flat,0 825 | 64,M,NAP,125,309,0,Normal,131,Y,1.8,Flat,1 826 | 37,M,NAP,130,250,0,Normal,187,N,3.5,Down,0 827 | 59,M,TA,170,288,0,LVH,159,N,0.2,Flat,1 828 | 51,M,NAP,125,245,1,LVH,166,N,2.4,Flat,0 829 | 43,F,NAP,122,213,0,Normal,165,N,0.2,Flat,0 830 | 58,M,ASY,128,216,0,LVH,131,Y,2.2,Flat,1 831 | 29,M,ATA,130,204,0,LVH,202,N,0,Up,0 832 | 41,F,ATA,130,204,0,LVH,172,N,1.4,Up,0 833 | 63,F,NAP,135,252,0,LVH,172,N,0,Up,0 834 | 51,M,NAP,94,227,0,Normal,154,Y,0,Up,0 835 | 54,M,NAP,120,258,0,LVH,147,N,0.4,Flat,0 836 | 44,M,ATA,120,220,0,Normal,170,N,0,Up,0 837 | 54,M,ASY,110,239,0,Normal,126,Y,2.8,Flat,1 838 | 65,M,ASY,135,254,0,LVH,127,N,2.8,Flat,1 839 | 57,M,NAP,150,168,0,Normal,174,N,1.6,Up,0 840 | 63,M,ASY,130,330,1,LVH,132,Y,1.8,Up,1 841 | 35,F,ASY,138,183,0,Normal,182,N,1.4,Up,0 842 | 41,M,ATA,135,203,0,Normal,132,N,0,Flat,0 843 | 62,F,NAP,130,263,0,Normal,97,N,1.2,Flat,1 844 | 43,F,ASY,132,341,1,LVH,136,Y,3,Flat,1 845 | 58,F,TA,150,283,1,LVH,162,N,1,Up,0 846 | 52,M,TA,118,186,0,LVH,190,N,0,Flat,0 847 | 61,F,ASY,145,307,0,LVH,146,Y,1,Flat,1 848 | 39,M,ASY,118,219,0,Normal,140,N,1.2,Flat,1 849 | 45,M,ASY,115,260,0,LVH,185,N,0,Up,0 850 | 52,M,ASY,128,255,0,Normal,161,Y,0,Up,1 851 | 62,M,NAP,130,231,0,Normal,146,N,1.8,Flat,0 852 | 62,F,ASY,160,164,0,LVH,145,N,6.2,Down,1 853 | 53,F,ASY,138,234,0,LVH,160,N,0,Up,0 854 | 43,M,ASY,120,177,0,LVH,120,Y,2.5,Flat,1 855 | 47,M,NAP,138,257,0,LVH,156,N,0,Up,0 856 | 52,M,ATA,120,325,0,Normal,172,N,0.2,Up,0 857 | 68,M,NAP,180,274,1,LVH,150,Y,1.6,Flat,1 858 | 39,M,NAP,140,321,0,LVH,182,N,0,Up,0 859 | 53,F,ASY,130,264,0,LVH,143,N,0.4,Flat,0 860 | 62,F,ASY,140,268,0,LVH,160,N,3.6,Down,1 861 | 51,F,NAP,140,308,0,LVH,142,N,1.5,Up,0 862 | 60,M,ASY,130,253,0,Normal,144,Y,1.4,Up,1 863 | 65,M,ASY,110,248,0,LVH,158,N,0.6,Up,1 864 | 65,F,NAP,155,269,0,Normal,148,N,0.8,Up,0 865 | 60,M,NAP,140,185,0,LVH,155,N,3,Flat,1 866 | 60,M,ASY,145,282,0,LVH,142,Y,2.8,Flat,1 867 | 54,M,ASY,120,188,0,Normal,113,N,1.4,Flat,1 868 | 44,M,ATA,130,219,0,LVH,188,N,0,Up,0 869 | 44,M,ASY,112,290,0,LVH,153,N,0,Up,1 870 | 51,M,NAP,110,175,0,Normal,123,N,0.6,Up,0 871 | 59,M,NAP,150,212,1,Normal,157,N,1.6,Up,0 872 | 71,F,ATA,160,302,0,Normal,162,N,0.4,Up,0 873 | 61,M,NAP,150,243,1,Normal,137,Y,1,Flat,0 874 | 55,M,ASY,132,353,0,Normal,132,Y,1.2,Flat,1 875 | 64,M,NAP,140,335,0,Normal,158,N,0,Up,1 876 | 43,M,ASY,150,247,0,Normal,171,N,1.5,Up,0 877 | 58,F,NAP,120,340,0,Normal,172,N,0,Up,0 878 | 60,M,ASY,130,206,0,LVH,132,Y,2.4,Flat,1 879 | 58,M,ATA,120,284,0,LVH,160,N,1.8,Flat,1 880 | 49,M,ATA,130,266,0,Normal,171,N,0.6,Up,0 881 | 48,M,ATA,110,229,0,Normal,168,N,1,Down,1 882 | 52,M,NAP,172,199,1,Normal,162,N,0.5,Up,0 883 | 44,M,ATA,120,263,0,Normal,173,N,0,Up,0 884 | 56,F,ATA,140,294,0,LVH,153,N,1.3,Flat,0 885 | 57,M,ASY,140,192,0,Normal,148,N,0.4,Flat,0 886 | 67,M,ASY,160,286,0,LVH,108,Y,1.5,Flat,1 887 | 53,F,NAP,128,216,0,LVH,115,N,0,Up,0 888 | 52,M,NAP,138,223,0,Normal,169,N,0,Up,0 889 | 43,M,ASY,132,247,1,LVH,143,Y,0.1,Flat,1 890 | 52,M,ASY,128,204,1,Normal,156,Y,1,Flat,1 891 | 59,M,TA,134,204,0,Normal,162,N,0.8,Up,1 892 | 64,M,TA,170,227,0,LVH,155,N,0.6,Flat,0 893 | 66,F,NAP,146,278,0,LVH,152,N,0,Flat,0 894 | 39,F,NAP,138,220,0,Normal,152,N,0,Flat,0 895 | 57,M,ATA,154,232,0,LVH,164,N,0,Up,1 896 | 58,F,ASY,130,197,0,Normal,131,N,0.6,Flat,0 897 | 57,M,ASY,110,335,0,Normal,143,Y,3,Flat,1 898 | 47,M,NAP,130,253,0,Normal,179,N,0,Up,0 899 | 55,F,ASY,128,205,0,ST,130,Y,2,Flat,1 900 | 35,M,ATA,122,192,0,Normal,174,N,0,Up,0 901 | 61,M,ASY,148,203,0,Normal,161,N,0,Up,1 902 | 58,M,ASY,114,318,0,ST,140,N,4.4,Down,1 903 | 58,F,ASY,170,225,1,LVH,146,Y,2.8,Flat,1 904 | 58,M,ATA,125,220,0,Normal,144,N,0.4,Flat,0 905 | 56,M,ATA,130,221,0,LVH,163,N,0,Up,0 906 | 56,M,ATA,120,240,0,Normal,169,N,0,Down,0 907 | 67,M,NAP,152,212,0,LVH,150,N,0.8,Flat,1 908 | 55,F,ATA,132,342,0,Normal,166,N,1.2,Up,0 909 | 44,M,ASY,120,169,0,Normal,144,Y,2.8,Down,1 910 | 63,M,ASY,140,187,0,LVH,144,Y,4,Up,1 911 | 63,F,ASY,124,197,0,Normal,136,Y,0,Flat,1 912 | 41,M,ATA,120,157,0,Normal,182,N,0,Up,0 913 | 59,M,ASY,164,176,1,LVH,90,N,1,Flat,1 914 | 57,F,ASY,140,241,0,Normal,123,Y,0.2,Flat,1 915 | 45,M,TA,110,264,0,Normal,132,N,1.2,Flat,1 916 | 68,M,ASY,144,193,1,Normal,141,N,3.4,Flat,1 917 | 57,M,ASY,130,131,0,Normal,115,Y,1.2,Flat,1 918 | 57,F,ATA,130,236,0,LVH,174,N,0,Flat,1 919 | 38,M,NAP,138,175,0,Normal,173,N,0,Up,0 920 | --------------------------------------------------------------------------------