geo-activity-playground 1.4.1__py3-none-any.whl → 1.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -230,6 +230,13 @@ class Activity(DB.Model):
230
230
  else:
231
231
  return self.start
232
232
 
233
+ @property
234
+ def start_utc(self) -> Optional[datetime.datetime]:
235
+ if self.start:
236
+ return self.start.replace(microsecond=0, tzinfo=zoneinfo.ZoneInfo("UTC"))
237
+ else:
238
+ return None
239
+
233
240
 
234
241
  class Tag(DB.Model):
235
242
  __tablename__ = "tags"
@@ -8,7 +8,7 @@ from collections.abc import Iterator
8
8
  import charset_normalizer
9
9
  import dateutil.parser
10
10
  import fitdecode.exceptions
11
- import gpxpy
11
+ import gpxpy.gpx
12
12
  import pandas as pd
13
13
  import tcxreader.tcxreader
14
14
  import xmltodict
@@ -40,7 +40,7 @@ def read_activity(path: pathlib.Path) -> tuple[Activity, pd.DataFrame]:
40
40
  if file_type == ".gpx":
41
41
  try:
42
42
  timeseries = read_gpx_activity(path, opener)
43
- except gpxpy.gpx.GPXXMLSyntaxException as e:
43
+ except gpxpy.gpx.GPXException as e:
44
44
  raise ActivityParseError(f"Syntax error while parsing GPX file") from e
45
45
  except UnicodeDecodeError as e:
46
46
  raise ActivityParseError(f"Encoding issue") from e
@@ -256,6 +256,7 @@ def web_ui_main(
256
256
  # "search_query_favorites": search_query_history.prepare_favorites(),
257
257
  # "search_query_last": search_query_history.prepare_last(),
258
258
  "request_url": urllib.parse.quote_plus(request.url),
259
+ "host_url": request.host_url,
259
260
  }
260
261
  variables["equipments_avail"] = DB.session.scalars(
261
262
  sqlalchemy.select(Equipment).order_by(Equipment.name)
@@ -4,6 +4,7 @@ import hashlib
4
4
  import io
5
5
  import logging
6
6
  from collections.abc import Iterable
7
+ from typing import Optional
7
8
  from typing import Union
8
9
 
9
10
  import altair as alt
@@ -53,9 +54,7 @@ def blend_color(
53
54
 
54
55
  class ColorStrategy(abc.ABC):
55
56
  @abc.abstractmethod
56
- def color_image(
57
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
58
- ) -> np.ndarray:
57
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
59
58
  pass
60
59
 
61
60
 
@@ -68,18 +67,15 @@ class MaxClusterColorStrategy(ColorStrategy):
68
67
  key=len,
69
68
  )
70
69
 
71
- def color_image(
72
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
73
- ) -> np.ndarray:
70
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
74
71
  if tile_xy in self.max_cluster_members:
75
- color = np.array([[[55, 126, 184, 70]]]) / 256
72
+ return np.array([[[55, 126, 184, 70]]]) / 255
76
73
  elif tile_xy in self.evolution_state.memberships:
77
- color = np.array([[[77, 175, 74, 70]]]) / 256
74
+ return np.array([[[77, 175, 74, 70]]]) / 255
78
75
  elif tile_xy in self.tile_visits:
79
- color = np.array([[[0, 0, 0, 70]]]) / 256
76
+ return np.array([[[0, 0, 0, 70]]]) / 255
80
77
  else:
81
- color = np.array([[[0, 0, 0, 0]]]) / 256
82
- return np.broadcast_to(color, grayscale.shape)
78
+ return None
83
79
 
84
80
 
85
81
  class ColorfulClusterColorStrategy(ColorStrategy):
@@ -92,20 +88,17 @@ class ColorfulClusterColorStrategy(ColorStrategy):
92
88
  )
93
89
  self._cmap = matplotlib.colormaps["hsv"]
94
90
 
95
- def color_image(
96
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
97
- ) -> np.ndarray:
91
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
98
92
  if tile_xy in self.evolution_state.memberships:
99
93
  cluster_id = self.evolution_state.memberships[tile_xy]
