satkit 0.8.5__cp38-cp38-win_amd64.whl → 0.9.0__cp38-cp38-win_amd64.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.
satkit/_version.py CHANGED
@@ -14,5 +14,5 @@ __version__: str
14
14
  __version_tuple__: VERSION_TUPLE
15
15
  version_tuple: VERSION_TUPLE
16
16
 
17
- __version__ = version = "0.8.5"
18
- __version_tuple__ = version_tuple = (0, 8, 5)
17
+ __version__ = version = "0.9.0"
18
+ __version_tuple__ = version_tuple = (0, 9, 0)
Binary file
satkit/satkit.pyi CHANGED
@@ -261,7 +261,7 @@ class TLE:
261
261
  """
262
262
 
263
263
  def sgp4(
264
- tle: TLE | list[TLE],
264
+ tle: TLE | list[TLE] | dict,
265
265
  tm: time | list[time] | npt.ArrayLike,
266
266
  **kwargs,
267
267
  ) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
@@ -276,7 +276,7 @@ def sgp4(
276
276
  https://celestrak.org/publications/AIAA/2008-6770/AIAA-2008-6770.pdf
277
277
 
278
278
  Args:
279
- tle (TLE | list[TLE]): TLE (or list of TLES) on which to operate
279
+ tle (TLE | list[TLE] | dict): TLE or OMM (or list of TLES) on which to operate
280
280
  tm (time | list[time] | npt.ArrayLike[time]): time(s) at which to compute position and velocity
281
281
 
282
282
  Keyword Args:
@@ -294,6 +294,12 @@ def sgp4(
294
294
  Additional return value if errflag is True:
295
295
  list[sgp4_error]: list of errors for each TLE and time output, if errflag is True
296
296
 
297
+ Note:
298
+ Now supports propagation of OMM (Orbital Mean-Element Message) dictionaries
299
+ The dictionaries must follow the structure used by https://www.celestrak.org or
300
+ https://www.space-track.org.
301
+
302
+
297
303
  Example:
298
304
  >>> lines = [
299
305
  >>> "0 INTELSAT 902",
@@ -317,6 +323,20 @@ def sgp4(
317
323
  >>> # Print ITRF coordinate object location
318
324
  >>> print(coord)
319
325
  ITRFCoord(lat: -0.0363 deg, lon: -2.2438 deg, hae: 35799.51 km)
326
+
327
+ Example 2:
328
+ >>> import requests
329
+ >>> import json
330
+ >>>
331
+ >>> # Query ephemeris for the International Space Station (ISS)
332
+ >>> url = 'https://celestrak.org/NORAD/elements/gp.php?CATNR=25544&FORMAT=json'
333
+ >>> with requests.get(url) as response:
334
+ >>> omm = response.json()
335
+ >>> # Get a representative time from the output
336
+ >>> epoch = sk.time(omm[0]['EPOCH'])
337
+ >>> # Compute TEME position & velocity at epoch
338
+ >>> pteme, vteme = satkit.sgp4(omm[0], epoch)
339
+
320
340
  """
321
341
 
322
342
  class sgp4_gravconst:
@@ -968,9 +988,30 @@ class time:
968
988
  satkit.time: Time object representing the same instant in time as the input "datetime.datetime" object
969
989
  """
970
990
 
971
- def datetime(self, utc: bool = True) -> datetime.datetime:
991
+ def as_datetime(self, utc: bool = True) -> datetime.datetime:
972
992
  """Convert object to "datetime.datetime" object representing same instant in time.
973
993
 
994
+ Args:
995
+ utc (bool, optional): Whether to make the "datetime.datetime" object represent time in the local timezone or "UTC". Default is True
996
+
997
+ Returns:
998
+ datetime.datetime: "datetime.datetime" object representing the same instant in time as the "satkit.time" object
999
+
1000
+ Example:
1001
+ >>> dt = satkit.time(2023, 6, 3, 6, 19, 34).as_datetime(True)
1002
+ >>> print(dt)
1003
+ 2023-06-03 06:19:34+00:00
1004
+ >>>
1005
+ >>> dt = satkit.time(2023, 6, 3, 6, 19, 34).as_datetime(False)
1006
+ >>> print(dt)
1007
+ 2023-06-03 02:19:34
1008
+ """
1009
+
1010
+ def datetime(self, utc: bool = True) -> datetime.datetime:
1011
+ """Deprecated: use :meth:`satkit.time.as_datetime`.
1012
+
1013
+ Convert object to "datetime.datetime" object representing same instant in time.
1014
+
974
1015
  Args:
