supervisely 6.73.290__py3-none-any.whl → 6.73.291__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.

Potentially problematic release.


This version of supervisely might be problematic. Click here for more details.

@@ -1028,7 +1028,10 @@ class ImageApi(RemoveableBulkModuleApi):
1028
1028
  return results
1029
1029
 
1030
1030
  def check_existing_links(
1031
- self, links: List[str], progress_cb: Optional[Union[tqdm, Callable]] = None
1031
+ self,
1032
+ links: List[str],
1033
+ progress_cb: Optional[Union[tqdm, Callable]] = None,
1034
+ team_id: Optional[int] = None,
1032
1035
  ) -> List[str]:
1033
1036
  """
1034
1037
  Checks existing links for Images.
@@ -1037,6 +1040,8 @@ class ImageApi(RemoveableBulkModuleApi):
1037
1040
  :type links: List[str]
1038
1041
  :param progress_cb: Function for tracking progress of checking.
1039
1042
  :type progress_cb: tqdm or callable, optional
1043
+ :param team_id: Team ID in Supervisely (will be used to get remote storage settings).
1044
+ :type team_id: int
1040
1045
  :return: List of existing links
1041
1046
  :rtype: List[str]
1042
1047
  """
@@ -1044,9 +1049,9 @@ class ImageApi(RemoveableBulkModuleApi):
1044
1049
  if len(links) == 0:
1045
1050
  return []
1046
1051
 
1047
- def _is_image_available(url, progress_cb=None):
1052
+ def _is_image_available(url, team_id, progress_cb=None):
1048
1053
  if self._api.remote_storage.is_bucket_url(url):
1049
- response = self._api.remote_storage.is_path_exist(url)
1054
+ response = self._api.remote_storage.is_path_exist(url, team_id)
1050
1055
  result = url if response else None
1051
1056
  else:
1052
1057
  response = requests.head(url)
@@ -1055,7 +1060,9 @@ class ImageApi(RemoveableBulkModuleApi):
1055
1060
  progress_cb(1)
1056
1061
  return result
1057
1062
 
1058
- _is_image_available_with_progress = partial(_is_image_available, progress_cb=progress_cb)
1063
+ _is_image_available_with_progress = partial(
1064
+ _is_image_available, team_id=team_id, progress_cb=progress_cb
1065
+ )
1059
1066
 
1060
1067
  with ThreadPoolExecutor(max_workers=20) as executor:
1061
1068
  results = list(executor.map(_is_image_available_with_progress, links))
@@ -617,6 +617,8 @@ class ApiField:
617
617
  """"""
618
618
  CUSTOM_SORT = "customSort"
619
619
  """"""
620
+ GROUP_ID = "groupId"
621
+ """"""
620
622
 
621
623
 
622
624
  def _get_single_item(items):
@@ -1,14 +1,15 @@
1
1
  # coding: utf-8
2
- from typing import Optional, Callable, Union, List
2
+ import mimetypes
3
+ from typing import Callable, List, Optional, Union
3
4
 
5
+ from requests_toolbelt import MultipartEncoder
4
6
  from tqdm import tqdm
5
7
 
6
- from supervisely.api.module_api import ModuleApiBase, ApiField
8
+ from supervisely import logger
9
+ from supervisely.api.module_api import ApiField, ModuleApiBase
7
10
  from supervisely.collection.str_enum import StrEnum
11
+ from supervisely.io import env
8
12
  from supervisely.io.fs import ensure_base_path, get_file_name_with_ext
9
- from supervisely import logger
10
- from requests_toolbelt import MultipartEncoder
11
- import mimetypes
12
13
 
13
14
 
14
15
  class Provider(StrEnum):
@@ -53,30 +54,38 @@ class RemoteStorageApi(ModuleApiBase):
53
54
  def get_file_info_by_path(
54
55
  self,
55
56
  path: str,
56
- ) -> dict:
57
+ team_id: int = None,
58
+ ) -> Optional[dict]:
57
59
  """
58
60
  Get info about file for given remote path.
59
61
 
60
62
  :param path: Remote path to file.
61
63
  :type path: str
62
- :returns: List of files in the given remote path
63
- :rtype: dict
64
+ :param team_id: Team ID (to get cloud storages connected to the team)
65
+ :type team_id: int
66
+ :returns: file info in the given remote path
67
+ :rtype: Optional[dict]
64
68
 
65
69
  """
