Commit 48669dd9 authored by Stefan Haslinger's avatar Stefan Haslinger

hide db from Activity

parent 8c8b4f55
This diff is collapsed.
......@@ -25,8 +25,8 @@ class ActivityList<E> extends DelegatingList<E> {
for (int olderIndex = index + 1;
olderIndex < _activities.length;
olderIndex++) {
final double daysAgo = activity.db.timeCreated
.difference(_activities[olderIndex].db.timeCreated)
final double daysAgo = activity.timeCreated
.difference(_activities[olderIndex].timeCreated)
.inHours /
24;
if (daysAgo > fullDecay) {
......@@ -88,7 +88,7 @@ class ActivityList<E> extends DelegatingList<E> {
}
final List<Activity> activityList = _activities
.where((Activity activity) => activityIds.contains(activity.db.id))
.where((Activity activity) => activityIds.contains(activity.id))
.toList();
return ActivityList<Activity>(activityList);
}
......
......@@ -11,7 +11,7 @@ class ActivityTagging {
bool system,
}) {
_db = DbActivityTagging()
..activitiesId = activity.db.id
..activitiesId = activity.id
..tagsId = tag.id
..system = system ?? false;
}
......@@ -31,7 +31,7 @@ class ActivityTagging {
final DbActivityTagging dbActivityTagging = await DbActivityTagging()
.select()
.activitiesId
.equals(activity.db.id)
.equals(activity.id)
.and
.tagsId
.equals(tag.id)
......@@ -54,7 +54,7 @@ class ActivityTagging {
final DbActivityTagging dbActivityTagging = await DbActivityTagging()
.select()
.activitiesId
.equals(activity.db.id)
.equals(activity.id)
.and
.tagsId
.equals(tag.id)
......@@ -71,7 +71,7 @@ class ActivityTagging {
final DbActivityTagging dbActivityTagging = await DbActivityTagging()
.select()
.activitiesId
.equals(activity.db.id)
.equals(activity.id)
.and
.tagsId
.equals(tag.id)
......
......@@ -137,8 +137,8 @@ class Athlete {
final Directory appDocDir = await getApplicationDocumentsDirectory();
for (final Activity activity in await activities) {
await activity.db.getDbEvents().delete();
await activity.db.getDbLaps().delete();
await activity.deleteEvents();
await activity.deleteLaps();
// ignore: avoid_slow_async_io
if (await File(appDocDir.path + '/$stravaId.fit').exists())
......
......@@ -14,14 +14,14 @@ class Event {
@required this.activity,
}) {
if (dataMessage.any('max_heart_rate') != null) {
activity.db
activity
..maxHeartRate = (dataMessage.get('max_heart_rate') as double)?.round()
..save();
} else if (dataMessage.values.any((Value value) =>
value.fieldName == 'event_type' &&
<String> ['start', 'stop_all'].contains(value.value))) {
_db = DbEvent()
..activitiesId = activity.db.id
..activitiesId = activity.id
..event = dataMessage.get('event') as String
..eventType = dataMessage.get('event_type') as String
..eventGroup = (dataMessage.get('event_group') as double)?.round()
......@@ -31,7 +31,7 @@ class Event {
} else if (dataMessage.values.any((Value value) =>
value.fieldName == 'event_type' && <String> ['marker'].contains(value.value))) {
_db = DbEvent()
..activitiesId = activity.db.id
..activitiesId = activity.id
..event = dataMessage.get('event')?.toString()
..eventType = dataMessage.get('event_type') as String
..eventGroup = (dataMessage.get('event_group') as double)?.round()
......@@ -52,7 +52,7 @@ class Event {
@required int lapsId,
}) {
_db = DbEvent()
..activitiesId = activity.db.id
..activitiesId = activity.id
..lapsId = lapsId
..event = 'record'
..timeStamp = dateTimeFromStrava(dataMessage.get('timestamp') as double)
......@@ -78,7 +78,7 @@ class Event {
@required int lapsId,
}) {
_db = DbEvent()
..activitiesId = activity.db.id
..activitiesId = activity.id
..lapsId = lapsId
..positionLat = dataMessage.get('end_position_lat') as double
..positionLong = dataMessage.get('end_position_long') as double
......@@ -150,16 +150,14 @@ class Event {
static Future<List<Event>> by({Activity activity}) async {
int counter = 1;
final List<DbEvent> dbEventList = await activity.db.getDbEvents().toList();
final List<Event> eventList =
dbEventList.map(Event.exDb).toList();
final List<Event> events = await activity.events;
for (final Event event in eventList) {
for (final Event event in events) {
event.activity = activity;
event.index = counter;
counter = counter + 1;
}
return eventList;
return events;
}
static Future<BoolCommitResult> upsertAll(List<Event> events) async {
......
......@@ -86,7 +86,7 @@ class Lap {
Lap lap,
}) {
lap._db
..activitiesId = activity.db.id
..activitiesId = activity.id
..avgSpeed = dataMessage.get('avg_speed') as double
..maxSpeed = dataMessage.get('max_speed') as double
..timeStamp = dateTimeFromStrava(dataMessage.get('timestamp') as double)
......@@ -207,22 +207,6 @@ class Lap {
return _db.sdevFormPower;
}
static Future<List<Lap>> all({Activity activity}) async {
int counter = 1;
final List<DbLap> dbLapList = await activity.db.getDbLaps().toList();
final List<Lap> lapList =
dbLapList.map(Lap.exDb).toList();
for (final Lap lap in lapList) {
lap
..activity = activity
..index = counter;
counter = counter + 1;
}
return lapList;
}
Future<PowerZoneSchema> get powerZoneSchema async {
if (_powerZoneSchema == null) {
final DbActivity dbActivity = await DbActivity().getById(activitiesId);
......
......@@ -41,7 +41,7 @@ class Tag {
final List<DbActivityTagging> dbActivityTaggings = await DbActivityTagging()
.select()
.activitiesId
.equals(activity.db.id)
.equals(activity.id)
.toList();
if (dbActivityTaggings.isNotEmpty) {
final List<DbTag> dbTags = await DbTag()
......
......@@ -115,7 +115,7 @@ class TagGroup {
final List<DbActivityTagging> dbActivityTaggings = await DbActivityTagging()
.select()
.activitiesId
.equals(activity.db.id)
.equals(activity.id)
.toList();
final Iterable<int> selectedTagIds = dbActivityTaggings
.map((DbActivityTagging dbActivityTagging) => dbActivityTagging.tagsId);
......
......@@ -22,7 +22,7 @@ class ShowActivityDetailScreen extends StatelessWidget {
appBar: AppBar(
backgroundColor: backgroundColor ?? MyColor.activity,
title: Text(
'$title: ${activity.db.name}',
'$title: ${activity.name}',
overflow: TextOverflow.ellipsis,
),
),
......
......@@ -247,8 +247,8 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
),
onPressed: () => autoTagger(),
),
if (<String>['new', 'downloaded', 'persisted'].contains(widget.activity.db.state))
if (<String>['new', 'downloaded', 'persisted']
.contains(widget.activity.state))
RaisedButton.icon(
color: MyColor.add,
icon: MyIcon.download,
......@@ -258,8 +258,7 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
),
onPressed: () => download(),
),
if (<String>['downloaded', 'persisted'].contains(widget.activity.db.state))
if (<String>['downloaded', 'persisted'].contains(widget.activity.state))
RaisedButton.icon(
color: MyColor.add,
icon: MyIcon.parse,
......@@ -269,8 +268,8 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
),
onPressed: () => parse(),
),
if (<String>['new', 'downloaded', 'persisted'].contains(widget.activity.db.state))
if (<String>['new', 'downloaded', 'persisted']
.contains(widget.activity.state))
RaisedButton.icon(
color: MyColor.delete,
icon: MyIcon.delete,
......@@ -289,7 +288,7 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
appBar: AppBar(
backgroundColor: MyColor.activity,
title: Text(
widget.activity.db.name,
widget.activity.name,
overflow: TextOverflow.ellipsis,
),
),
......@@ -361,7 +360,7 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
Future<void> download() async {
flushbar = Flushbar<Object>(
message: 'Download .fit-File for »${widget.activity.db.name}«',
message: 'Download .fit-File for »${widget.activity.name}«',
duration: const Duration(seconds: 10),
icon: MyIcon.stravaDownloadWhite,
)..show(context);
......@@ -380,19 +379,19 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
Future<void> parse() async {
Flushbar<Object> flushbar = Flushbar<Object>(
message: '0% of storing »${widget.activity.db.name}«',
message: '0% of storing »${widget.activity.name}«',
duration: const Duration(seconds: 10),
animationDuration: const Duration(milliseconds: 1),
titleText: const LinearProgressIndicator(value: 0),
)..show(context);
final Stream<int> percentageStream =
widget.activity.parse(athlete: widget.athlete);
widget.activity.parse(athlete: widget.athlete);
await for (final int value in percentageStream) {
flushbar.dismiss();
flushbar = Flushbar<Object>(
titleText: LinearProgressIndicator(value: value / 100),
message: '$value% of storing »${widget.activity.db.name}«',
message: '$value% of storing »${widget.activity.name}«',
duration: const Duration(seconds: 3),
animationDuration: const Duration(milliseconds: 1),
)..show(context);
......
......@@ -278,7 +278,7 @@ class _ShowAthleteScreenState extends State<ShowAthleteScreen> {
percent = 100 * index ~/ activities.length;
flushbar = Flushbar<Object>(
titleText: LinearProgressIndicator(value: percent / 100),
message: '$percent% done (recalculating »${activity.db.name}« )',
message: '$percent% done (recalculating »${activity.name}« )',
duration: const Duration(seconds: 2),
animationDuration: const Duration(milliseconds: 1),
)..show(context);
......@@ -309,7 +309,7 @@ class _ShowAthleteScreenState extends State<ShowAthleteScreen> {
activities = await widget.athlete.activities;
final List<Activity> downloadedActivities = activities
.where((Activity activity) => activity.db.state == 'downloaded')
.where((Activity activity) => activity.state == 'downloaded')
.toList();
for (final Activity activity in downloadedActivities) {
await parse(activity: activity);
......@@ -347,7 +347,7 @@ class _ShowAthleteScreenState extends State<ShowAthleteScreen> {
final Activity activity =
Activity.fromLocalDirectory(athlete: widget.athlete);
await dio.download(downloadDir + filename,
appDocDir.path + '/' + activity.db.stravaId.toString() + '.fit');
appDocDir.path + '/' + activity.stravaId.toString() + '.fit');
await activity.setState('downloaded');
}
......@@ -359,7 +359,7 @@ class _ShowAthleteScreenState extends State<ShowAthleteScreen> {
activities = await widget.athlete.activities;
final List<Activity> downloadedActivities = activities
.where((Activity activity) => activity.db.state == 'downloaded')
.where((Activity activity) => activity.state == 'downloaded')
.toList();
for (final Activity activity in downloadedActivities) {
await parse(activity: activity);
......@@ -390,13 +390,13 @@ class _ShowAthleteScreenState extends State<ShowAthleteScreen> {
activities = await widget.athlete.activities;
final Iterable<Activity> newActivities =
activities.where((Activity activity) => activity.db.state == 'new');
activities.where((Activity activity) => activity.state == 'new');
for (final Activity activity in newActivities) {
await download(activity: activity);
}
final Iterable<Activity> downloadedActivities = activities
.where((Activity activity) => activity.db.state == 'downloaded');
.where((Activity activity) => activity.state == 'downloaded');
for (final Activity activity in downloadedActivities) {
await parse(activity: activity);
await activity.autoTagger(athlete: widget.athlete);
......@@ -439,7 +439,7 @@ class _ShowAthleteScreenState extends State<ShowAthleteScreen> {
Future<void> download({Activity activity}) async {
flushbar.dismiss();
flushbar = Flushbar<Object>(
message: 'Download .fit-File for »${activity.db.name}«',
message: 'Download .fit-File for »${activity.name}«',
duration: const Duration(seconds: 10),
icon: MyIcon.stravaDownloadWhite,
)..show(context);
......@@ -458,7 +458,7 @@ class _ShowAthleteScreenState extends State<ShowAthleteScreen> {
Future<void> parse({Activity activity}) async {
flushbar.dismiss();
flushbar = Flushbar<Object>(
message: '0% of storing »${activity.db.name}«',
message: '0% of storing »${activity.name}«',
duration: const Duration(seconds: 10),
animationDuration: const Duration(milliseconds: 1),
titleText: const LinearProgressIndicator(value: 0),
......@@ -470,7 +470,7 @@ class _ShowAthleteScreenState extends State<ShowAthleteScreen> {
flushbar.dismiss();
flushbar = Flushbar<Object>(
titleText: LinearProgressIndicator(value: value / 100),
message: '$value% of storing »${activity.db.name}«',
message: '$value% of storing »${activity.name}«',
duration: const Duration(seconds: 20),
animationDuration: const Duration(milliseconds: 1),
)..show(context);
......@@ -541,7 +541,7 @@ class _ShowAthleteScreenState extends State<ShowAthleteScreen> {
percent = 100 * index ~/ activities.length;
flushbar = Flushbar<Object>(
titleText: LinearProgressIndicator(value: percent / 100),
message: '$percent% done (autotagging »${activity.db.name}« )',
message: '$percent% done (autotagging »${activity.name}« )',
duration: const Duration(seconds: 2),
animationDuration: const Duration(milliseconds: 1),
)..show(context);
......
......@@ -49,7 +49,7 @@ class _AthleteTimeSeriesChartState extends State<AthleteTimeSeriesChart> {
List<Activity> recentActivities = widget.activities
.where((Activity activity) =>
DateTime.now().difference(activity.db.timeCreated).inDays <
DateTime.now().difference(activity.timeCreated).inDays <
xAxesDays)
.toList();
if (recentActivities.length < 40) {
......@@ -61,7 +61,7 @@ class _AthleteTimeSeriesChartState extends State<AthleteTimeSeriesChart> {
Series<Activity, DateTime>(
id: widget.activityAttr.toString(),
colorFn: (_, __) => MaterialPalette.blue.shadeDefault,
domainFn: (Activity activity, _) => activity.db.timeCreated,
domainFn: (Activity activity, _) => activity.timeCreated,
measureFn: (Activity activity, _) =>
activity.getAttribute(widget.activityAttr) as num,
data: recentActivities,
......@@ -69,7 +69,7 @@ class _AthleteTimeSeriesChartState extends State<AthleteTimeSeriesChart> {
Series<Activity, DateTime>(
id: 'gliding_' + widget.activityAttr.toString(),
colorFn: (_, __) => MaterialPalette.green.shadeDefault,
domainFn: (Activity activity, _) => activity.db.timeCreated,
domainFn: (Activity activity, _) => activity.timeCreated,
measureFn: (Activity activity, _) => activity.glidingMeasureAttribute,
data: recentActivities,
)..setAttribute(rendererIdKey, 'glidingAverageRenderer'),
......@@ -135,7 +135,7 @@ class _AthleteTimeSeriesChartState extends State<AthleteTimeSeriesChart> {
mainAxisSpacing: 3,
children: <Widget>[
MyButton.activity(
child: Text(selectedActivity.db.name),
child: Text(selectedActivity.name),
onPressed: () => Navigator.push(
context,
MaterialPageRoute<BuildContext>(
......@@ -148,23 +148,23 @@ class _AthleteTimeSeriesChartState extends State<AthleteTimeSeriesChart> {
),
ListTile(
title: Text(DateFormat('dd MMM yyyy, h:mm:ss')
.format(selectedActivity.db.timeCreated)),
.format(selectedActivity.timeCreated)),
subtitle: const Text('Time created'),
),
ListTile(
title: Text(selectedActivity.db.distance.toString() + ' m'),
title: Text(selectedActivity.distance.toString() + ' m'),
subtitle: const Text('Distance')),
ListTile(
title:
Text(selectedActivity.db.avgSpeed.toPace() + ' min/km'),
Text(selectedActivity.avgSpeed.toPace() + ' min/km'),
subtitle: const Text('Average speed')),
ListTile(
title: Text(
selectedActivity.db.avgPower.toStringAsFixed(1) + ' W'),
selectedActivity.avgPower.toStringAsFixed(1) + ' W'),
subtitle: const Text('Average power')),
ListTile(
title: Text(
selectedActivity.db.avgHeartRate.toString() + ' bpm'),
selectedActivity.avgHeartRate.toString() + ' bpm'),
subtitle: const Text('Average heart rate')),
],
),
......
......@@ -33,8 +33,8 @@ class PathPainter extends CustomPainter {
..strokeWidth = strokeWidth,
);
final double scaleX = width / (activity.db.necLong - activity.db.swcLong);
final double scaleY = height / (activity.db.necLat - activity.db.swcLat);
final double scaleX = width / (activity.necLong - activity.swcLong);
final double scaleY = height / (activity.necLat - activity.swcLat);
final double scale = min(scaleX, scaleY);
canvas.drawPoints(
PointMode.points,
......@@ -44,12 +44,12 @@ class PathPainter extends CustomPainter {
width / 2 +
scale *
(record.positionLong -
activity.db.swcLong / 2 -
activity.db.necLong / 2),
activity.swcLong / 2 -
activity.necLong / 2),
height / 2 +
scale *
(activity.db.necLat / 2 +
activity.db.swcLat / 2 -
(activity.necLat / 2 +
activity.swcLat / 2 -
record.positionLat),
),
)
......
......@@ -46,8 +46,8 @@ class _ActivitiesFeedWidgetState extends State<ActivitiesFeedWidget> {
return Column(crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ListTile(
leading: sportsIcon(sport: activity.db.sport),
title: Text(activity.db.name ?? 'Activity'),
leading: sportsIcon(sport: activity.sport),
title: Text(activity.name ?? 'Activity'),
subtitle: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
......@@ -59,7 +59,7 @@ class _ActivitiesFeedWidgetState extends State<ActivitiesFeedWidget> {
],
),
onTap: () async {
if (activity.db.state == 'persisted') {
if (activity.state == 'persisted') {
await Navigator.push(
context,
MaterialPageRoute<BuildContext>(
......
......@@ -37,11 +37,11 @@ class _ActivitiesListWidgetState extends State<ActivitiesListWidget> {
for (Activity activity in activities)
ListTile(
dense: true,
leading: sportsIcon(sport: activity.db.sport),
title: Text(activity.db.name ?? 'Activity'),
leading: sportsIcon(sport: activity.sport),
title: Text(activity.name ?? 'Activity'),
subtitle: Text(activity.longDateTimeString()),
onTap: () {
if (activity.db.state == 'persisted')
if (activity.state == 'persisted')
Navigator.push(
context,
MaterialPageRoute<BuildContext>(
......@@ -74,7 +74,7 @@ class _ActivitiesListWidgetState extends State<ActivitiesListWidget> {
Future<void> download({Activity activity}) async {
flushbar = Flushbar<Object>(
message: 'Download .fit-File for »${activity.db.name}«',
message: 'Download .fit-File for »${activity.name}«',
duration: const Duration(seconds: 10),
icon: MyIcon.stravaDownloadWhite,
)..show(context);
......@@ -93,7 +93,7 @@ class _ActivitiesListWidgetState extends State<ActivitiesListWidget> {
Future<void> parse({Activity activity}) async {
Flushbar<Object> flushbar = Flushbar<Object>(
message: '0% of storing »${activity.db.name}«',
message: '0% of storing »${activity.name}«',
duration: const Duration(seconds: 10),
animationDuration: const Duration(milliseconds: 1),
titleText: const LinearProgressIndicator(value: 0),
......@@ -105,7 +105,7 @@ class _ActivitiesListWidgetState extends State<ActivitiesListWidget> {
flushbar.dismiss();
flushbar = Flushbar<Object>(
titleText: LinearProgressIndicator(value: value / 100),
message: '$value% of storing »${activity.db.name}«',
message: '$value% of storing »${activity.name}«',
duration: const Duration(seconds: 3),
animationDuration: const Duration(milliseconds: 1),
)..show(context);
......
......@@ -65,17 +65,17 @@ class _ActivityBarGraphWidgetState extends State<ActivityBarGraphWidget> {
MyBarChart(
width: 150,
height: 20,
value: widget.activity.db.avgPower,
value: widget.activity.avgPower,
powerZones: _powerZones,
),
Text(widget.activity.db.avgPower.toStringAsFixed(1)),
Text(widget.activity.avgPower.toStringAsFixed(1)),
MyBarChart(
width: 150,
height: 20,
value: widget.activity.db.avgHeartRate,
value: widget.activity.avgHeartRate,
heartRateZones: _heartRateZones,
),
Text(widget.activity.db.avgHeartRate.toString()),
Text(widget.activity.avgHeartRate.toString()),
]),
for (Lap lap in _laps)
TableRow(children: <Widget>[
......@@ -146,10 +146,10 @@ class _ActivityBarGraphWidgetState extends State<ActivityBarGraphWidget> {
const Text('Activity'),
MyBarChart(
height: 20,
value: widget.activity.db.avgSpeed.toPaceDouble(),
value: widget.activity.avgSpeed.toPaceDouble(),
maximum: 700,
),
Text(widget.activity.db.avgSpeed.toPace()),
Text(widget.activity.avgSpeed.toPace()),
]),
for (Lap lap in _laps)
TableRow(children: <Widget>[
......
......@@ -99,7 +99,7 @@ class _ActivityEcorWidgetState extends State<ActivityEcorWidget> {
records = RecordList<Event>(await widget.activity.records);
weight = await Weight.getBy(
athletesId: widget.athlete.id,
date: widget.activity.db.timeCreated,
date: widget.activity.timeCreated,
);
widget.activity.weight = weight.value;
weightString = weight.value.toStringOrDashes(2) + ' kg';
......
......@@ -90,8 +90,8 @@ class _ActivityFormPowerWidgetState extends State<ActivityFormPowerWidget> {
Future<void> getData() async {
final Activity activity = widget.activity;
records = RecordList<Event>(await activity.records);
avgFormPowerString = activity.db.avgFormPower.toStringOrDashes(1) + ' W';
sdevFormPowerString = activity.db.sdevFormPower.toStringOrDashes(2) + ' W';
avgFormPowerString = activity.avgFormPower.toStringOrDashes(1) + ' W';
sdevFormPowerString = activity.sdevFormPower.toStringOrDashes(2) + ' W';
setState(() {});
}
}
......@@ -88,11 +88,11 @@ class _ActivityGroundTimeWidgetState extends State<ActivityGroundTimeWidget> {
Future<void> getData() async {
final Activity activity = widget.activity;
records = RecordList<Event>(await activity.records);
avgGroundTimeString = activity.db.avgGroundTime != null
? activity.db.avgGroundTime.toStringOrDashes(1) + ' ms'
avgGroundTimeString = activity.avgGroundTime != null
? activity.avgGroundTime.toStringOrDashes(1) + ' ms'
: '- - -';
sdevGroundTimeString =
activity.db.sdevGroundTime.toStringOrDashes(2) + ' ms';
activity.sdevGroundTime.toStringOrDashes(2) + ' ms';
setState(() {});
}
}
......@@ -59,7 +59,7 @@ class _ActivityHeartRateWidgetState extends State<ActivityHeartRateWidget> {
const Divider(),
ListTile(
leading: MyIcon.average,
title: Text(widget.activity.db.avgHeartRate.toString()),
title: Text(widget.activity.avgHeartRate.toString()),
subtitle: const Text('average heart rate'),
),
ListTile(
......@@ -69,7 +69,7 @@ class _ActivityHeartRateWidgetState extends State<ActivityHeartRateWidget> {
),
ListTile(
leading: MyIcon.maximum,
title: Text(widget.activity.db.maxHeartRate.toString()),
title: Text(widget.activity.maxHeartRate.toString()),
subtitle: const Text('maximum heart rate'),
),
ListTile(
......
......@@ -91,10 +91,10 @@ class _ActivityLegSpringStiffnessWidgetState
final Activity activity = widget.activity;
records = RecordList<Event>(await activity.records);
avgLegSpringStiffnessString =
activity.db.avgLegSpringStiffness.toStringOrDashes(1) + ' ms';
activity.avgLegSpringStiffness.toStringOrDashes(1) + ' ms';
sdevLegSpringStiffnessString =
activity.db.sdevLegSpringStiffness.toStringOrDashes(2) + ' ms';
activity.sdevLegSpringStiffness.toStringOrDashes(2) + ' ms';
setState(() {});
}
}