opentrons 8.5.1a1__py2.py3-none-any.whl → 8.5.1a2__py2.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 opentrons might be problematic. Click here for more details.

@@ -1705,7 +1705,7 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1705
1705
  # multi-dispense in those destinations.
1706
1706
  # If the tip has a volume corresponding to a single destination, then
1707
1707
  # do a single-dispense into that destination.
1708
- for dispense_vol, dispense_dest in vol_dest_combo:
1708
+ for idx, (dispense_vol, dispense_dest) in enumerate(vol_dest_combo):
1709
1709
  if use_single_dispense:
1710
1710
  tip_contents = self.dispense_liquid_class(
1711
1711
  volume=dispense_vol,
@@ -1733,6 +1733,7 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1733
1733
  trash_location=trash_location,
1734
1734
  conditioning_volume=conditioning_vol,
1735
1735
  disposal_volume=disposal_vol,
1736
+ is_last_dispense_in_tip=(idx == len(vol_dest_combo) - 1),
1736
1737
  )
1737
1738
  is_first_step = False
1738
1739
 
@@ -2286,6 +2287,7 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
2286
2287
  trash_location: Union[Location, TrashBin, WasteChute],
2287
2288
  conditioning_volume: float,
2288
2289
  disposal_volume: float,
2290
+ is_last_dispense_in_tip: bool,
2289
2291
  ) -> List[tx_comps_executor.LiquidAndAirGapPair]:
2290
2292
  """Execute a dispense step that's part of a multi-dispense.
2291
2293
 
@@ -2332,9 +2334,8 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
2332
2334
  components_executor.submerge(
2333
2335
  submerge_properties=dispense_props.submerge, post_submerge_action="dispense"
2334
2336
  )
2335
- tip_starting_volume = self.get_current_volume()
2336
2337
  is_last_dispense_without_disposal_vol = (
2337
- disposal_volume == 0 and tip_starting_volume == volume
2338
+ disposal_volume == 0 and is_last_dispense_in_tip
2338
2339
  )
2339
2340
  push_out_vol = (
2340
2341
  # TODO (spp): verify if it's okay to use push_out_by_volume of single dispense
@@ -2354,7 +2355,7 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
2354
2355
  source_well=source[1] if source else None,
2355
2356
  conditioning_volume=conditioning_volume,
2356
2357
  add_final_air_gap=add_final_air_gap,
2357
- is_last_retract=tip_starting_volume - volume == disposal_volume,
2358
+ is_last_retract=is_last_dispense_in_tip,
2358
2359
  )
2359
2360
  last_contents = components_executor.tip_state.last_liquid_and_air_gap_in_tip
2360
2361
  new_tip_contents = tip_contents[0:-1] + [last_contents]
@@ -543,6 +543,11 @@ class TransferComponentsExecutor:
543
543
  blowout_props.enabled
544
544
  and blowout_props.location == BlowoutLocation.DESTINATION
545
545
  ) or not blowout_props.enabled
546
+
547
+ if is_final_air_gap and not add_final_air_gap:
548
+ air_gap_volume = 0.0
549
+ else:
550
+ air_gap_volume = retract_props.air_gap_by_volume.get_for_volume(0)
546
551
  # Regardless of the blowout location, do touch tip and air gap
547
552
  # when leaving the dispense well. If this will be the final air gap, i.e,
548
553
  # we won't be moving to a Trash or a Source for Blowout after this air gap,
@@ -551,7 +556,7 @@ class TransferComponentsExecutor:
551
556
  touch_tip_properties=retract_props.touch_tip,
552
557
  location=retract_location,
553
558
  well=self._target_well,
554
- add_air_gap=False if is_final_air_gap and not add_final_air_gap else True,
559
+ air_gap_volume=air_gap_volume,
555
560
  )
556
561
 
557
562
  if (
@@ -599,15 +604,21 @@ class TransferComponentsExecutor:
599
604
  last_air_gap = self._tip_state.last_liquid_and_air_gap_in_tip.air_gap
600
605
  self._tip_state.delete_air_gap(last_air_gap)
601
606
  self._tip_state.ready_to_aspirate = False
607
+
608
+ air_gap_volume = (
609
+ retract_props.air_gap_by_volume.get_for_volume(0)
610
+ if add_final_air_gap
611
+ else 0.0
612
+ )
602
613
  # Do touch tip and air gap again after blowing out into source well or trash
603
614
  self._do_touch_tip_and_air_gap_after_dispense(
604
615
  touch_tip_properties=retract_props.touch_tip,
605
616
  location=touch_tip_and_air_gap_location,
606
617
  well=touch_tip_and_air_gap_well,
607
- add_air_gap=add_final_air_gap,
618
+ air_gap_volume=air_gap_volume,
608
619
  )
609
620
 
610
- def retract_during_multi_dispensing(
621
+ def retract_during_multi_dispensing( # noqa: C901
611
622
  self,
612
623
  trash_location: Union[Location, TrashBin, WasteChute],
613
624
  source_location: Optional[Location],
@@ -720,6 +731,14 @@ class TransferComponentsExecutor:
720
731
  else:
721
732
  add_air_gap = True
722
733
 
734
+ air_gap_volume = (
735
+ retract_props.air_gap_by_volume.get_for_volume(
736
+ self.tip_state.last_liquid_and_air_gap_in_tip.liquid
737
+ )
738
+ if add_air_gap
739
+ else 0.0
740
+ )
741
+
723
742
  # Regardless of the blowout location, do touch tip
724
743
  # when leaving the dispense well.
725
744
  # Add an air gap depending on conditioning volume + whether this is
@@ -729,7 +748,7 @@ class TransferComponentsExecutor:
729
748
  touch_tip_properties=retract_props.touch_tip,
730
749
  location=retract_location,
731
750
  well=self._target_well,
732
- add_air_gap=add_air_gap,
751
+ air_gap_volume=air_gap_volume,
733
752
  )
734
753
 
735
754
  if (
@@ -776,17 +795,22 @@ class TransferComponentsExecutor:
776
795
  self._tip_state.delete_last_air_gap_and_liquid()
777
796
  self._tip_state.ready_to_aspirate = False
778
797
 
798
+ if (
799
+ # Same check as before for when it's the final air gap of current retract
800
+ conditioning_volume > 0
801
+ and is_last_retract
802
+ and add_final_air_gap
803
+ ):
804
+ # The volume in tip at this point should be 0uL
805
+ air_gap_volume = retract_props.air_gap_by_volume.get_for_volume(0)
806
+ else:
807
+ air_gap_volume = 0
779
808
  # Do touch tip and air gap again after blowing out into source well or trash
780
809
  self._do_touch_tip_and_air_gap_after_dispense(
781
810
  touch_tip_properties=retract_props.touch_tip,
782
811
  location=touch_tip_and_air_gap_location,
783
812
  well=touch_tip_and_air_gap_well,
784
- add_air_gap=(
785
- # Same check as before for when it's the final air gap of current retract
786
- conditioning_volume > 0
787
- and is_last_retract
788
- and add_final_air_gap
789
- ),
813
+ air_gap_volume=air_gap_volume,
790
814
  )
791
815
 
792
816
  def _do_touch_tip_and_air_gap_after_dispense( # noqa: C901
@@ -794,7 +818,7 @@ class TransferComponentsExecutor:
794
818
  touch_tip_properties: TouchTipProperties,
795
819
  location: Union[Location, TrashBin, WasteChute],
796
820
  well: Optional[WellCore],
797
- add_air_gap: bool,
821
+ air_gap_volume: float,
798
822
  ) -> None:
799
823
  """Perform touch tip and air gap as part of post-dispense retract.