66
-
70
+ team_id = team_id or env.team_id(raise_not_found=False)
67
71
  Provider.validate_path(path)
68
72
  path = path.rstrip("/")
69
- resp = self._api.get(
70
- "remote-storage.list",
71
- {
72
- ApiField.PATH: path,
73
- "recursive": False,
74
- "files": True,
75
- "folders": False,
76
- "limit": 1,
77
- "startAfter": "",
78
- },
79
- )
73
+
74
+ json_body = {
75
+ ApiField.PATH: path,
76
+ ApiField.RECURSIVE: False,
77
+ ApiField.FILES: True,
78
+ ApiField.FOLDERS: False,
79
+ ApiField.LIMIT: 1,
80
+ "startAfter": "",
81
+ }
82
+ if team_id is not None:
83
+ json_body[ApiField.GROUP_ID] = team_id
84
+
85
+ resp = self._api.get("remote-storage.list", json_body)
86
+ if resp is None:
87
+ return None
88
+
80
89
  return resp.json()[0]
81
90
 
82
91
  def list(
@@ -87,6 +96,7 @@ class RemoteStorageApi(ModuleApiBase):
87
96
  folders: bool = True,
88
97
  limit: int = 10000,
89
98
  start_after: str = "",
99
+ team_id: int = None,
90
100
  ) -> list:
91
101
  """
92
102
  List files and directories for given remote path.
@@ -103,28 +113,39 @@ class RemoteStorageApi(ModuleApiBase):
103
113
  :type limit: int
104
114
  :param start_after: Start listing path after given file name.
105
115
  :type start_after: str
116
+ :param team_id: Team ID (to get cloud storages connected to the team)
117
+ :type team_id: int
106
118
  :returns: List of files in the given remote path
107
- :rtype: dict
119
+ :rtype: list
108
120
 
109
121
  """
122
+ team_id = team_id or env.team_id(raise_not_found=False)
110
123
 
111
124
  Provider.validate_path(path)
112
125
  path = path.rstrip("/") + "/"
113
- resp = self._api.get(
114
- "remote-storage.list",
115
- {
116
- ApiField.PATH: path,
117
- "recursive": recursive,
118
- "files": files,
119
- "folders": folders,
120
- "limit": limit,
121
- "startAfter": start_after,
122
- },
123
- )
126
+
127
+ json_body = {
128
+ ApiField.PATH: path,
129
+ ApiField.RECURSIVE: recursive,
130
+ ApiField.FILES: files,
131
+ ApiField.FOLDERS: folders,
132
+ ApiField.LIMIT: limit,
133
+ "startAfter": start_after,
134
+ }
135
+ if team_id is not None:
136
+ json_body[ApiField.GROUP_ID] = team_id
137
+
138
+ resp = self._api.get("remote-storage.list", json_body)
139
+ if resp is None:
140
+ return []
124
141
  return resp.json()
125
142
 
126
143
  def download_path(
127
- self, remote_path: str, save_path: str, progress_cb: Optional[Union[tqdm, Callable]] = None
144
+ self,
145
+ remote_path: str,
146
+ save_path: str,
147
+ progress_cb: Optional[Union[tqdm, Callable]] = None,
148
+ team_id: int = None,
128
149
  ):
129
150
  """
130
151
  Downloads item from given remote path to given local path.
@@ -135,6 +156,8 @@ class RemoteStorageApi(ModuleApiBase):
135
156
  :type save_path: str
136
157
  :param progress_cb: Progress function to download.
137
158
  :type progress_cb: tqdm or callable, optional
159
+ :param team_id: Team ID (to get cloud storages connected to the team)
160
+ :type team_id: int
138
161
 
139
162
 
140
163
  .. code-block:: python
@@ -145,13 +168,17 @@ class RemoteStorageApi(ModuleApiBase):
145
168
  remote_path = api.remote_storage.get_remote_path(provider, bucket, path_in_bucket)
146
169
  # or alternatively use this:
147
170
  # remote_path = f"{provider}://{bucket}{path_in_bucket}"
148
- api.remote_storage.upload_path(local_path="images/my-cats.jpg", remote_path=remote_path)
171
+ api.remote_storage.download_path(local_path="images/my-cats.jpg", remote_path=remote_path)
149
172
  """