975
1016
  utc (bool, optional): Whether to make the "datetime.datetime" object represent time in the local timezone or "UTC". Default is True
976
1017
 
@@ -2235,7 +2276,7 @@ class propresult:
2235
2276
 
2236
2277
  Notes:
2237
2278
 
2238
- * If "enable_interp" is set to True in the propagation settings, the propresult object can be used to interpolate solutions at any time between the start and stop times of the propagation via the "interp" method
2279
+ * If "enable_interp" is set to True in the propagation settings, the propresult object can be used to interpolate solutions at any time between the begin and end times of the propagation via the "interp" method
2239
2280
 
2240
2281
  """
2241
2282
 
@@ -2276,10 +2317,10 @@ class propresult:
2276
2317
  """
2277
2318
 
2278
2319
  @property
2279
- def state_start(self) -> npt.NDArray[np.float64]:
2280
- """6-element state (pos + vel) of satellite in meters & meters/second at start of propagation
2320
+ def state_begin(self) -> npt.NDArray[np.float64]:
2321
+ """6-element state (pos + vel) of satellite in meters & meters/second at begin of propagation
2281
2322
  Returns:
2282
- npt.NDArray[np.float64]: 6-element numpy array representing state of satellite in meters & meters/second at start of propagation
2323
+ npt.NDArray[np.float64]: 6-element numpy array representing state of satellite in meters & meters/second at begin of propagation
2283
2324
  """
2284
2325
 
2285
2326
  @property
@@ -2302,12 +2343,12 @@ class propresult:
2302
2343
  """
2303
2344
 
2304
2345
  @property
2305
- def time_start(self) -> time:
2306
- """Time at which state_start is valid
2346
+ def time_begin(self) -> time:
2347
+ """Time at which state_begin is valid
2307
2348
 
2308
2349
 
2309
2350
  Returns:
2310
- satkit.time: Time at which state_start is valid
2351
+ satkit.time: Time at which state_begin is valid
2311
2352
  """
2312
2353
 
2313
2354
  @property
@@ -2398,7 +2439,7 @@ class propsettings:
2398
2439
  * use_jplephem: True
2399
2440
  * enable_interp: True
2400
2441
 
2401
- * enable_interp enables high-preciion interpolation of state between start and stop times via the returned function,
2442
+ * enable_interp enables high-preciion interpolation of state between begin and end times via the returned function,
2402
2443
  it is enabled by default. There is a small increase in computational efficiency if set to false
2403
2444
 
2404
2445
  """
@@ -2412,7 +2453,7 @@ class propsettings:
2412
2453
  gravity_order (int, optional keyword): Earth gravity order to use in ODE integration. Default is 4
2413
2454
  use_spaceweather (bool, optional keyword): Use space weather data when computing atmospheric density for drag forces. Default is True
2414
2455
  use_jplephem (bool, optional keyword): Use JPL ephemeris for solar system bodies. Default is True
2415
- enable_interp (bool, optional keyword): Store intermediate data that allows for fast high-precision interpolation of state between start and stop times. Default is True
2456
+ enable_interp (bool, optional keyword): Store intermediate data that allows for fast high-precision interpolation of state between begin and end times. Default is True
2416
2457
 
2417
2458
 
2418
2459
  Returns:
@@ -2471,30 +2512,30 @@ class propsettings:
2471
2512
  def use_spaceweather(self, value: bool) -> None: ...
2472
2513
  @property
2473
2514
  def enable_interp(self) -> bool:
2474
- """Store intermediate data that allows for fast high-precision interpolation of state between start and stop times
2515
+ """Store intermediate data that allows for fast high-precision interpolation of state between begin and end times
2475
2516
  If not needed, there is a small computational advantage if set to False