800
824
 
@@ -840,7 +864,7 @@ class TransferComponentsExecutor:
840
864
  # Full speed because the tip will already be out of the liquid
841
865
  speed=None,
842
866
  )
843
- if add_air_gap or not self._tip_state.ready_to_aspirate:
867
+ if air_gap_volume > 0 or not self._tip_state.ready_to_aspirate:
844
868
  # If we need to move the plunger up either to prepare for aspirate or to add air gap,
845
869
  # move to a safe location above the well if the retract location is not already
846
870
  # at or above this safe location
@@ -886,12 +910,8 @@ class TransferComponentsExecutor:
886
910
  if not self._tip_state.ready_to_aspirate:
887
911
  self._instrument.prepare_to_aspirate()
888
912
  self._tip_state.ready_to_aspirate = True
889
- if add_air_gap:
890
- self._add_air_gap(
891
- air_gap_volume=self._transfer_properties.aspirate.retract.air_gap_by_volume.get_for_volume(
892
- 0
893
- )
894
- )
913
+ if air_gap_volume > 0:
914
+ self._add_air_gap(air_gap_volume=air_gap_volume)
895
915
 
896
916
  def _add_air_gap(
897
917
  self,
@@ -1801,9 +1801,6 @@ class InstrumentContext(publisher.CommandPublisher):
1801
1801
  ) -> InstrumentContext:
1802
1802
  """Move a particular type of liquid from one well or group of wells to another.
1803
1803
 
1804
- ..
1805
- This is intended for Opentrons internal use only and is not a guaranteed API.
1806
-
1807
1804
  :param liquid_class: The type of liquid to move. You must specify the liquid class,
1808
1805
  even if you have used :py:meth:`.Labware.load_liquid` to indicate what liquid the
1809
1806
  source contains.
@@ -1944,16 +1941,12 @@ class InstrumentContext(publisher.CommandPublisher):
1944
1941
  """
1945
1942
  Distribute a particular type of liquid from one well to a group of wells.
1946
1943
 
1947
- ..
1948
- This is intended for Opentrons internal use only and is not a guaranteed API.
1949
-
1950
1944
  :param liquid_class: The type of liquid to move. You must specify the liquid class,
1951
1945
  even if you have used :py:meth:`.Labware.load_liquid` to indicate what liquid the
1952
1946
  source contains.
1953
1947
  :type liquid_class: :py:class:`.LiquidClass`
1954
1948
 
1955
- :param volume: The amount, in µL, to aspirate from the source and dispense to
1956
- each destination.
1949
+ :param volume: The amount, in µL, to dispense to each destination.
1957
1950
  :param source: A single well for the pipette to target, or a group of wells to
1958
1951
  target in a single aspirate for a multi-channel pipette.
1959
1952
  :param dest: A list of wells to dispense liquid into.
@@ -2092,16 +2085,12 @@ class InstrumentContext(publisher.CommandPublisher):
2092
2085
  """
2093
2086
  Consolidate a particular type of liquid from a group of wells to one well.
2094
2087
 
2095
- ..
2096
- This is intended for Opentrons internal use only and is not a guaranteed API.
2097
-
2098
2088
  :param liquid_class: The type of liquid to move. You must specify the liquid class,
2099
2089
  even if you have used :py:meth:`.Labware.load_liquid` to indicate what liquid the
2100
2090
  source contains.
2101
2091
  :type liquid_class: :py:class:`.LiquidClass`
2102
2092
 
2103
- :param volume: The amount, in µL, to aspirate from the source and dispense to
2104
- each destination.
2093
+ :param volume: The amount, in µL, to aspirate from each source well.
2105
2094
  :param source: A list of wells to aspirate liquid from.
2106
2095
  :param dest: A single well, list of wells, trash bin, or waste chute to dispense liquid into.
2107
2096
  Multiple wells can only be given for multi-channel pipette configurations, and
@@ -1386,6 +1386,8 @@ class ProtocolContext(CommandPublisher):
1386
1386
  - ``"ethanol_80"``: an Opentrons-verified liquid class for volatile liquid. Based on 80% ethanol.
1387
1387
 
1388
1388
  :raises: ``LiquidClassDefinitionDoesNotExist``: if the specified liquid class does not exist.
1389
+
1390
+ :returns: A new LiquidClass object.
1389
1391
  """
1390
1392
  return self._core.get_liquid_class(name=name, version=DEFAULT_LC_VERSION)
1391
1393
 
@@ -1397,15 +1399,16 @@ class ProtocolContext(CommandPublisher):
1397
1399
  base_liquid_class: Optional[LiquidClass] = None,
1398
1400
  display_name: Optional[str] = None,
1399
1401
  ) -> LiquidClass:
1400
- """Define a custom liquid class, either based on an existing, Opentrons-verified liquid class, or to create a completely new one.
1402
+ """Define a custom liquid class, either based on an existing liquid class, or create a completely new one.
1401
1403
 
1402
1404
  :param name: The name to give to the new liquid class. Cannot use the name of an Opentrons-verified liquid class.
1403
- :param properties: A dict of transfer properties for the Flex pipette and tips to use for liquid class transfers. The nested dictionary must have top-level keys corresponding to pipette load names and second-level keys corresponding to compatible tip rack load names. Further nested key–value pairs should be in the format returned by :py:meth:`.LiquidClass.get_for`. See also the `liquid class JSON schema <https://github.com/Opentrons/opentrons/tree/edge/shared-data/liquid-class/schemas>`_.
1405
+ :param properties: A dict of transfer properties for pipette and tip combinations to use for liquid class transfers. The nested dictionary must have top-level keys corresponding to pipette load names and second-level keys corresponding to compatible tip rack load names. Further nested key–value pairs should be as specified in ``TransferPropertiesDict``. See the `liquid class type definitions <https://github.com/Opentrons/opentrons/blob/edge/shared-data/python/opentrons_shared_data/liquid_classes/types.py>`_.
1404
1406
 
