Private
Public Access
1
0

Merge branch 'feature/newdataflow' into develop

This commit is contained in:
2025-11-16 13:11:52 +01:00
32 changed files with 3738 additions and 2402 deletions

View File

@@ -9,6 +9,9 @@ nu = datetime.datetime.now()
from django.db import transaction
from rowers.views import add_defaultfavorites
from rowers.dataflow import process_single_file, upload_handler
from django.core.files.uploadedfile import SimpleUploadedFile
from django.conf import settings
#@pytest.mark.django_db
@override_settings(TESTING=True)
@@ -28,6 +31,55 @@ class ViewTest(TestCase):
self.nu = datetime.datetime.now()
file_list = ['rowers/tests/testdata/testdata.csv',
'rowers/tests/testdata/testdata.csv',
]
@parameterized.expand(file_list)
def test_upload_view(self, filename):
# simple test to see if upload view works. Submits a DocumentsForm to /rowers/workout/upload/
login = self.c.login(username='john',password='koeinsloot')
self.assertTrue(login)
with open(filename, 'rb') as f:
file_content = f.read()
uploaded_file = SimpleUploadedFile(
"testdata.csv",
file_content,
content_type="text/csv"
)
form_data = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
'file': filename,
}
request = RequestFactory()
request.user = self.u
form = DocumentsForm(data = form_data,files={'file': uploaded_file})
self.assertTrue(form.is_valid())
optionsform = UploadOptionsForm(form_data,request=request)
self.assertTrue(optionsform.is_valid())
response = self.c.post('/rowers/workout/upload/', data = form_data,
files = {'file': uploaded_file}, follow=True)
uploadoptions = form.cleaned_data.copy()
uploadoptions.update(optionsform.cleaned_data)
result = upload_handler(uploadoptions, filename)
self.assertEqual(result["status"], "processing")
@patch('rowers.dataprep.create_engine')
@patch('rowers.dataprep.read_data',side_effect=mocked_read_data)
def test_upload_view_sled(self, mocked_sqlalchemy,mocked_read_data):
@@ -35,57 +87,45 @@ class ViewTest(TestCase):
self.assertTrue(login)
filename = 'rowers/tests/testdata/testdata.csv'
f = open(filename,'rb')
file_data = {'file': f}
form_data = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'rpe':4,
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
'file': f,
with open(filename,'rb') as f:
file_data = {'file': f}
form_data = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
}
request = RequestFactory()
request.user = self.u
form = DocumentsForm(form_data,file_data)
request = RequestFactory()
request.user = self.u
form = DocumentsForm(data = form_data,files=file_data)
if not form.is_valid():
print(form.errors)
self.assertTrue(form.is_valid())
optionsform = UploadOptionsForm(form_data,request=request)
self.assertTrue(optionsform.is_valid())
optionsform = UploadOptionsForm(form_data,request=request)
self.assertTrue(optionsform.is_valid())
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
response = self.c.post('/rowers/workout/upload/', data = form_data,
files = file_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200)
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/'+encoded1+'/', form_data, follow=True)
self.assertEqual(response.status_code, 200)
uploadoptions = form.cleaned_data.copy()
uploadoptions.update(optionsform.cleaned_data)
result = process_single_file(f, uploadoptions, 1)
self.assertEqual(result, True)
response = self.c.get('/rowers/workout/'+encoded1+'/edit/', form_data, follow=True)
self.assertEqual(response.status_code, 200)
f.close()
response = self.c.get('/rowers/workout/'+encoded1+'/workflow/',
follow=True)
self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/'+encoded1+'/get-thumbnails/',
follow=True)
self.assertEqual(response.status_code, 200)
form_data = {
'name':'aap',
@@ -206,7 +246,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -252,7 +292,7 @@ class ViewTest(TestCase):
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -326,7 +366,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -366,7 +406,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -406,7 +446,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -446,7 +486,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -454,13 +494,13 @@ class ViewTest(TestCase):
url = reverse('otw_use_gps',kwargs={'id':encoded1})
response = self.c.get(url,follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
url = reverse('otw_use_impeller',kwargs={'id':encoded1})
response = self.c.get(url,follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
@@ -502,7 +542,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -541,7 +581,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -581,7 +621,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -622,7 +662,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -662,7 +702,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -699,7 +739,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -735,7 +775,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -773,7 +813,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -811,7 +851,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -847,7 +887,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -885,7 +925,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -923,7 +963,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
@@ -958,7 +998,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)

View File

@@ -9,6 +9,7 @@ import pandas as pd
nu = datetime.datetime.now()
from rowers import tasks
from rowers import upload_tasks
import rowers.courses as courses
from rowers.integrations.sporttracks import default as stdefault
@@ -91,76 +92,76 @@ class AsyncTaskTests(TestCase):
def test_summaryfromsplitdata(self):
splitdata = [
{
"type": "distance",
"time": 415,
"rest_time": 600,
"stroke_rate": 35,
"distance": 220,
"heart_rate": {
"ending": 160,
"rest": 60
}
{
"type": "distance",
"time": 415,
"rest_time": 600,
"stroke_rate": 35,
"distance": 220,
"heart_rate": {
"ending": 160,
"rest": 60
}
},
{
"type": "distance",
"time": 347,
"rest_time": 600,
"stroke_rate": 45,
"distance": 220,
"heart_rate": {
"ending": 170,
"rest": 70
}
}
]
data = {
"date": "2015-08-30 14:24:00",
"timezone": "Europe/London",
"distance": 440,
"time": 762,
"type": "rower",
"weight_class": "H",
"heart_rate": {
"average": 140
},
"workout_type": "FixedDistanceInterval",
"rest_distance": 43,
"rest_time": 1200,
"workout": {
"targets": {
"stroke_rate": 30,
"heart_rate_zone": 4,
"pace": 1050
},
"intervals": [
{
"type": "distance",
"time": 415,
"rest_time": 600,
"stroke_rate": 35,
"distance": 220,
"heart_rate": {
"ending": 160,
"rest": 60
}
},
{
"type": "distance",
"time": 347,
"rest_time": 600,
"stroke_rate": 45,
"distance": 220,
"heart_rate": {
"ending": 170,
"rest": 70
}
}
{
"type": "distance",
"time": 347,
"rest_time": 600,
"stroke_rate": 45,
"distance": 220,
"heart_rate": {
"ending": 170,
"rest": 70
}
}
]
data = {
"date": "2015-08-30 14:24:00",
"timezone": "Europe/London",
"distance": 440,
"time": 762,
"type": "rower",
"weight_class": "H",
"heart_rate": {
"average": 140
},
"workout_type": "FixedDistanceInterval",
"rest_distance": 43,
"rest_time": 1200,
"workout": {
"targets": {
"stroke_rate": 30,
"heart_rate_zone": 4,
"pace": 1050
},
"intervals": [
{
"type": "distance",
"time": 415,
"rest_time": 600,
"stroke_rate": 35,
"distance": 220,
"heart_rate": {
"ending": 160,
"rest": 60
}
},
{
"type": "distance",
"time": 347,
"rest_time": 600,
"stroke_rate": 45,
"distance": 220,
"heart_rate": {
"ending": 170,
"rest": 70
}
}
]
}
}
}
res = tasks.summaryfromsplitdata(splitdata,data,'test.csv')
res = upload_tasks.summaryfromsplitdata(splitdata,data,'test.csv')
self.assertEqual(len(res[0]),478)
@@ -182,7 +183,7 @@ class AsyncTaskTests(TestCase):
@patch('rowers.tasks.requests.post',side_effect=mocked_requests)
@patch('rowers.tasks.requests.session',side_effect=mocked_requests)
def test_fetch_strava_workout(self, mock_get, mock_post, mock_Session):
res = tasks.fetch_strava_workout('aap',None,12,'rowers/tests/testdata/temp/tesmp.csv',
res = upload_tasks.fetch_strava_workout('aap',None,12,'rowers/tests/testdata/temp/tesmp.csv',
self.u.id)
self.assertEqual(res,1)

View File

@@ -13,7 +13,7 @@ import numpy as np
import rowers
from rowers import dataprep
from rowers import tasks
from rowers import tasks, upload_tasks
import urllib
import json
@@ -703,7 +703,7 @@ class C2Objects(DjangoTestCase):
response = self.c.get('/rowers/workout/c2import/31/',follow=True)
expected_url = '/rowers/workout/c2import/'
result = tasks.handle_c2_getworkout(self.r.user.id,self.r.c2token,31,self.r.defaulttimezone)
result = upload_tasks.handle_c2_getworkout(self.r.user.id,self.r.c2token,31,self.r.defaulttimezone)
self.assertRedirects(response,
expected_url=expected_url,
@@ -733,8 +733,8 @@ class C2Objects(DjangoTestCase):
for item in c2workoutdata['data']:
alldata[item['id']] = item
res = tasks.handle_c2_async_workout(alldata,self.u.id,self.r.c2token,33991243,0,self.r.defaulttimezone)
self.assertEqual(res,1)
res = upload_tasks.handle_c2_async_workout(alldata,self.u.id,self.r.c2token,33991243,0,self.r.defaulttimezone)
self.assertEqual(res, 1)
@override_settings(TESTING=True)
@@ -1309,7 +1309,7 @@ class RP3Objects(DjangoTestCase):
startdatetime = timezone.now()-datetime.timedelta(days=30)
max_attempts = 2
res = tasks.handle_rp3_async_workout(userid,rp3token,rp3id,startdatetime,max_attempts)
res = upload_tasks.handle_rp3_async_workout(userid,rp3token,rp3id,startdatetime,max_attempts)
self.assertEqual(res,1)
@patch('rowers.integrations.rp3.requests.post', side_effect=mocked_requests)

View File

@@ -714,8 +714,6 @@ class PermissionsViewTests(TestCase):
url = reverse('team_workout_upload_view')
aantal = len(Workout.objects.filter(user=self.rbasic))
response = self.c.get(url)
self.assertEqual(response.status_code,200)
@@ -743,9 +741,6 @@ class PermissionsViewTests(TestCase):
expected_url = url,
status_code=302,target_status_code=200)
aantal2 = len(Workout.objects.filter(user=self.rbasic))
self.assertEqual(aantal2,aantal+1)
## Coach can upload on behalf of athlete - if team allows
@patch('rowers.dataprep.create_engine')

View File

@@ -19,6 +19,7 @@ import polars as pl
from rowers import interactiveplots
from rowers import dataprep
from rowers import tasks
from rowers import upload_tasks
from rowers import plannedsessions
from rowers.views.workoutviews import get_video_id
@@ -124,7 +125,7 @@ class OtherUnitTests(TestCase):
s = f.read()
data = json.loads(s)
splitdata = data['workout']['intervals']
summary = tasks.summaryfromsplitdata(splitdata,data,'aap.txt')
summary = upload_tasks.summaryfromsplitdata(splitdata,data,'aap.txt')
self.assertEqual(len(summary),3)
sums = summary[0]
@@ -444,6 +445,7 @@ class DataPrepTests(TestCase):
self.u.save()
result = get_random_file(filename='rowers/tests/testdata/uherskehradiste_otw.csv')
self.wuh_otw = WorkoutFactory(user=self.r,
csvfilename=result['filename'],
@@ -477,7 +479,6 @@ class DataPrepTests(TestCase):
pass
def test_timezones(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
aware = datetime.datetime(2021,6,16,7,54,9,999000,tzinfo=pytz.timezone('Europe/Amsterdam'))
row.rowdatetime = aware
@@ -496,7 +497,6 @@ class DataPrepTests(TestCase):
def test_timezones2(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
naive = datetime.datetime(2021,6,16,7,54,9,999000)
timezone = pytz.timezone('Europe/Prague')
@@ -517,7 +517,6 @@ class DataPrepTests(TestCase):
self.assertEqual(startdate,'2021-06-16')
def test_timezones3(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
naive = datetime.datetime(2021,6,16,7,54,9,999000)
row.rowdatetime = naive
@@ -527,7 +526,6 @@ class DataPrepTests(TestCase):
self.assertEqual(timezone_str,'Europe/Amsterdam')
def test_timezones4(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
naive = datetime.datetime(2021,6,15,19,55,13,400000)
timezone = pytz.timezone('America/Los_Angeles')
@@ -553,7 +551,6 @@ class DataPrepTests(TestCase):
self.assertEqual(startdate,'2021-06-15')
def test_timezones5(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
naive = datetime.datetime(2021,6,15,19,55,13,400000)
timezone = pytz.timezone('America/Los_Angeles')

View File

@@ -39,128 +39,7 @@ class ForceUnits(TestCase):
def tearDown(self):
dataprep.delete_strokedata(1)
def test_upload_painsled_lbs(self):
login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login)
filename = 'rowers/tests/testdata/PainsledForce.csv'
f = open(filename,'rb')
file_data = {'file': f}
form_data = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'upload_to_c2':False,
'plottype':'timeplot',
'rpe': 1,
'file': f,
}
form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded13+'/edit/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
f.close()
w = Workout.objects.get(id=1)
self.assertEqual(w.forceunit,'lbs')
df = dataprep.read_data(['averageforce'],ids=[13])
df = dataprep.remove_nulls_pl(df)
average_N = int(df['averageforce'].mean())
self.assertEqual(average_N,400)
data = dataprep.read_df_sql(13)
average_N = int(data['averageforce'].mean())
self.assertEqual(average_N,398)
df,row = dataprep.getrowdata_db(id=13)
average_N = int(df['averageforce'].mean())
self.assertEqual(average_N,398)
df = dataprep.clean_df_stats(df,ignoreadvanced=False)
average_N = int(df['averageforce'].mean())
self.assertEqual(average_N,398)
def test_upload_speedcoach_N(self):
login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login)
filename = 'rowers/tests/testdata/EmpowerSpeedCoachForce.csv'
f = open(filename,'rb')
file_data = {'file': f}
form_data = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe': 1,
'upload_to_c2':False,
'plottype':'timeplot',
'file': f,
}
form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded13+'/edit/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
f.close()
w = Workout.objects.get(id=13)
self.assertEqual(w.forceunit,'N')
df = dataprep.read_data(['averageforce'],ids=[13])
df = dataprep.remove_nulls_pl(df)
average_N = int(df['averageforce'].mean())
self.assertEqual(average_N,271)
def test_upload_speedcoach_colin(self):
login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login)
filename = 'rowers/tests/testdata/colinforce.csv'
f = open(filename,'rb')
file_data = {'file': f}
form_data = {
'title':'test',
'rpe':1,
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'upload_to_c2':False,
'plottype':'timeplot',
'file': f,
}
form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded13+'/edit/',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
f.close()
w = Workout.objects.get(id=13)
self.assertEqual(w.forceunit,'N')
df = dataprep.read_data(['averageforce'],ids=[13])
df = dataprep.remove_nulls_pl(df)
average_N = int(df['averageforce'].mean())
self.assertEqual(average_N,120)
@override_settings(TESTING=True)
class TestForceUnit(TestCase):

View File

@@ -0,0 +1,299 @@
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
#from __future__ import print_function
from .statements import *
nu = datetime.datetime.now()
from django.db import transaction
import shutil
from rowers.views import add_defaultfavorites
from rowers.dataflow import process_single_file, upload_handler, unzip_and_process
from django.core.files.uploadedfile import SimpleUploadedFile
from django.conf import settings
from rowingdata import get_file_type
file_list = [
'rowers/tests/testdata/testdata.csv',
'rowers/tests/testdata/testdata.csv.gz',
'rowers/tests/testdata/tim.csv',
'rowers/tests/testdata/crewnerddata.tcx',
'rowers/tests/testdata/Speedcoach2example.csv',
'rowers/tests/testdata/Impeller.csv',
'rowers/tests/testdata/speedcoach3test3.csv',
'rowers/tests/testdata/SpeedCoach2Linkv1.27.csv',
'rowers/tests/testdata/SpeedCoach2Link_interval.csv',
'rowers/tests/testdata/NoHR.tcx',
'rowers/tests/testdata/rowinginmotionexample.tcx',
'rowers/tests/testdata/RP_testdata.csv',
'rowers/tests/testdata/mystery.csv',
'rowers/tests/testdata/RP_interval.csv',
'rowers/tests/testdata/3x250m.fit',
'rowers/tests/testdata/painsled_desktop_example.csv',
'rowers/tests/testdata/ergdata_example.csv',
'rowers/tests/testdata/boatcoach_2021-09-09__18-15-53.csv',
'rowers/tests/testdata/colinforce.csv',
'rowers/tests/testdata/PainsledForce.csv',
'rowers/tests/testdata/EmpowerSpeedCoachForce.csv',
'rowers/tests/testdata/boatcoach.csv',
'rowers/tests/testdata/ergstick.csv',
]
fail_list = [
'rowers/tests/testdata/lofoten.jpg',
'rowers/tests/testdata/c2records.json',
'rowers/tests/testdata/alphen.kml',
'rowers/tests/testdata/testdata.gpx'
]
#@pytest.mark.django_db
@override_settings(TESTING=True)
class ViewTest(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
self.c = Client()
self.u = User.objects.create_user('john',
'sander@ds.ds',
'koeinsloot')
self.r = Rower.objects.create(user=self.u,gdproptin=True, ftpset=True,surveydone=True,
gdproptindate=timezone.now(),
rowerplan='pro',
)
add_defaultfavorites(self.r)
self.nu = datetime.datetime.now()
# copy every file in fail_list to rowers/tests/testdata/backup folder
# Zorg ervoor dat de backup-map bestaat
backup_dir = 'rowers/tests/testdata/backup'
os.makedirs(backup_dir, exist_ok=True)
# Kopieer elk bestand in fail_list naar de backup-map
for file_path in fail_list:
if os.path.exists(file_path):
shutil.copy(file_path, backup_dir)
else:
print(f"Bestand niet gevonden: {file_path}")
def tearDown(self):
backup_dir = 'rowers/tests/testdata/backup'
for file_path in fail_list:
backup_file = os.path.join(backup_dir, os.path.basename(file_path))
if os.path.exists(backup_file):
shutil.copy(backup_file, os.path.dirname(file_path))
else:
print(f"Backup-bestand niet gevonden: {backup_file}")
@parameterized.expand(file_list)
@patch('rowers.dataflow.myqueue')
def test_upload_view(self, filename, mocked_myqueue):
# simple test to see if upload view works. Submits a DocumentsForm to /rowers/workout/upload/
login = self.c.login(username='john',password='koeinsloot')
self.assertTrue(login)
with open(filename, 'rb') as f:
file_content = f.read()
uploaded_file = SimpleUploadedFile(
"testdata.csv",
file_content,
content_type="text/csv"
)
form_data = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
'file': filename,
}
request = RequestFactory()
request.user = self.u
form = DocumentsForm(data = form_data,files={'file': uploaded_file})
self.assertTrue(form.is_valid())
optionsform = UploadOptionsForm(form_data,request=request)
self.assertTrue(optionsform.is_valid())
response = self.c.post('/rowers/workout/upload/', data = form_data,
files = {'file': uploaded_file}, follow=True)
self.assertEqual(response.status_code, 200)
uploadoptions = form.cleaned_data.copy()
uploadoptions.update(optionsform.cleaned_data)
result = upload_handler(uploadoptions, filename)
self.assertEqual(result["status"], "processing")
@parameterized.expand(fail_list)
@patch('rowers.dataflow.myqueue')
def test_upload_view(self, filename, mocked_myqueue):
# simple test to see if upload view works. Submits a DocumentsForm to /rowers/workout/upload/
login = self.c.login(username='john',password='koeinsloot')
self.assertTrue(login)
with open(filename, 'rb') as f:
file_content = f.read()
uploaded_file = SimpleUploadedFile(
"testdata.csv",
file_content,
content_type="text/csv"
)
form_data = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
'file': filename,
}
request = RequestFactory()
request.user = self.u
form = DocumentsForm(data = form_data,files={'file': uploaded_file})
self.assertTrue(form.is_valid())
optionsform = UploadOptionsForm(form_data,request=request)
self.assertTrue(optionsform.is_valid())
response = self.c.post('/rowers/workout/upload/', data = form_data,
files = {'file': uploaded_file}, follow=True)
self.assertEqual(response.status_code, 200)
uploadoptions = form.cleaned_data.copy()
uploadoptions.update(optionsform.cleaned_data)
result = upload_handler(uploadoptions, filename)
self.assertEqual(result["status"], "error")
@parameterized.expand(file_list)
@patch('rowers.dataflow.myqueue')
def test_process_single_file(self, filename, mocked_myqueue):
uploadoptions = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
'user': self.u,
'file': filename,
}
result, f2 = process_single_file(filename, uploadoptions, 1)
self.assertEqual(result, True)
os.remove(f2+'.gz')
# process a single file without 'user'
@patch('rowers.dataflow.myqueue')
def test_process_single_file_nouser(self, mocked_myqueue):
filename = 'rowers/tests/testdata/testdata.csv'
uploadoptions = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
'useremail': self.u.email,
'file': filename,
}
result, f2 = process_single_file(filename, uploadoptions, 1)
self.assertEqual(result, True)
os.remove(f2+'.gz')
# process a zip file
@patch('rowers.dataflow.myqueue')
def test_process_single_zipfile(self, mocked_myqueue):
filename = 'rowers/tests/testdata/zipfile.zip'
uploadoptions = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
'user': self.u,
'file': filename,
}
result = process_single_file(filename, uploadoptions, 1)
self.assertEqual(result["status"], "error")
result = upload_handler(uploadoptions, filename)
self.assertEqual(result["status"], "processing")
# process a single file without 'title'
@patch('rowers.dataflow.myqueue')
def test_process_single_file_nouser(self, mocked_myqueue):
filename = 'rowers/tests/testdata/testdata.csv'
uploadoptions = {
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
'user': self.u,
'file': filename,
}
result, f2 = process_single_file(filename, uploadoptions, 1)
self.assertEqual(result, True)
os.remove(f2+'.gz')
@patch('rowers.dataflow.myqueue')
def test_process_zip_file(self, mocked_myqueue):
filename = 'rowers/tests/testdata/zipfile.zip'
uploadoptions = {
'title':'test',
'workouttype':'rower',
'boattype':'1x',
'notes':'aap noot mies',
'make_plot':False,
'rpe':6,
'upload_to_c2':False,
'plottype':'timeplot',
'landingpage':'workout_edit_view',
'raceid':0,
'user': self.u,
'file': filename,
}
result = unzip_and_process(filename, uploadoptions, 1)
self.assertEqual(result['status'], "completed")

178
rowers/tests/testdata/backup/alphen.kml vendored Normal file
View File

@@ -0,0 +1,178 @@
<?xml version="1.0" ?>
<kml xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.google.com/kml/ext/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Courses.kml</name>
<Folder>
<name>Courses</name>
<Folder>
<name>Alphen - Alphen aan den Rijn</name>
<open>1</open>
<Placemark>
<name>Start</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.704149601313898,52.14611068342334,0 4.704648516706039,52.14606840788696,0 4.704642182077736,52.14626893773362,0 4.704151599747837,52.14628828501986,0 4.704149601313898,52.14611068342334,0 4.704149601313898,52.14611068342334,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 1</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.704040567073562,52.14772365703576,0 4.704544185247905,52.14767250842382,0 4.704570221164488,52.14791407188889,0 4.704130359234369,52.14797079566858,0 4.704040567073562,52.14772365703576,0 4.704040567073562,52.14772365703576,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 2</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.707120374629225,52.15459940303027,0 4.707573702026327,52.15460568431943,0 4.70761596147063,52.15486728249238,0 4.707159504658982,52.15489881627455,0 4.707120374629225,52.15459940303027,0 4.707120374629225,52.15459940303027,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 3</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.709028668490356,52.1646474322453,0 4.70984931790314,52.16449178436365,0 4.709978566943311,52.16488586779201,0 4.709244456319242,52.16499245615274,0 4.709028668490356,52.1646474322453,0 4.709028668490356,52.1646474322453,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 4</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.718138359290078,52.17865355742074,0 4.718653235056161,52.17830639665007,0 4.719134204848634,52.17862031168055,0 4.71867160984541,52.17894003397144,0 4.718138359290078,52.17865355742074,0 4.718138359290078,52.17865355742074,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 5</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.727641648412835,52.18284846695732,0 4.728273789904367,52.18251973845241,0 4.728577606945771,52.1827641768111,0 4.7279847617705,52.1830837392454,0 4.727641648412835,52.18284846695732,0 4.727641648412835,52.18284846695732,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 6</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.738716857017891,52.19396028458393,0 4.739294818571407,52.19389560588872,0 4.739411118817641,52.19428660874426,0 4.738864571028594,52.19431307372239,0 4.738716857017891,52.19396028458393,0 4.738716857017891,52.19396028458393,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 7</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.734183821236371,52.20620514880871,0 4.734924962205387,52.20637199686158,0 4.734802543714663,52.20688025274802,0 4.733601274999542,52.20663721340052,0 4.734183821236371,52.20620514880871,0 4.734183821236371,52.20620514880871,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 8</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.738785303605908,52.19457123452171,0 4.739333350356509,52.19459196501802,0 4.739304304831564,52.19482691469288,0 4.73885420703549,52.19479878738656,0 4.738785303605908,52.19457123452171,0 4.738785303605908,52.19457123452171,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 9</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.728292586661338,52.18327969510192,0 4.728884338045631,52.18302182842039,0 4.729083849790216,52.1833152834237,0 4.728606271720666,52.18355598784883,0 4.728292586661338,52.18327969510192,0 4.728292586661338,52.18327969510192,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 10</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.717008631662971,52.17788756203277,0 4.717714777374475,52.17758571819474,0 4.718168595226933,52.17803093936305,0 4.717634575621297,52.17832999894938,0 4.717008631662971,52.17788756203277,0 4.717008631662971,52.17788756203277,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 11</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.708580146922809,52.16405851453961,0 4.709467162927956,52.16392338577828,0 4.709761923185198,52.16427786809471,0 4.708922971852094,52.16448915385681,0 4.708580146922809,52.16405851453961,0 4.708580146922809,52.16405851453961,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 12</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.70716800510311,52.15500418035832,0 4.707671825192278,52.15498496004398,0 4.707743878685751,52.15525628533189,0 4.707149393888881,52.1553218720998,0 4.70716800510311,52.15500418035832,0 4.70716800510311,52.15500418035832,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Gate 13</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.704140681716737,52.14813498986593,0 4.704864196194787,52.1479883822655,0 4.705153909432487,52.14838874308533,0 4.704223464041033,52.14854260247372,0 4.704140681716737,52.14813498986593,0 4.704140681716737,52.14813498986593,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>Finish</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>4.70414987291546,52.1461319705247,0 4.704561170436561,52.14607111930849,0 4.704642182077736,52.14626893773362,0 4.70415735390207,52.14628831020436,0 4.70414987291546,52.1461319705247,0 4.70414987291546,52.1461319705247,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Folder>
</Folder>
</Document>
</kml>

BIN
rowers/tests/testdata/backup/lofoten.jpg vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

View File

@@ -0,0 +1,574 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?><gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" creator="Oregon 400t" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd"><metadata><link href="http://www.garmin.com"><text>Garmin International</text></link><time>2016-05-20T15:41:26</time></metadata><trk><name>Export by rowingdata</name><trkseg> <trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:26+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:29.238150+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:32.148290+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:35.269000+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:38.152180+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:41.148270+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:44.148910+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:46.908250+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:49.819010+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:52.942510+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:55.639670+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:41:58.370000+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:01.188270+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:04.008300+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:06.888990+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:09.678900+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:12.469140+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:15.199010+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:17.963080+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:20.658340+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:23.538800+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:26.269790+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:28.848350+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:31.729550+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:34.398400+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:37.038360+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:39.499250+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:42.349070+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:45.079070+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:47.752890+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:50.452350+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:53.182630+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:55.789410+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:42:58.671890+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:01.338860+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:04.068490+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:06.862620+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:09.618500+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:12.379160+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:15.229200+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:17.963150+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:20.692490+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:23.628520+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:26.329210+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:29.148960+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:31.668570+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:34.490920+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:37.369250+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:40.189230+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:42.798860+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:45.708750+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:48.318590+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:51.199500+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:53.869290+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:56.572490+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:43:59.212410+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:01.912890+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:04.459350+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:07.249360+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:09.949930+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:12.619870+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:15.378800+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:18.049420+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:20.719440+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:23.298970+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:26.178820+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:28.669980+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:31.429270+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:34.042790+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:36.589070+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:39.412800+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:42.078870+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:44.783760+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:47.450710+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:50.149400+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:52.789720+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:55.429750+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:44:58.069700+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:00.742790+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:03.442700+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:06.139610+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:08.689490+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:11.479530+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:14.119610+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:16.792860+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:19.368950+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:22.158960+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:24.889580+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:27.558940+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:30.469760+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:33.259860+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:36.079590+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:38.899560+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:41.689980+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:44.568940+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:47.329670+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:50.149560+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:52.969660+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:55.879910+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:45:58.789690+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:01.729660+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:04.669610+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:07.549730+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:10.458930+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:13.488980+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:16.429320+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:19.519650+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:22.459630+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:25.338880+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:28.459530+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:31.401590+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:34.339560+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:37.309450+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:40.098920+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:43.039950+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:46.039490+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:48.979630+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:51.949590+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:54.709590+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:46:57.589710+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:00.503120+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:03.408950+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:06.323410+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:09.229670+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:12.198960+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:15.079930+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:17.989660+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:20.959680+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:23.869730+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:26.782970+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:29.688910+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:32.539570+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:35.449720+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:38.329080+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:41.148960+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:44.088880+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:47.150600+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:50.029750+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:52.998850+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:55.880360+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:47:58.789400+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:01.639760+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:04.492770+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:07.429530+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:10.373270+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:13.309500+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:16.279570+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:19.160740+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:21.948820+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:25.039520+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:27.949340+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:30.890880+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:33.648790+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:36.770050+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:39.499600+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:42.559140+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:45.439020+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:48.439810+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:51.379570+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:54.259600+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:48:57.139300+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:00.049550+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:02.838790+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:05.839540+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:08.749400+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:11.689540+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:14.538900+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:17.389440+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:20.058880+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:23.059530+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:25.880610+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:28.608730+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:31.582600+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:34.278700+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:37.068660+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:40.039460+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:42.889790+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:45.772580+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:48.708690+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:51.679450+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:54.499470+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:49:57.409440+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:50:00.439330+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:50:03.408680+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:50:06.378680+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:50:09.168860+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:50:12.229650+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:50:15.138650+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:50:18.049470+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:50:20.959460+00:00</time>
</trkpt>
<trkpt lat="0.0" lon="0.0">
<time>2016-05-20T13:50:23.242360+00:00</time>
</trkpt>
</trkseg></trk></gpx>

View File

@@ -1,255 +0,0 @@
Concept2 Utility - Version 7.06.15,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,
Log Data for:,F,,,,,,,,,,,,,,,,,
,,,,,Total Workout Results,,,,Split or Work Interval Results,,,,Results Calculated by Formulas,,,Interval Rest Results,,
,Name,Date,Time of Day,Workout Name,Time,Meters,Avg SPM,Avg Heart Rate,Time,Meters,SPM,Heart Rate,/500m,Cal/hr,Watt,Time,Meters,Heart Rate
,,,,,,,,,,,,,,,,,,
,F,2/3/2017,7:48,0:25:03,25:03.6,6326,23,163,,,,,01:58.8,1017,209,,,
,F,2/3/2017,7:48,0:25:03,,,,,06:00.0,1484,23,150,02:01.2,975,196,,,
,F,2/3/2017,7:48,0:25:03,,,,,12:00.0,1532,24,161,01:57.4,1042,216,,,
,F,2/3/2017,7:48,0:25:03,,,,,18:00.0,1504,23,163,01:59.6,1002,204,,,
,F,2/3/2017,7:48,0:25:03,,,,,24:00.0,1535,23,171,01:57.2,1047,217,,,
,F,2/3/2017,7:48,0:25:03,,,,,25:03.6,271,23,170,01:57.3,1045,217,,,
,,,,,,,,,,,,,,,,,,
,F,2/3/2017,7:21,0:01:23,01:23.7,312,20,116,,,,,02:14.1,799,145,,,
,F,2/3/2017,7:21,0:01:23,,,,,01:23.7,313,20,116,02:13.7,803,146,,,
,,,,,,,,,,,,,,,,,,
,F,1/13/2017,8:42,0:45:00,45:00.0,11437,23,168,,,,,01:58.0,1032,213,,,
,F,1/13/2017,8:42,0:45:00,,,,,03:00.0,773,24,155,01:56.4,1063,222,,,
,F,1/13/2017,8:42,0:45:00,,,,,06:00.0,769,24,161,01:57.0,1051,218,,,
,F,1/13/2017,8:42,0:45:00,,,,,09:00.0,769,24,164,01:57.0,1051,218,,,
,F,1/13/2017,8:42,0:45:00,,,,,12:00.0,770,24,165,01:56.8,1054,219,,,
,F,1/13/2017,8:42,0:45:00,,,,,15:00.0,765,24,168,01:57.6,1039,215,,,
,F,1/13/2017,8:42,0:45:00,,,,,18:00.0,753,23,165,01:59.5,1005,205,,,
,F,1/13/2017,8:42,0:45:00,,,,,21:00.0,770,24,171,01:56.8,1054,219,,,
,F,1/13/2017,8:42,0:45:00,,,,,24:00.0,764,24,167,01:57.8,1036,214,,,
,F,1/13/2017,8:42,0:45:00,,,,,27:00.0,763,24,169,01:57.9,1033,213,,,
,F,1/13/2017,8:42,0:45:00,,,,,30:00.0,770,24,173,01:56.8,1054,219,,,
,F,1/13/2017,8:42,0:45:00,,,,,33:00.0,764,23,173,01:57.8,1036,214,,,
,F,1/13/2017,8:42,0:45:00,,,,,36:00.0,739,23,172,02:01.7,966,194,,,
,F,1/13/2017,8:42,0:45:00,,,,,39:00.0,723,22,171,02:04.4,924,181,,,
,F,1/13/2017,8:42,0:45:00,,,,,42:00.0,759,23,175,01:58.5,1022,210,,,
,F,1/13/2017,8:42,0:45:00,,,,,45:00.0,787,23,179,01:54.3,1105,234,,,
,,,,,,,,,,,,,,,,,,
,F,1/13/2017,7:57,0:04:53,04:53.6,1080,20,71,,,,,02:15.9,779,139,,,
,F,1/13/2017,7:57,0:04:53,,,,,04:53.6,1081,20,71,02:15.8,780,140,,,
,,,,,,,,,,,,,,,,,,
,F,1/10/2017,8:29,0:45:00,45:00.0,11260,21,170,,,,,01:59.8,998,203,,,
,F,1/10/2017,8:29,0:45:00,,,,,09:00.0,2320,22,168,01:56.3,1064,222,,,
,F,1/10/2017,8:29,0:45:00,,,,,18:00.0,2275,22,168,01:58.6,1020,209,,,
,F,1/10/2017,8:29,0:45:00,,,,,27:00.0,2142,21,167,02:06.0,901,175,,,
,F,1/10/2017,8:29,0:45:00,,,,,36:00.0,2243,21,173,02:00.3,990,201,,,
,F,1/10/2017,8:29,0:45:00,,,,,45:00.0,2281,22,177,01:58.3,1026,211,,,
,,,,,,,,,,,,,,,,,,
,F,1/10/2017,7:43,0:04:36,04:36.1,1048,21,113,,,,,02:11.7,826,153,,,
,F,1/10/2017,7:43,0:04:36,,,,,04:36.1,1049,21,113,02:11.6,828,154,,,
,,,,,,,,,,,,,,,,,,
,F,1/8/2017,8:29,0:45:00,45:00.0,10960,21,167,,,,,02:03.1,944,187,,,
,F,1/8/2017,8:29,0:45:00,,,,,09:00.0,2033,20,160,02:12.8,814,149,,,
,F,1/8/2017,8:29,0:45:00,,,,,18:00.0,2182,21,168,02:03.7,935,185,,,
,F,1/8/2017,8:29,0:45:00,,,,,27:00.0,2251,22,167,01:59.9,998,203,,,
,F,1/8/2017,8:29,0:45:00,,,,,36:00.0,2221,21,168,02:01.5,970,195,,,
,F,1/8/2017,8:29,0:45:00,,,,,45:00.0,2273,22,176,01:58.7,1018,209,,,
,,,,,,,,,,,,,,,,,,
,F,1/8/2017,7:43,0:05:01,05:01.3,1119,20,106,,,,,02:14.6,793,143,,,
,F,1/8/2017,7:43,0:05:01,,,,,05:00.0,1117,20,106,02:14.2,797,145,,,
,F,1/8/2017,7:43,0:05:01,,,,,05:01.3,3,0,106,03:36.6,418,34,,,
,,,,,,,,,,,,,,,,,,
,F,1/4/2017,9:03,v5:00/2:00r...3,55:00.0,12799,18,157,,,,,02:08.9,862,163,,,
,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,05:00.0,879,16,130,02:50.6,542,70,,,
,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,,,,,,,,02:00.0,128,124
,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,45:00.0,10953,22,176,02:03.2,943,187,,,
,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,,,,,,,,00:00.0,0,0
,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,05:00.0,971,18,165,02:34.4,626,95,,,
,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,,,,,,,,00:00.0,0,0
,,,,,,,,,,,,,,,,,,
,F,1/2/2017,7:56,v5:00/1:00r...2,22:14.2,5280,22,152,,,,,02:06.3,897,174,,,
,F,1/2/2017,7:56,v5:00/1:00r...2,,,,,05:00.0,1224,23,147,02:02.5,954,190,,,
,F,1/2/2017,7:56,v5:00/1:00r...2,,,,,,,,,,,,01:00.0,23,132
,F,1/2/2017,7:56,v5:00/1:00r...2,,,,,17:14.2,4060,21,158,02:07.3,883,169,,,
,F,1/2/2017,7:56,v5:00/1:00r...2,,,,,,,,,,,,01:00.0,0,0
,,,,,,,,,,,,,,,,,,
,F,10/6/2016,8:53,10000m,40:30.8,10000,21,173,,,,,02:01.5,970,195,,,
,F,10/6/2016,8:53,10000m,,,,,07:52.1,2000,23,169,01:58.0,1032,213,,,
,F,10/6/2016,8:53,10000m,,,,,08:03.3,4000,22,164,02:00.8,982,198,,,
,F,10/6/2016,8:53,10000m,,,,,08:19.4,6000,21,175,02:04.8,918,180,,,
,F,10/6/2016,8:53,10000m,,,,,08:10.7,8000,21,176,02:02.6,952,190,,,
,F,10/6/2016,8:53,10000m,,,,,08:05.3,10000,21,181,02:01.3,974,196,,,
,,,,,,,,,,,,,,,,,,
,F,10/6/2016,8:12,0:03:02,03:02.3,713,21,142,,,,,02:07.8,876,168,,,
,F,10/6/2016,8:12,0:03:02,,,,,03:02.3,714,21,142,02:07.6,878,168,,,
,,,,,,,,,,,,,,,,,,
,F,9/27/2016,16:39,0:10:19,10:19.2,2110,22,0,,,,,02:26.7,681,111,,,
,F,9/27/2016,16:39,0:10:19,,,,,05:00.0,1029,24,0,02:25.7,688,113,,,
,F,9/27/2016,16:39,0:10:19,,,,,10:00.0,1020,25,0,02:27.0,678,110,,,
,F,9/27/2016,16:39,0:10:19,,,,,10:19.2,61,19,0,02:37.3,609,90,,,
,,,,,,,,,,,,,,,,,,
,F,9/27/2016,16:26,0:01:20,01:20.8,259,22,0,,,,,02:35.9,617,92,,,
,F,9/27/2016,16:26,0:01:20,,,,,01:20.8,259,22,0,02:35.9,617,92,,,
,,,,,,,,,,,,,,,,,,
,F,9/23/2016,7:59,0:30:00,30:00.0,7142,21,163,,,,,02:06.0,901,175,,,
,F,9/23/2016,7:59,0:30:00,,,,,06:00.0,1473,22,160,02:02.1,960,192,,,
,F,9/23/2016,7:59,0:30:00,,,,,12:00.0,1409,20,162,02:07.7,877,168,,,
,F,9/23/2016,7:59,0:30:00,,,,,18:00.0,1393,21,163,02:09.2,858,162,,,
,F,9/23/2016,7:59,0:30:00,,,,,24:00.0,1429,22,158,02:05.9,902,175,,,
,F,9/23/2016,7:59,0:30:00,,,,,30:00.0,1439,21,173,02:05.0,915,179,,,
,,,,,,,,,,,,,,,,,,
,F,9/23/2016,7:29,0:03:08,03:08.0,744,21,147,,,,,02:06.3,897,174,,,
,F,9/23/2016,7:29,0:03:08,,,,,03:08.0,744,21,147,02:06.3,897,174,,,
,,,,,,,,,,,,,,,,,,
,F,9/21/2016,16:09,0:34:16,34:16.9,6512,20,0,,,,,02:37.9,605,89,,,
,F,9/21/2016,16:09,0:34:16,,,,,05:00.0,980,22,0,02:33.0,635,98,,,
,F,9/21/2016,16:09,0:34:16,,,,,10:00.0,989,20,0,02:31.6,645,100,,,
,F,9/21/2016,16:09,0:34:16,,,,,15:00.0,966,21,0,02:35.2,621,93,,,
,F,9/21/2016,16:09,0:34:16,,,,,20:00.0,938,20,0,02:39.9,594,86,,,
,F,9/21/2016,16:09,0:34:16,,,,,25:00.0,946,21,0,02:38.5,602,88,,,
,F,9/21/2016,16:09,0:34:16,,,,,30:00.0,909,21,0,02:45.0,568,78,,,
,F,9/21/2016,16:09,0:34:16,,,,,34:16.9,785,20,0,02:43.6,574,80,,,
,,,,,,,,,,,,,,,,,,
,F,9/20/2016,17:11,0:33:19,33:19.3,6519,21,0,,,,,02:33.3,634,97,,,
,F,9/20/2016,17:11,0:33:19,,,,,05:00.0,991,22,0,02:31.3,647,101,,,
,F,9/20/2016,17:11,0:33:19,,,,,10:00.0,994,21,0,02:30.9,650,102,,,
,F,9/20/2016,17:11,0:33:19,,,,,15:00.0,977,21,0,02:33.5,632,97,,,
,F,9/20/2016,17:11,0:33:19,,,,,20:00.0,968,21,0,02:34.9,623,94,,,
,F,9/20/2016,17:11,0:33:19,,,,,25:00.0,982,21,0,02:32.7,637,98,,,
,F,9/20/2016,17:11,0:33:19,,,,,30:00.0,971,21,0,02:34.4,626,95,,,
,F,9/20/2016,17:11,0:33:19,,,,,33:19.3,637,20,0,02:36.4,614,91,,,
,,,,,,,,,,,,,,,,,,
,F,9/20/2016,8:12,0:22:32,22:32.5,4731,18,158,,,,,02:22.9,712,120,,,
,F,9/20/2016,8:12,0:22:32,,,,,09:00.0,2197,22,171,02:02.8,948,189,,,
,F,9/20/2016,8:12,0:22:32,,,,,18:00.0,1781,18,136,02:31.6,645,100,,,
,F,9/20/2016,8:12,0:22:32,,,,,22:32.5,753,15,168,03:00.9,503,59,,,
,,,,,,,,,,,,,,,,,,
,F,9/20/2016,7:48,v5:00...1,05:00.0,758,14,115,,,,,03:17.8,455,45,,,
,F,9/20/2016,7:48,v5:00...1,,,,,05:00.0,759,14,115,03:17.6,456,45,,,
,F,9/20/2016,7:48,v5:00...1,,,,,,,,,,,,00:00.0,0,0
,,,,,,,,,,,,,,,,,,
,F,9/19/2016,15:28,0:31:15,31:15.4,6511,22,0,,,,,02:24.0,703,117,,,
,F,9/19/2016,15:28,0:31:15,,,,,05:00.0,1040,24,0,02:24.2,701,117,,,
,F,9/19/2016,15:28,0:31:15,,,,,10:00.0,1037,23,0,02:24.6,698,116,,,
,F,9/19/2016,15:28,0:31:15,,,,,15:00.0,1067,23,0,02:20.5,733,126,,,
,F,9/19/2016,15:28,0:31:15,,,,,20:00.0,1046,23,0,02:23.4,708,119,,,
,F,9/19/2016,15:28,0:31:15,,,,,25:00.0,1025,21,0,02:26.3,684,112,,,
,F,9/19/2016,15:28,0:31:15,,,,,30:00.0,1045,22,0,02:23.5,707,118,,,
,F,9/19/2016,15:28,0:31:15,,,,,31:15.4,252,19,0,02:29.6,659,105,,,
,,,,,,,,,,,,,,,,,,
,F,9/15/2016,18:01,0:32:53,32:53.1,6694,22,0,,,,,02:27.3,676,109,,,
,F,9/15/2016,18:01,0:32:53,,,,,05:00.0,1055,24,0,02:22.1,719,122,,,
,F,9/15/2016,18:01,0:32:53,,,,,10:00.0,1042,23,0,02:23.9,703,117,,,
,F,9/15/2016,18:01,0:32:53,,,,,15:00.0,1017,22,0,02:27.4,675,109,,,
,F,9/15/2016,18:01,0:32:53,,,,,20:00.0,1030,23,0,02:25.6,690,113,,,
,F,9/15/2016,18:01,0:32:53,,,,,25:00.0,996,23,0,02:30.6,652,102,,,
,F,9/15/2016,18:01,0:32:53,,,,,30:00.0,983,22,0,02:32.5,639,99,,,
,F,9/15/2016,18:01,0:32:53,,,,,32:53.1,572,22,0,02:31.3,647,101,,,
,,,,,,,,,,,,,,,,,,
,F,9/13/2016,16:52,0:35:12,35:12.4,6740,23,0,,,,,02:36.7,613,91,,,
,F,9/13/2016,16:52,0:35:12,,,,,10:00.0,1928,28,0,02:35.6,619,93,,,
,F,9/13/2016,16:52,0:35:12,,,,,20:00.0,1955,26,0,02:33.4,633,97,,,
,F,9/13/2016,16:52,0:35:12,,,,,30:00.0,1958,23,0,02:33.2,634,97,,,
,F,9/13/2016,16:52,0:35:12,,,,,35:12.4,900,18,0,02:53.5,530,67,,,
,,,,,,,,,,,,,,,,,,
,F,9/3/2016,11:33,0:01:26,01:26.7,113,28,0,,,,,06:23.6,321,6,,,
,F,9/3/2016,11:33,0:01:26,,,,,01:26.7,114,28,0,06:20.2,321,6,,,
,,,,,,,,,,,,,,,,,,
,F,8/8/2016,7:45,0:24:18,24:18.4,4438,15,136,,,,,02:44.3,571,79,,,
,F,8/8/2016,7:45,0:24:18,,,,,11:00.0,2322,19,147,02:22.1,719,122,,,
,F,8/8/2016,7:45,0:24:18,,,,,22:00.0,1830,15,0,03:00.3,505,60,,,
,F,8/8/2016,7:45,0:24:18,,,,,24:18.4,287,11,126,04:01.1,385,25,,,
,,,,,,,,,,,,,,,,,,
,F,7/6/2016,7:49,0:45:00,45:00.0,10872,21,164,,,,,02:04.1,929,183,,,
,F,7/6/2016,7:49,0:45:00,,,,,09:00.0,2186,22,151,02:03.5,939,186,,,
,F,7/6/2016,7:49,0:45:00,,,,,18:00.0,2222,22,163,02:01.5,971,195,,,
,F,7/6/2016,7:49,0:45:00,,,,,27:00.0,2048,20,158,02:11.8,825,153,,,
,F,7/6/2016,7:49,0:45:00,,,,,36:00.0,2146,21,169,02:05.8,904,176,,,
,F,7/6/2016,7:49,0:45:00,,,,,45:00.0,2271,22,179,01:58.8,1016,208,,,
,,,,,,,,,,,,,,,,,,
,F,7/5/2016,8:18,0:45:00,45:00.0,10900,21,168,,,,,02:03.8,934,184,,,
,F,7/5/2016,8:18,0:45:00,,,,,09:00.0,2285,23,166,01:58.1,1030,212,,,
,F,7/5/2016,8:18,0:45:00,,,,,18:00.0,2256,22,168,01:59.6,1002,204,,,
,F,7/5/2016,8:18,0:45:00,,,,,27:00.0,2156,21,174,02:05.2,913,178,,,
,F,7/5/2016,8:18,0:45:00,,,,,36:00.0,2016,20,155,02:13.9,801,146,,,
,F,7/5/2016,8:18,0:45:00,,,,,45:00.0,2188,21,177,02:03.4,941,186,,,
,,,,,,,,,,,,,,,,,,
,F,7/2/2016,7:14,0:35:17,35:17.2,8855,22,167,,,,,01:59.5,1005,205,,,
,F,7/2/2016,7:14,0:35:17,,,,,11:01.6,2800,24,161,01:58.1,1030,212,,,
,F,7/2/2016,7:14,0:35:17,,,,,10:57.7,5600,23,171,01:57.4,1043,216,,,
,F,7/2/2016,7:14,0:35:17,,,,,11:24.5,8400,22,169,02:02.2,959,192,,,
,F,7/2/2016,7:14,0:35:17,,,,,01:53.4,8855,21,167,02:04.6,922,181,,,
,,,,,,,,,,,,,,,,,,
,F,7/1/2016,7:32,10000m,40:15.0,10000,23,176,,,,,02:00.7,984,199,,,
,F,7/1/2016,7:32,10000m,,,,,07:54.1,2000,24,168,01:58.5,1023,210,,,
,F,7/1/2016,7:32,10000m,,,,,07:50.3,4000,24,174,01:57.5,1041,215,,,
,F,7/1/2016,7:32,10000m,,,,,08:24.4,6000,22,177,02:06.1,900,175,,,
,F,7/1/2016,7:32,10000m,,,,,08:02.3,8000,23,180,02:00.5,987,200,,,
,F,7/1/2016,7:32,10000m,,,,,08:03.9,10000,22,182,02:00.9,980,198,,,
,,,,,,,,,,,,,,,,,,
,F,7/1/2016,6:51,0:02:29,02:29.5,529,20,130,,,,,02:21.3,726,124,,,
,F,7/1/2016,6:51,0:02:29,,,,,02:29.5,529,20,130,02:21.3,726,124,,,
,,,,,,,,,,,,,,,,,,
,F,6/28/2016,6:45,0:30:00,30:00.0,7434,22,173,,,,,02:01.0,978,197,,,
,F,6/28/2016,6:45,0:30:00,,,,,06:00.0,1534,23,0,01:57.3,1045,217,,,
,F,6/28/2016,6:45,0:30:00,,,,,12:00.0,1342,21,166,02:14.1,799,145,,,
,F,6/28/2016,6:45,0:30:00,,,,,18:00.0,1523,24,172,01:58.1,1029,212,,,
,F,6/28/2016,6:45,0:30:00,,,,,24:00.0,1484,22,173,02:01.2,975,196,,,
,F,6/28/2016,6:45,0:30:00,,,,,30:00.0,1552,23,184,01:55.9,1072,224,,,
,,,,,,,,,,,,,,,,,,
,F,6/25/2016,7:10,0:30:00,30:00.0,7675,23,171,,,,,01:57.2,1047,217,,,
,F,6/25/2016,7:10,0:30:00,,,,,06:00.0,1542,24,159,01:56.7,1057,220,,,
,F,6/25/2016,7:10,0:30:00,,,,,12:00.0,1527,24,165,01:57.8,1035,214,,,
,F,6/25/2016,7:10,0:30:00,,,,,18:00.0,1550,24,174,01:56.1,1069,223,,,
,F,6/25/2016,7:10,0:30:00,,,,,24:00.0,1502,23,179,01:59.8,999,203,,,
,F,6/25/2016,7:10,0:30:00,,,,,30:00.0,1556,23,181,01:55.6,1078,226,,,
,,,,,,,,,,,,,,,,,,
,F,6/9/2016,7:17,0:30:00,30:00.0,7299,22,166,,,,,02:03.3,942,187,,,
,F,6/9/2016,7:17,0:30:00,,,,,06:00.0,1563,24,168,01:55.1,1088,229,,,
,F,6/9/2016,7:17,0:30:00,,,,,12:00.0,1463,22,166,02:03.0,946,188,,,
,F,6/9/2016,7:17,0:30:00,,,,,18:00.0,1371,21,160,02:11.2,832,155,,,
,F,6/9/2016,7:17,0:30:00,,,,,24:00.0,1434,22,165,02:05.5,909,177,,,
,F,6/9/2016,7:17,0:30:00,,,,,30:00.0,1468,22,174,02:02.6,953,190,,,
,,,,,,,,,,,,,,,,,,
,F,5/24/2016,7:42,0:30:00,30:00.0,7612,23,168,,,,,01:58.2,1028,212,,,
,F,5/24/2016,7:42,0:30:00,,,,,06:00.0,1534,24,158,01:57.3,1045,217,,,
,F,5/24/2016,7:42,0:30:00,,,,,12:00.0,1491,23,167,02:00.7,984,199,,,
,F,5/24/2016,7:42,0:30:00,,,,,18:00.0,1507,23,169,01:59.4,1006,205,,,
,F,5/24/2016,7:42,0:30:00,,,,,24:00.0,1532,23,171,01:57.4,1042,216,,,
,F,5/24/2016,7:42,0:30:00,,,,,30:00.0,1548,23,175,01:56.2,1066,223,,,
,,,,,,,,,,,,,,,,,,
,F,5/7/2016,9:14,0:30:00,30:00.0,7540,23,164,,,,,01:59.3,1008,206,,,
,F,5/7/2016,9:14,0:30:00,,,,,06:00.0,1493,23,162,02:00.5,987,200,,,
,F,5/7/2016,9:14,0:30:00,,,,,12:00.0,1517,23,161,01:58.6,1021,210,,,
,F,5/7/2016,9:14,0:30:00,,,,,18:00.0,1498,23,165,02:00.1,994,202,,,
,F,5/7/2016,9:14,0:30:00,,,,,24:00.0,1506,23,164,01:59.5,1005,205,,,
,F,5/7/2016,9:14,0:30:00,,,,,30:00.0,1526,23,169,01:57.9,1033,213,,,
,,,,,,,,,,,,,,,,,,
,F,4/23/2016,8:17,10000m,39:24.5,10000,23,166,,,,,01:58.2,1028,212,,,
,F,4/23/2016,8:17,10000m,,,,,07:47.0,2000,24,161,01:56.7,1056,220,,,
,F,4/23/2016,8:17,10000m,,,,,07:44.2,4000,24,171,01:56.0,1070,224,,,
,F,4/23/2016,8:17,10000m,,,,,07:50.7,6000,23,165,01:57.6,1039,215,,,
,F,4/23/2016,8:17,10000m,,,,,08:09.4,8000,22,165,02:02.3,957,191,,,
,F,4/23/2016,8:17,10000m,,,,,07:53.1,10000,23,170,01:58.2,1028,212,,,
,,,,,,,,,,,,,,,,,,
,F,4/20/2016,8:12,0:30:00,30:00.0,7961,24,170,,,,,01:53.0,1133,242,,,
,F,4/20/2016,8:12,0:30:00,,,,,06:00.0,1583,24,160,01:53.7,1119,238,,,
,F,4/20/2016,8:12,0:30:00,,,,,12:00.0,1590,24,163,01:53.2,1130,241,,,
,F,4/20/2016,8:12,0:30:00,,,,,18:00.0,1594,24,173,01:52.9,1136,243,,,
,F,4/20/2016,8:12,0:30:00,,,,,24:00.0,1589,25,174,01:53.2,1128,241,,,
,F,4/20/2016,8:12,0:30:00,,,,,30:00.0,1607,24,182,01:52.0,1157,249,,,
,,,,,,,,,,,,,,,,,,
,F,4/18/2016,8:24,0:30:00,30:00.0,7608,22,167,,,,,01:58.2,1027,211,,,
,F,4/18/2016,8:24,0:30:00,,,,,06:00.0,1508,22,154,01:59.3,1008,206,,,
,F,4/18/2016,8:24,0:30:00,,,,,12:00.0,1468,21,161,02:02.6,953,190,,,
,F,4/18/2016,8:24,0:30:00,,,,,18:00.0,1542,23,171,01:56.7,1057,220,,,
,F,4/18/2016,8:24,0:30:00,,,,,24:00.0,1544,23,172,01:56.5,1060,221,,,
,F,4/18/2016,8:24,0:30:00,,,,,30:00.0,1546,23,179,01:56.4,1063,222,,,
,,,,,,,,,,,,,,,,,,
,F,4/17/2016,9:32,0:35:33,35:33.4,8406,21,152,,,,,02:06.8,889,171,,,
,F,4/17/2016,9:32,0:35:33,,,,,11:25.3,2800,22,162,02:02.3,957,191,,,
,F,4/17/2016,9:32,0:35:33,,,,,11:02.1,5600,22,171,01:58.2,1028,212,,,
,F,4/17/2016,9:32,0:35:33,,,,,13:03.3,8400,19,138,02:19.8,740,128,,,
,F,4/17/2016,9:32,0:35:33,,,,,00:02.7,8406,0,138,03:45.0,405,31,,,
,,,,,,,,,,,,,,,,,,
,F,4/11/2016,8:29,0:37:24,37:24.9,9267,22,170,,,,,02:01.1,977,197,,,
,F,4/11/2016,8:29,0:37:24,,,,,11:03.9,2800,23,169,01:58.5,1022,210,,,
,F,4/11/2016,8:29,0:37:24,,,,,11:21.7,5600,22,171,02:01.7,967,194,,,
,F,4/11/2016,8:29,0:37:24,,,,,11:30.7,8400,22,170,02:03.3,941,187,,,
,F,4/11/2016,8:29,0:37:24,,,,,03:28.8,9267,22,170,02:00.4,989,200,,,
1 Concept2 Utility - Version 7.06.15
2
3 Log Data for: F
4 Total Workout Results Split or Work Interval Results Results Calculated by Formulas Interval Rest Results
5 Name Date Time of Day Workout Name Time Meters Avg SPM Avg Heart Rate Time Meters SPM Heart Rate /500m Cal/hr Watt Time Meters Heart Rate
6
7 F 2/3/2017 7:48 0:25:03 25:03.6 6326 23 163 01:58.8 1017 209
8 F 2/3/2017 7:48 0:25:03 06:00.0 1484 23 150 02:01.2 975 196
9 F 2/3/2017 7:48 0:25:03 12:00.0 1532 24 161 01:57.4 1042 216
10 F 2/3/2017 7:48 0:25:03 18:00.0 1504 23 163 01:59.6 1002 204
11 F 2/3/2017 7:48 0:25:03 24:00.0 1535 23 171 01:57.2 1047 217
12 F 2/3/2017 7:48 0:25:03 25:03.6 271 23 170 01:57.3 1045 217
13
14 F 2/3/2017 7:21 0:01:23 01:23.7 312 20 116 02:14.1 799 145
15 F 2/3/2017 7:21 0:01:23 01:23.7 313 20 116 02:13.7 803 146
16
17 F 1/13/2017 8:42 0:45:00 45:00.0 11437 23 168 01:58.0 1032 213
18 F 1/13/2017 8:42 0:45:00 03:00.0 773 24 155 01:56.4 1063 222
19 F 1/13/2017 8:42 0:45:00 06:00.0 769 24 161 01:57.0 1051 218
20 F 1/13/2017 8:42 0:45:00 09:00.0 769 24 164 01:57.0 1051 218
21 F 1/13/2017 8:42 0:45:00 12:00.0 770 24 165 01:56.8 1054 219
22 F 1/13/2017 8:42 0:45:00 15:00.0 765 24 168 01:57.6 1039 215
23 F 1/13/2017 8:42 0:45:00 18:00.0 753 23 165 01:59.5 1005 205
24 F 1/13/2017 8:42 0:45:00 21:00.0 770 24 171 01:56.8 1054 219
25 F 1/13/2017 8:42 0:45:00 24:00.0 764 24 167 01:57.8 1036 214
26 F 1/13/2017 8:42 0:45:00 27:00.0 763 24 169 01:57.9 1033 213
27 F 1/13/2017 8:42 0:45:00 30:00.0 770 24 173 01:56.8 1054 219
28 F 1/13/2017 8:42 0:45:00 33:00.0 764 23 173 01:57.8 1036 214
29 F 1/13/2017 8:42 0:45:00 36:00.0 739 23 172 02:01.7 966 194
30 F 1/13/2017 8:42 0:45:00 39:00.0 723 22 171 02:04.4 924 181
31 F 1/13/2017 8:42 0:45:00 42:00.0 759 23 175 01:58.5 1022 210
32 F 1/13/2017 8:42 0:45:00 45:00.0 787 23 179 01:54.3 1105 234
33
34 F 1/13/2017 7:57 0:04:53 04:53.6 1080 20 71 02:15.9 779 139
35 F 1/13/2017 7:57 0:04:53 04:53.6 1081 20 71 02:15.8 780 140
36
37 F 1/10/2017 8:29 0:45:00 45:00.0 11260 21 170 01:59.8 998 203
38 F 1/10/2017 8:29 0:45:00 09:00.0 2320 22 168 01:56.3 1064 222
39 F 1/10/2017 8:29 0:45:00 18:00.0 2275 22 168 01:58.6 1020 209
40 F 1/10/2017 8:29 0:45:00 27:00.0 2142 21 167 02:06.0 901 175
41 F 1/10/2017 8:29 0:45:00 36:00.0 2243 21 173 02:00.3 990 201
42 F 1/10/2017 8:29 0:45:00 45:00.0 2281 22 177 01:58.3 1026 211
43
44 F 1/10/2017 7:43 0:04:36 04:36.1 1048 21 113 02:11.7 826 153
45 F 1/10/2017 7:43 0:04:36 04:36.1 1049 21 113 02:11.6 828 154
46
47 F 1/8/2017 8:29 0:45:00 45:00.0 10960 21 167 02:03.1 944 187
48 F 1/8/2017 8:29 0:45:00 09:00.0 2033 20 160 02:12.8 814 149
49 F 1/8/2017 8:29 0:45:00 18:00.0 2182 21 168 02:03.7 935 185
50 F 1/8/2017 8:29 0:45:00 27:00.0 2251 22 167 01:59.9 998 203
51 F 1/8/2017 8:29 0:45:00 36:00.0 2221 21 168 02:01.5 970 195
52 F 1/8/2017 8:29 0:45:00 45:00.0 2273 22 176 01:58.7 1018 209
53
54 F 1/8/2017 7:43 0:05:01 05:01.3 1119 20 106 02:14.6 793 143
55 F 1/8/2017 7:43 0:05:01 05:00.0 1117 20 106 02:14.2 797 145
56 F 1/8/2017 7:43 0:05:01 05:01.3 3 0 106 03:36.6 418 34
57
58 F 1/4/2017 9:03 v5:00/2:00r...3 55:00.0 12799 18 157 02:08.9 862 163
59 F 1/4/2017 9:03 v5:00/2:00r...3 05:00.0 879 16 130 02:50.6 542 70
60 F 1/4/2017 9:03 v5:00/2:00r...3 02:00.0 128 124
61 F 1/4/2017 9:03 v5:00/2:00r...3 45:00.0 10953 22 176 02:03.2 943 187
62 F 1/4/2017 9:03 v5:00/2:00r...3 00:00.0 0 0
63 F 1/4/2017 9:03 v5:00/2:00r...3 05:00.0 971 18 165 02:34.4 626 95
64 F 1/4/2017 9:03 v5:00/2:00r...3 00:00.0 0 0
65
66 F 1/2/2017 7:56 v5:00/1:00r...2 22:14.2 5280 22 152 02:06.3 897 174
67 F 1/2/2017 7:56 v5:00/1:00r...2 05:00.0 1224 23 147 02:02.5 954 190
68 F 1/2/2017 7:56 v5:00/1:00r...2 01:00.0 23 132
69 F 1/2/2017 7:56 v5:00/1:00r...2 17:14.2 4060 21 158 02:07.3 883 169
70 F 1/2/2017 7:56 v5:00/1:00r...2 01:00.0 0 0
71
72 F 10/6/2016 8:53 10000m 40:30.8 10000 21 173 02:01.5 970 195
73 F 10/6/2016 8:53 10000m 07:52.1 2000 23 169 01:58.0 1032 213
74 F 10/6/2016 8:53 10000m 08:03.3 4000 22 164 02:00.8 982 198
75 F 10/6/2016 8:53 10000m 08:19.4 6000 21 175 02:04.8 918 180
76 F 10/6/2016 8:53 10000m 08:10.7 8000 21 176 02:02.6 952 190
77 F 10/6/2016 8:53 10000m 08:05.3 10000 21 181 02:01.3 974 196
78
79 F 10/6/2016 8:12 0:03:02 03:02.3 713 21 142 02:07.8 876 168
80 F 10/6/2016 8:12 0:03:02 03:02.3 714 21 142 02:07.6 878 168
81
82 F 9/27/2016 16:39 0:10:19 10:19.2 2110 22 0 02:26.7 681 111
83 F 9/27/2016 16:39 0:10:19 05:00.0 1029 24 0 02:25.7 688 113
84 F 9/27/2016 16:39 0:10:19 10:00.0 1020 25 0 02:27.0 678 110
85 F 9/27/2016 16:39 0:10:19 10:19.2 61 19 0 02:37.3 609 90
86
87 F 9/27/2016 16:26 0:01:20 01:20.8 259 22 0 02:35.9 617 92
88 F 9/27/2016 16:26 0:01:20 01:20.8 259 22 0 02:35.9 617 92
89
90 F 9/23/2016 7:59 0:30:00 30:00.0 7142 21 163 02:06.0 901 175
91 F 9/23/2016 7:59 0:30:00 06:00.0 1473 22 160 02:02.1 960 192
92 F 9/23/2016 7:59 0:30:00 12:00.0 1409 20 162 02:07.7 877 168
93 F 9/23/2016 7:59 0:30:00 18:00.0 1393 21 163 02:09.2 858 162
94 F 9/23/2016 7:59 0:30:00 24:00.0 1429 22 158 02:05.9 902 175
95 F 9/23/2016 7:59 0:30:00 30:00.0 1439 21 173 02:05.0 915 179
96
97 F 9/23/2016 7:29 0:03:08 03:08.0 744 21 147 02:06.3 897 174
98 F 9/23/2016 7:29 0:03:08 03:08.0 744 21 147 02:06.3 897 174
99
100 F 9/21/2016 16:09 0:34:16 34:16.9 6512 20 0 02:37.9 605 89
101 F 9/21/2016 16:09 0:34:16 05:00.0 980 22 0 02:33.0 635 98
102 F 9/21/2016 16:09 0:34:16 10:00.0 989 20 0 02:31.6 645 100
103 F 9/21/2016 16:09 0:34:16 15:00.0 966 21 0 02:35.2 621 93
104 F 9/21/2016 16:09 0:34:16 20:00.0 938 20 0 02:39.9 594 86
105 F 9/21/2016 16:09 0:34:16 25:00.0 946 21 0 02:38.5 602 88
106 F 9/21/2016 16:09 0:34:16 30:00.0 909 21 0 02:45.0 568 78
107 F 9/21/2016 16:09 0:34:16 34:16.9 785 20 0 02:43.6 574 80
108
109 F 9/20/2016 17:11 0:33:19 33:19.3 6519 21 0 02:33.3 634 97
110 F 9/20/2016 17:11 0:33:19 05:00.0 991 22 0 02:31.3 647 101
111 F 9/20/2016 17:11 0:33:19 10:00.0 994 21 0 02:30.9 650 102
112 F 9/20/2016 17:11 0:33:19 15:00.0 977 21 0 02:33.5 632 97
113 F 9/20/2016 17:11 0:33:19 20:00.0 968 21 0 02:34.9 623 94
114 F 9/20/2016 17:11 0:33:19 25:00.0 982 21 0 02:32.7 637 98
115 F 9/20/2016 17:11 0:33:19 30:00.0 971 21 0 02:34.4 626 95
116 F 9/20/2016 17:11 0:33:19 33:19.3 637 20 0 02:36.4 614 91
117
118 F 9/20/2016 8:12 0:22:32 22:32.5 4731 18 158 02:22.9 712 120
119 F 9/20/2016 8:12 0:22:32 09:00.0 2197 22 171 02:02.8 948 189
120 F 9/20/2016 8:12 0:22:32 18:00.0 1781 18 136 02:31.6 645 100
121 F 9/20/2016 8:12 0:22:32 22:32.5 753 15 168 03:00.9 503 59
122
123 F 9/20/2016 7:48 v5:00...1 05:00.0 758 14 115 03:17.8 455 45
124 F 9/20/2016 7:48 v5:00...1 05:00.0 759 14 115 03:17.6 456 45
125 F 9/20/2016 7:48 v5:00...1 00:00.0 0 0
126
127 F 9/19/2016 15:28 0:31:15 31:15.4 6511 22 0 02:24.0 703 117
128 F 9/19/2016 15:28 0:31:15 05:00.0 1040 24 0 02:24.2 701 117
129 F 9/19/2016 15:28 0:31:15 10:00.0 1037 23 0 02:24.6 698 116
130 F 9/19/2016 15:28 0:31:15 15:00.0 1067 23 0 02:20.5 733 126
131 F 9/19/2016 15:28 0:31:15 20:00.0 1046 23 0 02:23.4 708 119
132 F 9/19/2016 15:28 0:31:15 25:00.0 1025 21 0 02:26.3 684 112
133 F 9/19/2016 15:28 0:31:15 30:00.0 1045 22 0 02:23.5 707 118
134 F 9/19/2016 15:28 0:31:15 31:15.4 252 19 0 02:29.6 659 105
135
136 F 9/15/2016 18:01 0:32:53 32:53.1 6694 22 0 02:27.3 676 109
137 F 9/15/2016 18:01 0:32:53 05:00.0 1055 24 0 02:22.1 719 122
138 F 9/15/2016 18:01 0:32:53 10:00.0 1042 23 0 02:23.9 703 117
139 F 9/15/2016 18:01 0:32:53 15:00.0 1017 22 0 02:27.4 675 109
140 F 9/15/2016 18:01 0:32:53 20:00.0 1030 23 0 02:25.6 690 113
141 F 9/15/2016 18:01 0:32:53 25:00.0 996 23 0 02:30.6 652 102
142 F 9/15/2016 18:01 0:32:53 30:00.0 983 22 0 02:32.5 639 99
143 F 9/15/2016 18:01 0:32:53 32:53.1 572 22 0 02:31.3 647 101
144
145 F 9/13/2016 16:52 0:35:12 35:12.4 6740 23 0 02:36.7 613 91
146 F 9/13/2016 16:52 0:35:12 10:00.0 1928 28 0 02:35.6 619 93
147 F 9/13/2016 16:52 0:35:12 20:00.0 1955 26 0 02:33.4 633 97
148 F 9/13/2016 16:52 0:35:12 30:00.0 1958 23 0 02:33.2 634 97
149 F 9/13/2016 16:52 0:35:12 35:12.4 900 18 0 02:53.5 530 67
150
151 F 9/3/2016 11:33 0:01:26 01:26.7 113 28 0 06:23.6 321 6
152 F 9/3/2016 11:33 0:01:26 01:26.7 114 28 0 06:20.2 321 6
153
154 F 8/8/2016 7:45 0:24:18 24:18.4 4438 15 136 02:44.3 571 79
155 F 8/8/2016 7:45 0:24:18 11:00.0 2322 19 147 02:22.1 719 122
156 F 8/8/2016 7:45 0:24:18 22:00.0 1830 15 0 03:00.3 505 60
157 F 8/8/2016 7:45 0:24:18 24:18.4 287 11 126 04:01.1 385 25
158
159 F 7/6/2016 7:49 0:45:00 45:00.0 10872 21 164 02:04.1 929 183
160 F 7/6/2016 7:49 0:45:00 09:00.0 2186 22 151 02:03.5 939 186
161 F 7/6/2016 7:49 0:45:00 18:00.0 2222 22 163 02:01.5 971 195
162 F 7/6/2016 7:49 0:45:00 27:00.0 2048 20 158 02:11.8 825 153
163 F 7/6/2016 7:49 0:45:00 36:00.0 2146 21 169 02:05.8 904 176
164 F 7/6/2016 7:49 0:45:00 45:00.0 2271 22 179 01:58.8 1016 208
165
166 F 7/5/2016 8:18 0:45:00 45:00.0 10900 21 168 02:03.8 934 184
167 F 7/5/2016 8:18 0:45:00 09:00.0 2285 23 166 01:58.1 1030 212
168 F 7/5/2016 8:18 0:45:00 18:00.0 2256 22 168 01:59.6 1002 204
169 F 7/5/2016 8:18 0:45:00 27:00.0 2156 21 174 02:05.2 913 178
170 F 7/5/2016 8:18 0:45:00 36:00.0 2016 20 155 02:13.9 801 146
171 F 7/5/2016 8:18 0:45:00 45:00.0 2188 21 177 02:03.4 941 186
172
173 F 7/2/2016 7:14 0:35:17 35:17.2 8855 22 167 01:59.5 1005 205
174 F 7/2/2016 7:14 0:35:17 11:01.6 2800 24 161 01:58.1 1030 212
175 F 7/2/2016 7:14 0:35:17 10:57.7 5600 23 171 01:57.4 1043 216
176 F 7/2/2016 7:14 0:35:17 11:24.5 8400 22 169 02:02.2 959 192
177 F 7/2/2016 7:14 0:35:17 01:53.4 8855 21 167 02:04.6 922 181
178
179 F 7/1/2016 7:32 10000m 40:15.0 10000 23 176 02:00.7 984 199
180 F 7/1/2016 7:32 10000m 07:54.1 2000 24 168 01:58.5 1023 210
181 F 7/1/2016 7:32 10000m 07:50.3 4000 24 174 01:57.5 1041 215
182 F 7/1/2016 7:32 10000m 08:24.4 6000 22 177 02:06.1 900 175
183 F 7/1/2016 7:32 10000m 08:02.3 8000 23 180 02:00.5 987 200
184 F 7/1/2016 7:32 10000m 08:03.9 10000 22 182 02:00.9 980 198
185
186 F 7/1/2016 6:51 0:02:29 02:29.5 529 20 130 02:21.3 726 124
187 F 7/1/2016 6:51 0:02:29 02:29.5 529 20 130 02:21.3 726 124
188
189 F 6/28/2016 6:45 0:30:00 30:00.0 7434 22 173 02:01.0 978 197
190 F 6/28/2016 6:45 0:30:00 06:00.0 1534 23 0 01:57.3 1045 217
191 F 6/28/2016 6:45 0:30:00 12:00.0 1342 21 166 02:14.1 799 145
192 F 6/28/2016 6:45 0:30:00 18:00.0 1523 24 172 01:58.1 1029 212
193 F 6/28/2016 6:45 0:30:00 24:00.0 1484 22 173 02:01.2 975 196
194 F 6/28/2016 6:45 0:30:00 30:00.0 1552 23 184 01:55.9 1072 224
195
196 F 6/25/2016 7:10 0:30:00 30:00.0 7675 23 171 01:57.2 1047 217
197 F 6/25/2016 7:10 0:30:00 06:00.0 1542 24 159 01:56.7 1057 220
198 F 6/25/2016 7:10 0:30:00 12:00.0 1527 24 165 01:57.8 1035 214
199 F 6/25/2016 7:10 0:30:00 18:00.0 1550 24 174 01:56.1 1069 223
200 F 6/25/2016 7:10 0:30:00 24:00.0 1502 23 179 01:59.8 999 203
201 F 6/25/2016 7:10 0:30:00 30:00.0 1556 23 181 01:55.6 1078 226
202
203 F 6/9/2016 7:17 0:30:00 30:00.0 7299 22 166 02:03.3 942 187
204 F 6/9/2016 7:17 0:30:00 06:00.0 1563 24 168 01:55.1 1088 229
205 F 6/9/2016 7:17 0:30:00 12:00.0 1463 22 166 02:03.0 946 188
206 F 6/9/2016 7:17 0:30:00 18:00.0 1371 21 160 02:11.2 832 155
207 F 6/9/2016 7:17 0:30:00 24:00.0 1434 22 165 02:05.5 909 177
208 F 6/9/2016 7:17 0:30:00 30:00.0 1468 22 174 02:02.6 953 190
209
210 F 5/24/2016 7:42 0:30:00 30:00.0 7612 23 168 01:58.2 1028 212
211 F 5/24/2016 7:42 0:30:00 06:00.0 1534 24 158 01:57.3 1045 217
212 F 5/24/2016 7:42 0:30:00 12:00.0 1491 23 167 02:00.7 984 199
213 F 5/24/2016 7:42 0:30:00 18:00.0 1507 23 169 01:59.4 1006 205
214 F 5/24/2016 7:42 0:30:00 24:00.0 1532 23 171 01:57.4 1042 216
215 F 5/24/2016 7:42 0:30:00 30:00.0 1548 23 175 01:56.2 1066 223
216
217 F 5/7/2016 9:14 0:30:00 30:00.0 7540 23 164 01:59.3 1008 206
218 F 5/7/2016 9:14 0:30:00 06:00.0 1493 23 162 02:00.5 987 200
219 F 5/7/2016 9:14 0:30:00 12:00.0 1517 23 161 01:58.6 1021 210
220 F 5/7/2016 9:14 0:30:00 18:00.0 1498 23 165 02:00.1 994 202
221 F 5/7/2016 9:14 0:30:00 24:00.0 1506 23 164 01:59.5 1005 205
222 F 5/7/2016 9:14 0:30:00 30:00.0 1526 23 169 01:57.9 1033 213
223
224 F 4/23/2016 8:17 10000m 39:24.5 10000 23 166 01:58.2 1028 212
225 F 4/23/2016 8:17 10000m 07:47.0 2000 24 161 01:56.7 1056 220
226 F 4/23/2016 8:17 10000m 07:44.2 4000 24 171 01:56.0 1070 224
227 F 4/23/2016 8:17 10000m 07:50.7 6000 23 165 01:57.6 1039 215
228 F 4/23/2016 8:17 10000m 08:09.4 8000 22 165 02:02.3 957 191
229 F 4/23/2016 8:17 10000m 07:53.1 10000 23 170 01:58.2 1028 212
230
231 F 4/20/2016 8:12 0:30:00 30:00.0 7961 24 170 01:53.0 1133 242
232 F 4/20/2016 8:12 0:30:00 06:00.0 1583 24 160 01:53.7 1119 238
233 F 4/20/2016 8:12 0:30:00 12:00.0 1590 24 163 01:53.2 1130 241
234 F 4/20/2016 8:12 0:30:00 18:00.0 1594 24 173 01:52.9 1136 243
235 F 4/20/2016 8:12 0:30:00 24:00.0 1589 25 174 01:53.2 1128 241
236 F 4/20/2016 8:12 0:30:00 30:00.0 1607 24 182 01:52.0 1157 249
237
238 F 4/18/2016 8:24 0:30:00 30:00.0 7608 22 167 01:58.2 1027 211
239 F 4/18/2016 8:24 0:30:00 06:00.0 1508 22 154 01:59.3 1008 206
240 F 4/18/2016 8:24 0:30:00 12:00.0 1468 21 161 02:02.6 953 190
241 F 4/18/2016 8:24 0:30:00 18:00.0 1542 23 171 01:56.7 1057 220
242 F 4/18/2016 8:24 0:30:00 24:00.0 1544 23 172 01:56.5 1060 221
243 F 4/18/2016 8:24 0:30:00 30:00.0 1546 23 179 01:56.4 1063 222
244
245 F 4/17/2016 9:32 0:35:33 35:33.4 8406 21 152 02:06.8 889 171
246 F 4/17/2016 9:32 0:35:33 11:25.3 2800 22 162 02:02.3 957 191
247 F 4/17/2016 9:32 0:35:33 11:02.1 5600 22 171 01:58.2 1028 212
248 F 4/17/2016 9:32 0:35:33 13:03.3 8400 19 138 02:19.8 740 128
249 F 4/17/2016 9:32 0:35:33 00:02.7 8406 0 138 03:45.0 405 31
250
251 F 4/11/2016 8:29 0:37:24 37:24.9 9267 22 170 02:01.1 977 197
252 F 4/11/2016 8:29 0:37:24 11:03.9 2800 23 169 01:58.5 1022 210
253 F 4/11/2016 8:29 0:37:24 11:21.7 5600 22 171 02:01.7 967 194
254 F 4/11/2016 8:29 0:37:24 11:30.7 8400 22 170 02:03.3 941 187
255 F 4/11/2016 8:29 0:37:24 03:28.8 9267 22 170 02:00.4 989 200