2476
2517
  """
2477
2518
 
2478
2519
  @enable_interp.setter
2479
2520
  def enable_interp(self, value: bool) -> None: ...
2480
2521
  def precompute_terms(
2481
- self, start: time, stop: time, step: Optional[duration] = None
2522
+ self, begin: time, end: time, step: Optional[duration] = None
2482
2523
  ):
2483
- """Precompute terms for fast interpolation of state between start and stop times
2524
+ """Precompute terms for fast interpolation of state between begin and end times
2484
2525
 
2485
2526
  This can be used, for example, to compute sun and moon positions only once if propagating many satellites over the same time period
2486
2527
 
2487
2528
  Args:
2488
- start (satkit.time): Start time of propagation
2489
- stop (satkit.time): Stop time of propagation
2529
+ begin (satkit.time): Begin time of propagation
2530
+ end (satkit.time): End time of propagation
2490
2531
  step (satkit.duration, optional): Step size for interpolation. Default = 60 seconds
2491
2532
 
2492
2533
  """
2493
2534
 
2494
2535
  def propagate(
2495
2536
  state: npt.NDArray[np.float64],
2496
- start: time,
2497
- stop: time,
2537
+ begin: time,
2538
+ end: time,
2498
2539
  **kwargs,
2499
2540
  ) -> propresult:
2500
2541
  """High-precision orbit propagator
@@ -2503,12 +2544,12 @@ def propagate(
2503
2544
 
2504
2545
  Args:
2505
2546
  state (npt.ArrayLike[float], optional): 6-element numpy array representing satellite GCRF position and velocity in meters and meters/second
2506
- start (satkit.time, optional): satkit.time object representing instant at which satellite is at "pos" & "vel"
2507
- stop (satkit.time, optional keyword): satkit.time object representing instant at which new position and velocity will be computed
2508
- duration (satkit.duration, optional keyword): duration from "start" at which new position & velocity will be computed.
2509
- duration_secs (float, optional keyword): duration in seconds from "start" for at which new position and velocity will be computed.
2510
- duration_days (float, optional keyword): duration in days from "start" at which new position and velocity will be computed.
2511
- output_phi (bool, optional keyword): Output 6x6 state transition matrix between "starttime" and "stoptime" (and at intervals, if specified)
2547
+ begin (satkit.time, optional): satkit.time object representing instant at which satellite is at "pos" & "vel"
2548
+ end (satkit.time, optional keyword): satkit.time object representing instant at which new position and velocity will be computed
2549
+ duration (satkit.duration, optional keyword): duration from "begin" at which new position & velocity will be computed.
2550
+ duration_secs (float, optional keyword): duration in seconds from "begin" for at which new position and velocity will be computed.
2551
+ duration_days (float, optional keyword): duration in days from "begin" at which new position and velocity will be computed.
2552
+ output_phi (bool, optional keyword): Output 6x6 state transition matrix between "begintime" and "endtime" (and at intervals, if specified)
2512
2553
  propsettings (propsettings, optional keyword): "propsettings" object with input settings for the propagation. if left out, default will be used.
2513
2554
  satproperties (satproperties_static, optional keyword): "sat_properties_static" object with drag and radiation pressure succeptibility of satellite.
2514
2555
 
@@ -2524,7 +2565,7 @@ def propagate(
2524
2565
  * Sun, Moon gravity
2525
2566
  * Radiation pressured
2526
2567
  * Atmospheric drag: NRL-MISE 2000 density model, with option to include space weather effects (which can be large)
2527
- * Stop time must be set by keyword argument, either explicitely or by duration
2568
+ * End time must be set by keyword argument, either explicitely or by duration
2528
2569
  * Solid Earth tides are not (yet) included in the model
2529
2570
 
2530
2571
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: satkit
3
- Version: 0.8.5
3
+ Version: 0.9.0
4
4
  Summary: Satellite Orbital Dynamics Toolkit
5
5
  Author-email: Steven Michael <ssmichael@gmail.com>
6
6
  Maintainer-email: Steven Michael <ssmichael@gmail.com>
@@ -40,6 +40,9 @@ Description-Content-Type: text/markdown
40
40
  License-File: LICENSE
41
41
  Requires-Dist: numpy >=1.0.0
42
42
  Requires-Dist: satkit-data >=0.7.0
43
+ Provides-Extra: test
44
+ Requires-Dist: pytest ; extra == 'test'
45
+ Requires-Dist: xmltodict ; extra == 'test'
43
46
 
44
47
  # Satellite Toolkit (satkit)
45
48
 
@@ -47,7 +50,7 @@ Requires-Dist: satkit-data >=0.7.0
47
50
 
48
51
  Satkit provides robust, high-performance satellite orbital mechanics calculations with a clean, intuitive API. Built from the ground up in Rust for maximum performance and memory safety, it offers complete Python bindings for all functionality, making advanced orbital mechanics accessible to both systems programmers and data scientists.
49
52
 
50
- -----
53
+ -----
51
54
 
52
55
  ![Build Passing?](https://github.com/ssmichael1/satkit/actions/workflows/build.yml/badge.svg)
53
56
  ![Wheel Passing?](https://github.com/ssmichael1/satkit/actions/workflows/wheels.yml/badge.svg)
@@ -61,7 +64,7 @@ Satkit provides robust, high-performance satellite orbital mechanics calculation
61
64
  ![PyPI - Status](https://img.shields.io/pypi/status/satkit)
62
65
  ![PyPI - Downloads](https://img.shields.io/pypi/dm/satkit)
63
66
  ![Read the Docs](https://img.shields.io/readthedocs/satellite-toolkit)
64
-
67
+
65
68
  ------
66
69
 
67
70
  ## Language Bindings
@@ -83,7 +86,7 @@ High-precision conversions between multiple reference frames with full support f
83
86
  - **CIRF** - Celestial Intermediate Reference Frame (IAU-2006 intermediate)
84
87
  - **TIRF** - Terrestrial Intermediate Reference Frame (Earth-rotation intermediate)
85
88
  - **Geodetic** - Latitude, longitude, altitude with WGS-84 ellipsoid
86
-
89
+
87
90
  ### Orbit Propagation
88
91
  Multiple propagation methods optimized for different accuracy and performance requirements:
89
92
  - **Numerical Integration**: High-precision propagation using adaptive Runge-Kutta 9(8) methods with dense output
@@ -94,27 +97,29 @@ Multiple propagation methods optimized for different accuracy and performance re
94
97
  - Full AFSPC and improved mode support
95
98
  - TLE fitting from high-precision states with drag estimation
96
99
  - Batch processing for multiple satellites
100
+ - Support TLE and Orbital Mean-Element Messages
97
101
  - **Keplerian**: Fast analytical two-body propagation for preliminary analysis
98
-
99
- ### Force Models
102
+
103
+ ### Numerical Integration Force Models
100
104
  Comprehensive perturbation modeling for high-fidelity orbit propagation:
101
105
  - **Earth Gravity**: Spherical harmonic models up to degree/order 360
102
106
  - Multiple models: JGM2, JGM3, EGM96, ITU GRACE16
103
107
  - Efficient computation with configurable truncation order
104
108
  - Gravity gradient support for state transition matrix
105
109
  - **Third-Body Gravity**: Solar and lunar perturbations using JPL ephemerides
106
- - **Atmospheric Drag**: NRLMSISE-00 density model with space weather integration
110
+ - **Atmospheric Drag**:
111
+ - NRLMSISE-00 density model with space weather integration
107
112
  - Automatic space weather data updates (F10.7, Ap index)
108
113
  - Configurable ballistic coefficients
109
114
  - **Solar Radiation Pressure**: Cannon-ball model with shadow function
110
-
111
- ### Ephemerides
115
+
116
+ ### Solar System Ephemerides
112
117
  Access to high-precision solar system body positions:
113
118
  - **JPL DE440/DE441**: State-of-the-art planetary ephemerides
114
119
  - Chebyshev polynomial interpolation for accuracy
115
120
  - Support for all major planets, sun, moon, and solar system barycenter
116
121
  - **Low-Precision Models**: Fast analytical models for sun and moon when high precision isn't required
117
-
122
+
118
123
  ### Time Systems
119
124
  Comprehensive support for all standard astronomical time scales:
120
125
  - **UTC** - Coordinated Universal Time with leap second handling
@@ -124,7 +129,7 @@ Comprehensive support for all standard astronomical time scales:
124
129
  - **UT1** - Universal Time with Earth orientation corrections
125
130
  - **GPS** - GPS Time
126
131
  - Automatic conversion between all time scales with microsecond precision
127
-
132
+
128
133
  ### Geodetic Utilities
129
134
  - **Geodesic Calculations**: Accurate distance and azimuth between ground locations using Vincenty's formulae
130
135
  - **Coordinate Conversions**: ITRF ↔ Geodetic ↔ East-North-Up ↔ North-East-Down
@@ -177,12 +182,12 @@ The library requires external data files for various calculations. These are aut
177
182
  - DE440/DE441 planetary ephemerides (~100 MB)
178
183
  - Provides positions of sun, moon, planets, and solar system barycenter
179
184
  - Valid for years 1550-2650 CE
180
-
185
+
181
186
  - **Gravity Models** ([ICGEM](http://icgem.gfz-potsdam.de/home))
182
187
  - JGM2, JGM3, EGM96, ITU GRACE16 spherical harmonic coefficients
183
188
  - International Centre for Global Earth Models standardized format
184
189
  - Up to degree/order 360 for high-fidelity propagation
185
-
190
+
186
191
  - **IERS Nutation Tables** ([IERS Conventions](https://www.iers.org/IERS/EN/Publications/TechnicalNotes/tn36.html))
187
192
  - IAU-2006 nutation series coefficients
188
193
  - Required for GCRF ↔ ITRF transformations
@@ -195,7 +200,7 @@ The library requires external data files for various calculations. These are aut
195
200
  - Ap geomagnetic index
196
201
  - Critical for atmospheric density modeling and drag calculations
197
202
  - Updated daily by NOAA Space Weather Prediction Center
198
-
203
+
199
204
  - **Earth Orientation Parameters** ([Celestrak](https://celestrak.org/SpaceData/))
200
205
  - Polar motion (x, y)
201
206
  - UT1-UTC time difference
@@ -217,15 +222,15 @@ The library includes comprehensive test suites ensuring correctness of calculati
217
222
  - **JPL Ephemerides**: Validated against JPL-provided test vectors for Chebyshev polynomial interpolation
218
223
  - Over 10,000 test cases covering all planets and time ranges
219
224
  - Accuracy verified to within JPL's published tolerances (sub-meter precision)
220
-
225
+
221
226
  - **SGP4**: Verified using official test vectors from the original C++ distribution
222
227
  - All test cases from Vallado's SGP4 implementation
223
228
  - Includes edge cases and error conditions
224
-
229
+
225
230
  - **Coordinate Transformations**: Cross-validated against multiple reference implementations
226
231
  - SOFA library comparisons for IAU-2006 transformations
227
232
  - Vallado test cases for GCRF ↔ ITRF conversions
228
-
233
+
229
234
  - **Numerical Propagation**: Validated against high-precision commercial tools
230
235
  - Orbit fits to GPS SP3 ephemerides
231
236
  - Multi-day propagations with sub-meter accuracy
@@ -265,7 +270,7 @@ pip install satkit
265
270
 
266
271
  Pre-built binary wheels are available for:
267
272
  - **Windows**: AMD64
268
- - **macOS**: Intel (x86_64) and Apple Silicon (ARM64)
273
+ - **macOS**: Intel (x86_64) and Apple Silicon (ARM64)
269
274
  - **Linux**: x86_64 and ARM64 (aarch64)
270
275
  - **Python versions**: 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14
271
276
 
@@ -335,9 +340,9 @@ settings.gravity_order = 8
335
340
 
336
341
  # Propagate for 1 day
337
342
  result = sk.propagate(
338
- state0,
339
- time0,
340
- stop=time0 + sk.duration.from_days(1),
343
+ state0,
344
+ time0,
345
+ end=time0 + sk.duration.from_days(1),
341
346
  propsettings=settings
342
347
  )
343
348
 
@@ -374,13 +379,13 @@ use satkit::{Instant, SolarSystem, jplephem};
374
379
  fn main() -> Result<(), Box<dyn std::error::Error>> {
375
380
  // Create time instant
376
381
  let time = Instant::from_datetime(2024, 1, 1, 0, 0, 0.0)?;
377
-
382
+
378
383
  // Get Moon position and velocity in GCRF
379
384
  let (pos, vel) = jplephem::geocentric_state(SolarSystem::Moon, &time)?;
380
-
385
+
381
386
  println!("Moon position: {:?}", pos);
382
387
  println!("Moon velocity: {:?}", vel);
383
-
388
+
384
389
  Ok(())
385
390
  }
386
391
  ```
@@ -1,18 +1,18 @@
1
1
  satkit/__init__.py,sha256=_N6_4wz07lz7HhjdL-8bUKOlubFC4WJHyTumLoS1ru4,622
2
2
  satkit/__init__.pyi,sha256=zqMluH0ZKLDXQK9Z32yiEf2LncSDE8yiHHj9X0DS6Ww,732
3
- satkit/_version.py,sha256=ajWZoScrojscBOac59VBfHuO-bpIeaQKv8Ww1_E7FwQ,446
3
+ satkit/_version.py,sha256=yPAtgqyyGYDKGGxCwEzymB8ULCvrs8uAfofuy5v01KY,446
4
4
  satkit/density.pyi,sha256=j_25g_QI7LKo0IEq13Y2daSMYnb4pE5ZPHFX6H8gscE,2211
5
5
  satkit/frametransform.pyi,sha256=UeVyVbWJppoPkCNWOvUM-MGs7FShVVP0wWh6LE8BPus,15806
6
6
  satkit/jplephem.pyi,sha256=5W0tK3-kv5Si-aS7cci1QGTtXC5cAeEbUj5mwIu7IU8,3506
7
7
  satkit/moon.pyi,sha256=r151F1_D2J_Zp9YgZfAuuUlqb8OMPUjk610UwhJ0OXs,3510
8
8
  satkit/planets.pyi,sha256=MX_4waUoTVM11ftaIEDg8kmdZDId9nuRWUUiMYP6Zvg,1110
9
9
  satkit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- satkit/satkit.cp38-win_amd64.pyd,sha256=bqf-js17OQKOQAFnPwr7NTkp-MD9LBP5NblhKbaWo6Y,4611584
11
- satkit/satkit.pyi,sha256=buxuFCGNqliQpN0qOw81DjNr1AneBwCqKxrwLDyr5eM,86450
10
+ satkit/satkit.cp38-win_amd64.pyd,sha256=8d5SCNOFK4rIM51dXdBC9JTezAGzqk0hsY6Nyov50ns,4642304
11
+ satkit/satkit.pyi,sha256=Bb0rhJN9EVbAeVSFO2vBmLcWZUme4CzzItub3_eEjiA,88098
12
12
  satkit/sun.pyi,sha256=Ox7n-JJTNRXFjIR1U0ehbEeecoVss11KFiiKhl28wQs,4217
13
13
  satkit/utils.pyi,sha256=f087jRMh4Y4Lghrn-ncIvt16KCQ4Sto_icicvaXgXk4,3085
14
- satkit-0.8.5.dist-info/LICENSE,sha256=_G_hwbOSJZqdIWNjgzjFB91eZKvherjtmFfvVvy9wCA,1092
15
- satkit-0.8.5.dist-info/METADATA,sha256=qc3AJ8x8SS-GwryiziFjDlipeWaXf4A01KLFgkE2lDE,17388
16
- satkit-0.8.5.dist-info/WHEEL,sha256=q-8g9petFnV9NMO9vJ2udYt2PFlnDjFGlAmDhUgQ79c,99
17
- satkit-0.8.5.dist-info/top_level.txt,sha256=1gsJ2XQ64FuUfw4z-i3CDi4Y4z9qcKNcm8Fy6-8xSVE,7
18
- satkit-0.8.5.dist-info/RECORD,,
14
+ satkit-0.9.0.dist-info/LICENSE,sha256=_G_hwbOSJZqdIWNjgzjFB91eZKvherjtmFfvVvy9wCA,1092
15
+ satkit-0.9.0.dist-info/METADATA,sha256=IvhoubRINQAJ-hIGkV25X-qe_Mt-uvnOlK5UWaOSbxU,17549
16
+ satkit-0.9.0.dist-info/WHEEL,sha256=q-8g9petFnV9NMO9vJ2udYt2PFlnDjFGlAmDhUgQ79c,99
17
+ satkit-0.9.0.dist-info/top_level.txt,sha256=1gsJ2XQ64FuUfw4z-i3CDi4Y4z9qcKNcm8Fy6-8xSVE,7
18
+ satkit-0.9.0.dist-info/RECORD,,
File without changes