173
+ team_id = team_id or env.team_id(raise_not_found=False)
150
174
  Provider.validate_path(remote_path)
151
175
  ensure_base_path(save_path)
152
- response = self._api.post(
153
- "remote-storage.download", {ApiField.LINK: remote_path}, stream=True
154
- )
176
+
177
+ json_body = {ApiField.LINK: remote_path}
178
+ if team_id is not None:
179
+ json_body[ApiField.GROUP_ID] = team_id
180
+
181
+ response = self._api.post("remote-storage.download", json_body, stream=True)
155
182
  # if "Content-Length" in response.headers:
156
183
  # length = int(response.headers['Content-Length'])
157
184
  with open(save_path, "wb") as fd:
@@ -160,7 +187,7 @@ class RemoteStorageApi(ModuleApiBase):
160
187
  if progress_cb is not None:
161
188
  progress_cb(len(chunk))
162
189
 
163
- def upload_path(self, local_path: str, remote_path: str):
190
+ def upload_path(self, local_path: str, remote_path: str, team_id: int = None):
164
191
  """
165
192
  Uploads item from given local path to given remote path.
166
193
 
@@ -168,6 +195,8 @@ class RemoteStorageApi(ModuleApiBase):
168
195
  :type local_path: str
169
196
  :param remote_path: Remote destination path.
170
197
  :type remote_path: str
198
+ :param team_id: Team ID (to get cloud storages connected to the team)
199
+ :type team_id: int
171
200
  :Usage example:
172
201
 
173
202
  .. code-block:: python
@@ -176,15 +205,17 @@ class RemoteStorageApi(ModuleApiBase):
176
205
  bucket = "bucket-test-export"
177
206
  path_in_bucket = "/demo/image.jpg"
178
207
  remote_path = api.remote_storage.get_remote_path(provider, bucket, path_in_bucket)
208
+ team_id = 123
179
209
  # or alternatively use this:
180
210
  # remote_path = f"{provider}://{bucket}{path_in_bucket}"
181
- api.remote_storage.upload_path(local_path="images/my-cats.jpg", remote_path=remote_path)
211
+ api.remote_storage.upload_path("images/my-cats.jpg", remote_path, team_id)
182
212
  """
183
213
  Provider.validate_path(remote_path)
184
- return self._upload_paths_batch([local_path], [remote_path])
214
+ return self._upload_paths_batch([local_path], [remote_path], team_id)
185
215
 
186
- def _upload_paths_batch(self, local_paths, remote_paths):
216
+ def _upload_paths_batch(self, local_paths, remote_paths, team_id: int = None):
187
217
  """_upload_paths_batch"""
218
+ team_id = team_id or env.team_id(raise_not_found=False)
188
219
 
189
220
  if len(local_paths) != len(remote_paths):
190
221
  raise ValueError("Inconsistency in paths, len(local_paths) != len(remote_paths)")
@@ -209,7 +240,10 @@ class RemoteStorageApi(ModuleApiBase):
209
240
  )
210
241
  )
211
242
  encoder = MultipartEncoder(fields=content)
212
- resp = self._api.post("remote-storage.upload", encoder)
243
+ url = f"remote-storage.upload"
244
+ if team_id is not None:
245
+ url += f"?teamId={team_id}"
246
+ resp = self._api.post(url, encoder)
213
247
  return resp.json()
214
248
 
215
249
  def get_remote_path(self, provider: str, bucket: str, path_in_bucket: str) -> str:
@@ -236,10 +270,15 @@ class RemoteStorageApi(ModuleApiBase):
236
270
  Provider.validate_path(res_path)
237
271
  return res_path
238
272
 
239
- def get_list_available_providers(self) -> List[dict]:
273
+ def get_list_available_providers(
274
+ self,
275
+ team_id: int = None,
276
+ ) -> List[dict]:
240
277
  """
241
278
  Get the list of available providers for the instance.
242
279
 
280
+ :param team_id: Team ID (to get cloud storages connected to the team)
281
+ :type team_id: int
243
282
  :return: List of available providers
244
283
  :rtype: List[dict]
245
284
  :Usage example:
@@ -260,7 +299,8 @@ class RemoteStorageApi(ModuleApiBase):
260
299
  # Pass values into the API constructor (optional, not recommended)
261
300
  # api = sly.Api(server_address="https://app.supervise.ly", token="4r47N...xaTatb")
262
301
 
263
- available_providers = api.remote_storage.get_list_available_providers()
302
+ team_id = 123
303
+ available_providers = api.remote_storage.get_list_available_providers(team_id)
264
304
 
265
305
  # Output example
266
306
 
@@ -281,13 +321,24 @@ class RemoteStorageApi(ModuleApiBase):
281
321
  # ]
282
322
 
283
323
  """