100
94
  m = hashlib.sha256()
101
95
  m.update(str(cluster_id).encode())
102
96
  d = int(m.hexdigest(), base=16) / (256.0**m.digest_size)
103
- color = np.array([[self._cmap(d)[:3] + (0.5,)]])
97
+ return np.array([[self._cmap(d)[:3] + (0.5,)]])
104
98
  elif tile_xy in self.tile_visits:
105
- color = np.array([[[0, 0, 0, 70]]]) / 256
99
+ return np.array([[[0, 0, 0, 70]]]) / 255
106
100
  else:
107
- color = np.array([[[0, 0, 0, 0]]]) / 256
108
- return np.broadcast_to(color, grayscale.shape)
101
+ return None
109
102
 
110
103
 
111
104
  class VisitTimeColorStrategy(ColorStrategy):
@@ -113,9 +106,7 @@ class VisitTimeColorStrategy(ColorStrategy):
113
106
  self.tile_visits = tile_visits
114
107
  self.use_first = use_first
115
108
 
116
- def color_image(
117
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
118
- ) -> np.ndarray:
109
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
119
110
  if tile_xy in self.tile_visits:
120
111
  today = datetime.date.today()
121
112
  cmap = matplotlib.colormaps["plasma"]
@@ -124,31 +115,39 @@ class VisitTimeColorStrategy(ColorStrategy):
124
115
  tile_info["first_time"] if self.use_first else tile_info["last_time"]
125
116
  )
126
117
  if pd.isna(relevant_time):
127
- color = np.array([[[0, 0, 0, 70]]]) / 256
118
+ color = np.array([[[0, 0, 0, 70]]]) / 255
128
119
  else:
129
120
  last_age_days = (today - relevant_time.date()).days
130
121
  color = cmap(max(1 - last_age_days / (2 * 365), 0.0))
131
122
  color = np.array([[color[:3] + (0.5,)]])
123
+ return color
132
124
  else:
133
- color = np.array([[[0, 0, 0, 0]]]) / 256
134
- return np.broadcast_to(color, grayscale.shape)
125
+ return None
135
126
 
136
127
 
137
128
  class NumVisitsColorStrategy(ColorStrategy):
138
129
  def __init__(self, tile_visits):
139
130
  self.tile_visits = tile_visits
140
131
 
141
- def color_image(
142
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
143
- ) -> np.ndarray:
132
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
144
133
  if tile_xy in self.tile_visits:
145
134
  cmap = matplotlib.colormaps["viridis"]
146
135
  tile_info = self.tile_visits[tile_xy]
147
136
  color = cmap(min(len(tile_info["activity_ids"]) / 50, 1.0))
148
- color = np.array([[color[:3] + (0.5,)]])
137
+ return np.array([[color[:3] + (0.5,)]])
149
138
  else:
150
- color = np.array([[[0, 0, 0, 0]]]) / 256
151
- return np.broadcast_to(color, grayscale.shape)
139
+ return None
140
+
141
+
142
+ class MissingColorStrategy(ColorStrategy):
143
+ def __init__(self, tile_visits):
144
+ self.tile_visits = tile_visits
145
+
146
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
147
+ if tile_xy in self.tile_visits:
148
+ return None
149
+ else:
150
+ return np.array([[[0, 0, 0, 70]]]) / 255
152
151
 
153
152
 