1405
- :param base_liquid_class: An Opentrons-verified liquid class to base the newly defined liquid class on. The specified ``transfer_properties`` will override any existing properties for the Flex pipette and tips. All other properties will remain the same as those in the base class.
1407
+ :param base_liquid_class: An existing liquid class object to base the newly defined liquid class on. The specified ``transfer_properties`` will override any existing properties for the specified pipette and tip combinations. All other properties will remain the same as those in the base class.
1406
1408
 
1407
1409
  :param display_name: An optional name for the liquid class. Defaults to the title-case ``name`` if a display name isn't provided.
1408
1410
 
1411
+ :returns: A new LiquidClass object.
1409
1412
  """
1410
1413
  if definition_exists(name, DEFAULT_LC_VERSION):
1411
1414
  raise ValueError(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.5.1a1
3
+ Version: 8.5.1a2
4
4
  Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
5
5
  Author: Opentrons
6
6
  Author-email: engineering@opentrons.com
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Topic :: Scientific/Engineering
22
22
  Requires-Python: >=3.10
23
23
  License-File: ../LICENSE
24
- Requires-Dist: opentrons-shared-data (==8.5.1a1)
24
+ Requires-Dist: opentrons-shared-data (==8.5.1a2)
25
25
  Requires-Dist: aionotify (==0.3.1)
26
26
  Requires-Dist: anyio (<4.0.0,>=3.6.1)
27
27
  Requires-Dist: jsonschema (<4.18.0,>=3.0.1)
@@ -35,9 +35,9 @@ Requires-Dist: pyusb (==1.2.1)
35
35
  Requires-Dist: packaging (>=21.0)
36
36
  Requires-Dist: importlib-metadata (>=1.0) ; python_version < "3.8"
37
37
  Provides-Extra: flex-hardware
38
- Requires-Dist: opentrons-hardware[flex] (==8.5.1a1) ; extra == 'flex-hardware'
38
+ Requires-Dist: opentrons-hardware[flex] (==8.5.1a2) ; extra == 'flex-hardware'
39
39
  Provides-Extra: ot2-hardware
40
- Requires-Dist: opentrons-hardware (==8.5.1a1) ; extra == 'ot2-hardware'
40
+ Requires-Dist: opentrons-hardware (==8.5.1a2) ; extra == 'ot2-hardware'
41
41
 
42
42
  .. _Full API Documentation: http://docs.opentrons.com
43
43
 
@@ -229,11 +229,11 @@ opentrons/protocol_api/config.py,sha256=r9lyvXjagTX_g3q5FGURPpcz2IA9sSF7Oa_1mKx-
229
229
  opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau320_f-ASloR9eL1QCtkOh8,7612
230
230
  opentrons/protocol_api/deck.py,sha256=94vFceg1SC1bAGd7TvC1ZpYwnJR-VlzurEZ6jkacYeg,8910
231
231
  opentrons/protocol_api/disposal_locations.py,sha256=NRiSGmDR0LnbyEkWSOM-o64uR2fUoB1NWJG7Y7SsJSs,7920
232
- opentrons/protocol_api/instrument_context.py,sha256=mtflJtJfzHbnU3dFkQp8a2D4dqE1VRzy8JkqbDVpAJc,139254
232
+ opentrons/protocol_api/instrument_context.py,sha256=q-eTrK8PX61swEgA7IfZRAZzpcadPiGAXf4koJL3t5A,138846
233
233
  opentrons/protocol_api/labware.py,sha256=AhL1JX10Xt-mpB85CAnEOBvz9r5v3xncJuLMkiY1FPM,60934
234
234
  opentrons/protocol_api/module_contexts.py,sha256=Mzut2a92Gcv23wFPdNVU9fj2P--7WDqBx27xAJ7z8eo,48361
235
235
  opentrons/protocol_api/module_validation_and_errors.py,sha256=XL_m72P8rcvGO2fynY7UzXLcpGuI6X4s0V6Xf735Iyc,1464
236
- opentrons/protocol_api/protocol_context.py,sha256=PkedIdTuE8EBd4I7E6q1HjfXQWwmO_j3Q8dmNwLVJ90,70060
236
+ opentrons/protocol_api/protocol_context.py,sha256=8C_sgcntomyw5XEw9IEs5pIrOUA_uSqUHEEgIt1elK4,70161
237
237
  opentrons/protocol_api/robot_context.py,sha256=D6ZdpFX30VTtVUDHitsVjabJQXD5TxOV9_Z6sik1LvE,11891
238
238
  opentrons/protocol_api/validation.py,sha256=73QwpdK5337yu9g8jvpHHizOD0Mf3m6Wr9S8eikrHIc,28993
239
239
  opentrons/protocol_api/core/__init__.py,sha256=-g74o8OtBB0LmmOvwkRvPgrHt7fF7T8FRHDj-x_-Onk,736
@@ -249,7 +249,7 @@ opentrons/protocol_api/core/well_grid.py,sha256=BU28DKaBgEU_JdZ6pEzrwNxmuh6TkO4z
249
249
  opentrons/protocol_api/core/engine/__init__.py,sha256=B_5T7zgkWDb1mXPg4NbT-wBkQaK-WVokMMnJRNu7xiM,582
250
250
  opentrons/protocol_api/core/engine/deck_conflict.py,sha256=q3JViIAHDthIqq6ce7h2gxw3CHRfYsm5kkwzuXB-Gnc,12334
251
251
  opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
252
- opentrons/protocol_api/core/engine/instrument.py,sha256=HCc9SMglY9gumz1sAg7PU9cb7pR36Qkn0Cf6G1779_o,103900
252
+ opentrons/protocol_api/core/engine/instrument.py,sha256=uEy_pSox-I7A4P4Prhntofk4yQ4QFuJWqeK4gQk4kAI,103953
253
253
  opentrons/protocol_api/core/engine/labware.py,sha256=1xvzguNnK7aecFLiJK0gtRrZ5kpwtzLS73HnKvdJ5lc,8413
254
254
  opentrons/protocol_api/core/engine/load_labware_params.py,sha256=I4Cb8rqpBhmykQuZE8QRG802APrdCy_TYS88rm_9oGA,7159
255
255
  opentrons/protocol_api/core/engine/module_core.py,sha256=MLPgYSRJHUZPZ9rTLvsg3GlpL5b6-Pjk5UBgXCGrL6U,30994
@@ -259,7 +259,7 @@ opentrons/protocol_api/core/engine/point_calculations.py,sha256=C2eF0fvJQGMqQv3D
259
259
  opentrons/protocol_api/core/engine/protocol.py,sha256=OvE8kDONIR0z5S-FV10KUw5v5_HskPk7aqFNyTSUasc,46919
260
260
  opentrons/protocol_api/core/engine/robot.py,sha256=bzUt23NG-clD-9-QFsV_6nm3fMgSmvYEG9DyyZI1xgw,5366
261
261
  opentrons/protocol_api/core/engine/stringify.py,sha256=GwFgEhFMk-uPfFQhQG_2mkaf4cxaItiY8RW7rZwiooQ,2794
262
- opentrons/protocol_api/core/engine/transfer_components_executor.py,sha256=2RAcqU-a2uB6YQw7MGKIjeFhNkVFTD3AQySPGgrmpxc,43661
262
+ opentrons/protocol_api/core/engine/transfer_components_executor.py,sha256=PAH4hpg5QIp9gwsq0segY113_3ZyRgDV4OnDagNSrTE,44306
263
263
  opentrons/protocol_api/core/engine/well.py,sha256=IaaFK-3hoUfabfn_twIT7zcAynhzAmRxDnvABss2szo,8923
264
264
  opentrons/protocol_api/core/legacy/__init__.py,sha256=_9jCJNKG3SlS_vljVu8HHkZmtLf4F-f-JHALLF5d5go,401
265
265
  opentrons/protocol_api/core/legacy/deck.py,sha256=qHqcGo-Kdkl9L1aOE0pwrm9tsAnwkXbt4rIOr_VEP-s,13955
@@ -584,9 +584,9 @@ opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
584
584
  opentrons/util/logging_config.py,sha256=7et4YYuQdWdq_e50U-8vFS_QyNBRgdnqPGAQJm8qrIo,9954
585
585
  opentrons/util/logging_queue_handler.py,sha256=ZsSJwy-oV8DXwpYiZisQ1PbYwmK2cOslD46AcyJ1E4I,2484
586
586
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
587
- opentrons-8.5.1a1.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
588
- opentrons-8.5.1a1.dist-info/METADATA,sha256=MQIxS5B4tRWG4kazesJW0KIkXSD7zMI3FCj1ww8hS0k,5084
589
- opentrons-8.5.1a1.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
590
- opentrons-8.5.1a1.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
591
- opentrons-8.5.1a1.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
592
- opentrons-8.5.1a1.dist-info/RECORD,,
587
+ opentrons-8.5.1a2.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
588
+ opentrons-8.5.1a2.dist-info/METADATA,sha256=mo3SKWN9SO_-fOsmhqx0m4REdy-9WVyoAeURt7l5bHc,5084
589
+ opentrons-8.5.1a2.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
590
+ opentrons-8.5.1a2.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
591
+ opentrons-8.5.1a2.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
592
+ opentrons-8.5.1a2.dist-info/RECORD,,