284
- resp = self._api.get("remote-storage.available_providers", {})
324
+ team_id = team_id or env.team_id(raise_not_found=False)
325
+
326
+ json_body = {}
327
+ if team_id is not None:
328
+ json_body[ApiField.GROUP_ID] = team_id
329
+
330
+ resp = self._api.get("remote-storage.available_providers", json_body)
285
331
  return resp.json()
286
332
 
287
- def get_list_supported_providers(self) -> List[dict]:
333
+ def get_list_supported_providers(
334
+ self,
335
+ team_id: int = None,
336
+ ) -> List[dict]:
288
337
  """
289
338
  Get the list of supported providers for the instance.
290
339
 
340
+ :param team_id: Team ID (to get cloud storages connected to the team)
341
+ :type team_id: int
291
342
  :return: List of supported providers
292
343
  :rtype: List[dict]
293
344
  :Usage example:
@@ -308,7 +359,8 @@ class RemoteStorageApi(ModuleApiBase):
308
359
  # Pass values into the API constructor (optional, not recommended)
309
360
  # api = sly.Api(server_address="https://app.supervise.ly", token="4r47N...xaTatb")
310
361
 
311
- supported_providers = api.remote_storage.get_list_supported_providers()
362
+ team_id = 123
363
+ supported_providers = api.remote_storage.get_list_supported_providers(team_id)
312
364
 
313
365
  # Output example
314
366
 
@@ -325,15 +377,27 @@ class RemoteStorageApi(ModuleApiBase):
325
377
  # ]
326
378
 
327
379
  """
328
- resp = self._api.get("remote-storage.supported_providers", {})
380
+ team_id = team_id or env.team_id(raise_not_found=False)
381
+
382
+ json_body = {}
383
+ if team_id is not None:
384
+ json_body[ApiField.GROUP_ID] = team_id
385
+
386
+ resp = self._api.get("remote-storage.supported_providers", json_body)
329
387
  return resp.json()
330
388
 
331
- def is_path_exist(self, path: str) -> bool:
389
+ def is_path_exist(
390
+ self,
391
+ path: str,
392
+ team_id: int = None,
393
+ ) -> bool:
332
394
  """
333
395
  Check if the file path exists.
334
396
 
335
397
  :param path: URL of the file in the bucket storage
336
398
  :type path: str
399
+ :param team_id: Team ID (to get cloud storages connected to the team)
400
+ :type team_id: int
337
401
  :return: True if the file exists, False otherwise
338
402
  :rtype: bool
339
403
  :Usage example:
@@ -358,13 +422,17 @@ class RemoteStorageApi(ModuleApiBase):
358
422
  is_exist = api.remote_storage.is_path_exist(path)
359
423
 
360
424
  """
361
-
425
+ team_id = team_id or env.team_id(raise_not_found=False)
362
426
  Provider.validate_path(path)
363
427
 
364
- resp = self._api.get(
365
- "remote-storage.exists",
366
- {ApiField.PATH: path},
367
- )
428
+ json_body = {ApiField.PATH: path}
429
+ if team_id is not None:
430
+ json_body[ApiField.GROUP_ID] = team_id
431
+
432
+ resp = self._api.get("remote-storage.exists", json_body)
433
+ if resp is None:
434
+ return False
435
+
368
436
  resp = resp.json()
369
437
 
370
438
  if resp.get("exists"):
@@ -372,12 +440,18 @@ class RemoteStorageApi(ModuleApiBase):
372
440
  else:
373
441
  return False
374
442
 