154
153
  def make_explorer_blueprint(
@@ -294,6 +293,8 @@ def make_explorer_blueprint(
294
293
  color_strategy = VisitTimeColorStrategy(tile_visits, use_first=False)
295
294
  case "visits":
296
295
  color_strategy = NumVisitsColorStrategy(tile_visits)
296
+ case "missing":
297
+ color_strategy = MissingColorStrategy(tile_visits)
297
298
  case _:
298
299
  raise ValueError("Unsupported color strategy.")
299
300
 
@@ -302,7 +303,11 @@ def make_explorer_blueprint(
302
303
  tile_x = x // factor
303
304
  tile_y = y // factor
304
305
  tile_xy = (tile_x, tile_y)
305
- result = color_strategy.color_image(tile_xy, grayscale).copy()
306
+ color = color_strategy._color(tile_xy)
307
+ if color is None:
308
+ result = grayscale
309
+ else:
310
+ result = np.broadcast_to(color, grayscale.shape)
306
311
 
307
312
  if x % factor == 0:
308
313
  result[:, 0, :] = 0.5
@@ -356,73 +361,62 @@ def make_explorer_blueprint(
356
361
  tile_x = x * factor + xo
357
362
  tile_y = y * factor + yo
358
363
  tile_xy = (tile_x, tile_y)
359
- if tile_xy in tile_visits:
364
+ color = color_strategy._color(tile_xy)
365
+ if color is not None:
360
366
  result[
361
367
  yo * width : (yo + 1) * width, xo * width : (xo + 1) * width
362
- ] = color_strategy.color_image(
363
- tile_xy,
364
- grayscale[
368
+ ] = color
369
+
370
+ if (
371
+ evolution_state.square_x is not None
372
+ and evolution_state.square_y is not None
373
+ ):
374
+ if (
375
+ tile_x == evolution_state.square_x
376
+ and evolution_state.square_y
377
+ <= tile_y
378
+ < evolution_state.square_y + evolution_state.max_square_size
379
+ ):
380
+ result[
365
381
  yo * width : (yo + 1) * width,
382
+ xo * width : xo * width + square_line_width,
383
+ ] = square_color
384
+ if (
385
+ tile_y == evolution_state.square_y
386
+ and evolution_state.square_x
387
+ <= tile_x
388
+ < evolution_state.square_x + evolution_state.max_square_size
389
+ ):
390
+ result[
391
+ yo * width : yo * width + square_line_width,
366
392
  xo * width : (xo + 1) * width,
367
- ],
368
- )
393
+ ] = square_color
369
394
 
370
395
  if (
371
- evolution_state.square_x is not None
372
- and evolution_state.square_y is not None
396
+ tile_x + 1
397
+ == evolution_state.square_x
398
+ + evolution_state.max_square_size
399
+ and evolution_state.square_y
400
+ <= tile_y
401
+ < evolution_state.square_y + evolution_state.max_square_size
373
402
  ):
374
- if (
375
- tile_x == evolution_state.square_x
376
- and evolution_state.square_y
377
- <= tile_y
378
- < evolution_state.square_y
379
- + evolution_state.max_square_size
380
- ):
381
- result[
382
- yo * width : (yo + 1) * width,
383
- xo * width : xo * width + square_line_width,
384
- ] = square_color
385
- if (
386
- tile_y == evolution_state.square_y
387
- and evolution_state.square_x
388
- <= tile_x
389
- < evolution_state.square_x
390
- + evolution_state.max_square_size
391
- ):
392
- result[
393
- yo * width : yo * width + square_line_width,
394
- xo * width : (xo + 1) * width,
395
- ] = square_color
396
-
397
- if (
398
- tile_x + 1
399
- == evolution_state.square_x
400
- + evolution_state.max_square_size
401
- and evolution_state.square_y
402
- <= tile_y
403
- < evolution_state.square_y
404
- + evolution_state.max_square_size
405
- ):
406
- result[
407
- yo * width : (yo + 1) * width,
408
- (xo + 1) * width
409
- - square_line_width : (xo + 1) * width,
410
- ] = square_color
411
-
412
- if (
413
- tile_y + 1
414
- == evolution_state.square_y
415
- + evolution_state.max_square_size
416
- and evolution_state.square_x
417
- <= tile_x
418
- < evolution_state.square_x
419
- + evolution_state.max_square_size
420
- ):
421
- result[
422
- (yo + 1) * width
423
- - square_line_width : (yo + 1) * width,
424
- xo * width : (xo + 1) * width,
425
- ] = square_color
403
+ result[
404
+ yo * width : (yo + 1) * width,
405
+ (xo + 1) * width - square_line_width : (xo + 1) * width,
406
+ ] = square_color
407
+
408
+ if (
409
+ tile_y + 1
410
+ == evolution_state.square_y
411
+ + evolution_state.max_square_size
412
+ and evolution_state.square_x
413
+ <= tile_x
414
+ < evolution_state.square_x + evolution_state.max_square_size
415
+ ):
416
+ result[
417
+ (yo + 1) * width - square_line_width : (yo + 1) * width,
418
+ xo * width : (xo + 1) * width,
419
+ ] = square_color
426
420
  if width >= 64:
427
421
  result[yo * width, :, :] = 0.5
428
422
  result[:, xo * width, :] = 0.5
@@ -79,11 +79,11 @@ def _nominate_activities_inner(
79
79
  if variable in meta.columns and not pd.isna(meta[variable]).all():
80
80
  try:
81
81
  i = meta[variable].idxmax()
82
- except ValueError as e:
82
+ except (KeyError, TypeError):
83
83
  print(meta[variable].tolist())
84
84
  print(f"{meta[variable].dtype=}")
85
85
  logger.error(f"Trying to work with {variable=}.")
86
- logger.error(f"We got a ValueError: {e}")
86
+ raise
87
87
  else:
88
88
  value = meta.loc[i, variable]
89
89
  format_applied = format_str.format(value)
@@ -143,7 +143,10 @@ def make_photo_blueprint(
143
143
  .order_by(Activity.start.desc())
144
144
  .limit(1)
145
145
  )
146
- if activity is None or activity.start + activity.elapsed_time < time:
146
+ if (
147
+ activity is None
148
+ or activity.start_utc + activity.elapsed_time < time
149
+ ):
147
150
  flasher.flash_message(
148
151
  f"Your image '{file.filename}' is from {time} but no activity could be found. Please first upload an activity or fix the time in the photo.",
149
152
  FlashTypes.DANGER,
@@ -44,6 +44,10 @@ let overlay_maps = {
44
44
  maxZoom: 19,
45
45
  attribution: map_tile_attribution
46
46
  }),
47
+ "Mising": L.tileLayer(`/explorer/${zoom}/tile/{z}/{x}/{y}.png?color_strategy=missing`, {
48
+ maxZoom: 19,
49
+ attribution: map_tile_attribution
50
+ }),
47
51
  "Heatmap": L.tileLayer("/heatmap/tile/{z}/{x}/{y}.png", {
48
52
  maxZoom: 19,
49
53
  attribution: map_tile_attribution
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
  </div>
44
44
 
45
- <div class=" row mb-3">
45
+ <div class="row mb-3">
46
46
  <div class="col">
47
47
  <h2>Tile history</h2>
48
48
  </div>
@@ -66,5 +66,42 @@
66
66
  </div>
67
67
  </div>
68
68
 
69
+ <h2 class="mb-3">Tile URLs</h2>
70
+
71
+ <p>You can use the overlay tiles with other services like <a href="https://bikerouter.de/" target="_blank">Bike
72
+ Router</a>. See <a href="https://martin-ueding.github.io/geo-activity-playground/using-maps-as-overlays/"
73
+ target="_blank">the documentation for this feature</a>. For your server, use the following URLs:</p>
74
+
75
+ <code><pre>
76
+ {{ host_url }}tile/grayscale/{z}/{x}/{y}.png
77
+ {{ host_url }}tile/pastel/{z}/{x}/{y}.png
78
+ {{ host_url }}tile/color/{z}/{x}/{y}.png
79
+ {{ host_url }}tile/inverse_grayscale/{z}/{x}/{y}.png
80
+ </pre></code>
81
+
82
+ <p>For the explorer tiles, you can use these:</p>
83
+
84
+ <code><pre>
85
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=colorful_cluster
86
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=max_cluster
87
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=first
88
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=last
89
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=visits
90
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=missing
91
+
92
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=colorful_cluster
93
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=max_cluster
94
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=first
95
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=last
96
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=visits
97
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=missing
98
+ </pre></code>
99
+
100
+ <p>And for the heatmap, you can use this:</p>
101
+
102
+ <code><pre>
103
+ {{ host_url }}heatmap/tile/{z}/{x}/{y}.png
104
+ </pre></code>
105
+
69
106
  {% endif %}
70
107
  {% endblock %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geo-activity-playground
3
- Version: 1.4.1
3
+ Version: 1.5.1
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
@@ -21,7 +21,7 @@ geo_activity_playground/core/activities.py,sha256=apP_-Rg1ub3lh7RARMGXf2BOmJTiah
21
21
  geo_activity_playground/core/config.py,sha256=mmdMQ5iCLNGnAlriT1ETEVS-gM6Aq_9sg22QECHj4n8,5358
22
22
  geo_activity_playground/core/coordinates.py,sha256=rW_OmMRpTUyIsQwrT6mgT9Y6uPGuwqTo5XDDMS7mGuo,1140
23
23
  geo_activity_playground/core/copernicus_dem.py,sha256=t6Bc9fsyGyx1awdePXvlN-Zc-tiT2eGSJ80SV5B1Z9A,2944
24
- geo_activity_playground/core/datamodel.py,sha256=3LdTm7lqykeLM6KYviW9WamgnS61nGNl-NHSEQdwTXY,15765
24
+ geo_activity_playground/core/datamodel.py,sha256=PRqxKlExXxRXkHYIJeNsRr1DZQmdzAwa3PLyivJoix8,15983
25
25
  geo_activity_playground/core/enrichment.py,sha256=pw9VEyDAtdNbjQ1HOPYyXCXT8SLL5i3Cp6KWjKK7puM,8708
26
26
  geo_activity_playground/core/export.py,sha256=ayOmhWL72263oP9NLIZRYCg_Db0GLUFhgNIL_MCrV-E,4435
27
27
  geo_activity_playground/core/heart_rate.py,sha256=-S3WAhS7AOywrw_Lk5jfuo_fu6zvZQ1VtjwEKSycWpU,1542
@@ -52,7 +52,7 @@ geo_activity_playground/explorer/tile_visits.py,sha256=NUzC4jNb_vQExAIALrO2H1MiN
52
52
  geo_activity_playground/explorer/video.py,sha256=7j6Qv3HG6On7Tn7xh7Olwrx_fbQnfzS7CeRg3TEApHg,4397
53
53
  geo_activity_playground/heatmap_video.py,sha256=I8i1uVvbbPUXVtvLAROaLy58nQoUPnuMCZkERWNkQjg,3318
54
54
  geo_activity_playground/importers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- geo_activity_playground/importers/activity_parsers.py,sha256=zWgLkHHd8rjWnKs-COBegpAUh7dXxYOJsQL_L2-Qc7M,11435
55
+ geo_activity_playground/importers/activity_parsers.py,sha256=kL0PcS5eIjRokphQqkWs3ETNj-xdFkYLP7kdQW8y23o,11430
56
56
  geo_activity_playground/importers/csv_parser.py,sha256=O1pP5GLhWhnWcy2Lsrr9g17Zspuibpt-GtZ3ZS5eZF4,2143
57
57
  geo_activity_playground/importers/directory.py,sha256=ucnB5sPBvXzLdaza2v8GVU75ArfGG4E7d5OXrCgoFq4,3562
58
58
  geo_activity_playground/importers/strava_api.py,sha256=Fiqlc-VeuzsvgDcWt71JoPMri221cMjkeL4SH80gC5s,8426
@@ -61,7 +61,7 @@ geo_activity_playground/importers/test_csv_parser.py,sha256=nOTVTdlzIY0TDcbWp7xN
61
61
  geo_activity_playground/importers/test_directory.py,sha256=_fn_-y98ZyElbG0BRxAmGFdtGobUShPU86SdEOpuv-A,691
62
62
  geo_activity_playground/importers/test_strava_api.py,sha256=7b8bl5Rh2BctCmvTPEhCadxtUOq3mfzuadD6F5XxRio,398
63
63
  geo_activity_playground/webui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- geo_activity_playground/webui/app.py,sha256=qsnwE20S-tWBbD_MgkIS8HVsRh6TO6mrwW_gWYHk0Bo,10653
64
+ geo_activity_playground/webui/app.py,sha256=F1gHR2BtiMizwACxFrR_Egm2cNL_cAhWEEToP5H9EEg,10695
65
65
  geo_activity_playground/webui/authenticator.py,sha256=dhREYOu_TCD_nzFNuSlHIbf5K6TmwKdXtr1wxD8fBcc,1491
66
66
  geo_activity_playground/webui/blueprints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
67
  geo_activity_playground/webui/blueprints/activity_blueprint.py,sha256=tFy0GpOBhIP8xlmYc9PF4kAng-0MosXMJudVupGz2Yw,26771
@@ -71,11 +71,11 @@ geo_activity_playground/webui/blueprints/calendar_blueprint.py,sha256=SmOu5AfNNo
71
71
  geo_activity_playground/webui/blueprints/eddington_blueprints.py,sha256=Ya5GJxfVESwmRlgMTYe9g75g8JHHTAAvYFmSD-3Uz4Q,8987
72
72
  geo_activity_playground/webui/blueprints/entry_views.py,sha256=SDCzpUSb1FAb84tM0SnmrZQvtaTlO-Rqdj94hyIMDSc,2936
73
73
  geo_activity_playground/webui/blueprints/equipment_blueprint.py,sha256=8L_7NZGErvu4jyigi2gg7HN_gegZRdsSFahUH7Dz6Lw,5727
74
- geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=bqRG11EHJ67ZVrDVu9KhriCFihw9910fC6PuPmhFZDc,21352
74
+ geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=4sJcSwqyh5WxOU22IxpxkGTNWyq5MCgNeUKrCgotRcU,20828
75
75
  geo_activity_playground/webui/blueprints/export_blueprint.py,sha256=C9yFH5gEJs2YtWE-EhcGDEyGwwaLgC1umybgIRi6duE,1036
76
- geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py,sha256=bOJ6ejDS6rw8-GEGo1Lihn5DS6j0t9e8CbcbRi44Pts,3168
76
+ geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py,sha256=9CfcXE7v-p6IDR4L6ccBmSXlt89xTwitYetSF8xxI9g,3138
77
77
  geo_activity_playground/webui/blueprints/heatmap_blueprint.py,sha256=5LlYKMeOMIE7c3xGRZ52ld4Jxtdc3GNcb6lvt3v7NVA,8435
78
- geo_activity_playground/webui/blueprints/photo_blueprint.py,sha256=eK3JSvOAsiTVDy5wardtqTDGIZ79jmwuXpdIPBI-GjU,7186
78
+ geo_activity_playground/webui/blueprints/photo_blueprint.py,sha256=ql8gfJ-HYgy99PXPHGdbF_sp5wHsxjePQjWJipfpw1A,7250
79
79
  geo_activity_playground/webui/blueprints/plot_builder_blueprint.py,sha256=nGtYblRTJ0rasJvl_L35cs1Iry4LONPy_9TY4ytXB-Q,3838
80
80
  geo_activity_playground/webui/blueprints/search_blueprint.py,sha256=Sv_KL1Cdai26y51qVfI-5jZLhtElREsEar1dbR_VAC4,2275
81
81
  geo_activity_playground/webui/blueprints/settings_blueprint.py,sha256=cwes3QmRrC_HMP1g-Yc-x2BJycF4jF3StJl75v9acWo,20377
@@ -120,7 +120,7 @@ geo_activity_playground/webui/static/leaflet/leaflet.css,sha256=p4NxAoJBhIIN-hmN
120
120
  geo_activity_playground/webui/static/leaflet/leaflet.fullscreen.css,sha256=YTbhDGEH5amI_JfotPMN7IByFpsN9e4tCBnv5oNdvHU,994
121
121
  geo_activity_playground/webui/static/leaflet/leaflet.js,sha256=20nQCchB9co0qIjJZRGuk2_Z9VM-kNiyxNV1lvTlZBo,147552
122
122
  geo_activity_playground/webui/static/leaflet/leaflet.markercluster.js,sha256=WL6HHfYfbFEkZOFdsJQeY7lJG_E5airjvqbznghUzRw,33724
123
- geo_activity_playground/webui/static/server-side-explorer.js,sha256=dmGTTCZ9OchOc18SJM6qE_EgG-6LEZhckpVIsBvCkv8,3262
123
+ geo_activity_playground/webui/static/server-side-explorer.js,sha256=AZ1ikH0NrVWcf6QBwPp2NC6LkIY2T8T0HKVhyVrtT-A,3426
124
124
  geo_activity_playground/webui/static/table-sort.min.js,sha256=sFeDrgkXTePr2ciJU9_mLh-Z8qtYhPIQMgOZtj0LwBY,8506
125
125
  geo_activity_playground/webui/static/vega/vega-embed@6.js,sha256=EtAqz74-xZ75o33UgiouBOKWG1u7Zxu-Zh0iIXFbmdo,60630
126
126
  geo_activity_playground/webui/static/vega/vega-lite@4.js,sha256=roXmcY9bUF91uB9V-eSEUHEgfwoXe6B1xoDPuIe5ou8,267999
@@ -139,7 +139,7 @@ geo_activity_playground/webui/templates/eddington/distance.html.j2,sha256=9cLlIr
139
139
  geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2,sha256=h2mI1Uc1-P7rN_SeCVP_uadpQqX09ZpBG3Z6N8QWNLw,4723
140
140
  geo_activity_playground/webui/templates/elevation_eddington/index.html.j2,sha256=WjquRFWaMzIZrvByhRIuhJbSCUW2HTfMck6THQHZI-I,4743
141
141
  geo_activity_playground/webui/templates/equipment/index.html.j2,sha256=6pzSCJACMXA1fKgsO_KrCTvpumAKlelzj5f9dReey14,1742
142
- geo_activity_playground/webui/templates/explorer/server-side.html.j2,sha256=CrTFVghloFJcN25H18FZ6KQY7QgIqvyCauFzgYG_yCo,2547
142
+ geo_activity_playground/webui/templates/explorer/server-side.html.j2,sha256=jQHJBSqWp5iZpO0cw8fArpca_Ec9cyDFqvN1r5mxt8E,4173
143
143
  geo_activity_playground/webui/templates/export/index.html.j2,sha256=vxqpAm9KnT405Qz7q0_td-HZ4mCjcPR4Lp6EnIEWisg,1652
144
144
  geo_activity_playground/webui/templates/hall_of_fame/index.html.j2,sha256=P15fVPjXf0Wf6K_hd_lCMuw6-Q8_qfNqsBOWNpMfoXw,1804
145
145
  geo_activity_playground/webui/templates/heatmap/index.html.j2,sha256=Q99v4LP5EnuvDYKayL52qujWaIroLsD89ly2cM2YvTI,1420
@@ -174,8 +174,8 @@ geo_activity_playground/webui/templates/summary/vega-chart.html.j2,sha256=mw8Hti
174
174
  geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2,sha256=s9r6BJMXmd7kLSyjkvH4xLi6e01S5bpGRcMgMMJyCAE,1760
175
175
  geo_activity_playground/webui/templates/upload/index.html.j2,sha256=I1Ix8tDS3YBdi-HdaNfjkzYXVVCjfUTe5PFTnap1ydc,775
176
176
  geo_activity_playground/webui/templates/upload/reload.html.j2,sha256=YZWX5eDeNyqKJdQAywDBcU8DZBm22rRBbZqFjrFrCvQ,556
177
- geo_activity_playground-1.4.1.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
178
- geo_activity_playground-1.4.1.dist-info/METADATA,sha256=TlfR52Fp08hHZ5jDPHtHeQQ7dqcsqiUbI6aU1a94nv0,1890
179
- geo_activity_playground-1.4.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
180
- geo_activity_playground-1.4.1.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
181
- geo_activity_playground-1.4.1.dist-info/RECORD,,
177
+ geo_activity_playground-1.5.1.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
178
+ geo_activity_playground-1.5.1.dist-info/METADATA,sha256=xrB1_Ang0OELXJlnj1VnI69mgmNXDPESp1gf5btX0U0,1890
179
+ geo_activity_playground-1.5.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
180
+ geo_activity_playground-1.5.1.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
181
+ geo_activity_playground-1.5.1.dist-info/RECORD,,