opentrons 8.4.0a3__py2.py3-none-any.whl → 8.4.0a5__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.

Files changed (42) hide show
  1. opentrons/legacy_commands/commands.py +83 -2
  2. opentrons/legacy_commands/helpers.py +59 -1
  3. opentrons/legacy_commands/types.py +30 -0
  4. opentrons/protocol_api/core/engine/instrument.py +182 -115
  5. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +6 -14
  6. opentrons/protocol_api/core/engine/transfer_components_executor.py +30 -25
  7. opentrons/protocol_api/core/instrument.py +8 -4
  8. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +9 -30
  9. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +8 -4
  10. opentrons/protocol_api/core/well.py +1 -1
  11. opentrons/protocol_api/instrument_context.py +144 -73
  12. opentrons/protocol_api/labware.py +26 -44
  13. opentrons/protocol_api/protocol_context.py +18 -16
  14. opentrons/protocol_engine/commands/__init__.py +38 -38
  15. opentrons/protocol_engine/commands/aspirate_while_tracking.py +38 -65
  16. opentrons/protocol_engine/commands/command_unions.py +33 -33
  17. opentrons/protocol_engine/commands/dispense_while_tracking.py +36 -72
  18. opentrons/protocol_engine/commands/labware_handling_common.py +6 -1
  19. opentrons/protocol_engine/commands/liquid_probe.py +1 -2
  20. opentrons/protocol_engine/commands/move_to_well.py +5 -11
  21. opentrons/protocol_engine/commands/{evotip_dispense.py → pressure_dispense.py} +27 -27
  22. opentrons/protocol_engine/commands/{evotip_seal_pipette.py → seal_pipette_to_tip.py} +32 -27
  23. opentrons/protocol_engine/commands/{evotip_unseal_pipette.py → unseal_pipette_from_tip.py} +22 -22
  24. opentrons/protocol_engine/execution/pipetting.py +1 -0
  25. opentrons/protocol_engine/labware_offset_standardization.py +22 -1
  26. opentrons/protocol_engine/resources/deck_configuration_provider.py +8 -4
  27. opentrons/protocol_engine/state/frustum_helpers.py +12 -4
  28. opentrons/protocol_engine/state/geometry.py +121 -72
  29. opentrons/protocol_engine/state/update_types.py +1 -1
  30. opentrons/protocol_engine/state/wells.py +1 -1
  31. opentrons/protocol_engine/types/__init__.py +6 -0
  32. opentrons/protocol_engine/types/well_position.py +18 -1
  33. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +1 -1
  34. opentrons/protocols/labware.py +23 -18
  35. opentrons/util/logging_config.py +94 -25
  36. opentrons/util/logging_queue_handler.py +61 -0
  37. {opentrons-8.4.0a3.dist-info → opentrons-8.4.0a5.dist-info}/METADATA +4 -4
  38. {opentrons-8.4.0a3.dist-info → opentrons-8.4.0a5.dist-info}/RECORD +42 -41
  39. {opentrons-8.4.0a3.dist-info → opentrons-8.4.0a5.dist-info}/LICENSE +0 -0
  40. {opentrons-8.4.0a3.dist-info → opentrons-8.4.0a5.dist-info}/WHEEL +0 -0
  41. {opentrons-8.4.0a3.dist-info → opentrons-8.4.0a5.dist-info}/entry_points.txt +0 -0
  42. {opentrons-8.4.0a3.dist-info → opentrons-8.4.0a5.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,8 @@
1
1
  import logging
2
2
  from logging.config import dictConfig
3
+ from logging.handlers import QueueListener, RotatingFileHandler
3
4
  import sys
4
- from typing import Any, Dict
5
+ from queue import Queue
5
6
 
6
7
  from opentrons.config import CONFIG, ARCHITECTURE, SystemArchitecture
7
8
 
@@ -12,11 +13,33 @@ else:
12
13
  SENSOR_LOG_NAME = "unused"
13
14
 
14
15
 
15
- def _host_config(level_value: int) -> Dict[str, Any]:
16
+ # We want this big enough to smooth over any temporary stalls in journald's ability
17
+ # to consume our records--but bounded, so if we consistently outpace journald for
18
+ # some reason, we don't leak memory or get latency from buffer bloat.
19
+ # 50000 is basically an arbitrary guess.
20
+ _LOG_QUEUE_SIZE = 50000
21
+
22
+
23
+ log_queue = Queue[logging.LogRecord](maxsize=_LOG_QUEUE_SIZE)
24
+ """A buffer through which log records will pass.
25
+
26
+ This is intended to work around problems when our logs are going to journald:
27
+ we think journald can block for a while when it flushes records to the filesystem,
28
+ and the backpressure from that will cause calls like `log.debug()` to block and
29
+ interfere with timing-sensitive hardware control.
30
+ https://github.com/Opentrons/opentrons/issues/18034
31
+
32
+ `log_init()` will configure all the logs that this package knows about to pass through
33
+ this queue. This queue is exposed so consumers of this package (i.e. robot-server)
34
+ can do the same thing with their own logs, which is important to preserve ordering.
35
+ """
36
+
37
+
38
+ def _config_for_host(level_value: int) -> None:
16
39
  serial_log_filename = CONFIG["serial_log_file"]
17
40
  api_log_filename = CONFIG["api_log_file"]
18
41
  sensor_log_filename = CONFIG["sensor_log_file"]
19
- return {
42
+ config = {
20
43
  "version": 1,
21
44
  "disable_existing_loggers": False,
22
45
  "formatters": {
@@ -90,13 +113,20 @@ def _host_config(level_value: int) -> Dict[str, Any]:
90
113
  },
91
114
  }
92
115
 
116
+ dictConfig(config)
93
117
 
94
- def _buildroot_config(level_value: int) -> Dict[str, Any]:
118
+
119
+ def _config_for_robot(level_value: int) -> None:
95
120
  # Import systemd.journald here since it is generally unavailble on non
96
121
  # linux systems and we probably don't want to use it on linux desktops
97
122
  # either
123
+ from systemd.journal import JournalHandler # type: ignore
124
+
98
125
  sensor_log_filename = CONFIG["sensor_log_file"]
99
- return {
126
+
127
+ sensor_log_queue = Queue[logging.LogRecord](maxsize=_LOG_QUEUE_SIZE)
128
+
129
+ config = {
100
130
  "version": 1,
101
131
  "disable_existing_loggers": False,
102
132
  "formatters": {
@@ -104,36 +134,38 @@ def _buildroot_config(level_value: int) -> Dict[str, Any]:
104
134
  },
105
135
  "handlers": {
106
136
  "api": {
107
- "class": "systemd.journal.JournalHandler",
137
+ "class": "opentrons.util.logging_queue_handler.CustomQueueHandler",
108
138
  "level": logging.DEBUG,
109
139
  "formatter": "message_only",
110
- "SYSLOG_IDENTIFIER": "opentrons-api",
140
+ "extra": {"SYSLOG_IDENTIFIER": "opentrons-api"},
141
+ "queue": log_queue,
111
142
  },
112
143
  "serial": {
113
- "class": "systemd.journal.JournalHandler",
144
+ "class": "opentrons.util.logging_queue_handler.CustomQueueHandler",
114
145
  "level": logging.DEBUG,
115
146
  "formatter": "message_only",
116
- "SYSLOG_IDENTIFIER": "opentrons-api-serial",
147
+ "extra": {"SYSLOG_IDENTIFIER": "opentrons-api-serial"},
148
+ "queue": log_queue,
117
149
  },
118
150
  "can_serial": {
119
- "class": "systemd.journal.JournalHandler",
151
+ "class": "opentrons.util.logging_queue_handler.CustomQueueHandler",
120
152
  "level": logging.DEBUG,
121
153
  "formatter": "message_only",
122
- "SYSLOG_IDENTIFIER": "opentrons-api-serial-can",
154
+ "extra": {"SYSLOG_IDENTIFIER": "opentrons-api-serial-can"},
155
+ "queue": log_queue,
123
156
  },
124
157
  "usbbin_serial": {
125
- "class": "systemd.journal.JournalHandler",
158
+ "class": "opentrons.util.logging_queue_handler.CustomQueueHandler",
126
159
  "level": logging.DEBUG,
127
160
  "formatter": "message_only",
128
- "SYSLOG_IDENTIFIER": "opentrons-api-serial-usbbin",
161
+ "extra": {"SYSLOG_IDENTIFIER": "opentrons-api-serial-usbbin"},
162
+ "queue": log_queue,
129
163
  },
130
164
  "sensor": {
131
- "class": "logging.handlers.RotatingFileHandler",
132
- "formatter": "message_only",
133
- "filename": sensor_log_filename,
134
- "maxBytes": 1000000,
165
+ "class": "opentrons.util.logging_queue_handler.CustomQueueHandler",
135
166
  "level": logging.DEBUG,
136
- "backupCount": 3,
167
+ "formatter": "message_only",
168
+ "queue": sensor_log_queue,
137
169
  },
138
170
  },
139
171
  "loggers": {
@@ -169,12 +201,47 @@ def _buildroot_config(level_value: int) -> Dict[str, Any]:
169
201
  },
170
202
  }
171
203
 
204
+ # Start draining from the queue and sending messages to journald.
205
+ # Then, stash the queue listener in a global variable so it doesn't get garbage-collected.
206
+ # I don't know if we actually need to do this, but let's not find out the hard way.
207
+ global _queue_listener
208
+ if _queue_listener is not None:
209
+ # In case this log init function was called multiple times for some reason.
210
+ _queue_listener.stop()
211
+ _queue_listener = QueueListener(log_queue, JournalHandler())
212
+ _queue_listener.start()
213
+
214
+ # Sensor logs are a special one-off thing that go to their own file instead of journald.
215
+ # We apply the same QueueListener performance workaround for basically the same reasons.
216
+ sensor_rotating_file_handler = RotatingFileHandler(
217
+ filename=sensor_log_filename, maxBytes=1000000, backupCount=3
218
+ )
219
+ sensor_rotating_file_handler.setLevel(logging.DEBUG)
220
+ sensor_rotating_file_handler.setFormatter(logging.Formatter(fmt="%(message)s"))
221
+ global _sensor_queue_listener
222
+ if _sensor_queue_listener is not None:
223
+ _sensor_queue_listener.stop()
224
+ _sensor_queue_listener = QueueListener(
225
+ sensor_log_queue, sensor_rotating_file_handler
226
+ )
227
+ _sensor_queue_listener.start()
228
+
229
+ dictConfig(config)
172
230
 
173
- def _config(arch: SystemArchitecture, level_value: int) -> Dict[str, Any]:
174
- return {
175
- SystemArchitecture.YOCTO: _buildroot_config,
176
- SystemArchitecture.BUILDROOT: _buildroot_config,
177
- SystemArchitecture.HOST: _host_config,
231
+ # TODO(2025-04-15): We need some kind of log_deinit() function to call
232
+ # queue_listener.stop() before the process ends. Not doing that means we're
233
+ # dropping some records when the process shuts down.
234
+
235
+
236
+ _queue_listener: QueueListener | None = None
237
+ _sensor_queue_listener: QueueListener | None = None
238
+
239
+
240
+ def _config(arch: SystemArchitecture, level_value: int) -> None:
241
+ {
242
+ SystemArchitecture.YOCTO: _config_for_robot,
243
+ SystemArchitecture.BUILDROOT: _config_for_robot,
244
+ SystemArchitecture.HOST: _config_for_host,
178
245
  }[arch](level_value)
179
246
 
180
247
 
@@ -191,6 +258,8 @@ def log_init(level_name: str) -> None:
191
258
  f"Defaulting to {fallback_log_level}\n"
192
259
  )
193
260
  ot_log_level = fallback_log_level
261
+
262
+ # todo(mm, 2025-04-14): Use logging.getLevelNamesMapping() when we have Python >=3.11.
194
263
  level_value = logging._nameToLevel[ot_log_level]
195
- logging_config = _config(ARCHITECTURE, level_value)
196
- dictConfig(logging_config)
264
+
265
+ _config(ARCHITECTURE, level_value)
@@ -0,0 +1,61 @@
1
+ # noqa: D100
2
+
3
+
4
+ import logging.handlers
5
+ import logging
6
+ from queue import Queue
7
+ from typing import cast
8
+ from typing_extensions import override
9
+
10
+
11
+ class CustomQueueHandler(logging.handlers.QueueHandler):
12
+ """A logging.QueueHandler with some customizations.
13
+
14
+ - Allow adding `extra` data to handled log records.
15
+
16
+ - Simplify and optimize for single-process use.
17
+
18
+ - If a new message comes in but the queue is full, block until it has room.
19
+ (The default QueueHandler drops records in a way we probably wouldn't notice.)
20
+ """
21
+
22
+ def __init__(
23
+ self, *, queue: Queue[logging.LogRecord], extra: dict[str, object] | None = None
24
+ ) -> None:
25
+ """Construct the handler.
26
+
27
+ Args:
28
+ queue: When this handler receives a log record, it will insert the message
29
+ into this queue.
30
+ extra: Extra data to attach to each log record, to be interpreted by
31
+ whatever handler is on the consuming side of the queue. e.g. if that's
32
+ `systemd.journal.JournalHandler`, you could add a "SYSLOG_IDENTIFIER"
33
+ key here. This corresponds to the `extra` arg of `Logger.debug()`.
34
+ """
35
+ super().__init__(queue=queue)
36
+
37
+ # Double underscore because we're subclassing external code so we should try to
38
+ # avoid collisions with its attributes.
39
+ self.__extra = extra
40
+
41
+ @override
42
+ def prepare(self, record: logging.LogRecord) -> logging.LogRecord:
43
+ """Called internally by the superclass before enqueueing a record."""
44
+ if self.__extra is not None:
45
+ # This looks questionable, but updating __dict__ is the documented behavior
46
+ # of `Logger.debug(msg, extra=...)`.
47
+ record.__dict__.update(self.__extra)
48
+
49
+ # We intentionally do *not* call `super().prepare(record)`. It's documented to
50
+ # muck with the data in the LogRecord, apparently as part of supporting
51
+ # inter-process use. Since we don't need that, we can preserve the original
52
+ # data and also save some compute time.
53
+ return record
54
+
55
+ @override
56
+ def enqueue(self, record: logging.LogRecord) -> None:
57
+ """Called internally by the superclass to enqueue a record."""
58
+ # This cast is safe because we constrain the type of `self.queue`
59
+ # in our `__init__()` and nobody should mutate it after-the-fact, in practice.
60
+ queue = cast(Queue[logging.LogRecord], self.queue)
61
+ queue.put(record)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.4.0a3
3
+ Version: 8.4.0a5
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.4.0a3)
24
+ Requires-Dist: opentrons-shared-data (==8.4.0a5)
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.4.0a3) ; extra == 'flex-hardware'
38
+ Requires-Dist: opentrons-hardware[flex] (==8.4.0a5) ; extra == 'flex-hardware'
39
39
  Provides-Extra: ot2-hardware
40
- Requires-Dist: opentrons-hardware (==8.4.0a3) ; extra == 'ot2-hardware'
40
+ Requires-Dist: opentrons-hardware (==8.4.0a5) ; extra == 'ot2-hardware'
41
41
 
42
42
  .. _Full API Documentation: http://docs.opentrons.com
43
43
 
@@ -204,12 +204,12 @@ opentrons/hardware_control/scripts/gripper_control.py,sha256=aUt9MAo6DXDhY4BfJRe
204
204
  opentrons/hardware_control/scripts/repl.py,sha256=RojtHjYV6sa6O4SeNEgs5SvnAK0imQK_XqoLQTKlzWU,5982
205
205
  opentrons/hardware_control/scripts/tc_control.py,sha256=V6hOzoRXL3xqIUEz8Raldd45aO2JgN5m5Hr08c1G8Ko,2741
206
206
  opentrons/legacy_commands/__init__.py,sha256=erkaz7hc2iHsTtjpFDWrR1V5n47it3U1qxD2zL9CkuE,63
207
- opentrons/legacy_commands/commands.py,sha256=xapk1pSeIB_d6MwGj9wbQf0wRlJqOhtHeyws4w1L7j0,10437
208
- opentrons/legacy_commands/helpers.py,sha256=mOr7W0Qq-q8JBvLTBX7FOhU2DBsgS4z1mQhXCCkEsPg,3253
207
+ opentrons/legacy_commands/commands.py,sha256=8OtS9-_z8kotvByrVKtMaYnFiq8ZqDoTk6c-1Ne-iO0,13029
208
+ opentrons/legacy_commands/helpers.py,sha256=Bc7mjK6V7b4h472NCx_qSwD0ojd_DM7mPg18tjo1DIQ,5228
209
209
  opentrons/legacy_commands/module_commands.py,sha256=EO2YtrfzCCaGPYjGXWfk6jjSHiEqk1E6D8Ef2qDi1qI,7769
210
210
  opentrons/legacy_commands/protocol_commands.py,sha256=nPYBrm7j9co83IGWjzae2GOVkEZdu58pXQv3eOdpLzg,1383
211
211
  opentrons/legacy_commands/publisher.py,sha256=n7hT9n4zahM3N2LNIAEs7hqs5RbHHie_tev2M8pke4Y,5441
212
- opentrons/legacy_commands/types.py,sha256=1TynBINPQsiZoWAo4D6IdEEx58XCX31BL4ZXHgieFxs,24507
212
+ opentrons/legacy_commands/types.py,sha256=uMr5U8zDs6-2Da-2yQUao3zuOciaal7zB4xAwEgUE1Q,25649
213
213
  opentrons/motion_planning/__init__.py,sha256=Gma3SLAvKbL7QuhVGtL9zFx5vlk_7YBF0TjYZQSiv9s,755
214
214
  opentrons/motion_planning/adjacent_slots_getters.py,sha256=z7HkfC8ymAdGHdFq-sC_1_cERX_v29b9x4HKtJ6gp9I,5390
215
215
  opentrons/motion_planning/deck_conflict.py,sha256=gJG0dCQOvdEP-rr9EbVSGJCQPDXgvd04Jn4crGEbYLo,12604
@@ -228,42 +228,42 @@ opentrons/protocol_api/config.py,sha256=r9lyvXjagTX_g3q5FGURPpcz2IA9sSF7Oa_1mKx-
228
228
  opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau320_f-ASloR9eL1QCtkOh8,7612
229
229
  opentrons/protocol_api/deck.py,sha256=94vFceg1SC1bAGd7TvC1ZpYwnJR-VlzurEZ6jkacYeg,8910
230
230
  opentrons/protocol_api/disposal_locations.py,sha256=NRiSGmDR0LnbyEkWSOM-o64uR2fUoB1NWJG7Y7SsJSs,7920
231
- opentrons/protocol_api/instrument_context.py,sha256=ae_gLaPote11svliO-Y9QwPlbbvUwqW21l_5Mw0QVyY,115477
232
- opentrons/protocol_api/labware.py,sha256=q980jPZuBwvgwzIdBRyGn7bsJKiEPoAxO7y3iGPoczk,61406
231
+ opentrons/protocol_api/instrument_context.py,sha256=XUVIxnylpkhviFy5jxYJv-o7Lvmb2FJIbdoEjQ_9Vro,117886
232
+ opentrons/protocol_api/labware.py,sha256=1m1y7h70bBBqW60LjiCPQWwFfVXzY_goJrB773yUN0A,60407
233
233
  opentrons/protocol_api/module_contexts.py,sha256=3tVXj6Q7n-WuTJPU_dvIQLzzGv1P-jsMuDtMVpuhAf8,48291
234
234
  opentrons/protocol_api/module_validation_and_errors.py,sha256=XL_m72P8rcvGO2fynY7UzXLcpGuI6X4s0V6Xf735Iyc,1464
235
- opentrons/protocol_api/protocol_context.py,sha256=58qRTY9xqoAuagsfIHlu662vxOtPzk1XCUJtstCkDMU,66184
235
+ opentrons/protocol_api/protocol_context.py,sha256=CHMG5xbx_wxHDQYcobOWo2E9vsRw7FPSNy9J3YV99fM,66126
236
236
  opentrons/protocol_api/robot_context.py,sha256=hlxFOYx0SkqK7TihT25leYt-RJ_VvhDDzzclf1L8DKw,10405
237
237
  opentrons/protocol_api/validation.py,sha256=uiVTHyJF3wSh5LLfaIDBTELoMNCAT17E767ursB_s1g,28684
238
238
  opentrons/protocol_api/core/__init__.py,sha256=-g74o8OtBB0LmmOvwkRvPgrHt7fF7T8FRHDj-x_-Onk,736
239
239
  opentrons/protocol_api/core/common.py,sha256=q9ZbfpRdBvB3iDAOCyONtupvkYP5n1hjE-bwqGcwP_U,1172
240
240
  opentrons/protocol_api/core/core_map.py,sha256=gq3CIYPxuPvozf8yj8FprqBfs3e4ZJGQ6s0ViPbwV08,1757
241
- opentrons/protocol_api/core/instrument.py,sha256=0ubPoOsnA8ZBPVbxb2jfWj7XoFVtiOPgbThj0ODObcE,13455
241
+ opentrons/protocol_api/core/instrument.py,sha256=MQHI1_MkrtrKM9lN-7BsVQ-xNc4on39TRr8M3HB3WPY,13705
242
242
  opentrons/protocol_api/core/labware.py,sha256=-ZOjkalikXCV3ptehKCNaWGAdKxIdwne8LRFQW9NAm4,4290
243
243
  opentrons/protocol_api/core/module.py,sha256=z2STDyqqxZX3y6UyJVDnajeFXMEn1ie2NRBYHhry_XE,13838
244
244
  opentrons/protocol_api/core/protocol.py,sha256=v7v28jfeHSfOf-tqFDW2chGtrEatPiZ1y6YNwHfmtAs,9058
245
245
  opentrons/protocol_api/core/robot.py,sha256=QMAqj5Oqq3_IhTDyUF4jpWI4j2LRPP9crUiaYD_RUv4,1385
246
- opentrons/protocol_api/core/well.py,sha256=tvUh73NSgiUz5j4KFTwJjBzcWO3tdaf3ZAS1qK8krJE,3123
246
+ opentrons/protocol_api/core/well.py,sha256=PpnbiBxLa9ov5dF5QcV6H2pNRt30VwKS3h4Rsi9ogEc,3100
247
247
  opentrons/protocol_api/core/well_grid.py,sha256=BU28DKaBgEU_JdZ6pEzrwNxmuh6TkO4zlg7Pq1Rf5Xk,1516
248
248
  opentrons/protocol_api/core/engine/__init__.py,sha256=B_5T7zgkWDb1mXPg4NbT-wBkQaK-WVokMMnJRNu7xiM,582
249
249
  opentrons/protocol_api/core/engine/deck_conflict.py,sha256=q3JViIAHDthIqq6ce7h2gxw3CHRfYsm5kkwzuXB-Gnc,12334
250
250
  opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
251
- opentrons/protocol_api/core/engine/instrument.py,sha256=aXX_p08aGjqPT0RlqcS8K1BHHDxFuXrXejY-15uRci4,92666
251
+ opentrons/protocol_api/core/engine/instrument.py,sha256=qkoNv0KO_jQZffQDV4ixU2r-CkLIJl5IOz1dgs1G5V8,95869
252
252
  opentrons/protocol_api/core/engine/labware.py,sha256=1xvzguNnK7aecFLiJK0gtRrZ5kpwtzLS73HnKvdJ5lc,8413
253
253
  opentrons/protocol_api/core/engine/load_labware_params.py,sha256=I4Cb8rqpBhmykQuZE8QRG802APrdCy_TYS88rm_9oGA,7159
254
254
  opentrons/protocol_api/core/engine/module_core.py,sha256=MLPgYSRJHUZPZ9rTLvsg3GlpL5b6-Pjk5UBgXCGrL6U,30994
255
255
  opentrons/protocol_api/core/engine/overlap_versions.py,sha256=PyGvQtQUg1wzNtkuGZtxwXm019PoIjq7em2JiWaxbXc,675
256
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py,sha256=IxTcekperTA_Jv-fF6OonUif-jX5KESrdjf15oVD0GE,15360
256
+ opentrons/protocol_api/core/engine/pipette_movement_conflict.py,sha256=mMns5sKw3Qpfu3IJQf1q098zSdBSOKiHAaQshovZIh8,15225
257
257
  opentrons/protocol_api/core/engine/point_calculations.py,sha256=C2eF0fvJQGMqQv3DzNhc1-m8HTAXTyTsHPJEPrEUEmo,2502
258
258
  opentrons/protocol_api/core/engine/protocol.py,sha256=_1gdg4lq2B21LWV9Tqb924E39HCPCgozAHxaCRGDSIk,46759
259
259
  opentrons/protocol_api/core/engine/robot.py,sha256=o252HrC11tmZ5LRKT6NwXCoTeqcQFXHeNjszfxbJHjo,5366
260
260
  opentrons/protocol_api/core/engine/stringify.py,sha256=GwFgEhFMk-uPfFQhQG_2mkaf4cxaItiY8RW7rZwiooQ,2794
261
- opentrons/protocol_api/core/engine/transfer_components_executor.py,sha256=REPKWIgi62AjralChau1rIOWpgH6nrWPUFS5aJNgfqo,36955
261
+ opentrons/protocol_api/core/engine/transfer_components_executor.py,sha256=96SsftBRPB5WCeChLokXkdPJcmjP8FqlXEZXhNAlZKA,37582
262
262
  opentrons/protocol_api/core/engine/well.py,sha256=PEtDwdC8NkHjqasJaDaVDtzc_WFw-qv5Lf7IU1DkrLY,7570
263
263
  opentrons/protocol_api/core/legacy/__init__.py,sha256=_9jCJNKG3SlS_vljVu8HHkZmtLf4F-f-JHALLF5d5go,401
264
264
  opentrons/protocol_api/core/legacy/deck.py,sha256=qHqcGo-Kdkl9L1aOE0pwrm9tsAnwkXbt4rIOr_VEP-s,13955
265
265
  opentrons/protocol_api/core/legacy/labware_offset_provider.py,sha256=2DLIby9xmUrwLb2ht8hZbvNTxqPhNzWijd7yCb2cqP8,3783
266
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py,sha256=lap6L9kym_uanRjDiZx0X7r8dLvF5pJvtgOy6debXys,27134
266
+ opentrons/protocol_api/core/legacy/legacy_instrument_core.py,sha256=k-aM8Eu4qHqfhb8iRyn3jn3dZOGiq8JzQes8YUwY2v4,26501
267
267
  opentrons/protocol_api/core/legacy/legacy_labware_core.py,sha256=WQOgtMlq--zv0Ch7mmraYr9rQBT4ie2zHqwgamBq9J8,8606
268
268
  opentrons/protocol_api/core/legacy/legacy_module_core.py,sha256=tUhj88NKBMjCmCg6wjh1e2HX4d5hxjh8ZeJiYXaTaGY,23111
269
269
  opentrons/protocol_api/core/legacy/legacy_protocol_core.py,sha256=ZIFC7W6YA61oWWkq5xYGTcI_2S2pmALz16uB1R8HVyQ,23670
@@ -272,13 +272,13 @@ opentrons/protocol_api/core/legacy/load_info.py,sha256=r-WaH5ZJb3TRCp_zvbMMh0P4B
272
272
  opentrons/protocol_api/core/legacy/module_geometry.py,sha256=lvWFHZ81-JFw-1VZUW1R3yUIb59xpXT6H3jwlRintRo,21082
273
273
  opentrons/protocol_api/core/legacy/well_geometry.py,sha256=n5bEsvYZXXTAqYSAqlXd5t40bUPPrJ2Oj2frBZafQHA,4719
274
274
  opentrons/protocol_api/core/legacy_simulator/__init__.py,sha256=m9bLHGDJ6LSYC2WPm8tpOuu0zWSOPIrlybQgjRQBw9k,647
275
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py,sha256=5inA5v2fVymV6BQBjja_HfYVVNH8ta7tZEt2jwBX5TU,22641
275
+ opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py,sha256=pV-PEw8jMcdXMi2U5yplIkFJUUlugXd7OMJl_riiVf4,22940
276
276
  opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py,sha256=28HrrHzeUfnGKXpZqQ-VM8WbPiadqVhKj2S9y33q6Lo,2910
277
277
  opentrons/protocol_engine/__init__.py,sha256=UPSk7MbidkiSH_h4V3yxMvyTePKpRr5DM9-wfkJrlSo,4094
278
278
  opentrons/protocol_engine/create_protocol_engine.py,sha256=tfDIsC7_JKlRiCXPB_8tuxRsssU6o0ViRmWbGPtX9QA,7582
279
279
  opentrons/protocol_engine/engine_support.py,sha256=5wqk5CHudpOUCSNsalWRmBSeHaCT6bEmcYAn9P60L0w,923
280
280
  opentrons/protocol_engine/error_recovery_policy.py,sha256=ejsIywnz9DMv_XK-mo58PynW34sSDgnziPAw2g5m9G8,2873
281
- opentrons/protocol_engine/labware_offset_standardization.py,sha256=nXkqW6lVhWIc0CvA10SZVQNVRF6qPh1qpp1F_KbwMXo,6836
281
+ opentrons/protocol_engine/labware_offset_standardization.py,sha256=iqU-A2p6YK4XXMst2HWuM8ih-HnxN6BvqijOexw_BDw,7916
282
282
  opentrons/protocol_engine/plugins.py,sha256=pSEzpItf4RVO2NwoGSbDpmNtO0B0-G2W0g2sIzdyjkI,3449
283
283
  opentrons/protocol_engine/protocol_engine.py,sha256=lM7yfRuigE6Je4NwhR9-oKS4jzXPw8NSDXNugtKEdbk,28343
284
284
  opentrons/protocol_engine/slot_standardization.py,sha256=1YjzQSLHrVPeoTDDN9evu9kbJKCpQzLHT2-C3uINwoU,4004
@@ -290,34 +290,31 @@ opentrons/protocol_engine/actions/get_state_update.py,sha256=tsnfhZDFHWER6y6UV57
290
290
  opentrons/protocol_engine/clients/__init__.py,sha256=ILmfVL5SOkWzRpL2XXh0Q0MizOj7E2i-WObVuIsWAQE,161
291
291
  opentrons/protocol_engine/clients/sync_client.py,sha256=G5hik77cqRbM_jrHp-j0NN3ovVDXbs9yCJ8XW4MChZw,5745
292
292
  opentrons/protocol_engine/clients/transports.py,sha256=QejmtG5TjgOLUXpNhOzor_q-7MFI1qNfsguwkzY6Rxc,7177
293
- opentrons/protocol_engine/commands/__init__.py,sha256=dSwU-1M2Y4VKRDs2WPw3dAGaz1Zm6e0TitJEtn_rvII,17842
293
+ opentrons/protocol_engine/commands/__init__.py,sha256=b073p4seq9bnyqMydVrYl9b_yCASs7OI9QT_cO5KVSI,17854
294
294
  opentrons/protocol_engine/commands/air_gap_in_place.py,sha256=Z1Tz2wFtEnlJBf_0xW0tEvX1yYJbA8ZmdZcHG_YIKwE,5387
295
295
  opentrons/protocol_engine/commands/aspirate.py,sha256=ZxpwQ5Zq-AS11aNfgxx6PsL_MrBEaawAxAi7jWwpIRE,7920
296
296
  opentrons/protocol_engine/commands/aspirate_in_place.py,sha256=vJiLSZqEzuMj-kuQESZevHM5g9brXAo159GhaFyEQm8,6530
297
- opentrons/protocol_engine/commands/aspirate_while_tracking.py,sha256=e7zbGgdXebnMHCoWpAdlhB5fo2U7OrKF3ZR2dz4V1E0,8584
297
+ opentrons/protocol_engine/commands/aspirate_while_tracking.py,sha256=se1GIJWxxVCmvYQF_nhJK11D54KKeoN5Yne5Sti93-A,7224
298
298
  opentrons/protocol_engine/commands/blow_out.py,sha256=3gboq4x5S8fq7j4ZZGNClXFDlOjcdW1v2g58GPdhaPI,4338
299
299
  opentrons/protocol_engine/commands/blow_out_in_place.py,sha256=jm2XXyJfIP9-AAFwXhD59_13nX18-i6QqpLGb-lK7sI,3391
300
300
  opentrons/protocol_engine/commands/command.py,sha256=1hWH_KWg_WDL4R4VXe1ZH2vO6pYt5SA-ZpuPPF1oV5E,10149
301
- opentrons/protocol_engine/commands/command_unions.py,sha256=CzPSoGF4cFoxuOxS7-nX0rJ-dAkBfEKSmu7pwyVpgA4,26375
301
+ opentrons/protocol_engine/commands/command_unions.py,sha256=-jCoa27fy6SGFG1VBgjhScxyE7pvQprVZAlFuPPBNuU,26399
302
302
  opentrons/protocol_engine/commands/comment.py,sha256=-6o07x-MZ6-IvZas84OVFmqF0gAbbKWJZIlGVYThCqM,1638
303
303
  opentrons/protocol_engine/commands/configure_for_volume.py,sha256=Ntx0Qi55GtJ5Gm4ZMBCCxo4xWIgb1tHy4Sn1BRzPlKc,3612
304
304
  opentrons/protocol_engine/commands/configure_nozzle_layout.py,sha256=M_s5Ee03a7sSnbvkibDHzEqZwkca0y8J7F60EnSEq7A,3849
305
305
  opentrons/protocol_engine/commands/custom.py,sha256=vOJc7QSNnYTpLvJm98OfDKjgcvVFRZs1eEKEd9WkPN0,2157
306
306
  opentrons/protocol_engine/commands/dispense.py,sha256=gmjBXgGuWhB-SEUboXiNHqkaUrmpRTqSN4Dy362ln8w,6444
307
307
  opentrons/protocol_engine/commands/dispense_in_place.py,sha256=gcj0HXUkPrU3Qz_DbWzP3XZHuB8tXSMTo9CFoGi25lw,6263
308
- opentrons/protocol_engine/commands/dispense_while_tracking.py,sha256=VCLWwlAbaTr9K_dLl5KOC9rvoGBEwMPyIo_zfijfTgo,8432
308
+ opentrons/protocol_engine/commands/dispense_while_tracking.py,sha256=vn0nw5D4ggpTEwarConFPHUVI4gNShehs5v1U5Kn9sY,6644
309
309
  opentrons/protocol_engine/commands/drop_tip.py,sha256=ZZ63IoiT4dgWcemAHhNQfV4DUhkl-ToJyTRTxIiyAkc,7895
310
310
  opentrons/protocol_engine/commands/drop_tip_in_place.py,sha256=gwSNEKBwds7kOTucXKSK74ozrDe7Cqhta7NR6IqKV3g,7062
311
- opentrons/protocol_engine/commands/evotip_dispense.py,sha256=5OPrBmLMne1HiUzfkHJN5joZxiJAbkeZxbEsGPTtfVI,4636
312
- opentrons/protocol_engine/commands/evotip_seal_pipette.py,sha256=Xo5sYVd1zuvrKLyGbmZuhQNvpNBSDNlUNgjYCxs9R_8,11239
313
- opentrons/protocol_engine/commands/evotip_unseal_pipette.py,sha256=RXCo2opcKrFiR97hISNXfPGrHGj0eiPHwAZJMi0jY9w,4888
314
311
  opentrons/protocol_engine/commands/generate_command_schema.py,sha256=21Al_XQyRMNTb2ssVaxcNSPlgreOsCtKVXf8kZgpvR4,2296
315
312
  opentrons/protocol_engine/commands/get_next_tip.py,sha256=JS5hN_UScAiUIo_j7KT2cR1GDj3hDvaNPTSovWbgTHo,4828
316
313
  opentrons/protocol_engine/commands/get_tip_presence.py,sha256=vK80XN5qCzK44SOSxH3QJkIj9dPmvri4J4FZJeP1X08,2543
317
314
  opentrons/protocol_engine/commands/hash_command_params.py,sha256=obWy4TbVH97SyhNqrSD6iP1wgZ20JoaH1rilZCjXxIs,1530
318
315
  opentrons/protocol_engine/commands/home.py,sha256=g77hewv-puMxEHFy0PPnl8-Nkbb7K-2qk36HbWG_Nik,3326
319
- opentrons/protocol_engine/commands/labware_handling_common.py,sha256=HNiC6ZP1TyfiWcdp0puMyfq9cvC54vYYBKmkjy2dECs,800
320
- opentrons/protocol_engine/commands/liquid_probe.py,sha256=OJwVOfkMV4AnQ0nPQT3mi0GLUPtTnGIm9oalMyVYEkM,15743
316
+ opentrons/protocol_engine/commands/labware_handling_common.py,sha256=WtkdGIjQ5GBiBWsenyLyPLkSn6phgoesfWxCFTmG1AU,1074
317
+ opentrons/protocol_engine/commands/liquid_probe.py,sha256=XbpvkjvwesToLsYmzYUrf7vJ_-13wo-irmEfIMEB5SU,15701
321
318
  opentrons/protocol_engine/commands/load_labware.py,sha256=p02iOEbnYtq5gklOKTF2RNmYLVR4Ak7lnEUpSZjaHYc,8625
322
319
  opentrons/protocol_engine/commands/load_lid.py,sha256=8zRWBfdAQHSULLtjzYPEflkXC_rSSLZML9vJ4TJjxoQ,5484
323
320
  opentrons/protocol_engine/commands/load_lid_stack.py,sha256=WgSBr9bd4rRwv6yYztYuz-mIHMByPom6G0Vzo4znpAY,10572
@@ -330,17 +327,20 @@ opentrons/protocol_engine/commands/move_relative.py,sha256=EczlVmwUvQc-bPpcXMW-f
330
327
  opentrons/protocol_engine/commands/move_to_addressable_area.py,sha256=JtHftnSjbLpTJUrVP44D2kTUr8Bcq8Le4p1IziNFp3c,6453
331
328
  opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py,sha256=aVbxdVwCqhZxOn9ByAseqgaOl5TUd42bcyBMbuQu-8Q,7479
332
329
  opentrons/protocol_engine/commands/move_to_coordinates.py,sha256=2qZliN1ZLdgNDiGdaTafgKB2gxvHCpMbvX01kJ-kQuM,3179
333
- opentrons/protocol_engine/commands/move_to_well.py,sha256=fM8m5IcLjYZXy5fNjH_As4BK8wE7X_Xl_DQJaZZyIJk,3488
330
+ opentrons/protocol_engine/commands/move_to_well.py,sha256=m3GnX34Aimf7WCDjkxOMFF31kCyXVo_RqY-2S8H8Vp4,3418
334
331
  opentrons/protocol_engine/commands/movement_common.py,sha256=bnJuwcp6nkyoxkTXqfSXnnKgZ7TKflkMGZSHXuPWsRk,11950
335
332
  opentrons/protocol_engine/commands/pick_up_tip.py,sha256=pa2PXDvPyh5ZIYQeu_9XUnybE9CQ6VXooDO07gXCS5U,7726
336
333
  opentrons/protocol_engine/commands/pipetting_common.py,sha256=Rok3Fy3jwJj_irXVRnUSjzpRpKVzVbYCv7odRQAYWEY,15222
337
334
  opentrons/protocol_engine/commands/prepare_to_aspirate.py,sha256=0Xh0E0OEE2730zR-hhmp4y__MMKyJLZ0S8I68BTH83g,3776
335
+ opentrons/protocol_engine/commands/pressure_dispense.py,sha256=mGCJDFKwy6MPHg-AOttDg9TffHmp-eM_1y6x8CaErJE,4711
338
336
  opentrons/protocol_engine/commands/reload_labware.py,sha256=eB1X7M9rHso1qc0beBTVHm5SHbjS6IODsIDj9RhR3mI,2910
339
337
  opentrons/protocol_engine/commands/retract_axis.py,sha256=3h0eb6O3fjrCBY89q9tnjDFUGQXN9qafURxvXGcmCm4,2889
340
338
  opentrons/protocol_engine/commands/save_position.py,sha256=koxPh6t8s7Cl1vjPt9e6raZz5_rQtXsg_IGdWqAPzPI,3395
339
+ opentrons/protocol_engine/commands/seal_pipette_to_tip.py,sha256=Ggflnbe1nxzILxGARIqKbbs9clBAe124ZtovGoHvDcI,11423
341
340
  opentrons/protocol_engine/commands/set_rail_lights.py,sha256=QfB-NKw2ktBvSge1jOi9wYVLD19Vj6HiKw22Fsn0aSo,2090
342
341
  opentrons/protocol_engine/commands/set_status_bar.py,sha256=LJGFBteL8bD8tG8yMPQir93mWnGYlPy3er00THbp6kk,2834
343
342
  opentrons/protocol_engine/commands/touch_tip.py,sha256=620D8mXSKQdjXQonNVztz_ENOqjuHQd_oa-nHFiM2Ls,5713
343
+ opentrons/protocol_engine/commands/unseal_pipette_from_tip.py,sha256=EtLcgbfUiUeFS2vovDFQdTyTk7KIwJI4XcmGqpr28wA,4915
344
344
  opentrons/protocol_engine/commands/verify_tip_presence.py,sha256=UUwUWdlryfh-mU8IoHUZkoy67KxrqXTFygeu1bsavhc,3136
345
345
  opentrons/protocol_engine/commands/wait_for_duration.py,sha256=G-Lmo97BoqW8KA-cZDGQkqUmEE7lrLdw5j-2_LBF5gg,2396
346
346
  opentrons/protocol_engine/commands/wait_for_resume.py,sha256=IE_I7fqoKBrlBumaCp5Tm5ihyA6i5VAzG25xdVdRnVw,2372
@@ -418,7 +418,7 @@ opentrons/protocol_engine/execution/hardware_stopper.py,sha256=wlIl7U3gvnOiCvwri
418
418
  opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py,sha256=BSFLzSSeELAYZCrCUfJZx5DdlrwU06Ur92TYd0T-hzM,9084
419
419
  opentrons/protocol_engine/execution/labware_movement.py,sha256=XYVcxZOQ6_udpxcpwkIJpVD8-lgWLhizJAcRD9BclIo,12247
420
420
  opentrons/protocol_engine/execution/movement.py,sha256=AWcj7xlrOh3QrvoaH0sZO63yrPCEc7VE8hKfJNxxtP0,12527
421
- opentrons/protocol_engine/execution/pipetting.py,sha256=PSWU3c1woM4lPmMGktvq30a3BlhXtho9UrJv80e32ik,22043
421
+ opentrons/protocol_engine/execution/pipetting.py,sha256=0_OAxIDCQBAtdNOvdYwV0kEYfJvUrJWr-63rocqf75E,22094
422
422
  opentrons/protocol_engine/execution/queue_worker.py,sha256=riVVywKIOQ3Lx-woFuuSqqBtfeKFt23nCUnsk7gSVoI,2860
423
423
  opentrons/protocol_engine/execution/rail_lights.py,sha256=eiJT6oI_kFk7rFuFkZzISZiLNnpf7Kkh86Kyk9wQ_Jo,590
424
424
  opentrons/protocol_engine/execution/run_control.py,sha256=ksvI2zkguC4G3lR3HJgAF8uY1PNcaRfi7UOYu-oIZgo,1144
@@ -429,7 +429,7 @@ opentrons/protocol_engine/execution/tip_handler.py,sha256=DDlI-AwdasbwLjZpN6r76p
429
429
  opentrons/protocol_engine/notes/__init__.py,sha256=G0bIQswsov7MrJU0ArrOaWcOTxJU9BCUmNR3LRoNg-Q,311
430
430
  opentrons/protocol_engine/notes/notes.py,sha256=A5C9xHExlS9GAK7o_mYiKJgibBm6EEgHQ4PJor0IET0,1993
431
431
  opentrons/protocol_engine/resources/__init__.py,sha256=yvGFYpmLoxHYQff_IwiaEH9viZUfal5D5K91UjYLwwY,805
432
- opentrons/protocol_engine/resources/deck_configuration_provider.py,sha256=TDTTi-VE3wFiA9NF5422EQU5u4eT0lYb5ok-FdeqWdQ,9096
432
+ opentrons/protocol_engine/resources/deck_configuration_provider.py,sha256=sbUHVsoIPap_WpT-_k_1Gg0BTlyu026vRIW78ywztcc,9164
433
433
  opentrons/protocol_engine/resources/deck_data_provider.py,sha256=63c-Hmwy5IbVSoAL3hYoZxizxwzCqbB2KgJptpLX3Bc,3001
434
434
  opentrons/protocol_engine/resources/file_provider.py,sha256=6btMCDN7NsyFlV7Icy5vDO7xsgbmtkeAM_KCuQ-GvRo,5903
435
435
  opentrons/protocol_engine/resources/fixture_validation.py,sha256=WBGWFTmBwLPjOBFeqJYxnaSRHvo4pwxvdhT4XUW_FMY,1857
@@ -449,8 +449,8 @@ opentrons/protocol_engine/state/commands.py,sha256=aoON_C5DbiIEPxOGATvwCsSG9eHsF
449
449
  opentrons/protocol_engine/state/config.py,sha256=7jSGxC6Vqj1eA8fqZ2I3zjlxVXg8pxvcBYMztRIx9Mg,1515
450
450
  opentrons/protocol_engine/state/files.py,sha256=w8xxxg8HY0RqKKEGSfHWfrjV54Gb02O3dwtisJ-9j8E,1753
451
451
  opentrons/protocol_engine/state/fluid_stack.py,sha256=uwkf0qYk1UX5iU52xmk-e3yLPK8OG-TtMCcBqrkVFpM,5932
452
- opentrons/protocol_engine/state/frustum_helpers.py,sha256=ux9wCwQQXrZ9nr-KldtGTilpyW6zXdG5RfHUIUcqlTw,16822
453
- opentrons/protocol_engine/state/geometry.py,sha256=ptLGfIuFq9uGwxX3C9b8a8mYlS4RzAGhFXKgTpz6aJ4,94800
452
+ opentrons/protocol_engine/state/frustum_helpers.py,sha256=I_tVCqy-CgYBqBS7FVyDpxdz0AdDeKYyeTPmaZuUIqU,17342
453
+ opentrons/protocol_engine/state/geometry.py,sha256=_4buTI8kNjCogc4zKJwhCrvlB71yXrdcYqiwen-qkcA,97628
454
454
  opentrons/protocol_engine/state/labware.py,sha256=rehy7R1HIhxx3DTtTHIKxqHoBQJ_1tDhhiculMJeIy8,57556
455
455
  opentrons/protocol_engine/state/liquid_classes.py,sha256=u_z75UYdiFAKG0yB3mr1il4T3qaS0Sotq8sL7KLODP8,2990
456
456
  opentrons/protocol_engine/state/liquids.py,sha256=NoesktcQdJUjIVmet1uqqJPf-rzbo4SGemXwQC295W0,2338
@@ -460,8 +460,8 @@ opentrons/protocol_engine/state/pipettes.py,sha256=nqeJWn98S8wSDW-CPJnjEl5hEIkmh
460
460
  opentrons/protocol_engine/state/state.py,sha256=gHmXrlq17kx3sTbizq8gPoJQx_0nazxnooLODvrLY5k,15468
461
461
  opentrons/protocol_engine/state/state_summary.py,sha256=tu-xJYKbKzeLk9Z0RwSaz0tUs6blYuxSA5V2n7_zSGk,1180
462
462
  opentrons/protocol_engine/state/tips.py,sha256=XAFP7IpR-L9p6BKz4HWcAnRxXO4FHXrK5pIR_9eshfE,20145
463
- opentrons/protocol_engine/state/update_types.py,sha256=E2TMTSJfrLzE0KLHKHPiGMLwEJDjQbtQEBhzaF4M52M,27210
464
- opentrons/protocol_engine/state/wells.py,sha256=Tp1JRfldgChrx7aSthjbHNrcmpoW5XRcso7BGSQ84pg,10970
463
+ opentrons/protocol_engine/state/update_types.py,sha256=2PUsBE50y2PRhLosooESyLXkVTWyaM0-8Su1JD-_Hfg,27148
464
+ opentrons/protocol_engine/state/wells.py,sha256=rCFiyS8EOgvmsrFr2pHU3SY79ZRkZg_nhFfoH1pMjb0,10996
465
465
  opentrons/protocol_engine/state/module_substates/__init__.py,sha256=7OIzc7Zzm-7WRys6M90ZzJ7BZhivuZ1BHJ35TdOPasE,1377
466
466
  opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py,sha256=jiD8WqFEafGnka5n46vJ_qhS8Ofh--hTxuBWXk8eefE,1431
467
467
  opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py,sha256=gJ5arNHyHR-DeNwsxLhVd3sq7oJTI8moFeyP7a38kVQ,2517
@@ -470,7 +470,7 @@ opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py,sha2
470
470
  opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py,sha256=IJ5zpufz5WSRbJqHOAi-WroDxpsRZz-GvwznIL4v7VQ,2468
471
471
  opentrons/protocol_engine/state/module_substates/temperature_module_substate.py,sha256=w9h6EBM1YY8SeUOlUz5-nW1Zoyce8-zua8Z6mX4sDNg,2310
472
472
  opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py,sha256=fLt2jMsbnfe8Q25vAjloxLBGdx8sotqM34VxbwfegpE,5167
473
- opentrons/protocol_engine/types/__init__.py,sha256=KB2Sc0rtxy-c_rYmAIYETGGvOhEXLC8FV5NOD45phYk,7844
473
+ opentrons/protocol_engine/types/__init__.py,sha256=KUKrF0jBWlY2BUsCNnu_9OdMYu51YDpfKaUWBAJZtzE,7994
474
474
  opentrons/protocol_engine/types/automatic_tip_selection.py,sha256=I_B3iWei1Sl7F7IrMKqOn4S12heZXRnfKvtCTUXIMyM,1118
475
475
  opentrons/protocol_engine/types/command_annotations.py,sha256=5A4k_R_4A2_nGl0K85SKwNlnKA09fUhEIe_mdU55yro,1843
476
476
  opentrons/protocol_engine/types/deck_configuration.py,sha256=O5zO6sX0iGsrWvBxuR3JnxjtAH-gSMImcy1krP4B360,2047
@@ -492,7 +492,7 @@ opentrons/protocol_engine/types/partial_tip_configuration.py,sha256=4RMtHOAX-dgp
492
492
  opentrons/protocol_engine/types/run_time_parameters.py,sha256=5gH4GmGK7e3OkSClftZT6VA4wXELIvEMgpmQ__waceU,4468
493
493
  opentrons/protocol_engine/types/tip.py,sha256=qfjnCPG7RAlTGS80SAQB8rGwtFW3yRWYj7DpYy0oDow,389
494
494
  opentrons/protocol_engine/types/util.py,sha256=n94IDny6jeeIO1mCkMNgrB5G5aRYDaOvzbohYYFN-es,356
495
- opentrons/protocol_engine/types/well_position.py,sha256=KW8FldSbpUnhz3CJKmLtiTDJQApsHJidgoleum0Uwok,2986
495
+ opentrons/protocol_engine/types/well_position.py,sha256=bktvL-DGwtP0GbgPNbpsBfMhFj49sE00JTc9KCUesTw,3318
496
496
  opentrons/protocol_reader/__init__.py,sha256=BGQOig6EgY-3eeLkxmVeZ9VhqOt4QUiG_rQJwiuW8uY,959
497
497
  opentrons/protocol_reader/extract_labware_definitions.py,sha256=CiVqKDuNEmoh6UILsTGUAFCvSXNVbop2fXX97XY6ykc,2649
498
498
  opentrons/protocol_reader/file_format_validator.py,sha256=i5CNnQQsE8bnAF3FsOjjYrSdNNbmVjwHicLBsC6UbNQ,6570
@@ -516,7 +516,7 @@ opentrons/protocol_runner/run_orchestrator.py,sha256=iQPhdZERs_w6C-uGXPYszOHn2UP
516
516
  opentrons/protocol_runner/task_queue.py,sha256=YH8_lvuLBYjfzXAOJU8DYXizQcbaxGmUiAPmd7kHERw,2581
517
517
  opentrons/protocols/__init__.py,sha256=cOUxilkIvdlqGvN4nYJQYr0TGdIWnzxBaTfoz3svmw8,245
518
518
  opentrons/protocols/bundle.py,sha256=QW_2kwnxgdG_nNPl2e110A5ehOH9Ej63-9TBx-F9Yvw,3666
519
- opentrons/protocols/labware.py,sha256=NxDRsBtLVgAxLv93zTwfD7_df6SzConXjm2KFbPWYrQ,10715
519
+ opentrons/protocols/labware.py,sha256=PZhbLCGuPKU-MKLz8VdmryaeAqEqol34MyE528bke8A,10965
520
520
  opentrons/protocols/parse.py,sha256=viQxA4NiERPmZeHQaujq1CheiUop2oWkoPC8p7V_XqQ,27488
521
521
  opentrons/protocols/types.py,sha256=XttBJsVGx5hd__PK7OJzMepdlcRaQmno3-yZ0hUJNME,6045
522
522
  opentrons/protocols/advanced_control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -525,7 +525,7 @@ opentrons/protocols/advanced_control/mix.py,sha256=GobQ9E6F2gARjfhNp2xdyWQXFBSwO
525
525
  opentrons/protocols/advanced_control/transfers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
526
526
  opentrons/protocols/advanced_control/transfers/common.py,sha256=TO1XK07OWo4l3Bm3J0TrLepXQqUPLK9jdH2FeqFdc34,3743
527
527
  opentrons/protocols/advanced_control/transfers/transfer.py,sha256=-vE1uZq2BqAagSGeiuTxTyL1wT6fza_fwkO_V_OMMFc,37318
528
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py,sha256=UdCFJ4ZzuKFYvSuA5R2uSAGmb_mJxyKw2u4TXymH2Zg,9251
528
+ opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py,sha256=EMOOPNj2PkI0xCZ3TicKgzjdMvoDvl9stHcz1Eyz95g,9237
529
529
  opentrons/protocols/api_support/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
530
530
  opentrons/protocols/api_support/constants.py,sha256=pI_zJ8oORr6FUOaF508ttll3KOIYqRRgcwVFwnqZuqc,262
531
531
  opentrons/protocols/api_support/deck_type.py,sha256=cBxm-IQqFyL1QtYTMGtLXOlyuh-67xWgnJSP6rkg8oc,3942
@@ -580,11 +580,12 @@ opentrons/util/entrypoint_util.py,sha256=C0KN-09_WgNkqLbCyIB3yVm-kJoe7RGrZTb7qh9
580
580
  opentrons/util/get_union_elements.py,sha256=H1KqLnG1zYvI2kanhc3MXRZT-S07E5a2vF1jEkhXpCs,1073
581
581
  opentrons/util/helpers.py,sha256=3hr801bWGbxEcOFAS7f-iOhmnUhoK5qahbB8SIvaCfY,165
582
582
  opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
583
- opentrons/util/logging_config.py,sha256=UHoY7dyD6WMYNP5GKowbMxUSG_hlXeI5TaIwksR5u-U,6887
583
+ opentrons/util/logging_config.py,sha256=7et4YYuQdWdq_e50U-8vFS_QyNBRgdnqPGAQJm8qrIo,9954
584
+ opentrons/util/logging_queue_handler.py,sha256=ZsSJwy-oV8DXwpYiZisQ1PbYwmK2cOslD46AcyJ1E4I,2484
584
585
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
585
- opentrons-8.4.0a3.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
586
- opentrons-8.4.0a3.dist-info/METADATA,sha256=CZoqSSIORoNQWj0ebai61XeELxufiPTpZOHmgyVDA30,5084
587
- opentrons-8.4.0a3.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
588
- opentrons-8.4.0a3.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
589
- opentrons-8.4.0a3.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
590
- opentrons-8.4.0a3.dist-info/RECORD,,
586
+ opentrons-8.4.0a5.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
587
+ opentrons-8.4.0a5.dist-info/METADATA,sha256=dVv_Zex7NX_Yf6tBwmhxcaTUWKOKDvYAmuqkq99qwEU,5084
588
+ opentrons-8.4.0a5.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
589
+ opentrons-8.4.0a5.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
590
+ opentrons-8.4.0a5.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
591
+ opentrons-8.4.0a5.dist-info/RECORD,,