375
- def get_path_stats(self, path: str) -> Optional[dict]:
443
+ def get_path_stats(
444
+ self,
445
+ path: str,
446
+ team_id: int = None,
447
+ ) -> Optional[dict]:
376
448
  """
377
449
  Get information about file size and the date of its last modification in bucket storage.
378
450
 
379
451
  :param path: URL of the file in the bucket storage
380
452
  :type path: str
453
+ :param team_id: Team ID (to get cloud storages connected to the team)
454
+ :type team_id: int
381
455
  :return: File 'size' in bytes and 'lastModified' date if file exists, otherwise None
382
456
  :rtype: Optional[dict]
383
457
  :Usage example:
@@ -399,7 +473,8 @@ class RemoteStorageApi(ModuleApiBase):
399
473
  # api = sly.Api(server_address="https://app.supervise.ly", token="4r47N...xaTatb")
400
474
 
401
475
  path = "s3://bucket/lemons/ds1/img/IMG_444.jpeg"
402
- stats = api.remote_storage.get_path_stats(path)
476
+ team_id = 123
477
+ stats = api.remote_storage.get_path_stats(path, team_id)
403
478
 
404
479
  # Output example
405
480
 
@@ -409,11 +484,14 @@ class RemoteStorageApi(ModuleApiBase):
409
484
  # }
410
485
 
411
486
  """
412
- if self.is_path_exist(path):
413
- resp = self._api.get(
414
- "remote-storage.stat",
415
- {ApiField.PATH: path},
416
- )
487
+ team_id = team_id or env.team_id(raise_not_found=False)
488
+
489
+ json_body = {ApiField.PATH: path}
490
+ if team_id is not None:
491
+ json_body[ApiField.GROUP_ID] = team_id
492
+
493
+ if self.is_path_exist(path, team_id):
494
+ resp = self._api.get("remote-storage.stat", json_body)
417
495
  return resp.json()
418
496
  else:
419
497
  path_folers = path.split("/")[3:]
@@ -3352,8 +3352,9 @@ class Project:
3352
3352
  existing_hashes = api.image.check_existing_hashes(
3353
3353
  list(set([inf.hash for inf in image_infos if inf.hash and not inf.link]))
3354
3354
  )
3355
+ workspace_info = api.workspace.get_info_by_id(workspace_id)
3355
3356
  existing_links = api.image.check_existing_links(
3356
- list(set([inf.link for inf in image_infos if inf.link]))
3357
+ list(set([inf.link for inf in image_infos if inf.link])), team_id=workspace_info.team_id
3357
3358
  )
3358
3359
  image_infos = sorted(image_infos, key=lambda info: info.link is not None)
3359
3360
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: supervisely
3
- Version: 6.73.290
3
+ Version: 6.73.291
4
4
  Summary: Supervisely Python SDK.
5
5
  Home-page: https://github.com/supervisely/supervisely
6
6
  Author: Supervisely
@@ -28,17 +28,17 @@ supervisely/api/dataset_api.py,sha256=GH7prDRJKyJlTv_7_Y-RkTwJN7ED4EkXNqqmi3iIdI
28
28
  supervisely/api/file_api.py,sha256=v2FsD3oljwNPqcDgEJRe8Bu5k0PYKzVhqmRb5QFaHAQ,83422
29
29
  supervisely/api/github_api.py,sha256=NIexNjEer9H5rf5sw2LEZd7C1WR-tK4t6IZzsgeAAwQ,623
30
30
  supervisely/api/image_annotation_tool_api.py,sha256=YcUo78jRDBJYvIjrd-Y6FJAasLta54nnxhyaGyanovA,5237
31
- supervisely/api/image_api.py,sha256=_hoFKsJpvHxrjoLronFNg348TGUn-OC0f5Nuq7IyFIk,191905
31
+ supervisely/api/image_api.py,sha256=oi8luorbCaqMzd88_sjKeQQsX4eYOGJ8DVEbmSM44bw,192139
32
32
  supervisely/api/import_storage_api.py,sha256=BDCgmR0Hv6OoiRHLCVPKt3iDxSVlQp1WrnKhAK_Zl84,460
33
33
  supervisely/api/issues_api.py,sha256=BqDJXmNoTzwc3xe6_-mA7FDFC5QQ-ahGbXk_HmpkSeQ,17925
34
34
  supervisely/api/labeling_job_api.py,sha256=odnzZjp29yM16Gq-FYkv-OA4WFMNJCLFo4qSikW2A7c,56280
35
- supervisely/api/module_api.py,sha256=HrHndEvG684ULGchmFiFx0VsbSoihkq97iFPBFMY-dM,44345
35
+ supervisely/api/module_api.py,sha256=x5C1KvTulm5yZ-s9Sa47T4u--QRG6ditj1GhcqocTeA,44381
36
36
  supervisely/api/neural_network_api.py,sha256=ktPVRO4Jeulougio8F0mioJJHwRJcX250Djp1wBoQ9c,7620
37
37
  supervisely/api/object_class_api.py,sha256=-rQcKwhBw3iL9KNH9c1ROgoimgWM1ls6Wi_tb1R-MzY,7683
38
38
  supervisely/api/plugin_api.py,sha256=TlfrosdRuYG4NUxk92QiQoVaOdztFspPpygyVa3M3zk,5283
39
39
  supervisely/api/project_api.py,sha256=ZTRx7LXsPLjMuGq_PhugPgN-OsGMtTRxputH9EA9iZ0,78774
40
40
  supervisely/api/project_class_api.py,sha256=5cyjdGPPb2tpttu5WmYoOxUNiDxqiojschkhZumF0KM,1426
41
- supervisely/api/remote_storage_api.py,sha256=xy9-j5hSftVcAILyqF_mQdQ1DUywt9msq2QYuSE-PVY,15032
41
+ supervisely/api/remote_storage_api.py,sha256=qTuPhPsstgEjRm1g-ZInddik8BNC_38YvBBPvgmim6U,17790
42
42
  supervisely/api/report_api.py,sha256=Om7CGulUbQ4BuJ16eDtz7luLe0JQNqab-LoLpUXu7YE,7123
43
43
  supervisely/api/role_api.py,sha256=aBL4mxtn08LDPXQuS153-lQFN6N2kcwiz8MbescZ8Gk,3044
44
44
  supervisely/api/storage_api.py,sha256=FPGYf3Rn3LBoe38RBNdoiURs306oshzvKOEOQ56XAbs,13030
@@ -1009,7 +1009,7 @@ supervisely/project/data_version.py,sha256=nknaWJSUCwoDyNG9_d1KA-GjzidhV9zd9Cn8c
1009
1009
  supervisely/project/download.py,sha256=zb8sb4XZ6Qi3CP7fmtLRUAYzaxs_W0WnOfe2x3ZVRMs,24639
1010
1010
  supervisely/project/pointcloud_episode_project.py,sha256=yiWdNBQiI6f1O9sr1pg8JHW6O-w3XUB1rikJNn3Oung,41866
1011
1011
  supervisely/project/pointcloud_project.py,sha256=Kx1Vaes-krwG3BiRRtHRLQxb9G5m5bTHPN9IzRqmNWo,49399
1012
- supervisely/project/project.py,sha256=34fAbYV4VdfVSqMs0a5ggAIwELd8nPb-uGoaC1F7h4I,202299
1012
+ supervisely/project/project.py,sha256=pDKRPZZCwW79wlfDi4JK9rOZisO2vWRfiOD_j7AId5k,202403
1013
1013
  supervisely/project/project_meta.py,sha256=26s8IiHC5Pg8B1AQi6_CrsWteioJP2in00cRNe8QlW0,51423
1014
1014
  supervisely/project/project_settings.py,sha256=NLThzU_DCynOK6hkHhVdFyezwprn9UqlnrLDe_3qhkY,9347
1015
1015
  supervisely/project/project_type.py,sha256=_3RqW2CnDBKFOvSIrQT1RJQaiHirs34_jiQS8CkwCpo,530
@@ -1071,9 +1071,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1071
1071
  supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
1072
1072
  supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
1073
1073
  supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
1074
- supervisely-6.73.290.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1075
- supervisely-6.73.290.dist-info/METADATA,sha256=B9crK8mR_VqKArU2r9540M7jiO3aypWHsKAcdeU0YKs,33573
1076
- supervisely-6.73.290.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
1077
- supervisely-6.73.290.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1078
- supervisely-6.73.290.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1079
- supervisely-6.73.290.dist-info/RECORD,,
1074
+ supervisely-6.73.291.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1075
+ supervisely-6.73.291.dist-info/METADATA,sha256=QAK_3SyERXF-LNRXMUunSNQFpHBErFsVRtdMVPhStB8,33573
1076
+ supervisely-6.73.291.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
1077
+ supervisely-6.73.291.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1078
+ supervisely-6.73.291.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1079
+ supervisely-6.73.291.dist-info/RECORD,,