diff --git a/.eslintrc.js b/.eslintrc.js index aee75238df0..ec5e3e3536c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -180,6 +180,8 @@ module.exports = { files: ['./protocol-designer/src/**/*.@(ts|tsx)'], rules: { 'opentrons/no-imports-up-the-tree-of-life': 'warn', + 'opentrons/no-margins-in-css': 'warn', + 'opentrons/no-margins-inline': 'warn', }, }, // apply application structure import requirements to app @@ -187,6 +189,23 @@ module.exports = { files: ['./app/src/**/*.@(ts|tsx)'], rules: { 'opentrons/no-imports-across-applications': 'error', + 'opentrons/no-margins-in-css': 'warn', + 'opentrons/no-margins-inline': 'warn', + }, + }, + { + files: ['./opentrons-ai-client/src/**/*.@(ts|tsx)'], + rules: { + 'opentrons/no-imports-up-the-tree-of-life': 'warn', + 'opentrons/no-margins-in-css': 'warn', + 'opentrons/no-margins-inline': 'warn', + }, + }, + { + files: ['./components/src/**/*.@(ts|tsx)'], + rules: { + 'opentrons/no-margins-in-css': 'warn', + 'opentrons/no-margins-inline': 'warn', }, }, ], diff --git a/abr-testing/Pipfile.lock b/abr-testing/Pipfile.lock index a1b677f52bb..a2f82b44925 100644 --- a/abr-testing/Pipfile.lock +++ b/abr-testing/Pipfile.lock @@ -22,108 +22,93 @@ }, "aiohappyeyeballs": { "hashes": [ - "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586", - "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572" + "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745", + "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8" ], "markers": "python_version >= '3.8'", - "version": "==2.4.3" + "version": "==2.4.4" }, "aiohttp": { "hashes": [ - "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", - "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c", - "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24", - "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480", - "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2", - "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5", - "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", - "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", - "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", - "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871", - "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486", - "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9", - "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d", - "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb", - "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68", - "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1", - "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d", - "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd", - "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1", - "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8", - "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7", - "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959", - "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7", - "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42", - "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79", - "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38", - "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", - "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8", - "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8", - "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151", - "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6", - "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e", - "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", - "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce", - "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b", - "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8", - "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", - "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", - "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a", - "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7", - "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc", - "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab", - "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b", - "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911", - "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9", - "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572", - "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554", - "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d", - "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257", - "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", - "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b", - "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", - "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090", - "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6", - "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc", - "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142", - "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", - "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", - "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", - "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e", - "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94", - "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026", - "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb", - "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28", - "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", - "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3", - "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f", - "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983", - "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", - "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f", - "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa", - "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c", - "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2", - "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb", - "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67", - "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762", - "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a", - "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8", - "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a", - "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a", - "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc", - "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91", - "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23", - "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527", - "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", - "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c", - "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7", - "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f", - "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a", - "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092", - "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414" + "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", + "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", + "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", + "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", + "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", + "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", + "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", + "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", + "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", + "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", + "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", + "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", + "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", + "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", + "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", + "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", + "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", + "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", + "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", + "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", + "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", + "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", + "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", + "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", + "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", + "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", + "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", + "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", + "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", + "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", + "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", + "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", + "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", + "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", + "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", + "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", + "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", + "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", + "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", + "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", + "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", + "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", + "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", + "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", + "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", + "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", + "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", + "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", + "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", + "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", + "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", + "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", + "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", + "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", + "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", + "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", + "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", + "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", + "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", + "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", + "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", + "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", + "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", + "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", + "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", + "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", + "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", + "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", + "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", + "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", + "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", + "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", + "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", + "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", + "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", + "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" ], - "markers": "python_version >= '3.8'", - "version": "==3.10.10" + "markers": "python_version >= '3.9'", + "version": "==3.11.10" }, "aionotify": { "hashes": [ @@ -141,6 +126,14 @@ "markers": "python_version >= '3.7'", "version": "==1.3.1" }, + "annotated-types": { + "hashes": [ + "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", + "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" + ], + "markers": "python_version >= '3.8'", + "version": "==0.7.0" + }, "anyio": { "hashes": [ "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", @@ -151,11 +144,11 @@ }, "async-timeout": { "hashes": [ - "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", - "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028" + "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", + "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3" ], - "markers": "python_version < '3.11'", - "version": "==4.0.3" + "markers": "python_version >= '3.8'", + "version": "==5.0.1" }, "attrs": { "hashes": [ @@ -167,36 +160,34 @@ }, "bcrypt": { "hashes": [ - "sha256:096a15d26ed6ce37a14c1ac1e48119660f21b24cba457f160a4b830f3fe6b5cb", - "sha256:0da52759f7f30e83f1e30a888d9163a81353ef224d82dc58eb5bb52efcabc399", - "sha256:1bb429fedbe0249465cdd85a58e8376f31bb315e484f16e68ca4c786dcc04291", - "sha256:1d84cf6d877918620b687b8fd1bf7781d11e8a0998f576c7aa939776b512b98d", - "sha256:1ee38e858bf5d0287c39b7a1fc59eec64bbf880c7d504d3a06a96c16e14058e7", - "sha256:1ff39b78a52cf03fdf902635e4c81e544714861ba3f0efc56558979dd4f09170", - "sha256:27fe0f57bb5573104b5a6de5e4153c60814c711b29364c10a75a54bb6d7ff48d", - "sha256:3413bd60460f76097ee2e0a493ccebe4a7601918219c02f503984f0a7ee0aebe", - "sha256:3698393a1b1f1fd5714524193849d0c6d524d33523acca37cd28f02899285060", - "sha256:373db9abe198e8e2c70d12b479464e0d5092cc122b20ec504097b5f2297ed184", - "sha256:39e1d30c7233cfc54f5c3f2c825156fe044efdd3e0b9d309512cc514a263ec2a", - "sha256:3bbbfb2734f0e4f37c5136130405332640a1e46e6b23e000eeff2ba8d005da68", - "sha256:3d3a6d28cb2305b43feac298774b997e372e56c7c7afd90a12b3dc49b189151c", - "sha256:5a1e8aa9b28ae28020a3ac4b053117fb51c57a010b9f969603ed885f23841458", - "sha256:61ed14326ee023917ecd093ee6ef422a72f3aec6f07e21ea5f10622b735538a9", - "sha256:655ea221910bcac76ea08aaa76df427ef8625f92e55a8ee44fbf7753dbabb328", - "sha256:762a2c5fb35f89606a9fde5e51392dad0cd1ab7ae64149a8b935fe8d79dd5ed7", - "sha256:77800b7147c9dc905db1cba26abe31e504d8247ac73580b4aa179f98e6608f34", - "sha256:8ac68872c82f1add6a20bd489870c71b00ebacd2e9134a8aa3f98a0052ab4b0e", - "sha256:8d7bb9c42801035e61c109c345a28ed7e84426ae4865511eb82e913df18f58c2", - "sha256:8f6ede91359e5df88d1f5c1ef47428a4420136f3ce97763e31b86dd8280fbdf5", - "sha256:9c1c4ad86351339c5f320ca372dfba6cb6beb25e8efc659bedd918d921956bae", - "sha256:c02d944ca89d9b1922ceb8a46460dd17df1ba37ab66feac4870f6862a1533c00", - "sha256:c52aac18ea1f4a4f65963ea4f9530c306b56ccd0c6f8c8da0c06976e34a6e841", - "sha256:cb2a8ec2bc07d3553ccebf0746bbf3d19426d1c6d1adbd4fa48925f66af7b9e8", - "sha256:cf69eaf5185fd58f268f805b505ce31f9b9fc2d64b376642164e9244540c1221", - "sha256:f4f4acf526fcd1c34e7ce851147deedd4e26e6402369304220250598b26448db" + "sha256:041fa0155c9004eb98a232d54da05c0b41d4b8e66b6fc3cb71b4b3f6144ba837", + "sha256:04e56e3fe8308a88b77e0afd20bec516f74aecf391cdd6e374f15cbed32783d6", + "sha256:1340411a0894b7d3ef562fb233e4b6ed58add185228650942bdc885362f32c17", + "sha256:533e7f3bcf2f07caee7ad98124fab7499cb3333ba2274f7a36cf1daee7409d99", + "sha256:6765386e3ab87f569b276988742039baab087b2cdb01e809d74e74503c2faafe", + "sha256:687cf30e6681eeda39548a93ce9bfbb300e48b4d445a43db4298d2474d2a1e54", + "sha256:76132c176a6d9953cdc83c296aeaed65e1a708485fd55abf163e0d9f8f16ce0e", + "sha256:76d3e352b32f4eeb34703370e370997065d28a561e4a18afe4fef07249cb4396", + "sha256:807261df60a8b1ccd13e6599c779014a362ae4e795f5c59747f60208daddd96d", + "sha256:89df2aea2c43be1e1fa066df5f86c8ce822ab70a30e4c210968669565c0f4685", + "sha256:8ad2f4528cbf0febe80e5a3a57d7a74e6635e41af1ea5675282a33d769fba413", + "sha256:8c458cd103e6c5d1d85cf600e546a639f234964d0228909d8f8dbeebff82d526", + "sha256:8dbd0747208912b1e4ce730c6725cb56c07ac734b3629b60d4398f082ea718ad", + "sha256:909faa1027900f2252a9ca5dfebd25fc0ef1417943824783d1c8418dd7d6df4a", + "sha256:aaa2e285be097050dba798d537b6efd9b698aa88eef52ec98d23dcd6d7cf6fea", + "sha256:adadd36274510a01f33e6dc08f5824b97c9580583bd4487c564fc4617b328005", + "sha256:b1ee315739bc8387aa36ff127afc99120ee452924e0df517a8f3e4c0187a0f5f", + "sha256:b588af02b89d9fad33e5f98f7838bf590d6d692df7153647724a7f20c186f6bf", + "sha256:b7703ede632dc945ed1172d6f24e9f30f27b1b1a067f32f68bf169c5f08d0425", + "sha256:c6f5fa3775966cca251848d4d5393ab016b3afed251163c1436fefdec3b02c84", + "sha256:cde78d385d5e93ece5479a0a87f73cd6fa26b171c786a884f955e165032b262c", + "sha256:cfdf3d7530c790432046c40cda41dfee8c83e29482e6a604f8930b9930e94139", + "sha256:e158009a54c4c8bc91d5e0da80920d048f918c61a581f0a63e4e93bb556d362f", + "sha256:e84e0e6f8e40a242b11bce56c313edc2be121cec3e0ec2d76fce01f6af33c07c", + "sha256:f85b1ffa09240c89aa2e1ae9f3b1c687104f7b2b9d2098da4e923f1b7082d331" ], "markers": "python_version >= '3.7'", - "version": "==4.2.0" + "version": "==4.2.1" }, "cachetools": { "hashes": [ @@ -284,7 +275,7 @@ "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" ], - "markers": "platform_python_implementation != 'PyPy'", + "markers": "python_version >= '3.8'", "version": "==1.17.1" }, "charset-normalizer": { @@ -406,53 +397,45 @@ "markers": "python_version >= '3.7'", "version": "==8.1.7" }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "platform_system == 'Windows'", - "version": "==0.4.6" - }, "cryptography": { "hashes": [ - "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362", - "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", - "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa", - "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83", - "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff", - "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", - "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6", - "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664", - "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08", - "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e", - "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18", - "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f", - "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73", - "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", - "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984", - "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd", - "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3", - "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e", - "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", - "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2", - "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c", - "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995", - "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", - "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", - "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7", - "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd", - "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7" - ], - "markers": "python_version >= '3.7'", - "version": "==43.0.3" + "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", + "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731", + "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", + "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", + "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", + "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c", + "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", + "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", + "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", + "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", + "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", + "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c", + "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", + "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", + "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", + "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", + "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa", + "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", + "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", + "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", + "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", + "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", + "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", + "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", + "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", + "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756", + "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4" + ], + "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", + "version": "==44.0.0" }, "exceptiongroup": { "hashes": [ "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc" ], - "markers": "python_version < '3.11'", + "markers": "python_version >= '3.7'", "version": "==1.2.2" }, "frozenlist": { @@ -555,20 +538,20 @@ }, "google-api-core": { "hashes": [ - "sha256:26f8d76b96477db42b55fd02a33aae4a42ec8b86b98b94969b7333a2c828bf35", - "sha256:a6652b6bd51303902494998626653671703c420f6f4c88cfd3f50ed723e9d021" + "sha256:10d82ac0fca69c82a25b3efdeefccf6f28e02ebb97925a8cce8edbfe379929d9", + "sha256:e255640547a597a4da010876d333208ddac417d60add22b6851a0c66a831fcaf" ], "markers": "python_version >= '3.7'", - "version": "==2.22.0" + "version": "==2.24.0" }, "google-api-python-client": { "hashes": [ - "sha256:4427b2f47cd88b0355d540c2c52215f68c337f3bc9d6aae1ceeae4525977504c", - "sha256:a9d26d630810ed4631aea21d1de3e42072f98240aaf184a8a1a874a371115034" + "sha256:1b420062e03bfcaa1c79e2e00a612d29a6a934151ceb3d272fe150a656dc8f17", + "sha256:a521bbbb2ec0ba9d6f307cdd64ed6e21eeac372d1bd7493a4ab5022941f784ad" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2.151.0" + "version": "==2.154.0" }, "google-auth": { "hashes": [ @@ -595,11 +578,11 @@ }, "googleapis-common-protos": { "hashes": [ - "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63", - "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0" + "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c", + "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed" ], "markers": "python_version >= '3.7'", - "version": "==1.65.0" + "version": "==1.66.0" }, "gspread": { "hashes": [ @@ -633,11 +616,81 @@ }, "jsonschema": { "hashes": [ - "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d", - "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6" + "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", + "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566" ], - "markers": "python_version >= '3.7'", - "version": "==4.17.3" + "markers": "python_version >= '3.8'", + "version": "==4.23.0" + }, + "jsonschema-specifications": { + "hashes": [ + "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", + "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + ], + "markers": "python_version >= '3.9'", + "version": "==2024.10.1" + }, + "msgpack": { + "hashes": [ + "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982", + "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3", + "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40", + "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee", + "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693", + "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950", + "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151", + "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24", + "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305", + "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b", + "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c", + "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659", + "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d", + "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18", + "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746", + "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868", + "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2", + "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba", + "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228", + "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2", + "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273", + "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c", + "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653", + "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a", + "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596", + "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd", + "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8", + "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa", + "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85", + "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc", + "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836", + "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3", + "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58", + "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128", + "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db", + "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f", + "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77", + "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad", + "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13", + "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8", + "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b", + "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a", + "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543", + "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b", + "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce", + "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d", + "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a", + "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c", + "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f", + "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e", + "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011", + "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04", + "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480", + "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a", + "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d", + "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.8" }, "multidict": { "hashes": [ @@ -776,7 +829,7 @@ "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" ], - "markers": "python_version < '3.11'", + "markers": "python_version >= '3.9'", "version": "==1.26.4" }, "oauth2client": { @@ -817,11 +870,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pandas": { "hashes": [ @@ -874,12 +927,12 @@ }, "pandas-stubs": { "hashes": [ - "sha256:3a6f8f142105a42550be677ba741ba532621f4e0acad2155c0e7b2450f114cfa", - "sha256:d4ab618253f0acf78a5d0d2bfd6dffdd92d91a56a69bdc8144e5a5c6d25be3b5" + "sha256:74aa79c167af374fe97068acc90776c0ebec5266a6e5c69fe11e9c2cf51f2267", + "sha256:cf819383c6d9ae7d4dabf34cd47e1e45525bb2f312e6ad2939c2c204cb708acd" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.2.3.241009" + "version": "==2.2.3.241126" }, "paramiko": { "hashes": [ @@ -900,107 +953,91 @@ }, "propcache": { "hashes": [ - "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9", - "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763", - "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325", - "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb", - "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b", - "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09", - "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957", - "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68", - "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f", - "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798", - "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418", - "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6", - "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162", - "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f", - "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", - "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8", - "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2", - "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110", - "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23", - "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8", - "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638", - "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a", - "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44", - "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2", - "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2", - "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850", - "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136", - "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b", - "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887", - "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89", - "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87", - "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", - "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4", - "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861", - "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e", - "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c", - "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b", - "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb", - "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1", - "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de", - "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354", - "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563", - "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5", - "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf", - "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9", - "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12", - "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4", - "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", - "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71", - "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9", - "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed", - "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336", - "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90", - "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063", - "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad", - "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6", - "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8", - "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e", - "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2", - "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7", - "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d", - "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d", - "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df", - "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b", - "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178", - "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2", - "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630", - "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48", - "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61", - "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89", - "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb", - "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", - "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6", - "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562", - "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b", - "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58", - "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db", - "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99", - "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37", - "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83", - "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a", - "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d", - "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04", - "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70", - "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544", - "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394", - "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea", - "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7", - "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1", - "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793", - "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577", - "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7", - "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57", - "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d", - "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032", - "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d", - "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016", - "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504" + "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4", + "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4", + "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a", + "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f", + "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9", + "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d", + "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e", + "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6", + "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf", + "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034", + "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d", + "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16", + "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30", + "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba", + "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95", + "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d", + "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae", + "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348", + "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2", + "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64", + "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce", + "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54", + "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629", + "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54", + "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1", + "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b", + "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf", + "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b", + "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587", + "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097", + "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea", + "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24", + "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7", + "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541", + "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6", + "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634", + "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3", + "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d", + "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034", + "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465", + "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2", + "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf", + "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1", + "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04", + "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5", + "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583", + "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb", + "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b", + "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c", + "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958", + "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc", + "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4", + "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82", + "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e", + "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce", + "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9", + "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518", + "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536", + "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505", + "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052", + "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff", + "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1", + "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f", + "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681", + "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347", + "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af", + "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246", + "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787", + "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0", + "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f", + "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439", + "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3", + "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6", + "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca", + "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec", + "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d", + "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3", + "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16", + "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717", + "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6", + "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd", + "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212" ], - "markers": "python_version >= '3.8'", - "version": "==0.2.0" + "markers": "python_version >= '3.9'", + "version": "==0.2.1" }, "proto-plus": { "hashes": [ @@ -1012,20 +1049,20 @@ }, "protobuf": { "hashes": [ - "sha256:0c4eec6f987338617072592b97943fdbe30d019c56126493111cf24344c1cc24", - "sha256:135658402f71bbd49500322c0f736145731b16fc79dc8f367ab544a17eab4535", - "sha256:27b246b3723692bf1068d5734ddaf2fccc2cdd6e0c9b47fe099244d80200593b", - "sha256:3e6101d095dfd119513cde7259aa703d16c6bbdfae2554dfe5cfdbe94e32d548", - "sha256:3fa2de6b8b29d12c61911505d893afe7320ce7ccba4df913e2971461fa36d584", - "sha256:64badbc49180a5e401f373f9ce7ab1d18b63f7dd4a9cdc43c92b9f0b481cef7b", - "sha256:70585a70fc2dd4818c51287ceef5bdba6387f88a578c86d47bb34669b5552c36", - "sha256:712319fbdddb46f21abb66cd33cb9e491a5763b2febd8f228251add221981135", - "sha256:91fba8f445723fcf400fdbe9ca796b19d3b1242cd873907979b9ed71e4afe868", - "sha256:a3f6857551e53ce35e60b403b8a27b0295f7d6eb63d10484f12bc6879c715687", - "sha256:cee1757663fa32a1ee673434fcf3bf24dd54763c79690201208bafec62f19eed" + "sha256:012ce28d862ff417fd629285aca5d9772807f15ceb1a0dbd15b88f58c776c98c", + "sha256:027fbcc48cea65a6b17028510fdd054147057fa78f4772eb547b9274e5219331", + "sha256:1fc55267f086dd4050d18ef839d7bd69300d0d08c2a53ca7df3920cc271a3c34", + "sha256:22c1f539024241ee545cbcb00ee160ad1877975690b16656ff87dde107b5f110", + "sha256:32600ddb9c2a53dedc25b8581ea0f1fd8ea04956373c0c07577ce58d312522e0", + "sha256:50879eb0eb1246e3a5eabbbe566b44b10348939b7cc1b267567e8c3d07213853", + "sha256:5a41deccfa5e745cef5c65a560c76ec0ed8e70908a67cc8f4da5fce588b50d57", + "sha256:683be02ca21a6ffe80db6dd02c0b5b2892322c59ca57fd6c872d652cb80549cb", + "sha256:8ee1461b3af56145aca2800e6a3e2f928108c749ba8feccc6f5dd0062c410c0d", + "sha256:b5ba1d0e4c8a40ae0496d0e2ecfdbb82e1776928a205106d14ad6985a09ec155", + "sha256:d473655e29c0c4bbf8b69e9a8fb54645bc289dead6d753b952e7aa660254ae18" ], "markers": "python_version >= '3.8'", - "version": "==5.28.3" + "version": "==5.29.1" }, "pyasn1": { "hashes": [ @@ -1053,52 +1090,125 @@ }, "pydantic": { "hashes": [ - "sha256:0399094464ae7f28482de22383e667625e38e1516d6b213176df1acdd0c477ea", - "sha256:076c49e24b73d346c45f9282d00dbfc16eef7ae27c970583d499f11110d9e5b0", - "sha256:07d00ca5ef0de65dd274005433ce2bb623730271d495a7d190a91c19c5679d34", - "sha256:0890fbd7fec9e151c7512941243d830b2d6076d5df159a2030952d480ab80a4e", - "sha256:0bfb5b378b78229119d66ced6adac2e933c67a0aa1d0a7adffbe432f3ec14ce4", - "sha256:0d32227ea9a3bf537a2273fd2fdb6d64ab4d9b83acd9e4e09310a777baaabb98", - "sha256:11965f421f7eb026439d4eb7464e9182fe6d69c3d4d416e464a4485d1ba61ab6", - "sha256:1fc8cc264afaf47ae6a9bcbd36c018d0c6b89293835d7fb0e5e1a95898062d59", - "sha256:2206a1752d9fac011e95ca83926a269fb0ef5536f7e053966d058316e24d929f", - "sha256:22a1794e01591884741be56c6fba157c4e99dcc9244beb5a87bd4aa54b84ea8b", - "sha256:4739c206bfb6bb2bdc78dcd40bfcebb2361add4ceac6d170e741bb914e9eff0f", - "sha256:4a5d5b877c7d3d9e17399571a8ab042081d22fe6904416a8b20f8af5909e6c8f", - "sha256:566bebdbe6bc0ac593fa0f67d62febbad9f8be5433f686dc56401ba4aab034e3", - "sha256:570ad0aeaf98b5e33ff41af75aba2ef6604ee25ce0431ecd734a28e74a208555", - "sha256:573254d844f3e64093f72fcd922561d9c5696821ff0900a0db989d8c06ab0c25", - "sha256:5d4320510682d5a6c88766b2a286d03b87bd3562bf8d78c73d63bab04b21e7b4", - "sha256:6d8a38a44bb6a15810084316ed69c854a7c06e0c99c5429f1d664ad52cec353c", - "sha256:6eb56074b11a696e0b66c7181da682e88c00e5cebe6570af8013fcae5e63e186", - "sha256:7e66aa0fa7f8aa9d0a620361834f6eb60d01d3e9cea23ca1a92cda99e6f61dac", - "sha256:7ea24e8614f541d69ea72759ff635df0e612b7dc9d264d43f51364df310081a3", - "sha256:7f31742c95e3f9443b8c6fa07c119623e61d76603be9c0d390bcf7e888acabcb", - "sha256:83ee8c9916689f8e6e7d90161e6663ac876be2efd32f61fdcfa3a15e87d4e413", - "sha256:8b2cf5e26da84f2d2dee3f60a3f1782adedcee785567a19b68d0af7e1534bd1f", - "sha256:945407f4d08cd12485757a281fca0e5b41408606228612f421aa4ea1b63a095d", - "sha256:9c46f58ef2df958ed2ea7437a8be0897d5efe9ee480818405338c7da88186fb3", - "sha256:9d7d48fbc5289efd23982a0d68e973a1f37d49064ccd36d86de4543aff21e086", - "sha256:9f28a81978e936136c44e6a70c65bde7548d87f3807260f73aeffbf76fb94c2f", - "sha256:a415b9e95fa602b10808113967f72b2da8722061265d6af69268c111c254832d", - "sha256:a82746c6d6e91ca17e75f7f333ed41d70fce93af520a8437821dec3ee52dfb10", - "sha256:ad57004e5d73aee36f1e25e4e73a4bc853b473a1c30f652dc8d86b0a987ffce3", - "sha256:c6444368b651a14c2ce2fb22145e1496f7ab23cbdb978590d47c8d34a7bc0289", - "sha256:d216f8d0484d88ab72ab45d699ac669fe031275e3fa6553e3804e69485449fa0", - "sha256:d3449633c207ec3d2d672eedb3edbe753e29bd4e22d2e42a37a2c1406564c20f", - "sha256:d5b5b7c6bafaef90cbb7dafcb225b763edd71d9e22489647ee7df49d6d341890", - "sha256:d7a8a1dd68bac29f08f0a3147de1885f4dccec35d4ea926e6e637fac03cdb4b3", - "sha256:d8d72553d2f3f57ce547de4fa7dc8e3859927784ab2c88343f1fc1360ff17a08", - "sha256:dce355fe7ae53e3090f7f5fa242423c3a7b53260747aa398b4b3aaf8b25f41c3", - "sha256:e351df83d1c9cffa53d4e779009a093be70f1d5c6bb7068584086f6a19042526", - "sha256:ec5c44e6e9eac5128a9bfd21610df3b8c6b17343285cc185105686888dc81206", - "sha256:f5bb81fcfc6d5bff62cd786cbd87480a11d23f16d5376ad2e057c02b3b44df96", - "sha256:fd34012691fbd4e67bdf4accb1f0682342101015b78327eaae3543583fcd451e", - "sha256:fea36c2065b7a1d28c6819cc2e93387b43dd5d3cf5a1e82d8132ee23f36d1f10", - "sha256:ff09600cebe957ecbb4a27496fe34c1d449e7957ed20a202d5029a71a8af2e35" + "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d", + "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9" ], - "markers": "python_version >= '3.7'", - "version": "==1.10.19" + "markers": "python_version >= '3.8'", + "version": "==2.10.3" + }, + "pydantic-core": { + "hashes": [ + "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9", + "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b", + "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c", + "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529", + "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc", + "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854", + "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d", + "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278", + "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a", + "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c", + "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f", + "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27", + "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f", + "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac", + "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2", + "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97", + "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a", + "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919", + "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9", + "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4", + "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c", + "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131", + "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5", + "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd", + "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089", + "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107", + "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6", + "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60", + "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf", + "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5", + "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08", + "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05", + "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2", + "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e", + "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c", + "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17", + "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62", + "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23", + "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be", + "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067", + "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02", + "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f", + "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235", + "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840", + "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5", + "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807", + "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16", + "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c", + "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864", + "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e", + "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a", + "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35", + "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737", + "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a", + "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3", + "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52", + "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05", + "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31", + "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89", + "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de", + "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6", + "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36", + "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c", + "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154", + "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb", + "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e", + "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd", + "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3", + "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f", + "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78", + "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960", + "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618", + "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08", + "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4", + "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c", + "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c", + "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330", + "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8", + "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792", + "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025", + "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9", + "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f", + "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01", + "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337", + "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4", + "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f", + "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd", + "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51", + "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab", + "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc", + "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676", + "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381", + "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed", + "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb", + "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967", + "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073", + "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae", + "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c", + "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206", + "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b" + ], + "markers": "python_version >= '3.8'", + "version": "==2.27.1" + }, + "pydantic-settings": { + "hashes": [ + "sha256:7fb0637c786a558d3103436278a7c4f1cfd29ba8973238a50c5bb9a55387da87", + "sha256:e0f92546d8a9923cb8941689abf85d6601a8c19a23e97a34b2964a2e3f813ca0" + ], + "markers": "python_version >= '3.8'", + "version": "==2.6.1" }, "pynacl": { "hashes": [ @@ -1121,47 +1231,9 @@ "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84", "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c" ], - "markers": "python_version >= '3.1'", + "markers": "python_version >= '3.9'", "version": "==3.2.0" }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, "pyserial": { "hashes": [ "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", @@ -1182,9 +1254,17 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, + "python-dotenv": { + "hashes": [ + "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", + "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.1" + }, "pytz": { "hashes": [ "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", @@ -1200,29 +1280,13 @@ "markers": "python_full_version >= '3.6.0'", "version": "==1.2.1" }, - "pywin32": { - "hashes": [ - "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", - "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6", - "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6", - "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", - "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff", - "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de", - "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e", - "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b", - "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0", - "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", - "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a", - "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920", - "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341", - "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e", - "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", - "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c", - "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", - "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4" - ], - "markers": "platform_system == 'Windows' and platform_python_implementation == 'CPython'", - "version": "==308" + "referencing": { + "hashes": [ + "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", + "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de" + ], + "markers": "python_version >= '3.8'", + "version": "==0.35.1" }, "requests": { "hashes": [ @@ -1240,6 +1304,115 @@ "markers": "python_version >= '3.4'", "version": "==2.0.0" }, + "rpds-py": { + "hashes": [ + "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", + "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", + "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", + "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", + "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", + "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543", + "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", + "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", + "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", + "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", + "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", + "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", + "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", + "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", + "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99", + "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", + "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", + "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", + "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", + "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", + "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f", + "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3", + "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca", + "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d", + "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e", + "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", + "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea", + "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", + "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", + "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", + "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", + "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723", + "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e", + "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", + "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6", + "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", + "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091", + "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", + "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", + "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", + "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728", + "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", + "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", + "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", + "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7", + "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", + "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", + "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", + "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", + "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", + "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055", + "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d", + "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", + "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", + "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", + "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", + "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", + "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", + "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", + "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", + "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11", + "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", + "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", + "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", + "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b", + "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", + "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c", + "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9", + "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", + "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", + "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", + "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", + "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", + "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c", + "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", + "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", + "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", + "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", + "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", + "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", + "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", + "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", + "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", + "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", + "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", + "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", + "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", + "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3", + "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", + "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520", + "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831", + "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", + "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", + "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", + "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", + "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", + "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", + "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", + "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", + "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", + "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d", + "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", + "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e" + ], + "markers": "python_version >= '3.9'", + "version": "==0.22.3" + }, "rsa": { "hashes": [ "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", @@ -1250,28 +1423,28 @@ }, "setuptools": { "hashes": [ - "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd", - "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686" + "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", + "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d" ], - "markers": "python_version >= '3.8'", - "version": "==75.3.0" + "markers": "python_version >= '3.9'", + "version": "==75.6.0" }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.17.0" }, "slack-sdk": { "hashes": [ - "sha256:0515fb93cd03b18de61f876a8304c4c3cef4dd3c2a3bad62d7394d2eb5a3c8e6", - "sha256:4cc44c9ffe4bb28a01fbe3264c2f466c783b893a4eca62026ab845ec7c176ff1" + "sha256:a5e74c00c99dc844ad93e501ab764a20d86fa8184bbc9432af217496f632c4ee", + "sha256:b8cccadfa3d4005a5e6529f52000d25c583f46173fda8e9136fdd2bc58923ff6" ], "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==3.33.3" + "version": "==3.33.5" }, "slackclient": { "hashes": [ @@ -1348,167 +1521,162 @@ }, "wrapt": { "hashes": [ - "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc", - "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", - "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", - "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e", - "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca", - "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", - "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", - "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", - "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40", - "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", - "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", - "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202", - "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41", - "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", - "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", - "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", - "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", - "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", - "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00", - "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", - "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", - "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267", - "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", - "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966", - "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", - "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228", - "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", - "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", - "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292", - "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", - "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0", - "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", - "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c", - "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5", - "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f", - "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", - "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", - "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", - "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593", - "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39", - "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", - "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf", - "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", - "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", - "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c", - "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", - "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f", - "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", - "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465", - "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", - "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b", - "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", - "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", - "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8", - "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6", - "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e", - "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", - "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c", - "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e", - "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", - "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", - "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", - "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35", - "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", - "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3", - "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", - "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", - "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", - "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", - "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" + "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d", + "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301", + "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635", + "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a", + "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed", + "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721", + "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801", + "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b", + "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1", + "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88", + "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8", + "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0", + "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f", + "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578", + "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7", + "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045", + "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada", + "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d", + "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b", + "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a", + "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977", + "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea", + "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346", + "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13", + "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22", + "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339", + "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9", + "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181", + "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c", + "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90", + "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a", + "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489", + "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f", + "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504", + "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea", + "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569", + "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4", + "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce", + "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab", + "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a", + "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f", + "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c", + "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9", + "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf", + "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d", + "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627", + "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d", + "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4", + "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c", + "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d", + "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad", + "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b", + "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33", + "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371", + "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1", + "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393", + "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106", + "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df", + "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379", + "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451", + "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b", + "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575", + "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed", + "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb", + "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838" ], - "markers": "python_version >= '3.6'", - "version": "==1.16.0" + "markers": "python_version >= '3.8'", + "version": "==1.17.0" }, "yarl": { "hashes": [ - "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac", - "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47", - "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91", - "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5", - "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df", - "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3", - "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463", - "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b", - "sha256:1a3b91c44efa29e6c8ef8a9a2b583347998e2ba52c5d8280dbd5919c02dfc3b5", - "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74", - "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3", - "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3", - "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4", - "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0", - "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299", - "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2", - "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac", - "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61", - "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931", - "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21", - "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3", - "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7", - "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96", - "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f", - "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243", - "sha256:578d00c9b7fccfa1745a44f4eddfdc99d723d157dad26764538fbdda37209857", - "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f", - "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca", - "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488", - "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da", - "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948", - "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5", - "sha256:6f4c9156c4d1eb490fe374fb294deeb7bc7eaccda50e23775b2354b6a6739934", - "sha256:7294e38f9aa2e9f05f765b28ffdc5d81378508ce6dadbe93f6d464a8c9594473", - "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7", - "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685", - "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e", - "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147", - "sha256:7fac95714b09da9278a0b52e492466f773cfe37651cf467a83a1b659be24bf71", - "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67", - "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04", - "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822", - "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11", - "sha256:8994b29c462de9a8fce2d591028b986dbbe1b32f3ad600b2d3e1c482c93abad6", - "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0", - "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec", - "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda", - "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556", - "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4", - "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c", - "sha256:a7ac5b4984c468ce4f4a553df281450df0a34aefae02e58d77a0847be8d1e11f", - "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8", - "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba", - "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258", - "sha256:b40d1bf6e6f74f7c0a567a9e5e778bbd4699d1d3d2c0fe46f4b717eef9e96b95", - "sha256:b5c4804e4039f487e942c13381e6c27b4b4e66066d94ef1fae3f6ba8b953f383", - "sha256:b5d6a6c9602fd4598fa07e0389e19fe199ae96449008d8304bf5d47cb745462e", - "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938", - "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374", - "sha256:c180ac742a083e109c1a18151f4dd8675f32679985a1c750d2ff806796165b55", - "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139", - "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17", - "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217", - "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d", - "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d", - "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe", - "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199", - "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d", - "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8", - "sha256:d6324274b4e0e2fa1b3eccb25997b1c9ed134ff61d296448ab8269f5ac068c4c", - "sha256:d8a8b74d843c2638f3864a17d97a4acda58e40d3e44b6303b8cc3d3c44ae2d29", - "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172", - "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860", - "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7", - "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170", - "sha256:eb6dce402734575e1a8cc0bb1509afca508a400a57ce13d306ea2c663bad1138", - "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06", - "sha256:f5efe0661b9fcd6246f27957f6ae1c0eb29bc60552820f01e970b4996e016004", - "sha256:f9cbfbc5faca235fbdf531b93aa0f9f005ec7d267d9d738761a4d42b744ea159", - "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da", - "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988", - "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75" + "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", + "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193", + "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318", + "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee", + "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e", + "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1", + "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a", + "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", + "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1", + "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", + "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", + "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb", + "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", + "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc", + "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5", + "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", + "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", + "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", + "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24", + "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b", + "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910", + "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", + "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", + "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed", + "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1", + "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04", + "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", + "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5", + "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d", + "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889", + "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae", + "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b", + "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c", + "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", + "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34", + "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", + "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990", + "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", + "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", + "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069", + "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", + "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6", + "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", + "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", + "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", + "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", + "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8", + "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e", + "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e", + "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985", + "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8", + "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", + "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5", + "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690", + "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", + "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789", + "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", + "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca", + "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", + "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5", + "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59", + "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9", + "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8", + "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db", + "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde", + "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7", + "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", + "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3", + "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", + "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", + "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", + "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8", + "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", + "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd", + "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", + "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760", + "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", + "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", + "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", + "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", + "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719", + "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62" ], "markers": "python_version >= '3.9'", - "version": "==1.17.1" + "version": "==1.18.3" } }, "develop": { @@ -1694,79 +1862,80 @@ }, "colorama": { "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", + "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" ], - "markers": "platform_system == 'Windows'", - "version": "==0.4.6" + "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.4.4" }, "coverage": { "hashes": [ - "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376", - "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", - "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111", - "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", - "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", - "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", - "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", - "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", - "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", - "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c", - "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", - "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", - "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", - "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0", - "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", - "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", - "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", - "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", - "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", - "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", - "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", - "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", - "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", - "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", - "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", - "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", - "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", - "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", - "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", - "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901", - "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", - "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", - "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", - "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", - "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", - "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", - "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", - "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", - "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3", - "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", - "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076", - "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", - "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", - "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", - "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", - "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", - "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", - "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09", - "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", - "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", - "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f", - "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", - "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", - "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", - "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", - "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", - "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", - "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", - "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", - "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", - "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", - "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858" + "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", + "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", + "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", + "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", + "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", + "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", + "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", + "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", + "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", + "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", + "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", + "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", + "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", + "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", + "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", + "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", + "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", + "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", + "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", + "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", + "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", + "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", + "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", + "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", + "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", + "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", + "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", + "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", + "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", + "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", + "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", + "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", + "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", + "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", + "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", + "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", + "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", + "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", + "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", + "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", + "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", + "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", + "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", + "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", + "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", + "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", + "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", + "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", + "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", + "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", + "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", + "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", + "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", + "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", + "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", + "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", + "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", + "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", + "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", + "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", + "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", + "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" ], "markers": "python_version >= '3.9'", - "version": "==7.6.4" + "version": "==7.6.9" }, "flake8": { "hashes": [ @@ -1805,20 +1974,20 @@ }, "google-api-core": { "hashes": [ - "sha256:26f8d76b96477db42b55fd02a33aae4a42ec8b86b98b94969b7333a2c828bf35", - "sha256:a6652b6bd51303902494998626653671703c420f6f4c88cfd3f50ed723e9d021" + "sha256:10d82ac0fca69c82a25b3efdeefccf6f28e02ebb97925a8cce8edbfe379929d9", + "sha256:e255640547a597a4da010876d333208ddac417d60add22b6851a0c66a831fcaf" ], "markers": "python_version >= '3.7'", - "version": "==2.22.0" + "version": "==2.24.0" }, "google-api-python-client": { "hashes": [ - "sha256:4427b2f47cd88b0355d540c2c52215f68c337f3bc9d6aae1ceeae4525977504c", - "sha256:a9d26d630810ed4631aea21d1de3e42072f98240aaf184a8a1a874a371115034" + "sha256:1b420062e03bfcaa1c79e2e00a612d29a6a934151ceb3d272fe150a656dc8f17", + "sha256:a521bbbb2ec0ba9d6f307cdd64ed6e21eeac372d1bd7493a4ab5022941f784ad" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2.151.0" + "version": "==2.154.0" }, "google-api-python-client-stubs": { "hashes": [ @@ -1846,11 +2015,11 @@ }, "googleapis-common-protos": { "hashes": [ - "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63", - "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0" + "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c", + "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed" ], "markers": "python_version >= '3.7'", - "version": "==1.65.0" + "version": "==1.66.0" }, "httplib2": { "hashes": [ @@ -1928,11 +2097,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pathspec": { "hashes": [ @@ -1968,20 +2137,20 @@ }, "protobuf": { "hashes": [ - "sha256:0c4eec6f987338617072592b97943fdbe30d019c56126493111cf24344c1cc24", - "sha256:135658402f71bbd49500322c0f736145731b16fc79dc8f367ab544a17eab4535", - "sha256:27b246b3723692bf1068d5734ddaf2fccc2cdd6e0c9b47fe099244d80200593b", - "sha256:3e6101d095dfd119513cde7259aa703d16c6bbdfae2554dfe5cfdbe94e32d548", - "sha256:3fa2de6b8b29d12c61911505d893afe7320ce7ccba4df913e2971461fa36d584", - "sha256:64badbc49180a5e401f373f9ce7ab1d18b63f7dd4a9cdc43c92b9f0b481cef7b", - "sha256:70585a70fc2dd4818c51287ceef5bdba6387f88a578c86d47bb34669b5552c36", - "sha256:712319fbdddb46f21abb66cd33cb9e491a5763b2febd8f228251add221981135", - "sha256:91fba8f445723fcf400fdbe9ca796b19d3b1242cd873907979b9ed71e4afe868", - "sha256:a3f6857551e53ce35e60b403b8a27b0295f7d6eb63d10484f12bc6879c715687", - "sha256:cee1757663fa32a1ee673434fcf3bf24dd54763c79690201208bafec62f19eed" + "sha256:012ce28d862ff417fd629285aca5d9772807f15ceb1a0dbd15b88f58c776c98c", + "sha256:027fbcc48cea65a6b17028510fdd054147057fa78f4772eb547b9274e5219331", + "sha256:1fc55267f086dd4050d18ef839d7bd69300d0d08c2a53ca7df3920cc271a3c34", + "sha256:22c1f539024241ee545cbcb00ee160ad1877975690b16656ff87dde107b5f110", + "sha256:32600ddb9c2a53dedc25b8581ea0f1fd8ea04956373c0c07577ce58d312522e0", + "sha256:50879eb0eb1246e3a5eabbbe566b44b10348939b7cc1b267567e8c3d07213853", + "sha256:5a41deccfa5e745cef5c65a560c76ec0ed8e70908a67cc8f4da5fce588b50d57", + "sha256:683be02ca21a6ffe80db6dd02c0b5b2892322c59ca57fd6c872d652cb80549cb", + "sha256:8ee1461b3af56145aca2800e6a3e2f928108c749ba8feccc6f5dd0062c410c0d", + "sha256:b5ba1d0e4c8a40ae0496d0e2ecfdbb82e1776928a205106d14ad6985a09ec155", + "sha256:d473655e29c0c4bbf8b69e9a8fb54645bc289dead6d753b952e7aa660254ae18" ], "markers": "python_version >= '3.8'", - "version": "==5.28.3" + "version": "==5.29.1" }, "py": { "hashes": [ @@ -2036,7 +2205,7 @@ "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84", "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c" ], - "markers": "python_version >= '3.1'", + "markers": "python_version >= '3.9'", "version": "==3.2.0" }, "pytest": { @@ -2082,11 +2251,41 @@ }, "tomli": { "hashes": [ - "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38", - "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed" + "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", + "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", + "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", + "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", + "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", + "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", + "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", + "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", + "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", + "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", + "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", + "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", + "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", + "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", + "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", + "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", + "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", + "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", + "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", + "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", + "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", + "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", + "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", + "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", + "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", + "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", + "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", + "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", + "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", + "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", + "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", + "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7" ], - "markers": "python_version < '3.11'", - "version": "==2.0.2" + "markers": "python_version >= '3.8'", + "version": "==2.2.1" }, "types-httplib2": { "hashes": [ diff --git a/abr-testing/abr_testing/data_collection/abr_google_drive.py b/abr-testing/abr_testing/data_collection/abr_google_drive.py index 8f82567a7d1..655200745a9 100644 --- a/abr-testing/abr_testing/data_collection/abr_google_drive.py +++ b/abr-testing/abr_testing/data_collection/abr_google_drive.py @@ -34,16 +34,13 @@ def create_data_dictionary( runs_to_save: Union[Set[str], str], storage_directory: str, issue_url: str, - plate: str, - accuracy: Any, hellma_plate_standards: List[Dict[str, Any]], -) -> Tuple[List[List[Any]], List[str], List[List[Any]], List[str], List[List[Any]]]: +) -> Tuple[List[List[Any]], List[str], List[List[Any]], List[str]]: """Pull data from run files and format into a dictionary.""" runs_and_robots: List[Any] = [] runs_and_lpc: List[Dict[str, Any]] = [] headers: List[str] = [] headers_lpc: List[str] = [] - list_of_heights: List[List[Any]] = [[], [], [], [], [], [], [], []] hellma_plate_orientation = False # default hellma plate is not rotated. for filename in os.listdir(storage_directory): file_path = os.path.join(storage_directory, filename) @@ -103,12 +100,15 @@ def create_data_dictionary( run_time_min = run_time.total_seconds() / 60 except ValueError: pass # Handle datetime parsing errors if necessary + # Get protocol version # + version_number = read_robot_logs.get_protocol_version_number(file_results) if run_time_min > 0: run_row = { "Robot": robot, "Run_ID": run_id, "Protocol_Name": protocol_name, + "Protocol Version": version_number, "Software Version": software_version, "Date": start_date, "Start_Time": start_time_str, @@ -130,13 +130,10 @@ def create_data_dictionary( plate_reader_dict = read_robot_logs.plate_reader_commands( file_results, hellma_plate_standards, hellma_plate_orientation ) - list_of_heights = read_robot_logs.liquid_height_commands( - file_results, list_of_heights - ) notes = {"Note1": "", "Jira Link": issue_url} + liquid_height = read_robot_logs.get_liquid_waste_height(file_results) plate_measure = { - "Plate Measured": plate, - "End Volume Accuracy (%)": accuracy, + "Liquid Waste Height (mm)": liquid_height, "Average Temp (oC)": "", "Average RH(%)": "", } @@ -173,7 +170,6 @@ def create_data_dictionary( headers, transposed_runs_and_lpc, headers_lpc, - list_of_heights, ) @@ -211,26 +207,15 @@ def run( headers, transposed_runs_and_lpc, headers_lpc, - list_of_heights, ) = create_data_dictionary( missing_runs_from_gs, storage_directory, "", - "", - "", - hellma_plate_standards=file_values, + file_values, ) start_row = google_sheet.get_index_row() + 1 google_sheet.batch_update_cells(transposed_runs_and_robots, "A", start_row, "0") - # Record Liquid Heights Found - google_sheet_ldf = google_sheets_tool.google_sheet( - credentials_path, google_sheet_name, 2 - ) - google_sheet_ldf.get_row(1) - start_row_lhd = google_sheet_ldf.get_index_row() + 1 - google_sheet_ldf.batch_update_cells( - list_of_heights, "A", start_row_lhd, "2075262446" - ) + # Add LPC to google sheet google_sheet_lpc = google_sheets_tool.google_sheet(credentials_path, "ABR-LPC", 0) start_row_lpc = google_sheet_lpc.get_index_row() + 1 diff --git a/abr-testing/abr_testing/data_collection/abr_robot_error.py b/abr-testing/abr_testing/data_collection/abr_robot_error.py index 73cf12c6253..c2dadaae54c 100644 --- a/abr-testing/abr_testing/data_collection/abr_robot_error.py +++ b/abr-testing/abr_testing/data_collection/abr_robot_error.py @@ -11,11 +11,35 @@ import sys import json import re +from pathlib import Path import pandas as pd from statistics import mean, StatisticsError from abr_testing.tools import plate_reader +def retrieve_protocol_file( + protocol_id: str, + robot_ip: str, + storage: str, +) -> Path | str: + """Find and copy protocol file on robot with error.""" + protocol_dir = f"/var/lib/opentrons-robot-server/7.1/protocols/{protocol_id}" + + print(f"FILE TO FIND: {protocol_dir}/{protocol_id}") + # Copy protocol file found in robot oto host computer + save_dir = Path(f"{storage}/protocol_errors") + command = ["scp", "-r", f"root@{robot_ip}:{protocol_dir}", save_dir] + try: + # If file found and copied return path to file + subprocess.run(command, check=True) # type: ignore + print("File transfer successful!") + return save_dir + except subprocess.CalledProcessError as e: + print(f"Error during file transfer: {e}") + # Return empty string if file can't be copied + return "" + + def compare_current_trh_to_average( robot: str, start_time: Any, @@ -38,9 +62,13 @@ def compare_current_trh_to_average( # Find average conditions of errored time period df_all_trh = pd.DataFrame(all_trh_data) # Convert timestamps to datetime objects - df_all_trh["Timestamp"] = pd.to_datetime( - df_all_trh["Timestamp"], format="mixed", utc=True - ).dt.tz_localize(None) + print(f'TIMESTAMP: {df_all_trh["Timestamp"]}') + try: + df_all_trh["Timestamp"] = pd.to_datetime( + df_all_trh["Timestamp"], format="mixed", utc=True + ).dt.tz_localize(None) + except Exception: + print(f'The following timestamp is invalid: {df_all_trh["Timestamp"]}') # Ensure start_time is timezone-naive start_time = start_time.replace(tzinfo=None) relevant_temp_rhs = df_all_trh[ @@ -245,9 +273,10 @@ def get_user_id(user_file_path: str, assignee_name: str) -> str: return assignee_id -def get_error_runs_from_robot(ip: str) -> List[str]: +def get_error_runs_from_robot(ip: str) -> Tuple[List[str], List[str]]: """Get runs that have errors from robot.""" error_run_ids = [] + protocol_ids = [] response = requests.get( f"http://{ip}:31950/runs", headers={"opentrons-version": "3"} ) @@ -255,10 +284,13 @@ def get_error_runs_from_robot(ip: str) -> List[str]: run_list = run_data.get("data", []) for run in run_list: run_id = run["id"] + protocol_id = run["protocolId"] num_of_errors = len(run["errors"]) if not run["current"] and num_of_errors > 0: error_run_ids.append(run_id) - return error_run_ids + # Protocol ID will identify the correct folder on the robot of the protocol file + protocol_ids.append(protocol_id) + return (error_run_ids, protocol_ids) def get_robot_state( @@ -335,7 +367,7 @@ def get_robot_state( def get_run_error_info_from_robot( - ip: str, one_run: str, storage_directory: str + ip: str, one_run: str, storage_directory: str, protocol_found: bool ) -> Tuple[str, str, str, List[str], List[str], str, str]: """Get error information from robot to fill out ticket.""" description = dict() @@ -369,6 +401,9 @@ def get_run_error_info_from_robot( description["protocol_name"] = results["protocol"]["metadata"].get( "protocolName", "" ) + + # If Protocol was successfully retrieved from the robot + description["protocol_found_on_robot"] = protocol_found # Get start and end time of run start_time = datetime.strptime( results.get("startedAt", ""), "%Y-%m-%dT%H:%M:%S.%f%z" @@ -511,12 +546,21 @@ def get_run_error_info_from_robot( users_file_path = ticket.get_jira_users(storage_directory) assignee_id = get_user_id(users_file_path, assignee) run_log_file_path = "" + protocol_found = False try: - error_runs = get_error_runs_from_robot(ip) + error_runs, protocol_ids = get_error_runs_from_robot(ip) except requests.exceptions.InvalidURL: print("Invalid IP address.") sys.exit() if len(run_or_other) < 1: + # Retrieve the most recently run protocol file + protocol_files_path = retrieve_protocol_file( + protocol_ids[-1], ip, storage_directory + ) + # Set protocol_found to true if python protocol was successfully copied over + if protocol_files_path: + protocol_found = True + one_run = error_runs[-1] # Most recent run with error. ( summary, @@ -526,7 +570,9 @@ def get_run_error_info_from_robot( labels, whole_description_str, run_log_file_path, - ) = get_run_error_info_from_robot(ip, one_run, storage_directory) + ) = get_run_error_info_from_robot( + ip, one_run, storage_directory, protocol_found + ) else: ( summary, @@ -566,8 +612,15 @@ def get_run_error_info_from_robot( # OPEN TICKET issue_url = ticket.open_issue(issue_key) # MOVE FILES TO ERROR FOLDER. + print(protocol_files_path) error_files = [saved_file_path_calibration, run_log_file_path] + file_paths - error_folder_path = os.path.join(storage_directory, issue_key) + + # Move protocol file(s) to error folder + if protocol_files_path: + for file in os.listdir(protocol_files_path): + error_files.append(os.path.join(protocol_files_path, file)) + + error_folder_path = os.path.join(storage_directory, "issue_key") os.makedirs(error_folder_path, exist_ok=True) for source_file in error_files: try: @@ -577,7 +630,7 @@ def get_run_error_info_from_robot( shutil.move(source_file, destination_file) except shutil.Error: continue - # POST FILES TO TICKET + # POST ALL FILES TO TICKET list_of_files = os.listdir(error_folder_path) for file in list_of_files: file_to_attach = os.path.join(error_folder_path, file) @@ -614,28 +667,16 @@ def get_run_error_info_from_robot( headers, runs_and_lpc, headers_lpc, - list_of_heights, ) = abr_google_drive.create_data_dictionary( run_id, error_folder_path, issue_url, - "", - "", - hellma_plate_standards=file_values, + file_values, ) start_row = google_sheet.get_index_row() + 1 google_sheet.batch_update_cells(runs_and_robots, "A", start_row, "0") print("Wrote run to ABR-run-data") - # Record Liquid Heights Found - google_sheet_ldf = google_sheets_tool.google_sheet( - credentials_path, google_sheet_name, 4 - ) - start_row_lhd = google_sheet_ldf.get_index_row() + 1 - google_sheet_ldf.batch_update_cells( - list_of_heights, "A", start_row_lhd, "1795535088" - ) - print("wrote liquid heights found.") # Add LPC to google sheet google_sheet_lpc = google_sheets_tool.google_sheet( credentials_path, "ABR-LPC", 0 diff --git a/abr-testing/abr_testing/data_collection/read_robot_logs.py b/abr-testing/abr_testing/data_collection/read_robot_logs.py index 7bc83e0a54b..d4570d20110 100644 --- a/abr-testing/abr_testing/data_collection/read_robot_logs.py +++ b/abr-testing/abr_testing/data_collection/read_robot_logs.py @@ -134,7 +134,8 @@ def match_pipette_to_action( left_pipette_add = 0 for command in commandTypes: command_type = command_dict["commandType"] - command_pipette = command_dict.get("pipetteId", "") + command_params = command_dict.get("params", "") + command_pipette = command_params.get("pipetteId", "") if command_type == command and command_pipette == right_pipette: right_pipette_add = 1 elif command_type == command and command_pipette == left_pipette: @@ -213,6 +214,38 @@ def instrument_commands( return pipette_dict +def get_comment_result_by_string(file_results: Dict[str, Any], key_phrase: str) -> str: + """Get comment string based off ky phrase.""" + commandData = file_results.get("commands", "") + result_str = command_str = "" + for command in commandData: + commandType = command["commandType"] + if commandType == "comment": + command_str = command["params"].get("message", "") + try: + result_str = command_str.split(key_phrase)[1] + except IndexError: + continue + return result_str + + +def get_protocol_version_number(file_results: Dict[str, Any]) -> str: + """Get protocol version number.""" + return get_comment_result_by_string(file_results, "Protocol Version: ") + + +def get_liquid_waste_height(file_results: Dict[str, Any]) -> float: + """Find liquid waste height.""" + result_str = get_comment_result_by_string( + file_results, "Liquid Waste Total Height: " + ) + try: + height = float(result_str) + except ValueError: + height = 0.0 + return height + + def liquid_height_commands( file_results: Dict[str, Any], all_heights_list: List[List[Any]] ) -> List[List[Any]]: @@ -220,6 +253,9 @@ def liquid_height_commands( commandData = file_results.get("commands", "") robot = file_results.get("robot_name", "") run_id = file_results.get("run_id", "") + list_of_heights = [] + print(robot) + liquid_waste_height = 0.0 for command in commandData: commandType = command["commandType"] if commandType == "comment": @@ -236,16 +272,24 @@ def liquid_height_commands( well_location = str(entry.split(", ")[1].split(" ")[0]) slot_location = str(entry.split("slot ")[1].split(")")[0]) labware_name = str(entry.split("of ")[1].split(" on")[0]) - all_heights_list[0].append(robot) - all_heights_list[1].append(run_id) - all_heights_list[2].append(comment_time) - all_heights_list[3].append(labware_type) - all_heights_list[4].append(labware_name) - all_heights_list[5].append(slot_location) - all_heights_list[6].append(well_location) - all_heights_list[7].append(height) + if labware_name == "Liquid Waste": + liquid_waste_height += height + one_entry = { + "Timestamp": comment_time, + "Labware Name": labware_name, + "Labware Type": labware_type, + "Slot Location": slot_location, + "Well Location": well_location, + "All Heights (mm)": height, + } + list_of_heights.append(one_entry) except (IndexError, ValueError): continue + if len(list_of_heights) > 0: + all_heights_list[0].append(robot) + all_heights_list[1].append(run_id) + all_heights_list[2].append(list_of_heights) + all_heights_list[3].append(liquid_waste_height) return all_heights_list @@ -281,10 +325,13 @@ def plate_reader_commands( read = "yes" elif read == "yes" and commandType == "comment": result = command["params"].get("message", "") - if "result:" in result: - plate_name = result.split("result:")[0] - formatted_result = result.split("result: ")[1] - print(formatted_result) + if "result:" in result or "Result:" in result: + try: + plate_name = result.split("result:")[0] + formatted_result = result.split("result: ")[1] + except IndexError: + plate_name = result.split("Result:")[0] + formatted_result = result.split("Result: ")[1] result_dict = eval(formatted_result) result_dict_keys = list(result_dict.keys()) if len(result_dict_keys) > 1: diff --git a/abr-testing/abr_testing/data_collection/single_run_log_reader.py b/abr-testing/abr_testing/data_collection/single_run_log_reader.py index a61670e6d12..bf10347faff 100644 --- a/abr-testing/abr_testing/data_collection/single_run_log_reader.py +++ b/abr-testing/abr_testing/data_collection/single_run_log_reader.py @@ -34,14 +34,11 @@ header, runs_and_lpc, lpc_headers, - list_of_heights, ) = abr_google_drive.create_data_dictionary( run_ids_in_storage, run_log_file_path, "", - "", - "", - hellma_plate_standards=file_values, + file_values, ) print("list_of_heights not recorded.") transposed_list = list(zip(*runs_and_robots)) diff --git a/abr-testing/abr_testing/protocols/active_protocols/10_ZymoBIOMICS_Magbead_DNA_Cells_Flex.py b/abr-testing/abr_testing/protocols/active_protocols/10_ZymoBIOMICS_Magbead_DNA_Cells_Flex.py index 9631b442694..fbc77c9ed46 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/10_ZymoBIOMICS_Magbead_DNA_Cells_Flex.py +++ b/abr-testing/abr_testing/protocols/active_protocols/10_ZymoBIOMICS_Magbead_DNA_Cells_Flex.py @@ -17,7 +17,7 @@ "protocolName": "Flex ZymoBIOMICS Magbead DNA Extraction: Cells", } -requirements = {"robotType": "OT-3", "apiLevel": "2.21"} +requirements = {"robotType": "Flex", "apiLevel": "2.21"} """ Slot A1: Tips 1000 Slot A2: Tips 1000 @@ -41,11 +41,12 @@ Wells 1-12 - 9,000 ul """ -whichwash = 1 +whichwash = 0 +wash_volume_tracker = 0.0 sample_max = 48 tip1k = 0 -tip200 = 0 drop_count = 0 +m1000_tips = 0 def add_parameters(parameters: protocol_api.ParameterContext) -> None: @@ -53,28 +54,40 @@ def add_parameters(parameters: protocol_api.ParameterContext) -> None: helpers.create_hs_speed_parameter(parameters) helpers.create_single_pipette_mount_parameter(parameters) helpers.create_dot_bottom_parameter(parameters) + helpers.create_deactivate_modules_parameter(parameters) -def run(ctx: protocol_api.ProtocolContext) -> None: +def run(protocol: protocol_api.ProtocolContext) -> None: """Protocol Set Up.""" - heater_shaker_speed = ctx.params.heater_shaker_speed # type: ignore[attr-defined] - mount = ctx.params.pipette_mount # type: ignore[attr-defined] - dot_bottom = ctx.params.dot_bottom # type: ignore[attr-defined] + heater_shaker_speed = protocol.params.heater_shaker_speed # type: ignore[attr-defined] + mount = protocol.params.pipette_mount # type: ignore[attr-defined] + dot_bottom = protocol.params.dot_bottom # type: ignore[attr-defined] + deactivate_modules_bool = protocol.params.deactivate_modules # type: ignore[attr-defined] + helpers.comment_protocol_version(protocol, "01") + dry_run = False TIP_TRASH = ( False # True = Used tips go in Trash, False = Used tips go back into rack ) res_type = "nest_12_reservoir_15ml" - - num_samples = 8 - wash1_vol = 500.0 - wash2_vol = wash3_vol = 900.0 - lysis_vol = 200.0 + global m1000_tips + num_samples = 96 + wash1_vol = wash2_vol = wash3_vol = 400.0 + lysis_vol = 90.0 sample_vol = 10.0 # Sample should be pelleted tissue/bacteria/cells bind_vol = 600.0 bind2_vol = 500.0 elution_vol = 75.0 + def tipcheck(m1000: InstrumentContext) -> None: + """Tip tracking function.""" + global m1000_tips + if m1000_tips >= 3 * 96: + m1000.reset_tipracks() + m1000_tips == 0 + m1000.pick_up_tip() + m1000_tips += 8 + # Protocol Parameters deepwell_type = "nest_96_wellplate_2ml_deep" @@ -97,37 +110,41 @@ def run(ctx: protocol_api.ProtocolContext) -> None: bead_vol = 25.0 starting_vol = lysis_vol + sample_vol binding_buffer_vol = bind_vol + bead_vol - ctx.load_trash_bin("A3") - h_s: HeaterShakerContext = ctx.load_module(helpers.hs_str, "D1") # type: ignore[assignment] + protocol.load_trash_bin("A3") + h_s: HeaterShakerContext = protocol.load_module( + helpers.hs_str, "D1" + ) # type: ignore[assignment] labware_name = "Samples" sample_plate, h_s_adapter = helpers.load_hs_adapter_and_labware( deepwell_type, h_s, labware_name ) h_s.close_labware_latch() - temp: TemperatureModuleContext = ctx.load_module( + temp: TemperatureModuleContext = protocol.load_module( helpers.temp_str, "D3" ) # type: ignore[assignment] elutionplate, temp_adapter = helpers.load_temp_adapter_and_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt", temp, "Elution Plate" ) - magblock: MagneticBlockContext = ctx.load_module( + magblock: MagneticBlockContext = protocol.load_module( helpers.mag_str, "C1" ) # type: ignore[assignment] - waste_reservoir = ctx.load_labware("nest_1_reservoir_195ml", "B3", "Liquid Waste") + waste_reservoir = protocol.load_labware( + "nest_1_reservoir_290ml", "B3", "Liquid Waste" + ) waste = waste_reservoir.wells()[0].top() - res1 = ctx.load_labware(res_type, "D2", "reagent reservoir 1") - res2 = ctx.load_labware(res_type, "C2", "reagent reservoir 2") + res1 = protocol.load_labware(res_type, "D2", "reagent reservoir 1") + res2 = protocol.load_labware(res_type, "C2", "reagent reservoir 2") + res3 = protocol.load_labware(res_type, "B2", "reagent reservoir 3") num_cols = math.ceil(num_samples / 8) # Load tips and combine all similar boxes - tips1000 = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "A1", "Tips 1") - tips1001 = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "A2", "Tips 2") - tips1002 = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "B1", "Tips 3") - tips = [*tips1000.wells()[num_samples:96], *tips1001.wells(), *tips1002.wells()] + tips1000 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "A1", "Tips 1") + tips1001 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "A2", "Tips 2") + tips1002 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "B1", "Tips 3") tips_sn = tips1000.wells()[:num_samples] # load instruments - m1000 = ctx.load_instrument( + m1000 = protocol.load_instrument( "flex_8channel_1000", mount, tip_racks=[tips1000, tips1001, tips1002] ) @@ -135,50 +152,32 @@ def run(ctx: protocol_api.ProtocolContext) -> None: Here is where you can define the locations of your reagents. """ lysis_ = res1.wells()[0] - binding_buffer = res1.wells()[1:4] - bind2_res = res1.wells()[4:8] - wash1 = res1.wells()[6:8] - elution_solution = res1.wells()[-1] - wash2 = res2.wells()[:6] - wash3 = res2.wells()[6:] - + binding_buffer = res1.wells()[1:8] + bind2_res = res1.wells()[8:12] + all_washes = res2.wells()[1:] + elution_solution = res2.wells()[0] + all_washes.extend(res3.wells()[:2]) samples_m = sample_plate.rows()[0][:num_cols] elution_samples_m = elutionplate.rows()[0][:num_cols] # Redefine per well for liquid definitions samps = sample_plate.wells()[: (8 * num_cols)] - liquid_vols_and_wells: Dict[str, List[Dict[str, Well | List[Well] | float]]] = { "Lysis and PK": [{"well": lysis_, "volume": 12320.0}], "Beads and Binding": [{"well": binding_buffer, "volume": 11875.0}], "Binding 2": [{"well": bind2_res, "volume": 13500.0}], - "Final Elution": [{"well": elution_solution, "volume": 52000}], + "Final Elution": [{"well": elution_solution, "volume": 7500.0}], "Samples": [{"well": samps, "volume": 0.0}], - "Reagents": [{"well": res2.wells(), "volume": 9000.0}], + "Reagents": [{"well": all_washes, "volume": 9800.0}], } - flattened_list_of_wells = helpers.find_liquid_height_of_loaded_liquids( - ctx, liquid_vols_and_wells, m1000 - ) + helpers.find_liquid_height_of_loaded_liquids(protocol, liquid_vols_and_wells, m1000) m1000.flow_rate.aspirate = 300 m1000.flow_rate.dispense = 300 m1000.flow_rate.blow_out = 300 - def tiptrack(tipbox: List[Well]) -> None: - """Track Tips.""" - global tip1k - global drop_count - if tipbox == tips: - m1000.pick_up_tip(tipbox[int(tip1k)]) - tip1k = tip1k + 8 - - drop_count = drop_count + 8 - if drop_count >= 150: - drop_count = 0 - ctx.pause("Please empty the waste bin of all the tips before continuing.") - def remove_supernatant(vol: float) -> None: """Remove supernatant.""" - ctx.comment("-----Removing Supernatant-----") + protocol.comment("-----Removing Supernatant-----") m1000.flow_rate.aspirate = 30 num_trans = math.ceil(vol / 980) vol_per_trans = vol / num_trans @@ -198,7 +197,7 @@ def remove_supernatant(vol: float) -> None: m1000.flow_rate.aspirate = 300 # Transfer from Magdeck plate to H-S - helpers.move_labware_to_hs(ctx, sample_plate, h_s, h_s_adapter) + helpers.move_labware_to_hs(protocol, sample_plate, h_s, h_s_adapter) def bead_mixing( well: Well, pip: InstrumentContext, mvol: float, reps: int = 8 @@ -261,6 +260,7 @@ def mixing(well: Well, pip: InstrumentContext, mvol: float, reps: int = 8) -> No dispensing at the top and 2 cycles of aspirating from middle, dispensing at the bottom """ + pip.liquid_presence_detection = False center = well.top(5) asp = well.bottom(1) disp = well.top(-8) @@ -290,15 +290,18 @@ def mixing(well: Well, pip: InstrumentContext, mvol: float, reps: int = 8) -> No def lysis(vol: float, source: Well) -> None: """Lysis.""" - ctx.comment("-----Beginning Lysis Steps-----") - ctx.pause(msg="\n Hello \n - step 1 \n - step 2") + protocol.comment("-----Beginning Lysis Steps-----") num_transfers = math.ceil(vol / 980) - tiptrack(tips) + tipcheck(m1000) + total_lysis_aspirated = 0.0 for i in range(num_cols): src = source tvol = vol / num_transfers # Mix Shield and PK before transferring first time if i == 0: + m1000.liquid_presence_detection = ( + False # turn off liquid detection during mixing + ) for x in range(lysis_rep_1): m1000.aspirate(vol, src.bottom(1)) m1000.dispense(vol, src.bottom(8)) @@ -308,15 +311,14 @@ def lysis(vol: float, source: Well) -> None: m1000.aspirate(tvol, src.bottom(1)) m1000.air_gap(10) m1000.dispense(m1000.current_volume, samples_m[i].top()) - + total_lysis_aspirated += tvol * 8 # Mix shield and pk with samples for i in range(num_cols): if i != 0: - tiptrack(tips) + tipcheck(m1000) mixing(samples_m[i], m1000, tvol, reps=lysis_rep_2) m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, lysis_incubation, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, lysis_incubation, True) def bind(vol1: float, vol2: float) -> None: """Binding. @@ -334,9 +336,9 @@ def bind(vol1: float, vol2: float) -> None: supernatant to the final clean elutions PCR plate. """ - ctx.comment("-----Beginning Binding Steps-----") + protocol.comment("-----Beginning Binding Steps-----") for i, well in enumerate(samples_m): - tiptrack(tips) + tipcheck(m1000) num_trans = math.ceil(vol1 / 980) vol_per_trans = vol1 / num_trans source = binding_buffer[i // 2] @@ -360,15 +362,19 @@ def bind(vol1: float, vol2: float) -> None: m1000.air_gap(10) m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed * 0.9, bind_time_1, True) + helpers.set_hs_speed( + protocol, h_s, heater_shaker_speed * 0.9, bind_time_1, True + ) # Transfer from H-S plate to Magdeck plate - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) for bindi in np.arange( settling_time + 1, 0, -0.5 ): # Settling time delay with countdown timer - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(bindi) + " minutes left in the incubation.", ) @@ -376,8 +382,8 @@ def bind(vol1: float, vol2: float) -> None: # remove initial supernatant remove_supernatant(vol1 + starting_vol) - ctx.comment("-----Beginning Bind #2 Steps-----") - tiptrack(tips) + protocol.comment("-----Beginning Bind #2 Steps-----") + tipcheck(m1000) for i, well in enumerate(samples_m): num_trans = math.ceil(vol2 / 980) vol_per_trans = vol2 / num_trans @@ -402,20 +408,22 @@ def bind(vol1: float, vol2: float) -> None: for i in range(num_cols): if i != 0: - tiptrack(tips) + tipcheck(m1000) bead_mixing( samples_m[i], m1000, vol_per_trans, reps=3 if not dry_run else 1 ) m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, bind_time_2, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, bind_time_2, True) # Transfer from H-S plate to Magdeck plate - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) for bindi in np.arange( settling_time + 1, 0, -0.5 ): # Settling time delay with countdown timer - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(bindi) + " minutes left in the incubation.", ) @@ -426,52 +434,43 @@ def bind(vol1: float, vol2: float) -> None: def wash(vol: float, source: List[Well]) -> None: """Wash Steps.""" global whichwash # Defines which wash the protocol is on to log on the app - - if source == wash1: - whichwash = 1 - const = 6 // len(source) - if source == wash2: - whichwash = 2 - const = 6 // len(source) - height = 1 - if source == wash3: - whichwash = 3 - const = 6 // len(source) - height = 1 - - ctx.comment("-----Wash #" + str(whichwash) + " is starting now------") + protocol.comment("-----Now starting Wash #" + str(whichwash) + "-----") + global wash_volume_tracker num_trans = math.ceil(vol / 980) vol_per_trans = vol / num_trans - tiptrack(tips) + tipcheck(m1000) for i, m in enumerate(samples_m): - if source == wash1: - if i == 0 or i == 3: - height = 10 - else: - height = 1 - src = source[i // const] + src = source[whichwash] for n in range(num_trans): if m1000.current_volume > 0: m1000.dispense(m1000.current_volume, src.top()) m1000.require_liquid_presence(src) m1000.transfer( vol_per_trans, - src.bottom(height), + src.bottom(dot_bottom), m.top(), air_gap=20, new_tip="never", ) + wash_volume_tracker += vol_per_trans * 8 + if wash_volume_tracker >= 9600: + whichwash += 1 + src = source[whichwash] + protocol.comment(f"new wash source {whichwash}") + wash_volume_tracker = 0.0 m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed * 0.9, wash_time, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed * 0.9, wash_time, True) - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) for washi in np.arange( settling_time, 0, -0.5 ): # settling time timer for washes - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(washi) @@ -483,27 +482,30 @@ def wash(vol: float, source: List[Well]) -> None: remove_supernatant(vol) def elute(vol: float) -> None: - tiptrack(tips) + tipcheck(m1000) + total_elution_vol = 0.0 for i, m in enumerate(samples_m): m1000.require_liquid_presence(elution_solution) m1000.aspirate(vol, elution_solution) m1000.air_gap(20) m1000.dispense(m1000.current_volume, m.top(-3)) + total_elution_vol += vol * 8 m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed * 0.9, wash_time, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed * 0.9, wash_time, True) # Transfer back to magnet - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) for elutei in np.arange(settling_time, 0, -0.5): - ctx.delay( + protocol.delay( minutes=0.5, msg="Incubating on MagDeck for " + str(elutei) + " more minutes.", ) for i, (m, e) in enumerate(zip(samples_m, elution_samples_m)): - tiptrack(tips) + tipcheck(m1000) m1000.flow_rate.dispense = 100 m1000.flow_rate.aspirate = 25 m1000.transfer( @@ -521,16 +523,23 @@ def elute(vol: float) -> None: """ lysis(lysis_vol, lysis_) bind(binding_buffer_vol, bind2_vol) - wash(wash1_vol, wash1) - wash(wash2_vol, wash2) - wash(wash3_vol, wash3) + wash(wash1_vol, all_washes) + wash(wash2_vol, all_washes) + wash(wash3_vol, all_washes) h_s.set_and_wait_for_temperature(55) for beaddry in np.arange(drybeads, 0, -0.5): - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(beaddry) + " minutes left in the drying step.", ) elute(elution_vol) h_s.deactivate_heater() - flattened_list_of_wells.extend([waste_reservoir["A1"], elutionplate["A1"]]) - helpers.find_liquid_height_of_all_wells(ctx, m1000, flattened_list_of_wells) + helpers.clean_up_plates( + m1000, + [elutionplate, sample_plate, res1, res3, res2], + waste_reservoir["A1"], + 1000, + ) + helpers.find_liquid_height_of_all_wells(protocol, m1000, [waste_reservoir["A1"]]) + if deactivate_modules_bool: + helpers.deactivate_modules(protocol) diff --git a/abr-testing/abr_testing/protocols/active_protocols/11_Dynabeads_IP_Flex_96well_RIT.py b/abr-testing/abr_testing/protocols/active_protocols/11_Dynabeads_IP_Flex_96well_RIT.py index e885ec45a5e..44db654cc1f 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/11_Dynabeads_IP_Flex_96well_RIT.py +++ b/abr-testing/abr_testing/protocols/active_protocols/11_Dynabeads_IP_Flex_96well_RIT.py @@ -1,5 +1,5 @@ """Immunoprecipitation by Dynabeads.""" -from opentrons.protocol_api import ProtocolContext, ParameterContext, Well +from opentrons.protocol_api import ProtocolContext, ParameterContext, Well, Labware from opentrons.protocol_api.module_contexts import ( HeaterShakerContext, TemperatureModuleContext, @@ -15,7 +15,7 @@ } requirements = { - "robotType": "OT-3", + "robotType": "Flex", "apiLevel": "2.21", } @@ -25,6 +25,7 @@ def add_parameters(parameters: ParameterContext) -> None: helpers.create_hs_speed_parameter(parameters) helpers.create_two_pipette_mount_parameters(parameters) helpers.create_dot_bottom_parameter(parameters) + helpers.create_deactivate_modules_parameter(parameters) NUM_COL = 12 @@ -34,7 +35,7 @@ def add_parameters(parameters: ParameterContext) -> None: BEADS_VOL = 50 AB_VOL = 50 SAMPLE_VOL = 200 -WASH_TIMES = 3 +WASH_TIMES = 6 WASH_VOL = 200 ELUTION_VOL = 50 @@ -48,64 +49,78 @@ def add_parameters(parameters: ParameterContext) -> None: TIP_TRASH = False -def run(ctx: ProtocolContext) -> None: +def run(protocol: ProtocolContext) -> None: """Protocol.""" # defining variables inside def run - heater_shaker_speed = ctx.params.heater_shaker_speed # type: ignore[attr-defined] - ASP_HEIGHT = ctx.params.dot_bottom # type: ignore[attr-defined] - single_channel_mount = ctx.params.pipette_mount_1 # type: ignore[attr-defined] - eight_channel_mount = ctx.params.pipette_mount_2 # type: ignore[attr-defined] + heater_shaker_speed = protocol.params.heater_shaker_speed # type: ignore[attr-defined] + ASP_HEIGHT = protocol.params.dot_bottom # type: ignore[attr-defined] + single_channel_mount = protocol.params.pipette_mount_1 # type: ignore[attr-defined] + eight_channel_mount = protocol.params.pipette_mount_2 # type: ignore[attr-defined] + deactivate_modules_bool = protocol.params.deactivate_modules # type: ignore[attr-defined] + helpers.comment_protocol_version(protocol, "01") + MIX_SPEED = heater_shaker_speed MIX_SEC = 10 # if on deck: - INCUBATION_SPEEND = heater_shaker_speed * 0.5 + INCUBATION_SPEED = heater_shaker_speed * 0.5 INCUBATION_MIN = 60 # load labware - sample_plate = ctx.load_labware("nest_96_wellplate_2ml_deep", "B2", "samples") - wash_res = ctx.load_labware("nest_12_reservoir_15ml", "B1", "wash") - reagent_res = ctx.load_labware( + sample_plate_1 = protocol.load_labware( + "nest_96_wellplate_2ml_deep", "B2", "sample plate 1" + ) + sample_plate_2 = protocol.load_labware( + "nest_96_wellplate_2ml_deep", "C4", "sample plate 2" + ) + + wash_res = protocol.load_labware("nest_12_reservoir_15ml", "B1", "wash") + reagent_res = protocol.load_labware( "opentrons_15_tuberack_nest_15ml_conical", "C3", "reagents" ) - waste_res = ctx.load_labware("nest_1_reservoir_290ml", "D2", "waste") + waste_res = protocol.load_labware("nest_1_reservoir_290ml", "D2", "Liquid Waste") - tips = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "B3") - tips_sample = ctx.load_labware( + tips = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "B3") + tips_sample = protocol.load_labware( "opentrons_flex_96_tiprack_1000ul", "A2", "sample tips" ) tips_sample_loc = tips_sample.wells()[:95] if READY_FOR_SDSPAGE == 0: - tips_elu = ctx.load_labware( + tips_elu = protocol.load_labware( "opentrons_flex_96_tiprack_1000ul", "A1", "elution tips" ) tips_elu_loc = tips_elu.wells()[:95] - tips_reused = ctx.load_labware( + tips_reused = protocol.load_labware( "opentrons_flex_96_tiprack_1000ul", "C2", "reused tips" ) tips_reused_loc = tips_reused.wells()[:95] - p1000 = ctx.load_instrument( + p1000 = protocol.load_instrument( "flex_8channel_1000", eight_channel_mount, tip_racks=[tips] ) - p1000_single = ctx.load_instrument( + p1000_single = protocol.load_instrument( "flex_1channel_1000", single_channel_mount, tip_racks=[tips] ) - h_s: HeaterShakerContext = ctx.load_module(helpers.hs_str, "D1") # type: ignore[assignment] + h_s: HeaterShakerContext = protocol.load_module( + helpers.hs_str, "D1" + ) # type: ignore[assignment] working_plate, h_s_adapter = helpers.load_hs_adapter_and_labware( "nest_96_wellplate_2ml_deep", h_s, "Working Plate" ) if READY_FOR_SDSPAGE == 0: - temp: TemperatureModuleContext = ctx.load_module( + temp: TemperatureModuleContext = protocol.load_module( helpers.temp_str, "D3" ) # type: ignore[assignment] final_plate, temp_adapter = helpers.load_temp_adapter_and_labware( "nest_96_wellplate_2ml_deep", temp, "Final Plate" ) - mag: MagneticBlockContext = ctx.load_module(helpers.mag_str, "C1") # type: ignore[assignment] + mag: MagneticBlockContext = protocol.load_module( + helpers.mag_str, "C1" + ) # type: ignore[assignment] # liquids - samples = sample_plate.rows()[0][:NUM_COL] # 1 + samples1 = sample_plate_1.rows()[0][:NUM_COL] # 1 + samples2 = sample_plate_2.rows()[0][:NUM_COL] # 1 beads = reagent_res.wells()[0] # 2 ab = reagent_res.wells()[1] # 3 elu = reagent_res.wells()[2] # 4 @@ -119,14 +134,15 @@ def run(ctx: ProtocolContext) -> None: liquid_vols_and_wells: Dict[ str, List[Dict[str, Union[Well, List[Well], float]]] ] = { - "Beads": [{"well": beads, "volume": 4900.0}], - "AB": [{"well": ab, "volume": 4900.0}], - "Elution": [{"well": elu, "volume": 4900.0}], - "Wash": [{"well": wash, "volume": 750.0}], - "Samples": [{"well": samples, "volume": 250.0}], + "Beads": [{"well": beads, "volume": 9800.0}], + "AB": [{"well": ab, "volume": 9800.0}], + "Elution": [{"well": elu, "volume": 9800.0}], + "Wash": [{"well": wash, "volume": 1500.0}], + "Samples 1": [{"well": samples1, "volume": 250.0}], + "Samples 2": [{"well": samples2, "volume": 250.0}], } helpers.find_liquid_height_of_loaded_liquids( - ctx, liquid_vols_and_wells, p1000_single + protocol, liquid_vols_and_wells, p1000_single ) def transfer_plate_to_plate( @@ -193,9 +209,6 @@ def discard(vol3: float, start: List[Well]) -> None: """Discard function.""" global waste_vol global waste_vol_chk - if waste_vol_chk >= WASTE_VOL_MAX: - ctx.pause("Empty Liquid Waste") - waste_vol_chk = 0 waste_vol = 0.0 for k in range(NUM_COL): p1000.pick_up_tip(tips_reused_loc[k * 8]) @@ -210,64 +223,77 @@ def discard(vol3: float, start: List[Well]) -> None: waste_vol_chk = waste_vol_chk + waste_vol # protocol - - # Add beads, samples and antibody solution - h_s.close_labware_latch() - transfer_well_to_plate(BEADS_VOL, beads, working_wells, 2) - - helpers.move_labware_from_hs_to_destination(ctx, working_plate, h_s, mag) - - ctx.delay(minutes=MAG_DELAY_MIN) - discard(BEADS_VOL * 1.1, working_cols) - - helpers.move_labware_to_hs(ctx, working_plate, h_s, h_s_adapter) - - transfer_plate_to_plate(SAMPLE_VOL, samples, working_cols, 1) - transfer_well_to_plate(AB_VOL, ab, working_wells, 3) - - h_s.set_and_wait_for_shake_speed(rpm=MIX_SPEED) - ctx.delay(seconds=MIX_SEC) - - h_s.set_and_wait_for_shake_speed(rpm=INCUBATION_SPEEND) - ctx.delay(seconds=INCUBATION_MIN * 60) - h_s.deactivate_shaker() - - helpers.move_labware_from_hs_to_destination(ctx, working_plate, h_s, mag) - - ctx.delay(minutes=MAG_DELAY_MIN) - vol_total = SAMPLE_VOL + AB_VOL - discard(vol_total * 1.1, working_cols) - - # Wash - for _ in range(WASH_TIMES): - helpers.move_labware_to_hs(ctx, working_plate, h_s, h_s_adapter) - - transfer_well_to_plate(WASH_VOL, wash, working_cols, 5) - helpers.set_hs_speed(ctx, h_s, MIX_SPEED, MIX_SEC / 60, True) - helpers.move_labware_from_hs_to_destination(ctx, working_plate, h_s, mag) - ctx.delay(minutes=MAG_DELAY_MIN) - discard(WASH_VOL * 1.1, working_cols) - - # Elution - helpers.move_labware_to_hs(ctx, working_plate, h_s, h_s_adapter) - - transfer_well_to_plate(ELUTION_VOL, elu, working_wells, 4) - if READY_FOR_SDSPAGE == 1: - ctx.pause("Seal the Working Plate") - h_s.set_and_wait_for_temperature(70) - helpers.set_hs_speed(ctx, h_s, MIX_SPEED, (MIX_SEC / 60) + 10, True) - h_s.deactivate_heater() - h_s.open_labware_latch() - ctx.pause("Protocol Complete") - - elif READY_FOR_SDSPAGE == 0: - helpers.set_hs_speed(ctx, h_s, MIX_SPEED, (MIX_SEC / 60) + 2, True) - - temp.set_temperature(4) - helpers.move_labware_from_hs_to_destination(ctx, working_plate, h_s, mag) - ctx.delay(minutes=MAG_DELAY_MIN) - transfer_plate_to_plate(ELUTION_VOL * 1.1, working_cols, final_cols, 6) - temp.deactivate() - end_wells_to_probe = [reagent_res["A1"], reagent_res["B1"], reagent_res["C1"]] - end_wells_to_probe.extend(wash_res.wells()) - helpers.find_liquid_height_of_all_wells(ctx, p1000_single, end_wells_to_probe) + def run(sample_plate: Labware) -> None: + """Protocol.""" + # Add beads, samples and antibody solution + samples = sample_plate.rows()[0][:NUM_COL] # 1 + h_s.close_labware_latch() + transfer_well_to_plate(BEADS_VOL, beads, working_wells, 2) + + helpers.move_labware_from_hs_to_destination(protocol, working_plate, h_s, mag) + + protocol.delay(minutes=MAG_DELAY_MIN) + discard(BEADS_VOL * 1.1, working_cols) + + helpers.move_labware_to_hs(protocol, working_plate, h_s, h_s_adapter) + + transfer_plate_to_plate(SAMPLE_VOL, samples, working_cols, 1) + transfer_well_to_plate(AB_VOL, ab, working_wells, 3) + + h_s.set_and_wait_for_shake_speed(rpm=MIX_SPEED) + protocol.delay(seconds=MIX_SEC) + + h_s.set_and_wait_for_shake_speed(rpm=INCUBATION_SPEED) + protocol.delay(seconds=INCUBATION_MIN * 60) + h_s.deactivate_shaker() + + helpers.move_labware_from_hs_to_destination(protocol, working_plate, h_s, mag) + + protocol.delay(minutes=MAG_DELAY_MIN) + vol_total = SAMPLE_VOL + AB_VOL + discard(vol_total * 1.1, working_cols) + + # Wash + for _ in range(WASH_TIMES): + helpers.move_labware_to_hs(protocol, working_plate, h_s, h_s_adapter) + + transfer_well_to_plate(WASH_VOL, wash, working_cols, 5) + helpers.set_hs_speed(protocol, h_s, MIX_SPEED, MIX_SEC / 60, True) + helpers.move_labware_from_hs_to_destination( + protocol, working_plate, h_s, mag + ) + protocol.delay(minutes=MAG_DELAY_MIN) + discard(WASH_VOL * 1.1, working_cols) + # Elution + helpers.move_labware_to_hs(protocol, working_plate, h_s, h_s_adapter) + transfer_well_to_plate(ELUTION_VOL, elu, working_wells, 4) + if READY_FOR_SDSPAGE == 1: + protocol.pause("Seal the Working Plate") + h_s.set_and_wait_for_temperature(70) + helpers.set_hs_speed(protocol, h_s, MIX_SPEED, (MIX_SEC / 60) + 10, True) + h_s.deactivate_heater() + h_s.open_labware_latch() + protocol.pause("Protocol Complete") + elif READY_FOR_SDSPAGE == 0: + helpers.set_hs_speed(protocol, h_s, MIX_SPEED, (MIX_SEC / 60) + 2, True) + + temp.set_temperature(4) + helpers.move_labware_from_hs_to_destination( + protocol, working_plate, h_s, mag + ) + protocol.delay(minutes=MAG_DELAY_MIN) + transfer_plate_to_plate(ELUTION_VOL * 1.1, working_cols, final_cols, 6) + temp.deactivate() + helpers.clean_up_plates(p1000_single, [sample_plate], waste, 1000) + helpers.move_labware_to_hs(protocol, working_plate, h_s, h_s_adapter) + + run(sample_plate_1) + # swap plates + protocol.move_labware(sample_plate_1, "B4", True) + protocol.move_labware(sample_plate_2, "B2", True) + run(sample_plate_2) + + helpers.clean_up_plates(p1000_single, [wash_res], waste, 1000) + helpers.find_liquid_height_of_all_wells(protocol, p1000_single, [waste_res["A1"]]) + if deactivate_modules_bool: + helpers.deactivate_modules(protocol) diff --git a/abr-testing/abr_testing/protocols/active_protocols/12_KAPA HyperPlus Library Prep.py b/abr-testing/abr_testing/protocols/active_protocols/12_KAPA HyperPlus Library Prep.py index 75658f11438..ff38e8cf7c7 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/12_KAPA HyperPlus Library Prep.py +++ b/abr-testing/abr_testing/protocols/active_protocols/12_KAPA HyperPlus Library Prep.py @@ -18,7 +18,7 @@ metadata = { "protocolName": "KAPA HyperPlus Library Preparation", - "author": "Your Name ", + "author": "Tony Ngumah ", } requirements = {"robotType": "Flex", "apiLevel": "2.21"} @@ -41,6 +41,7 @@ def add_parameters(parameters: ParameterContext) -> None: helpers.create_disposable_lid_parameter(parameters) helpers.create_tc_lid_deck_riser_parameter(parameters) helpers.create_two_pipette_mount_parameters(parameters) + helpers.create_deactivate_modules_parameter(parameters) parameters.add_int( variable_name="num_samples", display_name="number of samples", @@ -68,22 +69,25 @@ def add_parameters(parameters: ParameterContext) -> None: ) -def run(ctx: ProtocolContext) -> None: +def run(protocol: ProtocolContext) -> None: """Protocol.""" USE_GRIPPER = True - trash_tips = ctx.params.trash_tips # type: ignore[attr-defined] - dry_run = ctx.params.dry_run # type: ignore[attr-defined] - pipette_1000_mount = ctx.params.pipette_mount_1 # type: ignore[attr-defined] - pipette_50_mount = ctx.params.pipette_mount_2 # type: ignore[attr-defined] - deck_riser = ctx.params.deck_riser # type: ignore[attr-defined] + deactivate_mods = protocol.params.deactivate_modules # type: ignore[attr-defined] + trash_tips = protocol.params.trash_tips # type: ignore[attr-defined] + dry_run = protocol.params.dry_run # type: ignore[attr-defined] + pipette_1000_mount = protocol.params.pipette_mount_1 # type: ignore[attr-defined] + pipette_50_mount = protocol.params.pipette_mount_2 # type: ignore[attr-defined] + deck_riser = protocol.params.deck_riser # type: ignore[attr-defined] + helpers.comment_protocol_version(protocol, "01") + REUSE_ETOH_TIPS = True REUSE_RSB_TIPS = ( True # Reuse tips for RSB buffer (adding RSB, mixing, and transferring) ) REUSE_REMOVE_TIPS = True # Reuse tips for supernatant removal - num_samples = ctx.params.num_samples # type: ignore[attr-defined] - PCRCYCLES = ctx.params.PCR_CYCLES # type: ignore[attr-defined] - disposable_lid = ctx.params.disposable_lid # type: ignore[attr-defined] + num_samples = protocol.params.num_samples # type: ignore[attr-defined] + PCRCYCLES = protocol.params.PCR_CYCLES # type: ignore[attr-defined] + disposable_lid = protocol.params.disposable_lid # type: ignore[attr-defined] Fragmentation_time = 10 ligation_tc_time = 15 used_lids: List[Labware] = [] @@ -111,10 +115,10 @@ def run(ctx: ProtocolContext) -> None: # etoh_vol = 400.0 # Importing Labware, Modules and Instruments - magblock: MagneticBlockContext = ctx.load_module( + magblock: MagneticBlockContext = protocol.load_module( helpers.mag_str, "D2" ) # type: ignore[assignment] - temp_mod: TemperatureModuleContext = ctx.load_module( + temp_mod: TemperatureModuleContext = protocol.load_module( helpers.temp_str, "B3" ) # type: ignore[assignment] temp_plate, temp_adapter = helpers.load_temp_adapter_and_labware( @@ -125,7 +129,7 @@ def run(ctx: ProtocolContext) -> None: if not dry_run: temp_mod.set_temperature(4) - tc_mod: ThermocyclerContext = ctx.load_module(helpers.tc_str) # type: ignore[assignment] + tc_mod: ThermocyclerContext = protocol.load_module(helpers.tc_str) # type: ignore[assignment] # Just in case tc_mod.open_lid() @@ -134,32 +138,32 @@ def run(ctx: ProtocolContext) -> None: ) samples_flp = FLP_plate.rows()[0][:num_cols] - sample_plate = ctx.load_labware( + sample_plate = protocol.load_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt", "D1", "Sample Plate 1" ) - sample_plate_2 = ctx.load_labware( + sample_plate_2 = protocol.load_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt", "B2", "Sample Plate 2" ) samples_2 = sample_plate_2.rows()[0][:num_cols] samples = sample_plate.rows()[0][:num_cols] - reservoir = ctx.load_labware( + reservoir = protocol.load_labware( "nest_96_wellplate_2ml_deep", "C2", "Beads + Buffer + Ethanol" ) # Load tipracks - tiprack_50_1 = ctx.load_labware("opentrons_flex_96_tiprack_50ul", "A3") - tiprack_50_2 = ctx.load_labware("opentrons_flex_96_tiprack_50ul", "A2") + tiprack_50_1 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "A3") + tiprack_50_2 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "A2") - tiprack_200_1 = ctx.load_labware("opentrons_flex_96_tiprack_200ul", "C1") - tiprack_200_2 = ctx.load_labware("opentrons_flex_96_tiprack_200ul", "C3") + tiprack_200_1 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "C1") + tiprack_200_2 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "C3") if trash_tips: - ctx.load_waste_chute() + protocol.load_waste_chute() unused_lids: List[Labware] = [] # Load TC Lids if disposable_lid: - unused_lids = helpers.load_disposable_lids(ctx, 5, ["C4"], deck_riser) + unused_lids = helpers.load_disposable_lids(protocol, 5, ["C4"], deck_riser) # Import Global Variables global tip50 @@ -168,12 +172,12 @@ def run(ctx: ProtocolContext) -> None: global p200_rack_count tip_count = {1000: 0, 50: 0} - p200 = ctx.load_instrument( + p200 = protocol.load_instrument( "flex_8channel_1000", pipette_1000_mount, tip_racks=[tiprack_200_1, tiprack_200_2], ) - p50 = ctx.load_instrument( + p50 = protocol.load_instrument( "flex_8channel_50", pipette_50_mount, tip_racks=[tiprack_50_1, tiprack_50_2] ) @@ -224,7 +228,7 @@ def run(ctx: ProtocolContext) -> None: waste2 = reservoir.columns()[7] waste2_res = waste2[0] - helpers.find_liquid_height_of_loaded_liquids(ctx, liquid_vols_and_wells, p50) + helpers.find_liquid_height_of_loaded_liquids(protocol, liquid_vols_and_wells, p50) def tip_track(pipette: InstrumentContext, tip_count: Dict) -> None: """Track tip usage.""" @@ -248,19 +252,19 @@ def run_tag_profile( ) -> Tuple[List[Labware], List[Labware]]: """Run Tag Profile.""" # Presetting Thermocycler Temps - ctx.comment( + protocol.comment( "****Starting Fragmentation Profile (37C for 10 minutes with 100C lid)****" ) tc_mod.set_lid_temperature(100) tc_mod.set_block_temperature(37) # Move Plate to TC - ctx.comment("****Moving Plate to Pre-Warmed TC Module Block****") - ctx.move_labware(sample_plate, tc_mod, use_gripper=USE_GRIPPER) + protocol.comment("****Moving Plate to Pre-Warmed TC Module Block****") + protocol.move_labware(sample_plate, tc_mod, use_gripper=USE_GRIPPER) if disposable_lid: lid_on_plate, unused_lids, used_lids = helpers.use_disposable_lid_with_tc( - ctx, unused_lids, used_lids, sample_plate, tc_mod + protocol, unused_lids, used_lids, sample_plate, tc_mod ) else: tc_mod.close_lid() @@ -271,13 +275,13 @@ def run_tag_profile( if disposable_lid: if len(used_lids) <= 1: - ctx.move_labware(lid_on_plate, "D4", use_gripper=True) + protocol.move_labware(lid_on_plate, "D4", use_gripper=True) else: - ctx.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) + protocol.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) # #Move Plate to H-S - ctx.comment("****Moving Plate off of TC****") + protocol.comment("****Moving Plate off of TC****") - ctx.move_labware(sample_plate, "D1", use_gripper=USE_GRIPPER) + protocol.move_labware(sample_plate, "D1", use_gripper=USE_GRIPPER) return unused_lids, used_lids def run_er_profile( @@ -285,19 +289,19 @@ def run_er_profile( ) -> Tuple[List[Labware], List[Labware]]: """End Repair Profile.""" # Presetting Thermocycler Temps - ctx.comment( + protocol.comment( "****Starting End Repair Profile (65C for 30 minutes with 100C lid)****" ) tc_mod.set_lid_temperature(100) tc_mod.set_block_temperature(65) # Move Plate to TC - ctx.comment("****Moving Plate to Pre-Warmed TC Module Block****") - ctx.move_labware(sample_plate, tc_mod, use_gripper=USE_GRIPPER) + protocol.comment("****Moving Plate to Pre-Warmed TC Module Block****") + protocol.move_labware(sample_plate, tc_mod, use_gripper=USE_GRIPPER) if disposable_lid: lid_on_plate, unused_lids, used_lids = helpers.use_disposable_lid_with_tc( - ctx, unused_lids, used_lids, sample_plate, tc_mod + protocol, unused_lids, used_lids, sample_plate, tc_mod ) else: tc_mod.close_lid() @@ -311,13 +315,13 @@ def run_er_profile( if disposable_lid: # move lid if len(used_lids) <= 1: - ctx.move_labware(lid_on_plate, "C4", use_gripper=True) + protocol.move_labware(lid_on_plate, "C4", use_gripper=True) else: - ctx.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) + protocol.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) # #Move Plate to H-S - ctx.comment("****Moving Plate off of TC****") + protocol.comment("****Moving Plate off of TC****") - ctx.move_labware(sample_plate, "D1", use_gripper=USE_GRIPPER) + protocol.move_labware(sample_plate, "D1", use_gripper=USE_GRIPPER) return unused_lids, used_lids def run_ligation_profile( @@ -325,20 +329,20 @@ def run_ligation_profile( ) -> Tuple[List[Labware], List[Labware]]: """Run Ligation Profile.""" # Presetting Thermocycler Temps - ctx.comment( + protocol.comment( "****Starting Ligation Profile (20C for 15 minutes with 100C lid)****" ) tc_mod.set_lid_temperature(100) tc_mod.set_block_temperature(20) # Move Plate to TC - ctx.comment("****Moving Plate to Pre-Warmed TC Module Block****") + protocol.comment("****Moving Plate to Pre-Warmed TC Module Block****") - ctx.move_labware(sample_plate, tc_mod, use_gripper=USE_GRIPPER) + protocol.move_labware(sample_plate, tc_mod, use_gripper=USE_GRIPPER) if disposable_lid: lid_on_plate, unused_lids, used_lids = helpers.use_disposable_lid_with_tc( - ctx, unused_lids, used_lids, sample_plate, tc_mod + protocol, unused_lids, used_lids, sample_plate, tc_mod ) else: tc_mod.close_lid() @@ -353,14 +357,14 @@ def run_ligation_profile( tc_mod.open_lid() if disposable_lid: if len(used_lids) <= 1: - ctx.move_labware(lid_on_plate, "C4", use_gripper=True) + protocol.move_labware(lid_on_plate, "C4", use_gripper=True) else: - ctx.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) + protocol.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) # #Move Plate to H-S - ctx.comment("****Moving Plate off of TC****") + protocol.comment("****Moving Plate off of TC****") - ctx.move_labware(sample_plate, "D1", use_gripper=USE_GRIPPER) + protocol.move_labware(sample_plate, "D1", use_gripper=USE_GRIPPER) return unused_lids, used_lids def run_amplification_profile( @@ -368,27 +372,27 @@ def run_amplification_profile( ) -> Tuple[List[Labware], List[Labware]]: """Run Amplification Profile.""" # Presetting Thermocycler Temps - ctx.comment( + protocol.comment( "Amplification Profile (37C for 5 min, 50C for 5 min with 100C lid)" ) tc_mod.set_lid_temperature(100) tc_mod.set_block_temperature(98) # Move Plate to TC - ctx.comment("****Moving Sample Plate onto TC****") - ctx.move_labware(sample_plate_2, tc_mod, use_gripper=USE_GRIPPER) + protocol.comment("****Moving Sample Plate onto TC****") + protocol.move_labware(sample_plate_2, tc_mod, use_gripper=USE_GRIPPER) if not dry_run: tc_mod.set_lid_temperature(105) if disposable_lid: lid_on_plate, unused_lids, used_lids = helpers.use_disposable_lid_with_tc( - ctx, unused_lids, used_lids, sample_plate_2, tc_mod + protocol, unused_lids, used_lids, sample_plate_2, tc_mod ) else: tc_mod.close_lid() if not dry_run: helpers.perform_pcr( - ctx, + protocol, tc_mod, initial_denature_time_sec=45, denaturation_time_sec=15, @@ -401,16 +405,16 @@ def run_amplification_profile( tc_mod.open_lid() if disposable_lid: if len(used_lids) <= 1: - ctx.move_labware(lid_on_plate, "C4", use_gripper=True) + protocol.move_labware(lid_on_plate, "C4", use_gripper=True) else: - ctx.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) + protocol.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) # Move Sample Plate to H-S - ctx.comment("****Moving Sample Plate back to H-S****") - ctx.move_labware(sample_plate_2, "D1", use_gripper=USE_GRIPPER) + protocol.comment("****Moving Sample Plate back to H-S****") + protocol.move_labware(sample_plate_2, "D1", use_gripper=USE_GRIPPER) # get FLP plate out of the way - ctx.comment("****Moving FLP Plate back to TC****") - ctx.move_labware(FLP_plate, tc_mod, use_gripper=USE_GRIPPER) + protocol.comment("****Moving FLP Plate back to TC****") + protocol.move_labware(FLP_plate, tc_mod, use_gripper=USE_GRIPPER) return unused_lids, used_lids def mix_beads( @@ -463,39 +467,39 @@ def mix_beads( def remove_supernatant(well: Well, vol: float, waste_: Well, column: int) -> None: """Remove supernatant.""" - ctx.comment("-------Removing " + str(vol) + "ul of Supernatant-------") + protocol.comment("-------Removing " + str(vol) + "ul of Supernatant-------") p200.flow_rate.aspirate = 15 num_trans = math.ceil(vol / 190) vol_per_trans = vol / num_trans tip_track(p200, tip_count) for x in range(num_trans): p200.aspirate(vol_per_trans / 2, well.bottom(0.2)) - ctx.delay(seconds=1) + protocol.delay(seconds=1) p200.aspirate(vol_per_trans / 2, well.bottom(0.2)) p200.air_gap(10) p200.dispense(p200.current_volume, waste_) p200.air_gap(10) if REUSE_REMOVE_TIPS: p200.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") else: if trash_tips: p200.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p200.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") p200.flow_rate.aspirate = 150 def Fragmentation( unused_lids: List[Labware], used_lids: List[Labware] ) -> Tuple[List[Labware], List[Labware]]: """Fragmentation Function.""" - ctx.comment("-------Starting Fragmentation-------") + protocol.comment("-------Starting Fragmentation-------") for i in range(num_cols): - ctx.comment("Mixing and Transfering beads to column " + str(i + 1)) + protocol.comment("Mixing and Transfering beads to column " + str(i + 1)) p50.flow_rate.dispense = 15 tip_track(p50, tip_count) @@ -512,10 +516,10 @@ def Fragmentation( p50.flow_rate.dispense = 150 if trash_tips: p50.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") unused_lids, used_lids = run_tag_profile( unused_lids, used_lids @@ -526,11 +530,11 @@ def end_repair( unused_lids: List[Labware], used_lids: List[Labware] ) -> Tuple[List[Labware], List[Labware]]: """End Repair Function.""" - ctx.comment("-------Starting end_repair-------") + protocol.comment("-------Starting end_repair-------") for i in range(num_cols): - ctx.comment( + protocol.comment( "**** Mixing and Transfering beads to column " + str(i + 1) + " ****" ) @@ -549,10 +553,10 @@ def end_repair( p50.flow_rate.dispense = 150 if trash_tips: p50.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") unused_lids, used_lids = run_er_profile( unused_lids, used_lids @@ -565,8 +569,8 @@ def index_ligation( unused_lids: List[Labware], used_lids: List[Labware] ) -> Tuple[List[Labware], List[Labware]]: """Index Ligation.""" - ctx.comment("-------Ligating Indexes-------") - ctx.comment("-------Adding and Mixing ELM-------") + protocol.comment("-------Ligating Indexes-------") + protocol.comment("-------Adding and Mixing ELM-------") for i in samples: tip_track(p50, tip_count) p50.aspirate(ligation_vol, ligation_res) @@ -581,13 +585,13 @@ def index_ligation( p50.flow_rate.dispense = 150 if trash_tips: p50.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") # Add and mix adapters - ctx.comment("-------Adding and Mixing Adapters-------") + protocol.comment("-------Adding and Mixing Adapters-------") for i_well, x_well in zip(samples, adapters): tip_track(p50, tip_count) p50.aspirate(adapter_vol, x_well) @@ -600,10 +604,10 @@ def index_ligation( p50.dispense(40, i_well.bottom(8)) if trash_tips: p50.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") p50.flow_rate.aspirate = 150 p50.flow_rate.dispense = 150 @@ -613,13 +617,13 @@ def index_ligation( def lib_cleanup() -> None: """Litigation Clean up.""" - ctx.comment("-------Starting Cleanup-------") - ctx.comment("-------Adding and Mixing Cleanup Beads-------") + protocol.comment("-------Starting Cleanup-------") + protocol.comment("-------Adding and Mixing Cleanup Beads-------") # Move FLP plate off magnetic module if it's there if FLP_plate.parent == magblock: - ctx.comment("****Moving FLP Plate off Magnetic Module****") - ctx.move_labware(FLP_plate, tc_mod, use_gripper=USE_GRIPPER) + protocol.comment("****Moving FLP Plate off Magnetic Module****") + protocol.move_labware(FLP_plate, tc_mod, use_gripper=USE_GRIPPER) for x, i in enumerate(samples): mix_beads(p200, bead_res, bead_vol_1, 7 if x == 0 else 2, x) @@ -636,22 +640,22 @@ def lib_cleanup() -> None: p200.flow_rate.dispense = 150 if trash_tips: p200.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p200.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") - ctx.delay( + protocol.delay( minutes=bead_inc, msg="Please wait " + str(bead_inc) + " minutes while samples incubate at RT.", ) - ctx.comment("****Moving Labware to Magnet for Pelleting****") - ctx.move_labware(sample_plate, magblock, use_gripper=USE_GRIPPER) + protocol.comment("****Moving Labware to Magnet for Pelleting****") + protocol.move_labware(sample_plate, magblock, use_gripper=USE_GRIPPER) - ctx.delay(minutes=4.5, msg="Time for Pelleting") + protocol.delay(minutes=4.5, msg="Time for Pelleting") for col, i in enumerate(samples): remove_supernatant(i, 130, waste1_res, col) @@ -661,7 +665,7 @@ def lib_cleanup() -> None: p200.flow_rate.aspirate = 75 p200.flow_rate.dispense = 75 for y in range(2 if not dry_run else 1): - ctx.comment(f"-------Wash # {y+1} with Ethanol-------") + protocol.comment(f"-------Wash # {y+1} with Ethanol-------") if y == 0: # First wash this_res = etoh1_res this_waste_res = waste1_res @@ -672,42 +676,42 @@ def lib_cleanup() -> None: p200.aspirate(150, this_res) p200.air_gap(10) p200.dispense(p200.current_volume, i.top()) - ctx.delay(seconds=1) + protocol.delay(seconds=1) p200.air_gap(10) if not REUSE_ETOH_TIPS: p200.drop_tip() if trash_tips else p200.return_tip() - ctx.delay(seconds=10) + protocol.delay(seconds=10) # Remove the ethanol wash for x, i in enumerate(samp_list): tip_track(p200, tip_count) p200.aspirate(155, i) p200.air_gap(10) p200.dispense(p200.current_volume, this_waste_res) - ctx.delay(seconds=1) + protocol.delay(seconds=1) p200.air_gap(10) if trash_tips: p200.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p200.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") p200.flow_rate.aspirate = 150 p200.flow_rate.dispense = 150 # Wash complete, move on to drying steps. - ctx.delay(minutes=2, msg="Allow 3 minutes for residual ethanol to dry") + protocol.delay(minutes=2, msg="Allow 3 minutes for residual ethanol to dry") # Return Plate to H-S from Magnet - ctx.comment("****Moving sample plate off of Magnet****") - ctx.move_labware(sample_plate, "D1", use_gripper=USE_GRIPPER) + protocol.comment("****Moving sample plate off of Magnet****") + protocol.move_labware(sample_plate, "D1", use_gripper=USE_GRIPPER) # Adding RSB and Mixing for col, i in enumerate(samp_list): - ctx.comment(f"****Adding RSB to Columns: {col+1}****") + protocol.comment(f"****Adding RSB to Columns: {col+1}****") tip_track(p50, tip_count) p50.aspirate(rsb_vol_1, rsb_res) p50.air_gap(5) @@ -723,23 +727,23 @@ def lib_cleanup() -> None: p50.air_gap(5) if REUSE_RSB_TIPS: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") else: if trash_tips: p50.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") - ctx.delay( + protocol.delay( minutes=3, msg="Allow 3 minutes for incubation and liquid aggregation." ) - ctx.comment("****Move Samples to Magnet for Pelleting****") - ctx.move_labware(sample_plate, magblock, use_gripper=USE_GRIPPER) + protocol.comment("****Move Samples to Magnet for Pelleting****") + protocol.move_labware(sample_plate, magblock, use_gripper=USE_GRIPPER) - ctx.delay(minutes=2, msg="Please allow 2 minutes for beads to pellet.") + protocol.delay(minutes=2, msg="Please allow 2 minutes for beads to pellet.") p200.flow_rate.aspirate = 10 for i_int, (s, e) in enumerate(zip(samp_list, samples_2)): @@ -750,31 +754,31 @@ def lib_cleanup() -> None: p50.air_gap(5) if trash_tips: p50.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") # move new sample plate to D1 or heatershaker - ctx.comment("****Moving sample plate off of Magnet****") - ctx.move_labware(sample_plate_2, "D1", use_gripper=USE_GRIPPER) + protocol.comment("****Moving sample plate off of Magnet****") + protocol.move_labware(sample_plate_2, "D1", use_gripper=USE_GRIPPER) # Keep Sample PLate 1 to B2 - ctx.comment("****Moving Sample_plate_1 Plate off magnet to B2****") - ctx.move_labware(sample_plate, "B2", use_gripper=USE_GRIPPER) + protocol.comment("****Moving Sample_plate_1 Plate off magnet to B2****") + protocol.move_labware(sample_plate, "B2", use_gripper=USE_GRIPPER) - ctx.comment("****Moving FLP Plate off TC****") - ctx.move_labware(FLP_plate, magblock, use_gripper=USE_GRIPPER) + protocol.comment("****Moving FLP Plate off TC****") + protocol.move_labware(FLP_plate, magblock, use_gripper=USE_GRIPPER) def lib_amplification( unused_lids: List[Labware], used_lids: List[Labware] ) -> Tuple[List[Labware], List[Labware]]: """Library Amplification.""" - ctx.comment("-------Starting lib_amplification-------") + protocol.comment("-------Starting lib_amplification-------") for i in range(num_cols): - ctx.comment( + protocol.comment( "**** Mixing and Transfering beads to column " + str(i + 1) + " ****" ) mix_beads( @@ -795,10 +799,10 @@ def lib_amplification( p50.flow_rate.dispense = 150 if trash_tips: p50.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") unused_lids, used_lids = run_amplification_profile( unused_lids, used_lids @@ -807,8 +811,8 @@ def lib_amplification( def lib_cleanup_2() -> None: """Final Library Clean up.""" - ctx.comment("-------Starting Cleanup-------") - ctx.comment("-------Adding and Mixing Cleanup Beads-------") + protocol.comment("-------Starting Cleanup-------") + protocol.comment("-------Adding and Mixing Cleanup Beads-------") for x, i in enumerate(samples_2): mix_beads(p200, bead_res, bead_vol_2, 7 if x == 0 else 2, x) tip_track(p200, tip_count) @@ -826,22 +830,22 @@ def lib_cleanup_2() -> None: p200.flow_rate.dispense = 150 if trash_tips: p200.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p200.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") - ctx.delay( + protocol.delay( minutes=bead_inc, msg="Please wait " + str(bead_inc) + " minutes while samples incubate at RT.", ) - ctx.comment("****Moving Labware to Magnet for Pelleting****") - ctx.move_labware(sample_plate_2, magblock, use_gripper=USE_GRIPPER) + protocol.comment("****Moving Labware to Magnet for Pelleting****") + protocol.move_labware(sample_plate_2, magblock, use_gripper=USE_GRIPPER) - ctx.delay(minutes=4.5, msg="Time for Pelleting") + protocol.delay(minutes=4.5, msg="Time for Pelleting") for col, i in enumerate(samples_2): remove_supernatant(i, 130, waste1_res, col) @@ -851,7 +855,7 @@ def lib_cleanup_2() -> None: p200.flow_rate.aspirate = 75 p200.flow_rate.dispense = 75 for y in range(2 if not dry_run else 1): - ctx.comment(f"-------Wash # {y+1} with Ethanol-------") + protocol.comment(f"-------Wash # {y+1} with Ethanol-------") if y == 0: # First wash this_res = etoh1_res this_waste_res = waste1_res @@ -862,41 +866,41 @@ def lib_cleanup_2() -> None: p200.aspirate(150, this_res) p200.air_gap(10) p200.dispense(p200.current_volume, i.top()) - ctx.delay(seconds=1) + protocol.delay(seconds=1) p200.air_gap(10) if not REUSE_ETOH_TIPS: p200.drop_tip() if trash_tips else p200.return_tip() - ctx.delay(seconds=10) + protocol.delay(seconds=10) # Remove the ethanol wash for x, i in enumerate(samp_list_2): tip_track(p200, tip_count) p200.aspirate(155, i) p200.air_gap(10) p200.dispense(p200.current_volume, this_waste_res) - ctx.delay(seconds=1) + protocol.delay(seconds=1) p200.air_gap(10) if trash_tips: p200.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p200.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") p200.flow_rate.aspirate = 150 p200.flow_rate.dispense = 150 # Washes Complete, Move on to Drying Steps - ctx.delay(minutes=3, msg="Allow 3 minutes for residual ethanol to dry") + protocol.delay(minutes=3, msg="Allow 3 minutes for residual ethanol to dry") - ctx.comment("****Moving sample plate off of Magnet****") - ctx.move_labware(sample_plate_2, "D1", use_gripper=USE_GRIPPER) + protocol.comment("****Moving sample plate off of Magnet****") + protocol.move_labware(sample_plate_2, "D1", use_gripper=USE_GRIPPER) # Adding RSB and Mixing for col, i in enumerate(samp_list_2): - ctx.comment(f"****Adding RSB to Columns: {col+1}****") + protocol.comment(f"****Adding RSB to Columns: {col+1}****") tip_track(p50, tip_count) p50.aspirate(rsb_vol_2, rsb_res) p50.air_gap(5) @@ -912,23 +916,23 @@ def lib_cleanup_2() -> None: p50.air_gap(5) if REUSE_RSB_TIPS: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") else: if trash_tips: p50.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") - ctx.delay( + protocol.delay( minutes=3, msg="Allow 3 minutes for incubation and liquid aggregation." ) - ctx.comment("****Move Samples to Magnet for Pelleting****") - ctx.move_labware(sample_plate_2, magblock, use_gripper=USE_GRIPPER) + protocol.comment("****Move Samples to Magnet for Pelleting****") + protocol.move_labware(sample_plate_2, magblock, use_gripper=USE_GRIPPER) - ctx.delay(minutes=2, msg="Please allow 2 minutes for beads to pellet.") + protocol.delay(minutes=2, msg="Please allow 2 minutes for beads to pellet.") p200.flow_rate.aspirate = 10 for i_int, (s, e) in enumerate(zip(samp_list_2, samples_flp)): @@ -939,10 +943,10 @@ def lib_cleanup_2() -> None: p50.air_gap(5) if trash_tips: p50.drop_tip() - ctx.comment("****Dropping Tip in Waste shoot****") + protocol.comment("****Dropping Tip in Waste shoot****") else: p50.return_tip() - ctx.comment("****Dropping Tip Back in Tip Box****") + protocol.comment("****Dropping Tip Back in Tip Box****") # Set Block Temp for Final Plate tc_mod.set_block_temperature(4) @@ -963,4 +967,6 @@ def lib_cleanup_2() -> None: waste2_res = waste2[0] end_probed_wells = [waste1_res, waste2_res] - helpers.find_liquid_height_of_all_wells(ctx, p50, end_probed_wells) + helpers.find_liquid_height_of_all_wells(protocol, p50, end_probed_wells) + if deactivate_mods: + helpers.deactivate_modules(protocol) diff --git a/abr-testing/abr_testing/protocols/active_protocols/1_Simple Normalize Long Right.py b/abr-testing/abr_testing/protocols/active_protocols/1_Simple Normalize Long Right.py index 525a82c3095..6162e6ab34e 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/1_Simple Normalize Long Right.py +++ b/abr-testing/abr_testing/protocols/active_protocols/1_Simple Normalize Long Right.py @@ -4,10 +4,12 @@ ParameterContext, Labware, SINGLE, + ALL, InstrumentContext, Well, ) from abr_testing.protocols import helpers +from typing import List, Dict metadata = { "protocolName": "Simple Normalize Long with LPD and Single Tip", @@ -15,16 +17,14 @@ "source": "Protocol Library", } -requirements = { - "robotType": "Flex", - "apiLevel": "2.21", -} +requirements = {"robotType": "Flex", "apiLevel": "2.21"} def add_parameters(parameters: ParameterContext) -> None: """Parameters.""" helpers.create_single_pipette_mount_parameter(parameters) - helpers.create_tip_size_parameter(parameters) + helpers.create_csv_parameter(parameters) + helpers.create_dot_bottom_parameter(parameters) def get_next_tip_by_row(tip_rack: Labware, pipette: InstrumentContext) -> Well | None: @@ -79,149 +79,68 @@ def get_next_tip_by_row(tip_rack: Labware, pipette: InstrumentContext) -> Well | def run(protocol: ProtocolContext) -> None: """Protocol.""" - tip_type = protocol.params.tip_size # type: ignore[attr-defined] + dot_bottom = protocol.params.dot_bottom # type: ignore[attr-defined] mount_pos = protocol.params.pipette_mount # type: ignore[attr-defined] + all_data = protocol.params.parameters_csv.parse_as_csv() # type: ignore[attr-defined] + data = all_data[1:] + helpers.comment_protocol_version(protocol, "01") # DECK SETUP AND LABWARE protocol.comment("THIS IS A NO MODULE RUN") - tiprack_x_1 = protocol.load_labware(tip_type, "D1") - tiprack_x_2 = protocol.load_labware(tip_type, "D2") - tiprack_x_3 = protocol.load_labware(tip_type, "B1") + tiprack_x_1 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "D1") + tiprack_x_2 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "D2") + tiprack_x_3 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "A1") sample_plate_1 = protocol.load_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt", "D3" ) reservoir = protocol.load_labware("nest_12_reservoir_15ml", "B3") + waste_reservoir = protocol.load_labware( + "nest_1_reservoir_195ml", "C1", "Liquid Waste" + ) sample_plate_2 = protocol.load_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt", "C2" ) sample_plate_3 = protocol.load_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt", "B2" ) + sample_plate_4 = protocol.load_labware( + "armadillo_96_wellplate_200ul_pcr_full_skirt", "A2" + ) protocol.load_trash_bin("A3") - # reagent + # reagentg146 Dye_1 = reservoir["A1"] Dye_2 = reservoir["A2"] Dye_3 = reservoir["A3"] Diluent_1 = reservoir["A4"] Diluent_2 = reservoir["A5"] + Diluent_3 = reservoir["A6"] # pipette p1000 = protocol.load_instrument( "flex_8channel_1000", mount_pos, liquid_presence_detection=True ) + p1000_single = protocol.load_instrument( + "flex_1channel_1000", + "right", + liquid_presence_detection=True, + tip_racks=[tiprack_x_2, tiprack_x_3], + ) # LOAD LIQUIDS liquid_volumes = [675.0, 675.0, 675.0, 675.0, 675.0] - wells = [Dye_1, Dye_2, Dye_3, Diluent_1, Diluent_2] + wells = [Dye_1, Dye_2, Dye_3, Diluent_1, Diluent_2, Diluent_3] helpers.load_wells_with_water(protocol, wells, liquid_volumes) - + liquid_vols_and_wells: Dict[str, List[Dict[str, Well | List[Well] | float]]] = { + "Dye": [{"well": [Dye_1, Dye_2, Dye_3], "volume": 675.0}], + "Diluent": [{"well": [Diluent_1, Diluent_2, Diluent_3], "volume": 675.0}], + } current_rack = tiprack_x_1 # CONFIGURE SINGLE LAYOUT - p1000.configure_nozzle_layout( - style=SINGLE, start="H1", tip_racks=[tiprack_x_1, tiprack_x_2, tiprack_x_3] + p1000.configure_nozzle_layout(style=SINGLE, start="H1", tip_racks=[tiprack_x_1]) + helpers.find_liquid_height_of_loaded_liquids( + protocol, liquid_vols_and_wells, p1000_single ) - helpers.find_liquid_height_of_all_wells(protocol, p1000, wells) - sample_quant_csv = """ - sample_plate_1, Sample_well,DYE,DILUENT - sample_plate_1,A1,0,100 - sample_plate_1,B1,5,95 - sample_plate_1,C1,10,90 - sample_plate_1,D1,20,80 - sample_plate_1,E1,40,60 - sample_plate_1,F1,15,40 - sample_plate_1,G1,40,20 - sample_plate_1,H1,40,0 - sample_plate_1,A2,35,65 - sample_plate_1,B2,38,42 - sample_plate_1,C2,42,58 - sample_plate_1,D2,32,8 - sample_plate_1,E2,38,12 - sample_plate_1,F2,26,74 - sample_plate_1,G2,31,69 - sample_plate_1,H2,46,4 - sample_plate_1,A3,47,13 - sample_plate_1,B3,42,18 - sample_plate_1,C3,46,64 - sample_plate_1,D3,48,22 - sample_plate_1,E3,26,74 - sample_plate_1,F3,34,66 - sample_plate_1,G3,43,37 - sample_plate_1,H3,20,80 - sample_plate_1,A4,44,16 - sample_plate_1,B4,49,41 - sample_plate_1,C4,48,42 - sample_plate_1,D4,44,16 - sample_plate_1,E4,47,53 - sample_plate_1,F4,47,33 - sample_plate_1,G4,42,48 - sample_plate_1,H4,39,21 - sample_plate_1,A5,30,20 - sample_plate_1,B5,36,14 - sample_plate_1,C5,31,59 - sample_plate_1,D5,38,52 - sample_plate_1,E5,36,4 - sample_plate_1,F5,32,28 - sample_plate_1,G5,35,55 - sample_plate_1,H5,39,1 - sample_plate_1,A6,31,59 - sample_plate_1,B6,20,80 - sample_plate_1,C6,38,2 - sample_plate_1,D6,34,46 - sample_plate_1,E6,30,70 - sample_plate_1,F6,32,58 - sample_plate_1,G6,21,79 - sample_plate_1,H6,38,52 - sample_plate_1,A7,33,27 - sample_plate_1,B7,34,16 - sample_plate_1,C7,40,60 - sample_plate_1,D7,34,26 - sample_plate_1,E7,30,20 - sample_plate_1,F7,44,56 - sample_plate_1,G7,26,74 - sample_plate_1,H7,45,55 - sample_plate_1,A8,39,1 - sample_plate_1,B8,38,2 - sample_plate_1,C8,34,66 - sample_plate_1,D8,39,11 - sample_plate_1,E8,46,54 - sample_plate_1,F8,37,63 - sample_plate_1,G8,38,42 - sample_plate_1,H8,34,66 - sample_plate_1,A9,44,56 - sample_plate_1,B9,39,11 - sample_plate_1,C9,30,70 - sample_plate_1,D9,37,33 - sample_plate_1,E9,46,54 - sample_plate_1,F9,39,21 - sample_plate_1,G9,29,41 - sample_plate_1,H9,23,77 - sample_plate_1,A10,26,74 - sample_plate_1,B10,39,1 - sample_plate_1,C10,31,49 - sample_plate_1,D10,38,62 - sample_plate_1,E10,29,1 - sample_plate_1,F10,21,79 - sample_plate_1,G10,29,41 - sample_plate_1,H10,28,42 - sample_plate_1,A11,15,55 - sample_plate_1,B11,28,72 - sample_plate_1,C11,11,49 - sample_plate_1,D11,34,66 - sample_plate_1,E11,27,73 - sample_plate_1,F11,30,40 - sample_plate_1,G11,33,67 - sample_plate_1,H11,31,39 - sample_plate_1,A12,39,31 - sample_plate_1,B12,47,53 - sample_plate_1,C12,46,54 - sample_plate_1,D12,13,7 - sample_plate_1,E12,34,46 - sample_plate_1,F12,45,35 - sample_plate_1,G12,28,42 - sample_plate_1,H12,37,63 - """ - data = [r.split(",") for r in sample_quant_csv.strip().splitlines() if r][1:] for X in range(1): protocol.comment("==============================================") protocol.comment("Adding Dye Sample Plate 1") @@ -232,8 +151,8 @@ def run(protocol: ProtocolContext) -> None: well = get_next_tip_by_row(current_rack, p1000) p1000.pick_up_tip(well) while current < len(data): - CurrentWell = str(data[current][1]) - DyeVol = float(data[current][2]) + CurrentWell = str(data[current][0]) + DyeVol = float(data[current][1]) if DyeVol != 0 and DyeVol < 100: p1000.liquid_presence_detection = False p1000.transfer( @@ -245,7 +164,7 @@ def run(protocol: ProtocolContext) -> None: if DyeVol > 20: wells.append(sample_plate_1.wells_by_name()[CurrentWell]) current += 1 - p1000.blow_out() + p1000.blow_out(location=waste_reservoir["A1"]) p1000.touch_tip() p1000.drop_tip() p1000.liquid_presence_detection = True @@ -256,34 +175,34 @@ def run(protocol: ProtocolContext) -> None: current = 0 while current < len(data): - CurrentWell = str(data[current][1]) + CurrentWell = str(data[current][0]) DilutionVol = float(data[current][2]) if DilutionVol != 0 and DilutionVol < 100: well = get_next_tip_by_row(current_rack, p1000) p1000.pick_up_tip(well) - p1000.aspirate(DilutionVol, Diluent_1.bottom(z=2)) + p1000.aspirate(DilutionVol, Diluent_1.bottom(z=dot_bottom)) p1000.dispense( DilutionVol, sample_plate_1.wells_by_name()[CurrentWell].top(z=0.2) ) if DilutionVol > 20: wells.append(sample_plate_1.wells_by_name()[CurrentWell]) - p1000.blow_out() + p1000.blow_out(location=waste_reservoir["A1"]) p1000.touch_tip() p1000.drop_tip() current += 1 + protocol.comment("Changing pipette configuration to 8ch.") + protocol.comment("==============================================") protocol.comment("Adding Dye Sample Plate 2") protocol.comment("==============================================") - current = 0 - well = get_next_tip_by_row(tiprack_x_2, p1000) - p1000.pick_up_tip(well) + p1000_single.pick_up_tip() while current < len(data): - CurrentWell = str(data[current][1]) - DyeVol = float(data[current][2]) + CurrentWell = str(data[current][0]) + DyeVol = float(data[current][1]) if DyeVol != 0 and DyeVol < 100: - p1000.transfer( + p1000_single.transfer( DyeVol, Dye_2.bottom(z=2), sample_plate_2.wells_by_name()[CurrentWell].top(z=1), @@ -292,9 +211,9 @@ def run(protocol: ProtocolContext) -> None: if DyeVol > 20: wells.append(sample_plate_2.wells_by_name()[CurrentWell]) current += 1 - p1000.blow_out() - p1000.touch_tip() - p1000.drop_tip() + p1000_single.blow_out(location=waste_reservoir["A1"]) + p1000_single.touch_tip() + p1000_single.return_tip() protocol.comment("==============================================") protocol.comment("Adding Diluent Sample Plate 2") @@ -302,20 +221,19 @@ def run(protocol: ProtocolContext) -> None: current = 0 while current < len(data): - CurrentWell = str(data[current][1]) + CurrentWell = str(data[current][0]) DilutionVol = float(data[current][2]) if DilutionVol != 0 and DilutionVol < 100: - well = get_next_tip_by_row(tiprack_x_2, p1000) - p1000.pick_up_tip(well) - p1000.aspirate(DilutionVol, Diluent_2.bottom(z=2)) - p1000.dispense( + p1000_single.pick_up_tip() + p1000_single.aspirate(DilutionVol, Diluent_2.bottom(z=dot_bottom)) + p1000_single.dispense( DilutionVol, sample_plate_2.wells_by_name()[CurrentWell].top(z=0.2) ) if DilutionVol > 20: wells.append(sample_plate_2.wells_by_name()[CurrentWell]) - p1000.blow_out() - p1000.touch_tip() - p1000.drop_tip() + p1000_single.blow_out(location=waste_reservoir["A1"]) + p1000_single.touch_tip() + p1000_single.return_tip() current += 1 protocol.comment("==============================================") @@ -323,14 +241,13 @@ def run(protocol: ProtocolContext) -> None: protocol.comment("==============================================") current = 0 - well = get_next_tip_by_row(tiprack_x_3, p1000) - p1000.pick_up_tip(well) + p1000_single.pick_up_tip() while current < len(data): - CurrentWell = str(data[current][1]) - DyeVol = float(data[current][2]) + CurrentWell = str(data[current][0]) + DyeVol = float(data[current][1]) if DyeVol != 0 and DyeVol < 100: - p1000.liquid_presence_detection = False - p1000.transfer( + p1000_single.liquid_presence_detection = False + p1000_single.transfer( DyeVol, Dye_3.bottom(z=2), sample_plate_3.wells_by_name()[CurrentWell].top(z=1), @@ -341,14 +258,85 @@ def run(protocol: ProtocolContext) -> None: if DyeVol > 20: wells.append(sample_plate_3.wells_by_name()[CurrentWell]) current += 1 - p1000.liquid_presence_detection = True - p1000.blow_out() - p1000.touch_tip() - p1000.drop_tip() + p1000_single.liquid_presence_detection = True + p1000_single.blow_out(location=waste_reservoir["A1"]) + p1000_single.touch_tip() + p1000_single.return_tip() protocol.comment("==============================================") protocol.comment("Adding Diluent Sample Plate 3") protocol.comment("==============================================") + current = 0 + while current < len(data): + CurrentWell = str(data[current][0]) + DilutionVol = float(data[current][2]) + if DilutionVol != 0 and DilutionVol < 100: + p1000_single.pick_up_tip() + p1000_single.aspirate(DilutionVol, Diluent_3.bottom(z=dot_bottom)) + p1000_single.dispense( + DilutionVol, sample_plate_3.wells_by_name()[CurrentWell].top(z=0.2) + ) + if DilutionVol > 20: + wells.append(sample_plate_3.wells_by_name()[CurrentWell]) + p1000_single.blow_out(location=waste_reservoir["A1"]) + p1000_single.touch_tip() + p1000_single.return_tip() + current += 1 + protocol.comment("==============================================") + protocol.comment("Adding Dye Sample Plate 4") + protocol.comment("==============================================") + p1000_single.reset_tipracks() current = 0 - # Probe heights - helpers.find_liquid_height_of_all_wells(protocol, p1000, wells) + p1000_single.pick_up_tip() + while current < len(data): + CurrentWell = str(data[current][0]) + DyeVol = float(data[current][1]) + if DyeVol != 0 and DyeVol < 100: + p1000_single.liquid_presence_detection = False + p1000_single.transfer( + DyeVol, + Dye_3.bottom(z=2), + sample_plate_4.wells_by_name()[CurrentWell].top(z=1), + blow_out=True, + blowout_location="destination well", + new_tip="never", + ) + if DyeVol > 20: + wells.append(sample_plate_4.wells_by_name()[CurrentWell]) + current += 1 + p1000_single.liquid_presence_detection = True + p1000_single.blow_out(location=waste_reservoir["A1"]) + p1000_single.touch_tip() + p1000_single.return_tip() + protocol.comment("==============================================") + protocol.comment("Adding Diluent Sample Plate 4") + protocol.comment("==============================================") + current = 0 + while current < len(data): + CurrentWell = str(data[current][0]) + DilutionVol = float(data[current][2]) + if DilutionVol != 0 and DilutionVol < 100: + p1000_single.pick_up_tip() + p1000_single.aspirate(DilutionVol, Diluent_3.bottom(z=dot_bottom)) + p1000_single.dispense( + DilutionVol, sample_plate_4.wells_by_name()[CurrentWell].top(z=0.2) + ) + if DilutionVol > 20: + wells.append(sample_plate_4.wells_by_name()[CurrentWell]) + p1000_single.blow_out(location=waste_reservoir["A1"]) + p1000_single.touch_tip() + p1000_single.return_tip() + current += 1 + + current = 0 + # Probe heights + p1000.configure_nozzle_layout(style=ALL, tip_racks=[tiprack_x_3]) + helpers.clean_up_plates( + p1000, + [sample_plate_1, sample_plate_2, sample_plate_3, sample_plate_4], + waste_reservoir["A1"], + 200, + ) + helpers.find_liquid_height_of_all_wells( + protocol, p1000_single, [waste_reservoir["A1"]] + ) diff --git a/abr-testing/abr_testing/protocols/active_protocols/2_BMS_PCR_Protocol.py b/abr-testing/abr_testing/protocols/active_protocols/2_BMS_PCR_Protocol.py index 24e7358f6e1..3b11b51b7fe 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/2_BMS_PCR_Protocol.py +++ b/abr-testing/abr_testing/protocols/active_protocols/2_BMS_PCR_Protocol.py @@ -5,7 +5,7 @@ ThermocyclerContext, TemperatureModuleContext, ) -from opentrons.protocol_api import SINGLE, Well +from opentrons.protocol_api import SINGLE, Well, ALL from abr_testing.protocols import helpers from typing import List, Dict @@ -14,7 +14,7 @@ "protocolName": "PCR Protocol with TC Auto Sealing Lid", "author": "Rami Farawi None: @@ -23,81 +23,79 @@ def add_parameters(parameters: ParameterContext) -> None: helpers.create_disposable_lid_parameter(parameters) helpers.create_csv_parameter(parameters) helpers.create_tc_lid_deck_riser_parameter(parameters) + helpers.create_deactivate_modules_parameter(parameters) -def run(ctx: ProtocolContext) -> None: +def run(protocol: ProtocolContext) -> None: """Protocol.""" - pipette_mount = ctx.params.pipette_mount # type: ignore[attr-defined] - disposable_lid = ctx.params.disposable_lid # type: ignore[attr-defined] - parsed_csv = ctx.params.parameters_csv.parse_as_csv() # type: ignore[attr-defined] - deck_riser = ctx.params.deck_riser # type: ignore[attr-defined] + pipette_mount = protocol.params.pipette_mount # type: ignore[attr-defined] + disposable_lid = protocol.params.disposable_lid # type: ignore[attr-defined] + parsed_csv = protocol.params.parameters_csv.parse_as_csv() # type: ignore[attr-defined] + deck_riser = protocol.params.deck_riser # type: ignore[attr-defined] + deactivate_modules_bool = protocol.params.deactivate_modules # type: ignore[attr-defined] + helpers.comment_protocol_version(protocol, "01") rxn_vol = 50 real_mode = True # DECK SETUP AND LABWARE - tc_mod: ThermocyclerContext = ctx.load_module( + tc_mod: ThermocyclerContext = protocol.load_module( helpers.tc_str ) # type: ignore[assignment] tc_mod.open_lid() tc_mod.set_lid_temperature(105) - temp_mod: TemperatureModuleContext = ctx.load_module( + temp_mod: TemperatureModuleContext = protocol.load_module( helpers.temp_str, location="D3" ) # type: ignore[assignment] reagent_rack = temp_mod.load_labware( - "opentrons_24_aluminumblock_nest_1.5ml_snapcap" - ) # check if 2mL - - dest_plate = tc_mod.load_labware( - "opentrons_96_wellplate_200ul_pcr_full_skirt" - ) # do I change this to tough plate if they run pcr? - - source_plate = ctx.load_labware( - "opentrons_96_wellplate_200ul_pcr_full_skirt", location="D1" - ) # do I change this to their plate? + "opentrons_24_aluminumblock_nest_1.5ml_snapcap", "Reagent Rack" + ) + dest_plate_1 = tc_mod.load_labware( + "opentrons_96_wellplate_200ul_pcr_full_skirt", "Destination Plate 1" + ) + source_plate_1 = protocol.load_labware( + "opentrons_96_wellplate_200ul_pcr_full_skirt", "D1", "DNA Plate 1" + ) + waste = protocol.load_labware("nest_1_reservoir_195ml", "D2", "Liquid Waste") + liquid_waste = waste["A1"] tiprack_50 = [ - ctx.load_labware("opentrons_flex_96_tiprack_50ul", slot) for slot in [8, 9] + protocol.load_labware("opentrons_flex_96_tiprack_50ul", slot) for slot in [8, 9] ] # Opentrons tough pcr auto sealing lids if disposable_lid: - unused_lids = helpers.load_disposable_lids(ctx, 3, ["C3"], deck_riser) + unused_lids = helpers.load_disposable_lids(protocol, 3, ["C3"], deck_riser) used_lids: List[Labware] = [] # LOAD PIPETTES - p50 = ctx.load_instrument( + p50 = protocol.load_instrument( "flex_8channel_50", pipette_mount, tip_racks=tiprack_50, liquid_presence_detection=True, ) p50.configure_nozzle_layout(style=SINGLE, start="A1", tip_racks=tiprack_50) - ctx.load_trash_bin("A3") + protocol.load_trash_bin("A3") temp_mod.set_temperature(4) # LOAD LIQUIDS water: Well = reagent_rack["B1"] mmx_pic: List[Well] = reagent_rack.rows()[0] - dna_pic: List[Well] = source_plate.wells() + dna_pic: List[Well] = source_plate_1.wells() liquid_vols_and_wells: Dict[str, List[Dict[str, Well | List[Well] | float]]] = { - "Water": [{"well": water, "volume": 1500.0}], - "Mastermix": [{"well": mmx_pic, "volume": 1500.0}], - "DNA": [{"well": dna_pic, "volume": 50.0}], + "Water": [{"well": water, "volume": 500.0}], + "Mastermix": [{"well": mmx_pic, "volume": 500.0}], + "DNA": [{"well": dna_pic, "volume": 100.0}], } - helpers.load_wells_with_custom_liquids(ctx, liquid_vols_and_wells) - wells_to_probe = [[water], mmx_pic, dna_pic] - wells_to_probe_flattened = [ - well for list_of_wells in wells_to_probe for well in list_of_wells - ] - helpers.find_liquid_height_of_all_wells(ctx, p50, wells_to_probe_flattened) + helpers.find_liquid_height_of_loaded_liquids(protocol, liquid_vols_and_wells, p50) # adding water - ctx.comment("\n\n----------ADDING WATER----------\n") + protocol.comment("\n\n----------ADDING WATER----------\n") p50.pick_up_tip() - # p50.aspirate(40, water) # prewet - # p50.dispense(40, water) + p50.aspirate(40, water) # prewet + p50.dispense(40, water) parsed_csv = parsed_csv[1:] num_of_rows = len(parsed_csv) for row_index in range(num_of_rows): @@ -112,13 +110,13 @@ def run(ctx: ProtocolContext) -> None: p50.configure_for_volume(water_vol) p50.aspirate(water_vol, water) - p50.dispense(water_vol, dest_plate[dest_well], rate=0.5) + p50.dispense(water_vol, dest_plate_1[dest_well], rate=0.5) p50.configure_for_volume(50) - # p50.blow_out() + p50.blow_out() p50.drop_tip() # adding Mastermix - ctx.comment("\n\n----------ADDING MASTERMIX----------\n") + protocol.comment("\n\n----------ADDING MASTERMIX----------\n") for i, row in enumerate(parsed_csv): p50.pick_up_tip() mmx_vol = row[3] @@ -144,8 +142,8 @@ def run(ctx: ProtocolContext) -> None: break p50.configure_for_volume(mmx_vol) p50.aspirate(mmx_vol, reagent_rack[mmx_tube]) - p50.dispense(mmx_vol, dest_plate[dest_well].top()) - ctx.delay(seconds=2) + p50.dispense(mmx_vol, dest_plate_1[dest_well].top()) + protocol.delay(seconds=2) p50.blow_out() p50.touch_tip() p50.configure_for_volume(50) @@ -154,7 +152,7 @@ def run(ctx: ProtocolContext) -> None: p50.drop_tip() # adding DNA - ctx.comment("\n\n----------ADDING DNA----------\n") + protocol.comment("\n\n----------ADDING DNA----------\n") for row in parsed_csv: dna_vol = row[2] if dna_vol.lower() == "x": @@ -168,29 +166,28 @@ def run(ctx: ProtocolContext) -> None: if dna_vol == 0: break p50.configure_for_volume(dna_vol) - p50.aspirate(dna_vol, source_plate[dest_and_source_well]) - p50.dispense(dna_vol, dest_plate[dest_and_source_well], rate=0.5) + p50.aspirate(dna_vol, source_plate_1[dest_and_source_well]) + p50.dispense(dna_vol, dest_plate_1[dest_and_source_well], rate=0.5) p50.mix( 10, 0.7 * rxn_vol if 0.7 * rxn_vol < 30 else 30, - dest_plate[dest_and_source_well], + dest_plate_1[dest_and_source_well], ) p50.drop_tip() p50.configure_for_volume(50) - wells_to_probe_flattened.append(dest_plate[dest_well]) - ctx.comment("\n\n-----------Running PCR------------\n") + protocol.comment("\n\n-----------Running PCR------------\n") if real_mode: if disposable_lid: lid_on_plate, unused_lids, used_lids = helpers.use_disposable_lid_with_tc( - ctx, unused_lids, used_lids, dest_plate, tc_mod + protocol, unused_lids, used_lids, dest_plate_1, tc_mod ) else: tc_mod.close_lid() helpers.perform_pcr( - ctx, + protocol, tc_mod, initial_denature_time_sec=120, denaturation_time_sec=10, @@ -205,9 +202,16 @@ def run(ctx: ProtocolContext) -> None: tc_mod.open_lid() if disposable_lid: if len(used_lids) <= 1: - ctx.move_labware(lid_on_plate, "C2", use_gripper=True) + protocol.move_labware(lid_on_plate, "C2", use_gripper=True) else: - ctx.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) + protocol.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) p50.drop_tip() p50.configure_nozzle_layout(style=SINGLE, start="A1", tip_racks=tiprack_50) - helpers.find_liquid_height_of_all_wells(ctx, p50, wells_to_probe_flattened) + mmx_pic.append(water) + # Empty plates into liquid waste + p50.configure_nozzle_layout(style=ALL, tip_racks=tiprack_50) + helpers.clean_up_plates(p50, [source_plate_1, dest_plate_1], liquid_waste, 50) + # Probe liquid waste + helpers.find_liquid_height_of_all_wells(protocol, p50, [liquid_waste]) + if deactivate_modules_bool: + helpers.deactivate_modules(protocol) diff --git a/abr-testing/abr_testing/protocols/active_protocols/3_Tartrazine Protocol.py b/abr-testing/abr_testing/protocols/active_protocols/3_Tartrazine Protocol.py index 66db85468f4..9916ef7f7fc 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/3_Tartrazine Protocol.py +++ b/abr-testing/abr_testing/protocols/active_protocols/3_Tartrazine Protocol.py @@ -1,5 +1,10 @@ """Tartrazine Protocol.""" -from opentrons.protocol_api import ProtocolContext, ParameterContext, Well +from opentrons.protocol_api import ( + ProtocolContext, + ParameterContext, + Well, + InstrumentContext, +) from abr_testing.protocols import helpers from opentrons.protocol_api.module_contexts import ( AbsorbanceReaderContext, @@ -23,101 +28,172 @@ def add_parameters(parameters: ParameterContext) -> None: parameters.add_int( variable_name="number_of_plates", display_name="Number of Plates", - default=4, + default=1, minimum=1, maximum=4, ) + helpers.create_channel_parameter(parameters) + helpers.create_plate_reader_compatible_labware_parameter(parameters) -def run(ctx: ProtocolContext) -> None: +def run(protocol: ProtocolContext) -> None: """Protocol.""" - number_of_plates = ctx.params.number_of_plates # type: ignore [attr-defined] + # Load parameters + number_of_plates = protocol.params.number_of_plates # type: ignore [attr-defined] + channels = protocol.params.channels # type: ignore [attr-defined] + plate_type = protocol.params.labware_plate_reader_compatible # type: ignore [attr-defined] + + helpers.comment_protocol_version(protocol, "01") # Plate Reader - plate_reader: AbsorbanceReaderContext = ctx.load_module( + plate_reader: AbsorbanceReaderContext = protocol.load_module( helpers.abs_mod_str, "A3" ) # type: ignore[assignment] - hs: HeaterShakerContext = ctx.load_module(helpers.hs_str, "A1") # type: ignore[assignment] - hs_adapter = hs.load_adapter("opentrons_universal_flat_adapter") - tube_rack = ctx.load_labware( - "opentrons_10_tuberack_nest_4x50ml_6x15ml_conical", "C2", "Reagent Tube" - ) - tartrazine_tube = tube_rack["A3"] - water_tube_1 = tube_rack["A4"] - water_tube_2 = tube_rack["B3"] - sample_plate_1 = ctx.load_labware( - "corning_96_wellplate_360ul_flat", "D1", "Sample Plate 1" - ) - sample_plate_2 = ctx.load_labware( - "corning_96_wellplate_360ul_flat", "D2", "Sample Plate 2" + hs: HeaterShakerContext = protocol.load_module(helpers.hs_str, "A1") # type: ignore[assignment] + # Load Plates based off of number_of_plates parameter + available_deck_slots = ["D1", "D2", "C1", "B1"] + sample_plate_list = [] + for plate_num, slot in zip(range(number_of_plates), available_deck_slots): + plate = protocol.load_labware(plate_type, slot, f"Sample Plate {plate_num + 1}") + sample_plate_list.append(plate) + available_tip_rack_slots = ["D3", "C3", "B3", "B2"] + # LOAD PIPETTES AND TIP RACKS + # 50 CHANNEL + tip_racks_50 = [] + for plate_num, slot_2 in zip(range(number_of_plates), available_tip_rack_slots): + tiprack_50 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", slot_2) + tip_racks_50.append(tiprack_50) + p50 = protocol.load_instrument( + f"flex_{channels}_50", "left", tip_racks=tip_racks_50 ) - sample_plate_3 = ctx.load_labware( - "corning_96_wellplate_360ul_flat", "C1", "Sample Plate 3" - ) - sample_plate_4 = ctx.load_labware( - "corning_96_wellplate_360ul_flat", "B1", "Sample Plate 4" + # 1000 CHANNEL + tiprack_1000_1 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "A2") + p1000 = protocol.load_instrument( + f"flex_{channels}_1000", "right", tip_racks=[tiprack_1000_1] ) + # DETERMINE RESERVOIR BASED OFF # OF PIPETTE CHANNELS + # 1 CHANNEL = TUBE RACK + if p50.active_channels == 1: + reservoir = protocol.load_labware( + "opentrons_10_tuberack_nest_4x50ml_6x15ml_conical", "C2", "Reservoir" + ) + water_max_vol = reservoir["A3"].max_volume - 500 + reservoir_wells = reservoir.wells()[6:] # Skip first 4 bc they are 15ml + else: + # 8 CHANNEL = 12 WELL RESERVOIR + reservoir = protocol.load_labware("nest_12_reservoir_15ml", "C2", "Reservoir") + water_max_vol = reservoir["A1"].max_volume - 500 + reservoir_wells = reservoir.wells()[ + 1: + ] # Skip A1 as it's reserved for tartrazine - sample_plate_list = [sample_plate_1, sample_plate_2, sample_plate_3, sample_plate_4] - tiprack_50_1 = ctx.load_labware("opentrons_flex_96_tiprack_50ul", "D3") - tiprack_50_2 = ctx.load_labware("opentrons_flex_96_tiprack_50ul", "C3") - tiprack_50_3 = ctx.load_labware("opentrons_flex_96_tiprack_50ul", "B3") - tiprack_1000_1 = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "A2") - tip_racks = [tiprack_50_1, tiprack_50_2, tiprack_50_3] + # LABEL RESERVOIR WELLS AND DETERMINE NEEDED LIQUID + tartrazine_well = reservoir["A1"] + # NEEDED TARTRAZINE + needed_tartrazine: float = ( + float(number_of_plates) * 96.0 + ) * 10.0 + 1000.0 # loading extra as a safety factor + # NEEDED WATER + needed_water: float = ( + float(number_of_plates) * 96.0 * 250 + ) # loading extra as a safety factor + # CALCULATING NEEDED # OF WATER WELLS + needed_wells = round(needed_water / water_max_vol) + water_wells = [] + for i in range(needed_wells + 1): + water_wells.append(reservoir_wells[i]) - # Pipette - p50 = ctx.load_instrument("flex_1channel_50", "left", tip_racks=tip_racks) - p1000 = ctx.load_instrument( - "flex_1channel_1000", "right", tip_racks=[tiprack_1000_1] - ) + def _mix_tartrazine(pipette: InstrumentContext, well_to_probe: Well) -> None: + """Mix Tartrazine.""" + # Mix step is needed to ensure tartrazine does not settle between plates. + pipette.pick_up_tip() + top_of_tartrazine = helpers.find_liquid_height(pipette, well_to_probe) + for i in range(20): + p50.aspirate(1, well_to_probe.bottom(z=1)) + p50.dispense(1, well_to_probe.bottom(z=top_of_tartrazine + 1)) + pipette.return_tip() - # Probe wells + # LOAD LIQUIDS AND PROBE WELLS liquid_vols_and_wells: Dict[str, List[Dict[str, Well | List[Well] | float]]] = { - "Tartrazine": [{"well": tartrazine_tube, "volume": 45.0}], - "Water": [{"well": [water_tube_1, water_tube_2], "volume": 45.0}], + "Tartrazine": [{"well": tartrazine_well, "volume": needed_tartrazine}], + "Water": [{"well": water_wells, "volume": water_max_vol}], } - helpers.find_liquid_height_of_loaded_liquids(ctx, liquid_vols_and_wells, p50) - + helpers.find_liquid_height_of_loaded_liquids(protocol, liquid_vols_and_wells, p50) + tip_count = 1 * p50.active_channels # number of 50 ul tip uses. + p50.reset_tipracks() i = 0 all_percent_error_dict = {} cv_dict = {} - vol = 0.0 - tip_count = 0 + vol = 0.0 # counter to track available water volume + water_tip_count = 0 * p1000.active_channels # number of 1000 ul tip uses + well_num = 0 # index of well being used for water for sample_plate in sample_plate_list[:number_of_plates]: - deck_locations = ["D1", "D2", "C1", "B1"] - p1000.pick_up_tip() - for well in sample_plate.wells(): - if vol < 45000: - tube_of_choice = water_tube_1 + return_location = sample_plate.parent + # Mix Tartrazine to ensure no settling as occurred + _mix_tartrazine(p50, tartrazine_well) + tip_count += 1 * p50.active_channels + # Determine list of wells to probe + if p50.active_channels == 1: + well_list = sample_plate.wells() + elif p50.active_channels == 8: + well_list = sample_plate.rows()[0] + for well in well_list: + p1000.pick_up_tip() + # Determine which water well to aspirate from. + if vol < water_max_vol - 6000: + well_of_choice = water_wells[well_num] else: - tube_of_choice = water_tube_2 + well_num += 1 + well_of_choice = water_wells[well_num] + vol = 0.0 p50.pick_up_tip() - p1000.aspirate(190, tube_of_choice) - p1000.air_gap(5) - p1000.dispense(5, well.top()) + p1000.aspirate(190, well_of_choice) + p1000.air_gap(10) + p1000.dispense(10, well.top()) p1000.dispense(190, well) - vol += 190 - height = helpers.find_liquid_height(p50, tartrazine_tube) - p50.aspirate(10, tartrazine_tube.bottom(z=height)) + # Two blow outs ensures water is completely removed from pipette + p1000.blow_out(well.top()) + protocol.delay(minutes=0.1) + p1000.blow_out(well.top()) + vol += 190 * p1000.active_channels + # Probe to find liquid height of tartrazine to ensure correct amount is aspirated + height = helpers.find_liquid_height(p50, tartrazine_well) + if height <= 0.0: + # If a negative tartrazine height is found, + # the protocol will pause, prompt a refill, and reprobe. + protocol.pause("Fill tartrazine") + height = helpers.find_liquid_height(p50, tartrazine_well) + p50.aspirate(10, tartrazine_well.bottom(z=height), rate=0.15) p50.air_gap(5) p50.dispense(5, well.top()) - p50.dispense(10, well.bottom(z=0.5)) + p50.dispense(10, well.bottom(z=0.5), rate=0.15) + p50.blow_out() + protocol.delay(minutes=0.1) p50.blow_out() p50.return_tip() - tip_count += 1 - if tip_count >= (96 * 3): + tip_count += p50.active_channels + if tip_count >= (96 * len(tip_racks_50)): p50.reset_tipracks() - p1000.return_tip() - helpers.move_labware_to_hs(ctx, sample_plate, hs, hs_adapter) - helpers.set_hs_speed(ctx, hs, 1500, 2.0, True) + tip_count = 0 + p1000.return_tip() + water_tip_count += p1000.active_channels + if water_tip_count >= 96: + p1000.reset_tipracks() + water_tip_count = 0 + # Move labware to heater shaker to be mixed + helpers.move_labware_to_hs(protocol, sample_plate, hs, hs) + helpers.set_hs_speed(protocol, hs, 1500, 2.0, True) hs.open_labware_latch() + # Initialize plate reader plate_reader.close_lid() plate_reader.initialize("single", [450]) plate_reader.open_lid() - ctx.move_labware(sample_plate, plate_reader, use_gripper=True) + # Move sample plate into plate reader + protocol.move_labware(sample_plate, plate_reader, use_gripper=True) sample_plate_name = "sample plate_" + str(i + 1) csv_string = sample_plate_name + "_" + str(datetime.now()) plate_reader.close_lid() result = plate_reader.read(csv_string) + # Calculate CV and % error of expected value. for wavelength in result: dict_of_wells = result[wavelength] readings_and_wells = dict_of_wells.items() @@ -145,11 +221,15 @@ def run(ctx: ProtocolContext) -> None: "SD": standard_deviation, "Avg Percent Error": avg_percent_error, } + # Move Plate back to original location all_percent_error_dict[sample_plate_name] = percent_error_dict plate_reader.open_lid() - ctx.move_labware(sample_plate, deck_locations[i], use_gripper=True) + protocol.comment( + f"------plate {sample_plate}. {cv_dict[sample_plate_name]}------" + ) + protocol.move_labware(sample_plate, return_location, use_gripper=True) i += 1 # Print percent error dictionary - ctx.comment("Percent Error: " + str(all_percent_error_dict)) + protocol.comment("Percent Error: " + str(all_percent_error_dict)) # Print cv dictionary - ctx.comment("Plate Reader result: " + str(cv_dict)) + protocol.comment("Plate Reader Result: " + str(cv_dict)) diff --git a/abr-testing/abr_testing/protocols/active_protocols/4_Illumina DNA Enrichment.py b/abr-testing/abr_testing/protocols/active_protocols/4_Illumina DNA Enrichment.py new file mode 100644 index 00000000000..ff9a9807c92 --- /dev/null +++ b/abr-testing/abr_testing/protocols/active_protocols/4_Illumina DNA Enrichment.py @@ -0,0 +1,1016 @@ +"""DVT1ABR4: Illumina DNA Enrichment.""" +from opentrons.protocol_api import ( + ParameterContext, + ProtocolContext, + Labware, + Well, + InstrumentContext, +) +from opentrons import types +from abr_testing.protocols import helpers +from opentrons.protocol_api.module_contexts import ( + HeaterShakerContext, + MagneticBlockContext, + ThermocyclerContext, + TemperatureModuleContext, +) +from opentrons.hardware_control.modules.types import ThermocyclerStep +from typing import List, Dict + + +metadata = { + "protocolName": "Illumina DNA Enrichment v4 with TC Auto Sealing Lid", + "author": "Opentrons ", + "source": "Protocol Library", +} + +requirements = { + "robotType": "Flex", + "apiLevel": "2.21", +} + +# SCRIPT SETTINGS +DRYRUN = False # True = skip incubation times, shorten mix, for testing purposes +USE_GRIPPER = True # True = Uses Gripper, False = Manual Move +TIP_TRASH = False # True = Used tips go in Trash, False = Used tips go back into rack +HYBRID_PAUSE = True # True = sets a pause on the Hybridization + +# PROTOCOL SETTINGS +COLUMNS = 4 # 1-4 +HYBRIDDECK = True +HYBRIDTIME = 1.6 # Hours + +# PROTOCOL BLOCKS +STEP_VOLPOOL = 0 +STEP_HYB = 0 +STEP_CAPTURE = 1 +STEP_WASH = 1 +STEP_PCR = 1 +STEP_PCRDECK = 1 +STEP_CLEANUP = 1 + +p200_tips = 0 +p50_tips = 0 +total_waste_volume = 0.0 + + +RUN = 1 + + +def add_parameters(parameters: ParameterContext) -> None: + """Add parameters.""" + helpers.create_hs_speed_parameter(parameters) + helpers.create_dot_bottom_parameter(parameters) + helpers.create_disposable_lid_parameter(parameters) + helpers.create_tc_lid_deck_riser_parameter(parameters) + helpers.create_disposable_lid_trash_location(parameters) + helpers.create_deactivate_modules_parameter(parameters) + + +def run(protocol: ProtocolContext) -> None: + """Protocol.""" + heater_shaker_speed = protocol.params.heater_shaker_speed # type: ignore[attr-defined] + dot_bottom = protocol.params.dot_bottom # type: ignore[attr-defined] + disposable_lid = protocol.params.disposable_lid # type: ignore[attr-defined] + deck_riser = protocol.params.deck_riser # type: ignore[attr-defined] + trash_lid = protocol.params.trash_lid # type: ignore[attr-defined] + deactivate_modules_bool = protocol.params.deactivate_modules # type: ignore[attr-defined] + helpers.comment_protocol_version(protocol, "01") + + unused_lids: List[Labware] = [] + used_lids: List[Labware] = [] + global p200_tips + global p50_tips + + protocol.comment("THIS IS A DRY RUN") if DRYRUN else protocol.comment( + "THIS IS A REACTION RUN" + ) + protocol.comment("USED TIPS WILL GO IN TRASH") if TIP_TRASH else protocol.comment( + "USED TIPS WILL BE RE-RACKED" + ) + + # DECK SETUP AND LABWARE + # ========== FIRST ROW =========== + heatershaker: HeaterShakerContext = protocol.load_module( + helpers.hs_str, "1" + ) # type: ignore[assignment] + heatershaker.close_labware_latch() + sample_plate_2 = heatershaker.load_labware( + "thermoscientificnunc_96_wellplate_1300ul" + ) + reservoir = protocol.load_labware("nest_96_wellplate_2ml_deep", "2", "Liquid Waste") + temp_block: TemperatureModuleContext = protocol.load_module( + helpers.temp_str, "3" + ) # type: ignore[assignment] + reagent_plate, temp_adapter = helpers.load_temp_adapter_and_labware( + "armadillo_96_wellplate_200ul_pcr_full_skirt", temp_block, "Reagent Plate" + ) + # ========== SECOND ROW ========== + MAG_PLATE_SLOT: MagneticBlockContext = protocol.load_module( + helpers.mag_str, "C1" + ) # type: ignore[assignment] + tiprack_200_1 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "5") + tiprack_50_1 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "6") + # Opentrons tough pcr auto sealing lids + if disposable_lid: + unused_lids = helpers.load_disposable_lids(protocol, 3, ["C4"], deck_riser) + # ========== THIRD ROW =========== + thermocycler: ThermocyclerContext = protocol.load_module( + helpers.tc_str + ) # type: ignore[assignment] + sample_plate_1 = thermocycler.load_labware( + "armadillo_96_wellplate_200ul_pcr_full_skirt" + ) + thermocycler.open_lid() + tiprack_200_2 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "8") + tiprack_50_2 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "9") + # ========== FOURTH ROW ========== + tiprack_200_3 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "11") + trash_bin = protocol.load_trash_bin("A3") + # reagent + AMPure = reservoir["A1"] + SMB = reservoir["A2"] + + EtOH = reservoir["A4"] + RSB = reservoir["A5"] + Liquid_trash_well_1 = reservoir["A9"] + Liquid_trash_well_2 = reservoir["A10"] + Liquid_trash_well_3 = reservoir["A11"] + Liquid_trash_well_4 = reservoir["A12"] + liquid_trash_list = { + Liquid_trash_well_1: 0.0, + Liquid_trash_well_2: 0.0, + Liquid_trash_well_3: 0.0, + Liquid_trash_well_4: 0.0, + } + + def trash_liquid( + protocol: ProtocolContext, + pipette: InstrumentContext, + vol_to_trash: float, + liquid_trash_list: Dict[Well, float], + ) -> None: + """Determine which wells to use as liquid waste.""" + remaining_volume = vol_to_trash + max_capacity = 1500.0 + # Determine liquid waste location depending on current total volume + # Distribute the liquid volume sequentially + for well, current_volume in liquid_trash_list.items(): + if remaining_volume <= 0.0: + break + available_capacity = max_capacity - current_volume + if available_capacity < remaining_volume: + continue + pipette.dispense(remaining_volume, well.top()) + protocol.delay(minutes=0.1) + pipette.blow_out(well.top()) + liquid_trash_list[well] += remaining_volume + if pipette.current_volume <= 0.0: + break + + # Will Be distributed during the protocol + EEW_1 = sample_plate_2.wells_by_name()["A9"] + EEW_2 = sample_plate_2.wells_by_name()["A10"] + EEW_3 = sample_plate_2.wells_by_name()["A11"] + EEW_4 = sample_plate_2.wells_by_name()["A12"] + + NHB2 = reagent_plate.wells_by_name()["A1"] + Panel = reagent_plate.wells_by_name()["A2"] + EHB2 = reagent_plate.wells_by_name()["A3"] + Elute = reagent_plate.wells_by_name()["A4"] + ET2 = reagent_plate.wells_by_name()["A5"] + PPC = reagent_plate.wells_by_name()["A6"] + EPM = reagent_plate.wells_by_name()["A7"] + + # pipette + p1000 = protocol.load_instrument( + "flex_8channel_1000", + "left", + tip_racks=[tiprack_200_1, tiprack_200_2, tiprack_200_3], + ) + p50 = protocol.load_instrument( + "flex_8channel_50", "right", tip_racks=[tiprack_50_1, tiprack_50_2] + ) + reagent_plate.columns()[3] + # Load liquids and probe + liquid_vols_and_wells: Dict[str, List[Dict[str, Well | List[Well] | float]]] = { + "Reagents": [ + {"well": reagent_plate.columns()[3], "volume": 75.0}, + {"well": reagent_plate.columns()[4], "volume": 15.0}, + {"well": reagent_plate.columns()[5], "volume": 20.0}, + {"well": reagent_plate.columns()[6], "volume": 65.0}, + ], + "AMPure": [{"well": reservoir.columns()[0], "volume": 120.0}], + "SMB": [{"well": reservoir.columns()[1], "volume": 750.0}], + "EtOH": [{"well": reservoir.columns()[3], "volume": 900.0}], + "RSB": [{"well": reservoir.columns()[4], "volume": 96.0}], + "Wash": [ + {"well": sample_plate_2.columns()[8], "volume": 1000.0}, + {"well": sample_plate_2.columns()[9], "volume": 1000.0}, + {"well": sample_plate_2.columns()[10], "volume": 1000.0}, + {"well": sample_plate_2.columns()[11], "volume": 1000.0}, + ], + "Samples": [{"well": sample_plate_1.wells(), "volume": 150.0}], + } + helpers.find_liquid_height_of_loaded_liquids(protocol, liquid_vols_and_wells, p50) + # tip and sample tracking + if COLUMNS == 1: + column_1_list = ["A1"] # Plate 1 + column_2_list = ["A1"] # Plate 2 + column_3_list = ["A4"] # Plate 2 + column_4_list = ["A4"] # Plate 1 + column_5_list = ["A7"] # Plate 2 + column_6_list = ["A7"] # Plate 1 + WASHES = [EEW_1] + if COLUMNS == 2: + column_1_list = ["A1", "A2"] # Plate 1 + column_2_list = ["A1", "A2"] # Plate 2 + column_3_list = ["A4", "A5"] # Plate 2 + column_4_list = ["A4", "A5"] # Plate 1 + column_5_list = ["A7", "A8"] # Plate 2 + column_6_list = ["A7", "A8"] # Plate 1 + WASHES = [EEW_1, EEW_2] + if COLUMNS == 3: + column_1_list = ["A1", "A2", "A3"] # Plate 1 + column_2_list = ["A1", "A2", "A3"] # Plate 2 + column_3_list = ["A4", "A5", "A6"] # Plate 2 + column_4_list = ["A4", "A5", "A6"] # Plate 1 + column_5_list = ["A7", "A8", "A9"] # Plate 2 + column_6_list = ["A7", "A8", "A9"] # Plate 1 + WASHES = [EEW_1, EEW_2, EEW_3] + if COLUMNS == 4: + column_1_list = ["A1", "A2", "A3", "A4"] # Plate 1 + column_2_list = ["A1", "A2", "A3", "A4"] # Plate 2 + column_3_list = ["A5", "A6", "A7", "A8"] # Plate 2 + column_4_list = ["A5", "A6", "A7", "A8"] # Plate 1 + column_5_list = ["A9", "A10", "A11", "A12"] # Plate 2 + column_6_list = ["A9", "A10", "A11", "A12"] # Plate 1 + WASHES = [EEW_1, EEW_2, EEW_3, EEW_4] + + def tipcheck() -> None: + """Tip tracking function.""" + if p200_tips >= 3 * 12: + p1000.reset_tipracks() + p200_tips == 0 + if p50_tips >= 2 * 12: + p50.reset_tipracks() + p50_tips == 0 + + # commands + for loop in range(RUN): + thermocycler.open_lid() + heatershaker.open_labware_latch() + if DRYRUN is False: + if STEP_HYB == 1: + protocol.comment("SETTING THERMO and TEMP BLOCK Temperature") + thermocycler.set_block_temperature(4) + thermocycler.set_lid_temperature(100) + temp_block.set_temperature(4) + else: + protocol.comment("SETTING THERMO and TEMP BLOCK Temperature") + thermocycler.set_block_temperature(58) + thermocycler.set_lid_temperature(58) + heatershaker.set_and_wait_for_temperature(58) + heatershaker.close_labware_latch() + + # Sample Plate contains 30ul of DNA + + if STEP_VOLPOOL == 1: + protocol.comment("==============================================") + protocol.comment("--> Quick Vol Pool") + protocol.comment("==============================================") + + if STEP_HYB == 1: + protocol.comment("==============================================") + protocol.comment("--> HYB") + protocol.comment("==============================================") + + protocol.comment("--> Adding NHB2") + NHB2Vol = 50 + for loop, X in enumerate(column_1_list): + p50.pick_up_tip() + p50.aspirate(NHB2Vol, NHB2.bottom(z=dot_bottom)) # original = () + p50.dispense( + NHB2Vol, sample_plate_1[X].bottom(z=dot_bottom) + ) # original = () + p50.return_tip() if TIP_TRASH is False else p50.drop_tip() + p50_tips += 1 + tipcheck() + + protocol.comment("--> Adding Panel") + PanelVol = 10 + for loop, X in enumerate(column_1_list): + p50.pick_up_tip() + p50.aspirate(PanelVol, Panel.bottom(z=dot_bottom)) # original = () + p50.dispense( + PanelVol, sample_plate_1[X].bottom(z=dot_bottom) + ) # original = () + p50.return_tip() if TIP_TRASH is False else p50.drop_tip() + p50_tips += 1 + tipcheck() + + protocol.comment("--> Adding EHB2") + EHB2Vol = 10 + EHB2MixRep = 10 if DRYRUN is False else 1 + EHB2MixVol = 90 + for loop, X in enumerate(column_1_list): + p1000.pick_up_tip() + p1000.aspirate(EHB2Vol, EHB2.bottom(z=dot_bottom)) # original = () + p1000.dispense( + EHB2Vol, sample_plate_1[X].bottom(z=dot_bottom) + ) # original = () + p1000.move_to(sample_plate_1[X].bottom(z=dot_bottom)) # original = () + p1000.mix(EHB2MixRep, EHB2MixVol) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p50_tips += 1 + tipcheck() + + if HYBRIDDECK: + protocol.comment("Hybridize on Deck") + if disposable_lid: + ( + lid_on_plate, + unused_lids, + used_lids, + ) = helpers.use_disposable_lid_with_tc( + protocol, unused_lids, used_lids, sample_plate_1, thermocycler + ) + else: + thermocycler.close_lid() + if DRYRUN is False: + profile_TAGSTOP: List[ThermocyclerStep] = [ + {"temperature": 98, "hold_time_minutes": 5}, + {"temperature": 97, "hold_time_minutes": 1}, + {"temperature": 95, "hold_time_minutes": 1}, + {"temperature": 93, "hold_time_minutes": 1}, + {"temperature": 91, "hold_time_minutes": 1}, + {"temperature": 89, "hold_time_minutes": 1}, + {"temperature": 87, "hold_time_minutes": 1}, + {"temperature": 85, "hold_time_minutes": 1}, + {"temperature": 83, "hold_time_minutes": 1}, + {"temperature": 81, "hold_time_minutes": 1}, + {"temperature": 79, "hold_time_minutes": 1}, + {"temperature": 77, "hold_time_minutes": 1}, + {"temperature": 75, "hold_time_minutes": 1}, + {"temperature": 73, "hold_time_minutes": 1}, + {"temperature": 71, "hold_time_minutes": 1}, + {"temperature": 69, "hold_time_minutes": 1}, + {"temperature": 67, "hold_time_minutes": 1}, + {"temperature": 65, "hold_time_minutes": 1}, + {"temperature": 63, "hold_time_minutes": 1}, + {"temperature": 62, "hold_time_minutes": HYBRIDTIME * 60}, + ] + thermocycler.execute_profile( + steps=profile_TAGSTOP, repetitions=1, block_max_volume=100 + ) + thermocycler.set_block_temperature(62) + if HYBRID_PAUSE: + protocol.comment("HYBRIDIZATION PAUSED") + thermocycler.set_block_temperature(10) + thermocycler.open_lid() + if disposable_lid: + if trash_lid: + protocol.move_labware(lid_on_plate, trash_bin, use_gripper=True) + elif len(used_lids) <= 1: + protocol.move_labware(lid_on_plate, "B4", use_gripper=True) + else: + protocol.move_labware( + lid_on_plate, used_lids[-2], use_gripper=True + ) + else: + protocol.comment("Hybridize off Deck") + + if STEP_CAPTURE == 1: + protocol.comment("==============================================") + protocol.comment("--> Capture") + protocol.comment("==============================================") + # Standard Setup + + if DRYRUN is False: + protocol.comment("SETTING THERMO and TEMP BLOCK Temperature") + thermocycler.set_block_temperature(58) + thermocycler.set_lid_temperature(58) + + if DRYRUN is False: + heatershaker.set_and_wait_for_temperature(58) + + protocol.comment("--> Transfer Hybridization") + TransferSup = 100 + for loop, X in enumerate(column_1_list): + p1000.pick_up_tip() + p1000.move_to(sample_plate_1[X].bottom(z=0.5)) + p1000.aspirate(TransferSup + 1, rate=0.25) + p1000.dispense( + TransferSup + 1, sample_plate_2[column_2_list[loop]].bottom(z=1) + ) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + if disposable_lid: + ( + lid_on_plate, + unused_lids, + used_lids, + ) = helpers.use_disposable_lid_with_tc( + protocol, + unused_lids, + used_lids, + sample_plate_1, + thermocycler, + ) + else: + thermocycler.close_lid() + + protocol.comment("--> ADDING SMB") + SMBVol = 250 + SMBMixRPM = heater_shaker_speed + SMBMixRep = 5.0 if DRYRUN is False else 0.1 # minutes + SMBPremix = 3 if DRYRUN is False else 1 + # ============================== + for loop, X in enumerate(column_2_list): + p1000.pick_up_tip() + p1000.mix(SMBPremix, 200, SMB.bottom(z=1)) + p1000.aspirate(SMBVol / 2, SMB.bottom(z=1), rate=0.25) + p1000.dispense(SMBVol / 2, sample_plate_2[X].top(z=-7), rate=0.25) + p1000.aspirate(SMBVol / 2, SMB.bottom(z=1), rate=0.25) + p1000.dispense(SMBVol / 2, sample_plate_2[X].bottom(z=1), rate=0.25) + p1000.default_speed = 5 + p1000.move_to(sample_plate_2[X].bottom(z=5)) + for Mix in range(2): + p1000.aspirate(100, rate=0.5) + p1000.move_to(sample_plate_2[X].bottom(z=1)) + p1000.aspirate(80, rate=0.5) + p1000.dispense(80, rate=0.5) + p1000.move_to(sample_plate_2[X].bottom(z=5)) + p1000.dispense(100, rate=0.5) + Mix += 1 + p1000.blow_out(sample_plate_2[X].top(z=-7)) + p1000.default_speed = 400 + p1000.move_to(sample_plate_2[X].top(z=5)) + p1000.move_to(sample_plate_2[X].top(z=0)) + p1000.move_to(sample_plate_2[X].top(z=5)) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + # ============================== + helpers.set_hs_speed(protocol, heatershaker, SMBMixRPM, SMBMixRep, True) + + # GRIPPER MOVE sample_plate_2 FROM heatershaker TO MAGPLATE + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate_2, heatershaker, MAG_PLATE_SLOT + ) + + thermocycler.open_lid() + if disposable_lid: + if trash_lid: + protocol.move_labware(lid_on_plate, trash_bin, use_gripper=True) + elif len(used_lids) <= 1: + protocol.move_labware(lid_on_plate, "B4", use_gripper=True) + else: + protocol.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) + + if DRYRUN is False: + protocol.delay(minutes=2) + + protocol.comment("==============================================") + protocol.comment("--> WASH") + protocol.comment("==============================================") + # Setting Labware to Resume at Cleanup 1 + + protocol.comment("--> Remove SUPERNATANT") + for loop, X in enumerate(column_2_list): + p1000.pick_up_tip() + p1000.move_to(sample_plate_2[X].bottom(4)) + p1000.aspirate(200, rate=0.25) + trash_liquid(protocol, p1000, 200.0, liquid_trash_list) + p1000.move_to(sample_plate_2[X].bottom(0.5)) + p1000.aspirate(200, rate=0.25) + trash_liquid(protocol, p1000, 200.0, liquid_trash_list) + p1000.aspirate(20) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + + # GRIPPER MOVE sample_plate_2 FROM MAGPLATE TO heatershaker + helpers.move_labware_to_hs( + protocol, sample_plate_2, heatershaker, heatershaker + ) + + protocol.comment("--> Repeating 6 washes") + washreps = 6 + washcount = 0 + for wash in range(washreps): + + protocol.comment("--> Adding EEW") + EEWVol = 200 + for loop, X in enumerate(column_2_list): + p1000.pick_up_tip() + p1000.aspirate( + EEWVol, WASHES[loop].bottom(z=dot_bottom) + ) # original = () + p1000.dispense( + EEWVol, sample_plate_2[X].bottom(z=dot_bottom) + ) # original = () + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + helpers.set_hs_speed( + protocol, heatershaker, int(heater_shaker_speed * 0.9), 4.0, True + ) + heatershaker.open_labware_latch() + + if DRYRUN is False: + protocol.delay(seconds=5 * 60) + + # GRIPPER MOVE sample_plate_2 FROM heatershaker TO MAGPLATE + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate_2, heatershaker, MAG_PLATE_SLOT + ) + + if DRYRUN is False: + protocol.delay(seconds=1 * 60) + + protocol.comment("--> Removing Supernatant") + RemoveSup = 200 + for loop, X in enumerate(column_2_list): + p1000.pick_up_tip() + p1000.move_to(sample_plate_2[X].bottom(z=3.5)) + p1000.aspirate(RemoveSup - 100, rate=0.25) + protocol.delay(minutes=0.1) + p1000.move_to(sample_plate_2[X].bottom(z=0.5)) + p1000.aspirate(100, rate=0.25) + trash_liquid(protocol, p1000, RemoveSup, liquid_trash_list) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + + # ============================================================================================ + # GRIPPER MOVE sample_plate_2 FROM MAGPLATE TO heatershaker + helpers.move_labware_to_hs( + protocol, sample_plate_2, heatershaker, heatershaker + ) + washcount += 1 + + protocol.comment("--> Adding EEW") + EEWVol = 200 + for loop, X in enumerate(column_2_list): + p1000.pick_up_tip() + p1000.aspirate( + EEWVol, WASHES[loop].bottom(z=dot_bottom) + ) # original = () + p1000.dispense( + EEWVol, sample_plate_2[X].bottom(z=dot_bottom) + ) # original = () + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + + helpers.set_hs_speed( + protocol, heatershaker, int(heater_shaker_speed * 0.9), 4.0, True + ) + + if DRYRUN is False: + protocol.delay(seconds=1 * 60) + + protocol.comment("--> Transfer Hybridization") + TransferSup = 200 + for loop, X in enumerate(column_2_list): + p1000.pick_up_tip() + p1000.move_to(sample_plate_2[X].bottom(z=0.5)) + p1000.aspirate(TransferSup, rate=0.25) + p1000.dispense( + TransferSup, sample_plate_2[column_3_list[loop]].bottom(z=1) + ) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + + if DRYRUN is False: + protocol.delay(seconds=5 * 60) + + # GRIPPER MOVE sample_plate_2 FROM heatershaker TO MAGPLATE + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate_2, heatershaker, MAG_PLATE_SLOT + ) + if DRYRUN is False: + protocol.delay(seconds=1 * 60) + + protocol.comment("--> Removing Supernatant") + RemoveSup = 200 + for loop, X in enumerate(column_3_list): + p1000.pick_up_tip() + p1000.move_to(sample_plate_2[X].bottom(z=3.5)) + p1000.aspirate(RemoveSup - 100, rate=0.25) + protocol.delay(minutes=0.1) + p1000.move_to(sample_plate_2[X].bottom(z=0.5)) + p1000.aspirate(100, rate=0.25) + p1000.move_to(sample_plate_2[X].top(z=0.5)) + trash_liquid(protocol, p1000, 100, liquid_trash_list) + p1000.aspirate(20) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + + protocol.comment("--> Removing Residual") + for loop, X in enumerate(column_3_list): + p50.pick_up_tip() + p50.move_to(sample_plate_2[X].bottom(z=dot_bottom)) # original = z=0 + p50.aspirate(50, rate=0.25) + p50.default_speed = 200 + trash_liquid(protocol, p50, 50, liquid_trash_list) + p50.return_tip() if TIP_TRASH is False else p50.drop_tip() + p50_tips += 1 + tipcheck() + + protocol.comment("==============================================") + protocol.comment("--> ELUTE") + protocol.comment("==============================================") + + protocol.comment("--> Adding Elute") + EluteVol = 23 + for loop, X in enumerate(column_3_list): + p50.pick_up_tip() + p50.aspirate(EluteVol, Elute.bottom(z=dot_bottom)) # original = () + p50.dispense( + EluteVol, sample_plate_2[X].bottom(z=dot_bottom) + ) # original = () + p50.return_tip() if TIP_TRASH is False else p50.drop_tip() + p50_tips += 1 + tipcheck() + + # ============================================================================================ + # GRIPPER MOVE sample_plate_2 FROM MAGPLATE TO heatershaker + helpers.move_labware_to_hs( + protocol, sample_plate_2, heatershaker, heatershaker + ) + # ============================================================================================ + helpers.set_hs_speed( + protocol, heatershaker, int(heater_shaker_speed * 0.9), 2.0, True + ) + heatershaker.open_labware_latch() + + if DRYRUN is False: + protocol.delay(minutes=2) + + # ============================================================================================ + # GRIPPER MOVE sample_plate_2 FROM heatershaker TO MAGPLATE + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate_2, heatershaker, MAG_PLATE_SLOT + ) + protocol.comment("--> Transfer Elution") + TransferSup = 21 + for loop, X in enumerate(column_3_list): + p50.pick_up_tip() + p50.move_to(sample_plate_2[X].bottom(z=0.5)) + p50.aspirate(TransferSup + 1, rate=0.25) + p50.dispense( + TransferSup + 1, sample_plate_1[column_4_list[loop]].bottom(z=1) + ) + p50.return_tip() if TIP_TRASH is False else p50.drop_tip() + p50_tips += 1 + tipcheck() + + protocol.comment("--> Adding ET2") + ET2Vol = 4 + ET2MixRep = 10 if DRYRUN is False else 1 + ET2MixVol = 20 + for loop, X in enumerate(column_4_list): + p50.pick_up_tip() + p50.aspirate(ET2Vol, ET2.bottom(z=dot_bottom)) # original = () + p50.dispense( + ET2Vol, sample_plate_1[X].bottom(z=dot_bottom) + ) # original = () + p50.move_to(sample_plate_1[X].bottom(z=dot_bottom)) # original = () + p50.mix(ET2MixRep, ET2MixVol) + p50.return_tip() if TIP_TRASH is False else p50.drop_tip() + p50_tips += 1 + tipcheck() + + if STEP_PCR == 1: + protocol.comment("==============================================") + protocol.comment("--> AMPLIFICATION") + protocol.comment("==============================================") + + protocol.comment("--> Adding PPC") + PPCVol = 5 + for loop, X in enumerate(column_4_list): + p50.pick_up_tip() + p50.aspirate(PPCVol, PPC.bottom(z=dot_bottom)) # original = () + p50.dispense( + PPCVol, sample_plate_1[X].bottom(z=dot_bottom) + ) # original = () + p50.return_tip() if TIP_TRASH is False else p50.drop_tip() + p50_tips += 1 + tipcheck() + + protocol.comment("--> Adding EPM") + EPMVol = 20 + EPMMixRep = 10 if DRYRUN is False else 1 + EPMMixVol = 45 + for loop, X in enumerate(column_4_list): + p50.pick_up_tip() + p50.aspirate(EPMVol, EPM.bottom(z=dot_bottom)) # original = () + p50.dispense( + EPMVol, sample_plate_1[X].bottom(z=dot_bottom) + ) # original = () + p50.move_to(sample_plate_1[X].bottom(z=dot_bottom)) # original = () + p50.mix(EPMMixRep, EPMMixVol) + p50.return_tip() if TIP_TRASH is False else p50.drop_tip() + p50_tips += 1 + tipcheck() + + if DRYRUN is False: + heatershaker.deactivate_heater() + + if STEP_PCRDECK == 1: + if DRYRUN is False: + if DRYRUN is False: + if disposable_lid: + ( + lid_on_plate, + unused_lids, + used_lids, + ) = helpers.use_disposable_lid_with_tc( + protocol, + unused_lids, + used_lids, + sample_plate_1, + thermocycler, + ) + else: + thermocycler.close_lid() + profile_PCR_1: List[ThermocyclerStep] = [ + {"temperature": 98, "hold_time_seconds": 45} + ] + thermocycler.execute_profile( + steps=profile_PCR_1, repetitions=1, block_max_volume=50 + ) + profile_PCR_2: List[ThermocyclerStep] = [ + {"temperature": 98, "hold_time_seconds": 30}, + {"temperature": 60, "hold_time_seconds": 30}, + {"temperature": 72, "hold_time_seconds": 30}, + ] + thermocycler.execute_profile( + steps=profile_PCR_2, repetitions=12, block_max_volume=50 + ) + profile_PCR_3: List[ThermocyclerStep] = [ + {"temperature": 72, "hold_time_minutes": 1} + ] + thermocycler.execute_profile( + steps=profile_PCR_3, repetitions=1, block_max_volume=50 + ) + thermocycler.set_block_temperature(10) + + thermocycler.open_lid() + if disposable_lid: + if trash_lid: + protocol.move_labware(lid_on_plate, trash_bin, use_gripper=True) + elif len(used_lids) <= 1: + protocol.move_labware(lid_on_plate, "B4", use_gripper=True) + else: + protocol.move_labware( + lid_on_plate, used_lids[-2], use_gripper=True + ) + + if STEP_CLEANUP == 1: + protocol.comment("==============================================") + protocol.comment("--> Cleanup") + protocol.comment("==============================================") + + # GRIPPER MOVE sample_plate_2 FROM MAGPLATE TO heatershaker + helpers.move_labware_to_hs( + protocol, sample_plate_2, heatershaker, heatershaker + ) + + protocol.comment("--> Transfer Elution") + TransferSup = 45 + for loop, X in enumerate(column_4_list): + p50.pick_up_tip() + p50.move_to(sample_plate_1[X].bottom(z=0.5)) + p50.aspirate(TransferSup + 1, rate=0.25) + p50.dispense( + TransferSup + 1, sample_plate_2[column_5_list[loop]].bottom(z=1) + ) + p50.return_tip() if TIP_TRASH is False else p50.drop_tip() + p50_tips += 1 + tipcheck() + + protocol.comment("--> ADDING AMPure (0.8x)") + AMPureVol = 40.5 + AMPureMixRep = 5.0 if DRYRUN is False else 0.1 + AMPurePremix = 3 if DRYRUN is False else 1 + # ========NEW SINGLE TIP DISPENSE=========== + for loop, X in enumerate(column_5_list): + p1000.pick_up_tip() + p1000.mix(AMPurePremix, AMPureVol + 10, AMPure.bottom(z=1)) + p1000.aspirate(AMPureVol, AMPure.bottom(z=1), rate=0.25) + p1000.dispense(AMPureVol, sample_plate_2[X].bottom(z=1), rate=0.25) + p1000.default_speed = 5 + p1000.move_to(sample_plate_2[X].bottom(z=5)) + for Mix in range(2): + p1000.aspirate(60, rate=0.5) + p1000.move_to(sample_plate_2[X].bottom(z=1)) + p1000.aspirate(60, rate=0.5) + p1000.dispense(60, rate=0.5) + p1000.move_to(sample_plate_2[X].bottom(z=5)) + p1000.dispense(30, rate=0.5) + Mix += 1 + p1000.blow_out(sample_plate_2[X].top(z=2)) + p1000.default_speed = 400 + p1000.move_to(sample_plate_2[X].top(z=5)) + p1000.move_to(sample_plate_2[X].top(z=0)) + p1000.move_to(sample_plate_2[X].top(z=5)) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + # ========NEW HS MIX========================= + helpers.set_hs_speed( + protocol, + heatershaker, + int(heater_shaker_speed * 0.9), + AMPureMixRep, + True, + ) + + # GRIPPER MOVE PLATE FROM HEATER SHAKER TO MAG PLATE + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate_2, heatershaker, MAG_PLATE_SLOT + ) + + if DRYRUN is False: + protocol.delay(minutes=4) + + protocol.comment("--> Removing Supernatant") + RemoveSup = 200 + for loop, X in enumerate(column_5_list): + p1000.pick_up_tip() + p1000.move_to(sample_plate_2[X].bottom(z=3.5)) + p1000.aspirate(RemoveSup - 100, rate=0.25) + protocol.delay(minutes=0.1) + p1000.move_to(sample_plate_2[X].bottom(z=0.5)) + p1000.aspirate(100, rate=0.25) + p1000.default_speed = 5 + p1000.move_to(sample_plate_2[X].top(z=2)) + p1000.default_speed = 200 + trash_liquid(protocol, p1000, 200, liquid_trash_list) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + + for X_times in range(2): + protocol.comment("--> ETOH Wash") + ETOHMaxVol = 150 + for loop, X in enumerate(column_5_list): + p1000.pick_up_tip() + p1000.aspirate(ETOHMaxVol, EtOH.bottom(z=1)) + p1000.move_to(EtOH.top(z=0)) + p1000.move_to(EtOH.top(z=-5)) + p1000.move_to(EtOH.top(z=0)) + p1000.move_to(sample_plate_2[X].top(z=-2)) + p1000.dispense(ETOHMaxVol, rate=1) + protocol.delay(minutes=0.1) + p1000.blow_out() + p1000.move_to(sample_plate_2[X].top(z=5)) + p1000.move_to(sample_plate_2[X].top(z=0)) + p1000.move_to(sample_plate_2[X].top(z=5)) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + + if DRYRUN is False: + protocol.delay(minutes=0.5) + + protocol.comment("--> Remove ETOH Wash") + for loop, X in enumerate(column_5_list): + p1000.pick_up_tip() + p1000.move_to(sample_plate_2[X].bottom(z=3.5)) + p1000.aspirate(RemoveSup - 100, rate=0.25) + protocol.delay(minutes=0.1) + p1000.move_to(sample_plate_2[X].bottom(z=0.5)) + p1000.aspirate(100, rate=0.25) + p1000.default_speed = 5 + p1000.move_to(sample_plate_2[X].top(z=2)) + p1000.default_speed = 200 + trash_liquid(protocol, p1000, RemoveSup, liquid_trash_list) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + + if DRYRUN is False: + protocol.delay(minutes=2) + + protocol.comment("--> Removing Residual ETOH") + for loop, X in enumerate(column_5_list): + p1000.pick_up_tip() + p1000.move_to( + sample_plate_2[X].bottom(z=dot_bottom) + ) # original = (z=0) + p1000.aspirate(50, rate=0.25) + p1000.default_speed = 200 + trash_liquid(protocol, p1000, 50, liquid_trash_list) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + + if DRYRUN is False: + protocol.delay(minutes=1) + + # GRIPPER MOVE PLATE FROM MAG PLATE TO HEATER SHAKER + helpers.move_labware_to_hs( + protocol, sample_plate_2, heatershaker, heatershaker + ) + + protocol.comment("--> Adding RSB") + RSBVol = 32 + RSBMixRep = 1.0 if DRYRUN is False else 0.1 # minutes + for loop, X in enumerate(column_5_list): + p1000.pick_up_tip() + p1000.aspirate(RSBVol, RSB.bottom(z=1)) + + p1000.move_to( + ( + sample_plate_2.wells_by_name()[X] + .center() + .move(types.Point(x=1.3 * 0.8, y=0, z=-4)) + ) + ) + p1000.dispense(RSBVol, rate=1) + p1000.move_to(sample_plate_2.wells_by_name()[X].bottom(z=1)) + p1000.aspirate(RSBVol, rate=1) + p1000.move_to( + ( + sample_plate_2.wells_by_name()[X] + .center() + .move(types.Point(x=0, y=1.3 * 0.8, z=-4)) + ) + ) + p1000.dispense(RSBVol, rate=1) + p1000.move_to(sample_plate_2.wells_by_name()[X].bottom(z=1)) + p1000.aspirate(RSBVol, rate=1) + p1000.move_to( + ( + sample_plate_2.wells_by_name()[X] + .center() + .move(types.Point(x=1.3 * -0.8, y=0, z=-4)) + ) + ) + p1000.dispense(RSBVol, rate=1) + p1000.move_to(sample_plate_2.wells_by_name()[X].bottom(z=1)) + p1000.aspirate(RSBVol, rate=1) + p1000.move_to( + ( + sample_plate_2.wells_by_name()[X] + .center() + .move(types.Point(x=0, y=1.3 * -0.8, z=-4)) + ) + ) + p1000.dispense(RSBVol, rate=1) + p1000.move_to(sample_plate_2.wells_by_name()[X].bottom(z=1)) + p1000.aspirate(RSBVol, rate=1) + p1000.dispense(RSBVol, rate=1) + + p1000.blow_out(sample_plate_2.wells_by_name()[X].center()) + p1000.move_to(sample_plate_2.wells_by_name()[X].top(z=5)) + p1000.move_to(sample_plate_2.wells_by_name()[X].top(z=0)) + p1000.move_to(sample_plate_2.wells_by_name()[X].top(z=5)) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + if DRYRUN is False: + helpers.set_hs_speed( + protocol, + heatershaker, + int(heater_shaker_speed * 0.8), + RSBMixRep, + True, + ) + + # GRIPPER MOVE PLATE FROM HEATER SHAKER TO MAG PLATE + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate_2, heatershaker, MAG_PLATE_SLOT + ) + + if DRYRUN is False: + protocol.delay(minutes=3) + + protocol.comment("--> Transferring Supernatant") + TransferSup = 30 + for loop, X in enumerate(column_5_list): + p1000.pick_up_tip() + p1000.move_to(sample_plate_2[X].bottom(z=0.5)) + p1000.aspirate(TransferSup + 1, rate=0.25) + p1000.dispense( + TransferSup + 1, sample_plate_1[column_6_list[loop]].bottom(z=1) + ) + p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() + p200_tips += 1 + tipcheck() + liquids_to_probe_at_end = [ + Liquid_trash_well_1, + Liquid_trash_well_2, + Liquid_trash_well_3, + Liquid_trash_well_4, + ] + helpers.find_liquid_height_of_all_wells(protocol, p50, liquids_to_probe_at_end) + if deactivate_modules_bool: + helpers.deactivate_modules(protocol) diff --git a/abr-testing/abr_testing/protocols/active_protocols/5_96ch complex protocol with single tip Pick Up.py b/abr-testing/abr_testing/protocols/active_protocols/5_96ch complex protocol with single tip Pick Up.py index dc40db7f177..ca7506cf6f0 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/5_96ch complex protocol with single tip Pick Up.py +++ b/abr-testing/abr_testing/protocols/active_protocols/5_96ch complex protocol with single tip Pick Up.py @@ -1,14 +1,14 @@ """96 ch Test Single Tip and Gripper Moves.""" from opentrons.protocol_api import ( - ALL, + COLUMN, SINGLE, + ALL, ParameterContext, ProtocolContext, Labware, ) from opentrons.protocol_api.module_contexts import ( HeaterShakerContext, - MagneticBlockContext, ThermocyclerContext, TemperatureModuleContext, ) @@ -21,7 +21,7 @@ } requirements = { - "robotType": "OT-3", + "robotType": "Flex", "apiLevel": "2.21", } @@ -45,25 +45,31 @@ def add_parameters(parameters: ParameterContext) -> None: helpers.create_dot_bottom_parameter(parameters) helpers.create_disposable_lid_parameter(parameters) helpers.create_tc_lid_deck_riser_parameter(parameters) + helpers.create_deactivate_modules_parameter(parameters) -def run(ctx: ProtocolContext) -> None: +def run(protocol: ProtocolContext) -> None: """Protocol.""" - b = ctx.params.dot_bottom # type: ignore[attr-defined] - TIPRACK_96_NAME = ctx.params.tip_size # type: ignore[attr-defined] - disposable_lid = ctx.params.disposable_lid # type: ignore[attr-defined] - deck_riser = ctx.params.deck_riser # type: ignore[attr-defined] + b = protocol.params.dot_bottom # type: ignore[attr-defined] + TIPRACK_96_NAME = protocol.params.tip_size # type: ignore[attr-defined] + disposable_lid = protocol.params.disposable_lid # type: ignore[attr-defined] + deck_riser = protocol.params.deck_riser # type: ignore[attr-defined] + deactivate_modules_bool = protocol.params.deactivate_modules # type: ignore[attr-defined] - waste_chute = ctx.load_waste_chute() + waste_chute = protocol.load_waste_chute() + helpers.comment_protocol_version(protocol, "01") - thermocycler: ThermocyclerContext = ctx.load_module(helpers.tc_str) # type: ignore[assignment] - mag: MagneticBlockContext = ctx.load_module(helpers.mag_str, "A3") # type: ignore[assignment] - h_s: HeaterShakerContext = ctx.load_module(helpers.hs_str, "D1") # type: ignore[assignment] - temperature_module: TemperatureModuleContext = ctx.load_module( + thermocycler: ThermocyclerContext = protocol.load_module( + helpers.tc_str + ) # type: ignore[assignment] + h_s: HeaterShakerContext = protocol.load_module( + helpers.hs_str, "D1" + ) # type: ignore[assignment] + temperature_module: TemperatureModuleContext = protocol.load_module( helpers.temp_str, "C1" ) # type: ignore[assignment] if disposable_lid: - unused_lids = helpers.load_disposable_lids(ctx, 3, ["A4"], deck_riser) + unused_lids = helpers.load_disposable_lids(protocol, 3, ["A2"], deck_riser) used_lids: List[Labware] = [] thermocycler.open_lid() h_s.open_labware_latch() @@ -75,16 +81,15 @@ def run(ctx: ProtocolContext) -> None: adapters = [temperature_module_adapter, h_s_adapter] - source_reservoir = ctx.load_labware(RESERVOIR_NAME, "D2") - dest_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "C2") + source_reservoir = protocol.load_labware(RESERVOIR_NAME, "D2") + dest_pcr_plate = protocol.load_labware(PCR_PLATE_96_NAME, "C2") + liquid_waste = protocol.load_labware("nest_1_reservoir_195ml", "B2", "Liquid Waste") - tip_rack_1 = ctx.load_labware( - TIPRACK_96_NAME, "A2", adapter=TIPRACK_96_ADAPTER_NAME + tip_rack_1 = protocol.load_labware( + TIPRACK_96_NAME, "A3", adapter="opentrons_flex_96_tiprack_adapter" ) - tip_rack_adapter = tip_rack_1.parent - - tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, "C3") - tip_rack_3 = ctx.load_labware(TIPRACK_96_NAME, "C4") + tip_rack_2 = protocol.load_labware(TIPRACK_96_NAME, "C3") + tip_rack_3 = protocol.load_labware(TIPRACK_96_NAME, "C4") tip_racks = [ tip_rack_1, @@ -92,14 +97,16 @@ def run(ctx: ProtocolContext) -> None: tip_rack_3, ] - pipette_96_channel = ctx.load_instrument( + pipette_96_channel = protocol.load_instrument( PIPETTE_96_CHANNEL_NAME, mount="left", tip_racks=tip_racks, liquid_presence_detection=True, ) - water = ctx.define_liquid(name="water", description="H₂O", display_color="#42AB2D") + water = protocol.define_liquid( + name="water", description="H₂O", display_color="#42AB2D" + ) source_reservoir.wells_by_name()["A1"].load_liquid(liquid=water, volume=29000) def run_moves( @@ -123,7 +130,7 @@ def move_to_locations( def reset_labware() -> None: """Reset the labware to the reset location.""" - ctx.move_labware( + protocol.move_labware( labware_to_move, reset_location, use_gripper=use_gripper ) @@ -131,7 +138,9 @@ def reset_labware() -> None: return for location in move_locations: - ctx.move_labware(labware_to_move, location, use_gripper=use_gripper) + protocol.move_labware( + labware_to_move, location, use_gripper=use_gripper + ) if reset_after_each_move: reset_labware() @@ -161,14 +170,13 @@ def test_gripper_moves() -> None: def deck_moves(labware: Labware, reset_location: str) -> None: """Function to perform the movement of labware.""" deck_move_sequence = [ - ["B2"], # Deck Moves + ["B3"], # Deck Moves ["C3"], # Staging Area Slot 3 Moves ["C4", "D4"], # Staging Area Slot 4 Moves [ thermocycler, temperature_module_adapter, h_s_adapter, - mag, ], # Module Moves ] @@ -177,14 +185,13 @@ def deck_moves(labware: Labware, reset_location: str) -> None: def staging_area_slot_3_moves(labware: Labware, reset_location: str) -> None: """Function to perform the movement of labware, starting w/ staging area slot 3.""" staging_area_slot_3_move_sequence = [ - ["B2", "C2"], # Deck Moves + ["B3", "C2"], # Deck Moves [], # Don't have Staging Area Slot 3 open ["C4", "D4"], # Staging Area Slot 4 Moves [ thermocycler, temperature_module_adapter, h_s_adapter, - mag, ], # Module Moves ] @@ -198,14 +205,13 @@ def staging_area_slot_3_moves(labware: Labware, reset_location: str) -> None: def staging_area_slot_4_moves(labware: Labware, reset_location: str) -> None: """Function to perform the movement of labware, starting with staging area slot 4.""" staging_area_slot_4_move_sequence = [ - ["C2", "B2"], # Deck Moves + ["C2", "B3"], # Deck Moves ["C3"], # Staging Area Slot 3 Moves ["C4"], # Staging Area Slot 4 Moves [ thermocycler, temperature_module_adapter, h_s_adapter, - mag, ], # Module Moves ] @@ -219,7 +225,7 @@ def staging_area_slot_4_moves(labware: Labware, reset_location: str) -> None: def module_moves(labware: Labware, module_locations: List) -> None: """Function to perform the movement of labware, starting on a module.""" module_move_sequence = [ - ["C2", "B2"], # Deck Moves + ["C2", "B3"], # Deck Moves ["C3"], # Staging Area Slot 3 Moves ["C4", "D4"], # Staging Area Slot 4 Moves ] @@ -229,7 +235,7 @@ def module_moves(labware: Labware, module_locations: List) -> None: labware_move_to_locations.remove(module_starting_location) all_sequences = module_move_sequence.copy() all_sequences.append(labware_move_to_locations) - ctx.move_labware( + protocol.move_labware( labware, module_starting_location, use_gripper=USING_GRIPPER ) run_moves( @@ -242,27 +248,27 @@ def module_moves(labware: Labware, module_locations: List) -> None: deck_moves(dest_pcr_plate, DECK_MOVE_RESET_LOCATION) - ctx.move_labware( + protocol.move_labware( dest_pcr_plate, STAGING_AREA_SLOT_3_RESET_LOCATION, use_gripper=USING_GRIPPER, ) staging_area_slot_3_moves(dest_pcr_plate, STAGING_AREA_SLOT_3_RESET_LOCATION) - ctx.move_labware( + protocol.move_labware( dest_pcr_plate, STAGING_AREA_SLOT_4_RESET_LOCATION, use_gripper=USING_GRIPPER, ) staging_area_slot_4_moves(dest_pcr_plate, STAGING_AREA_SLOT_4_RESET_LOCATION) - module_locations = [thermocycler, mag] + adapters + module_locations = [thermocycler] + adapters module_moves(dest_pcr_plate, module_locations) - ctx.move_labware(dest_pcr_plate, thermocycler, use_gripper=USING_GRIPPER) + protocol.move_labware(dest_pcr_plate, thermocycler, use_gripper=USING_GRIPPER) def test_manual_moves() -> None: """Test manual moves.""" - ctx.move_labware(source_reservoir, "D4", use_gripper=USING_GRIPPER) + protocol.move_labware(source_reservoir, "D4", use_gripper=USING_GRIPPER) def test_pipetting() -> None: """Test pipetting.""" @@ -279,64 +285,59 @@ def test_single_tip_pickup_usage() -> None: well_position = f"{row}{col}" pipette_96_channel.pick_up_tip(tip_rack_2) - pipette_96_channel.aspirate(5, source_reservoir[well_position]) - pipette_96_channel.touch_tip() + pipette_96_channel.aspirate(45, source_reservoir[well_position]) + pipette_96_channel.air_gap(5) pipette_96_channel.dispense( - 5, dest_pcr_plate[well_position].bottom(b) + 25, dest_pcr_plate[well_position].bottom(b) ) + pipette_96_channel.blow_out(location=liquid_waste["A1"]) pipette_96_channel.drop_tip() tip_count += 1 # leave this dropping in waste chute, do not use get_disposal_preference # want to test partial drop - ctx.move_labware(tip_rack_2, waste_chute, use_gripper=USING_GRIPPER) + protocol.move_labware(tip_rack_2, waste_chute, use_gripper=USING_GRIPPER) + + def test_column_tip_rack_usage() -> None: + """Column Tip Pick Up.""" + list_of_columns = list(range(1, 13)) + pipette_96_channel.configure_nozzle_layout( + style=COLUMN, start="A12", tip_racks=[tip_rack_3] + ) + protocol.comment("------------------------------") + protocol.comment(f"channels {pipette_96_channel.active_channels}") + protocol.move_labware(tip_rack_3, "C3", use_gripper=USING_GRIPPER) + for well in list_of_columns: + tiprack_well = "A" + str(well) + well_name = "A" + str(well) + pipette_96_channel.liquid_presence_detection = True + pipette_96_channel.pick_up_tip(tip_rack_3[tiprack_well]) + pipette_96_channel.aspirate(45, source_reservoir[well_name]) + pipette_96_channel.liquid_presence_detection = False + pipette_96_channel.air_gap(5) + pipette_96_channel.dispense(25, dest_pcr_plate[tiprack_well].bottom(b)) + pipette_96_channel.blow_out(location=liquid_waste["A1"]) + pipette_96_channel.drop_tip() + protocol.move_labware(tip_rack_3, waste_chute, use_gripper=USING_GRIPPER) def test_full_tip_rack_usage() -> None: """Full Tip Pick Up.""" - pipette_96_channel.configure_nozzle_layout(style=ALL, start="A1") + pipette_96_channel.configure_nozzle_layout( + style=ALL, tip_racks=[tip_rack_1] + ) + protocol.comment(f"channels {pipette_96_channel.active_channels}") pipette_96_channel.liquid_presence_detection = True - pipette_96_channel.pick_up_tip(tip_rack_1["A1"]) - - pipette_96_channel.aspirate(5, source_reservoir["A1"]) - pipette_96_channel.touch_tip() - + pipette_96_channel.pick_up_tip() + pipette_96_channel.aspirate(45, source_reservoir["A1"]) pipette_96_channel.liquid_presence_detection = False - pipette_96_channel.air_gap(height=30) - pipette_96_channel.blow_out(waste_chute) - - pipette_96_channel.aspirate(5, source_reservoir["A1"]) - pipette_96_channel.touch_tip() - - pipette_96_channel.air_gap(height=30) - pipette_96_channel.blow_out() - - pipette_96_channel.aspirate(10, source_reservoir["A1"]) - pipette_96_channel.touch_tip() - - pipette_96_channel.dispense(10, dest_pcr_plate["A1"].bottom(b)) - pipette_96_channel.mix(repetitions=5, volume=15) + pipette_96_channel.air_gap(5) + pipette_96_channel.dispense(25, dest_pcr_plate["A1"].bottom(b)) + pipette_96_channel.blow_out(location=liquid_waste["A1"]) pipette_96_channel.return_tip() - - ctx.move_labware(tip_rack_1, waste_chute, use_gripper=USING_GRIPPER) - ctx.move_labware(tip_rack_3, tip_rack_adapter, use_gripper=USING_GRIPPER) - - pipette_96_channel.pick_up_tip(tip_rack_3["A1"]) - pipette_96_channel.transfer( - volume=10, - source=source_reservoir["A1"], - dest=dest_pcr_plate["A1"], - new_tip="never", - touch_tip=True, - blow_out=True, - blowout_location="trash", - mix_before=(3, 5), - mix_after=(1, 5), - ) - pipette_96_channel.return_tip() - - ctx.move_labware(tip_rack_3, waste_chute, use_gripper=USING_GRIPPER) + pipette_96_channel.reset_tipracks() test_single_tip_pickup_usage() + test_column_tip_rack_usage() test_full_tip_rack_usage() def test_module_usage(unused_lids: List[Labware], used_lids: List[Labware]) -> None: @@ -351,14 +352,14 @@ def test_thermocycler( unused_lids, used_lids, ) = helpers.use_disposable_lid_with_tc( - ctx, unused_lids, used_lids, dest_pcr_plate, thermocycler + protocol, unused_lids, used_lids, dest_pcr_plate, thermocycler ) thermocycler.set_block_temperature(4) thermocycler.set_lid_temperature(105) # Close lid thermocycler.close_lid() helpers.perform_pcr( - ctx, + protocol, thermocycler, initial_denature_time_sec=45, denaturation_time_sec=30, @@ -374,9 +375,9 @@ def test_thermocycler( thermocycler.open_lid() if disposable_lid: if len(used_lids) <= 1: - ctx.move_labware(lid_on_plate, "B3", use_gripper=True) + protocol.move_labware(lid_on_plate, waste_chute, use_gripper=True) else: - ctx.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) + protocol.move_labware(lid_on_plate, used_lids[-2], use_gripper=True) thermocycler.deactivate() def test_h_s() -> None: @@ -397,16 +398,21 @@ def test_temperature_module() -> None: temperature_module.set_temperature(10) temperature_module.deactivate() - def test_mag() -> None: - """Tests magnetic block.""" - pass - test_thermocycler(unused_lids, used_lids) test_h_s() test_temperature_module() - test_mag() test_pipetting() test_gripper_moves() test_module_usage(unused_lids, used_lids) test_manual_moves() + protocol.move_labware(source_reservoir, "C2", use_gripper=True) + helpers.clean_up_plates( + pipette_96_channel, [dest_pcr_plate, source_reservoir], liquid_waste["A1"], 50 + ) + pipette_96_channel.reset_tipracks() + helpers.find_liquid_height_of_all_wells( + protocol, pipette_96_channel, [liquid_waste["A1"]] + ) + if deactivate_modules_bool: + helpers.deactivate_modules(protocol) diff --git a/abr-testing/abr_testing/protocols/active_protocols/6_Omega_HDQ_DNA_Cells-Flex_96_channel.py b/abr-testing/abr_testing/protocols/active_protocols/6_Omega_HDQ_DNA_Cells-Flex_96_channel.py index 89f643729fb..894f80dcdea 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/6_Omega_HDQ_DNA_Cells-Flex_96_channel.py +++ b/abr-testing/abr_testing/protocols/active_protocols/6_Omega_HDQ_DNA_Cells-Flex_96_channel.py @@ -29,22 +29,31 @@ def add_parameters(parameters: ParameterContext) -> None: """Parameters.""" helpers.create_dot_bottom_parameter(parameters) + helpers.create_deactivate_modules_parameter(parameters) + parameters.add_int( + variable_name="number_of_runs", + display_name="Number of Runs", + default=2, + minimum=1, + maximum=4, + ) # Start protocol -def run(ctx: ProtocolContext) -> None: +def run(protocol: ProtocolContext) -> None: """Protocol.""" - dot_bottom = ctx.params.dot_bottom # type: ignore[attr-defined] - + dot_bottom = protocol.params.dot_bottom # type: ignore[attr-defined] + deactivate_modules = protocol.params.deactivate_modules # type: ignore[attr-defined] + number_of_runs = protocol.params.number_of_runs # type: ignore[attr-defined] dry_run = False tip_mixing = False wash_vol = 600.0 AL_vol = 230.0 - bind_vol = 320.0 + bind_vol = 300.0 sample_vol = 180.0 elution_vol = 100.0 - + helpers.comment_protocol_version(protocol, "01") # Same for all HDQ Extractions deepwell_type = "nest_96_wellplate_2ml_deep" if not dry_run: @@ -59,56 +68,56 @@ def run(ctx: ProtocolContext) -> None: binding_buffer_vol = bead_vol + bind_vol starting_vol = AL_total_vol + sample_vol - h_s: HeaterShakerContext = ctx.load_module(helpers.hs_str, "D1") # type: ignore[assignment] + h_s: HeaterShakerContext = protocol.load_module( + helpers.hs_str, "D1" + ) # type: ignore[assignment] sample_plate, h_s_adapter = helpers.load_hs_adapter_and_labware( deepwell_type, h_s, "Sample Plate" ) h_s.close_labware_latch() samples_m = sample_plate.wells()[0] - # NOTE: MAG BLOCK will be on slot 6 - - temp: TemperatureModuleContext = ctx.load_module( + temp: TemperatureModuleContext = protocol.load_module( helpers.temp_str, "A3" ) # type: ignore[assignment] elutionplate, tempblock = helpers.load_temp_adapter_and_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt", temp, "Elution Plate/Reservoir" ) - magblock: MagneticBlockContext = ctx.load_module( + magblock: MagneticBlockContext = protocol.load_module( "magneticBlockV1", "C1" ) # type: ignore[assignment] - liquid_waste = ctx.load_labware("nest_1_reservoir_195ml", "B3", "Liquid Waste") + liquid_waste = protocol.load_labware("nest_1_reservoir_195ml", "B3", "Liquid Waste") waste = liquid_waste.wells()[0].top() - lysis_reservoir = ctx.load_labware(deepwell_type, "D2", "Lysis reservoir") + lysis_reservoir = protocol.load_labware(deepwell_type, "D2", "Lysis reservoir") lysis_res = lysis_reservoir.wells()[0] - bind_reservoir = ctx.load_labware( + bind_reservoir = protocol.load_labware( deepwell_type, "C2", "Beads and binding reservoir" ) bind_res = bind_reservoir.wells()[0] - wash1_reservoir = ctx.load_labware(deepwell_type, "C3", "Wash 1 reservoir") + wash1_reservoir = protocol.load_labware(deepwell_type, "C3", "Wash 1 reservoir") wash1_res = wash1_reservoir.wells()[0] - wash2_reservoir = ctx.load_labware(deepwell_type, "B1", "Wash 2 reservoir") + wash2_reservoir = protocol.load_labware(deepwell_type, "B1", "Wash 2 reservoir") wash2_res = wash2_reservoir.wells()[0] elution_res = elutionplate.wells()[0] # Load Pipette and tip racks # Load tips - tiprack_1 = ctx.load_labware( + tiprack_1 = protocol.load_labware( "opentrons_flex_96_tiprack_1000ul", "A1", adapter="opentrons_flex_96_tiprack_adapter", ) tips = tiprack_1.wells()[0] - tiprack_2 = ctx.load_labware( + tiprack_2 = protocol.load_labware( "opentrons_flex_96_tiprack_1000ul", "A2", adapter="opentrons_flex_96_tiprack_adapter", ) tips1 = tiprack_2.wells()[0] # load 96 channel pipette - pip: InstrumentContext = ctx.load_instrument( + pip: InstrumentContext = protocol.load_instrument( "flex_96channel_1000", mount="left", tip_racks=[tiprack_1, tiprack_2] ) # Load Liquids and probe @@ -127,7 +136,7 @@ def run(ctx: ProtocolContext) -> None: "Samples": [{"well": sample_plate.wells(), "volume": sample_vol}], } - helpers.find_liquid_height_of_loaded_liquids(ctx, liquid_vols_and_wells, pip) + helpers.find_liquid_height_of_loaded_liquids(protocol, liquid_vols_and_wells, pip) pip.flow_rate.aspirate = 50 pip.flow_rate.dispense = 150 @@ -211,141 +220,215 @@ def bead_mix(vol: float, plate: Well, reps: int = 5) -> None: pip.flow_rate.aspirate = 150 pip.flow_rate.dispense = 200 - # Start Protocol - temp.set_temperature(inc_temp) - # Transfer and mix lysis - pip.pick_up_tip(tips) - pip.aspirate(AL_total_vol, lysis_res) - pip.dispense(AL_total_vol, samples_m) - resuspend_pellet(400, samples_m, reps=4 if not dry_run else 1) - if not tip_mixing: - pip.return_tip() - - # Mix, then heat - ctx.comment("Lysis Mixing") - helpers.set_hs_speed(ctx, h_s, 1800, 10, False) - if not dry_run: - h_s.set_and_wait_for_temperature(55) - ctx.delay( - minutes=10 if not dry_run else 0.25, - msg="Please allow another 10 minutes of 55C incubation to complete lysis.", - ) - h_s.deactivate_shaker() - - # Transfer and mix bind&beads - pip.pick_up_tip(tips) - bead_mix(binding_buffer_vol, bind_res, reps=4 if not dry_run else 1) - pip.aspirate(binding_buffer_vol, bind_res) - pip.dispense(binding_buffer_vol, samples_m) - bead_mix(binding_buffer_vol + starting_vol, samples_m, reps=4 if not dry_run else 1) - if not tip_mixing: - pip.return_tip() - pip.home() - - # Shake for binding incubation - ctx.comment("Binding incubation") - helpers.set_hs_speed(ctx, h_s, 1800, 10, True) - - # Transfer plate to magnet - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) - - ctx.delay( - minutes=settling_time, - msg="Please wait " + str(settling_time) + " minute(s) for beads to pellet.", - ) + def protocol_function() -> None: + # Start Protocol + temp.set_temperature(inc_temp) + # Transfer and mix lysis + pip.pick_up_tip(tips) + pip.aspirate(AL_total_vol, lysis_res) + pip.dispense(AL_total_vol, samples_m) + resuspend_pellet(200, samples_m, reps=4 if not dry_run else 1) + if not tip_mixing: + pip.return_tip() - # Remove Supernatant and move off magnet - pip.pick_up_tip(tips) - pip.aspirate(1000, samples_m.bottom(dot_bottom)) - pip.dispense(1000, waste) - if starting_vol + binding_buffer_vol > 1000: - pip.aspirate(1000, samples_m.bottom(dot_bottom)) - pip.dispense(1000, waste) - pip.return_tip() - - # Transfer plate from magnet to H/S - helpers.move_labware_to_hs(ctx, sample_plate, h_s, h_s_adapter) - - # Washes - for i in range(num_washes if not dry_run else 1): - if i == 0 or i == 1: - wash_res = wash1_res - else: - wash_res = wash2_res + # Mix, then heat + protocol.comment("Lysis Mixing") + helpers.set_hs_speed(protocol, h_s, 1800, 10, False) + if not dry_run: + h_s.set_and_wait_for_temperature(55) + protocol.delay( + minutes=10 if not dry_run else 0.25, + msg="Please allow another 10 minutes of 55C incubation to complete lysis.", + ) + h_s.deactivate_shaker() + # Transfer and mix bind&beads pip.pick_up_tip(tips) - pip.aspirate(wash_vol, wash_res) - pip.dispense(wash_vol, samples_m) + bead_mix(binding_buffer_vol, bind_res, reps=4 if not dry_run else 1) + pip.aspirate(binding_buffer_vol, bind_res) + pip.dispense(binding_buffer_vol, samples_m) + bead_mix( + binding_buffer_vol + starting_vol, samples_m, reps=4 if not dry_run else 1 + ) if not tip_mixing: pip.return_tip() - helpers.set_hs_speed(ctx, h_s, 1800, 5, True) + pip.home() + + # Shake for binding incubation + protocol.comment("Binding incubation") + helpers.set_hs_speed(protocol, h_s, 1800, 10, True) # Transfer plate to magnet - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) - ctx.delay( + protocol.delay( minutes=settling_time, msg="Please wait " + str(settling_time) + " minute(s) for beads to pellet.", ) # Remove Supernatant and move off magnet pip.pick_up_tip(tips) - pip.aspirate(1000, samples_m.bottom(dot_bottom)) - pip.dispense(1000, bind_res.top()) - if wash_vol > 1000: - pip.aspirate(1000, samples_m.bottom(dot_bottom)) - pip.dispense(1000, bind_res.top()) + pip.aspirate(550, samples_m.bottom(dot_bottom)) + pip.dispense(550, waste) + if starting_vol + binding_buffer_vol > 1000: + pip.aspirate(550, samples_m.bottom(dot_bottom)) + pip.dispense(550, waste) pip.return_tip() # Transfer plate from magnet to H/S - helpers.move_labware_to_hs(ctx, sample_plate, h_s, h_s_adapter) + helpers.move_labware_to_hs(protocol, sample_plate, h_s, h_s_adapter) + + # Washes + for i in range(num_washes if not dry_run else 1): + if i == 0 or i == 1: + wash_res = wash1_res + else: + wash_res = wash2_res + + pip.pick_up_tip(tips) + pip.aspirate(wash_vol, wash_res) + pip.dispense(wash_vol, samples_m) + if not tip_mixing: + pip.return_tip() + helpers.set_hs_speed(protocol, h_s, 1800, 5, True) + + # Transfer plate to magnet + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) + + protocol.delay( + minutes=settling_time, + msg="Please wait " + + str(settling_time) + + " minute(s) for beads to pellet.", + ) + + # Remove Supernatant and move off magnet + pip.pick_up_tip(tips) + pip.aspirate(473, samples_m.bottom(dot_bottom)) + pip.dispense(473, bind_res.top()) + if wash_vol > 1000: + pip.aspirate(473, samples_m.bottom(dot_bottom)) + pip.dispense(473, bind_res.top()) + pip.return_tip() - # Dry beads - if dry_run: - drybeads = 0.5 - else: - drybeads = 10 - # Number of minutes you want to dry for - for beaddry in np.arange(drybeads, 0, -0.5): - ctx.delay( - minutes=0.5, - msg="There are " + str(beaddry) + " minutes left in the drying step.", - ) + # Transfer plate from magnet to H/S + helpers.move_labware_to_hs(protocol, sample_plate, h_s, h_s_adapter) - # Elution - pip.pick_up_tip(tips1) - pip.aspirate(elution_vol, elution_res) - pip.dispense(elution_vol, samples_m) - resuspend_pellet(elution_vol, samples_m, reps=3 if not dry_run else 1) - if not tip_mixing: - pip.return_tip() - pip.home() + # Dry beads + if dry_run: + drybeads = 0.5 + else: + drybeads = 10 + # Number of minutes you want to dry for + for beaddry in np.arange(drybeads, 0, -0.5): + protocol.delay( + minutes=0.5, + msg="There are " + str(beaddry) + " minutes left in the drying step.", + ) + + # Elution + pip.pick_up_tip(tips1) + pip.aspirate(elution_vol, elution_res) + pip.dispense(elution_vol, samples_m) + resuspend_pellet(elution_vol, samples_m, reps=3 if not dry_run else 1) + if not tip_mixing: + pip.return_tip() + pip.home() - helpers.set_hs_speed(ctx, h_s, 2000, 5, True) + helpers.set_hs_speed(protocol, h_s, 2000, 5, True) - # Transfer plate to magnet - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + # Transfer plate to magnet + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) - ctx.delay( - minutes=settling_time, - msg="Please wait " + str(settling_time) + " minute(s) for beads to pellet.", - ) + protocol.delay( + minutes=settling_time, + msg="Please wait " + str(settling_time) + " minute(s) for beads to pellet.", + ) + + pip.pick_up_tip(tips1) + pip.aspirate(elution_vol, samples_m) + pip.dispense(elution_vol, elutionplate.wells()[0]) + pip.return_tip() + + pip.home() + pip.reset_tipracks() + + # Empty Plates + pip.pick_up_tip() + pip.aspirate(500, samples_m) + pip.dispense(500, liquid_waste["A1"].top()) + pip.aspirate(500, wash1_res) + pip.dispense(500, liquid_waste["A1"].top()) + pip.aspirate(500, wash2_res) + pip.dispense(500, liquid_waste["A1"].top()) + pip.return_tip() + helpers.find_liquid_height_of_all_wells(protocol, pip, [liquid_waste["A1"]]) + helpers.move_labware_to_hs(protocol, sample_plate, h_s, h_s_adapter) + + def setup() -> None: + pip.pick_up_tip() + pip.transfer( + volume=250, + source=liquid_waste["A1"].bottom(z=2), + dest=lysis_reservoir["A1"], + blow_out=True, + blowout_location="source well", + new_tip="never", + trash=False, + ) + pip.transfer( + 1700, + liquid_waste["A1"].bottom(z=2), + wash1_reservoir["A1"], + blow_out=True, + blowout_location="source well", + new_tip="never", + trash=False, + ) + pip.transfer( + 1100, + bind_reservoir["A1"].bottom(z=2), + wash2_reservoir["A1"], + blow_out=True, + blowout_location="source well", + new_tip="never", + trash=False, + ) + pip.transfer( + 100, + liquid_waste["A1"].bottom(z=2), + sample_plate["A1"], + blow_out=True, + blowout_location="source well", + new_tip="never", + trash=False, + ) + pip.return_tip() - pip.pick_up_tip(tips1) - pip.aspirate(elution_vol, samples_m) - pip.dispense(elution_vol, elutionplate.wells()[0]) - pip.return_tip() - - pip.home() - pip.reset_tipracks() - - # Empty Plates - pip.pick_up_tip() - pip.aspirate(1000, samples_m) - pip.dispense(1000, liquid_waste["A1"].top()) - pip.aspirate(1000, wash1_res) - pip.dispense(1000, liquid_waste["A1"].top()) - pip.aspirate(1000, wash2_res) - pip.dispense(1000, liquid_waste["A1"].top()) - pip.return_tip() - helpers.find_liquid_height_of_all_wells(ctx, pip, [liquid_waste["A1"]]) + def clean() -> None: + plates_to_clean = [ + sample_plate, + elutionplate, + wash2_reservoir, + wash1_reservoir, + liquid_waste, + ] + helpers.clean_up_plates(pip, plates_to_clean, liquid_waste["A1"], 1000) + + for i in range(number_of_runs): + protocol_function() + + pip.reset_tipracks() + if i < number_of_runs - 1: + setup() + pip.reset_tipracks() + clean() + if deactivate_modules: + helpers.deactivate_modules(protocol) + helpers.find_liquid_height_of_all_wells(protocol, pip, [liquid_waste["A1"]]) diff --git a/abr-testing/abr_testing/protocols/active_protocols/7_HDQ_DNA_Bacteria_Flex.py b/abr-testing/abr_testing/protocols/active_protocols/7_HDQ_DNA_Bacteria_Flex.py index aa33079f553..4350888b0d6 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/7_HDQ_DNA_Bacteria_Flex.py +++ b/abr-testing/abr_testing/protocols/active_protocols/7_HDQ_DNA_Bacteria_Flex.py @@ -22,7 +22,7 @@ } requirements = { - "robotType": "OT-3", + "robotType": "Flex", "apiLevel": "2.21", } """ @@ -57,18 +57,22 @@ def add_parameters(parameters: ParameterContext) -> None: helpers.create_single_pipette_mount_parameter(parameters) helpers.create_hs_speed_parameter(parameters) helpers.create_dot_bottom_parameter(parameters) + helpers.create_deactivate_modules_parameter(parameters) -def run(ctx: ProtocolContext) -> None: +def run(protocol: ProtocolContext) -> None: """Protocol.""" - heater_shaker_speed = ctx.params.heater_shaker_speed # type: ignore[attr-defined] - mount = ctx.params.pipette_mount # type: ignore[attr-defined] - dot_bottom = ctx.params.dot_bottom # type: ignore[attr-defined] + heater_shaker_speed = protocol.params.heater_shaker_speed # type: ignore[attr-defined] + mount = protocol.params.pipette_mount # type: ignore[attr-defined] + dot_bottom = protocol.params.dot_bottom # type: ignore[attr-defined] + deactivate_modules_bool = protocol.params.deactivate_modules # type: ignore[attr-defined] + helpers.comment_protocol_version(protocol, "01") + dry_run = False TIP_TRASH = False res_type = "nest_12_reservoir_22ml" - num_samples = 8 + num_samples = 96 wash1_vol = 600.0 wash2_vol = 600.0 wash3_vol = 600.0 @@ -95,37 +99,48 @@ def run(ctx: ProtocolContext) -> None: starting_vol = AL_vol + sample_vol binding_buffer_vol = bind_vol + bead_vol - ctx.load_trash_bin("A3") - h_s: HeaterShakerContext = ctx.load_module(helpers.hs_str, "D1") # type: ignore[assignment] + protocol.load_trash_bin("A3") + h_s: HeaterShakerContext = protocol.load_module( + helpers.hs_str, "D1" + ) # type: ignore[assignment] sample_plate, h_s_adapter = helpers.load_hs_adapter_and_labware( deepwell_type, h_s, "Sample Plate" ) h_s.close_labware_latch() - temp: TemperatureModuleContext = ctx.load_module( + temp: TemperatureModuleContext = protocol.load_module( helpers.temp_str, "D3" ) # type: ignore[assignment] elutionplate, temp_adapter = helpers.load_temp_adapter_and_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt", temp, "Elution Plate" ) - magnetic_block: MagneticBlockContext = ctx.load_module( + magnetic_block: MagneticBlockContext = protocol.load_module( helpers.mag_str, "C1" ) # type: ignore[assignment] - waste_reservoir = ctx.load_labware("nest_1_reservoir_195ml", "B3", "Liquid Waste") + waste_reservoir = protocol.load_labware( + "nest_1_reservoir_195ml", "B3", "Liquid Waste" + ) waste = waste_reservoir.wells()[0].top() - res1 = ctx.load_labware(res_type, "D2", "Reagent Reservoir 1") + res1 = protocol.load_labware(res_type, "D2", "Reagent Reservoir 1") num_cols = math.ceil(num_samples / 8) - # Load tips and combine all similar boxes - tips1000 = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "A1", "Tips 1") - tips1001 = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "A2", "Tips 2") - tips1002 = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "B1", "Tips 3") - tips = [*tips1000.wells()[num_samples:96], *tips1001.wells(), *tips1002.wells()] + tips1000 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "A1", "Tips 1") + tips1001 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "A2", "Tips 2") + tips1002 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "B1", "Tips 3") + tips1003 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "B2", "Tips 4") + tips1004 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "C2", "Tips 5") + + tips = [ + *tips1000.wells()[num_samples:96], + *tips1001.wells(), + *tips1002.wells(), + *tips1003.wells(), + ] tips_sn = tips1000.wells()[:num_samples] # load instruments - m1000 = ctx.load_instrument( - "flex_8channel_1000", mount, tip_racks=[tips1000, tips1001, tips1002] + m1000 = protocol.load_instrument( + "flex_8channel_1000", mount, tip_racks=[tips1000, tips1001, tips1002, tips1003] ) """ @@ -158,7 +173,7 @@ def run(ctx: ProtocolContext) -> None: m1000.flow_rate.aspirate = 300 m1000.flow_rate.dispense = 300 m1000.flow_rate.blow_out = 300 - helpers.find_liquid_height_of_loaded_liquids(ctx, liquid_vols_and_wells, m1000) + helpers.find_liquid_height_of_loaded_liquids(protocol, liquid_vols_and_wells, m1000) def tiptrack(tipbox: List[Well]) -> None: """Track Tips.""" @@ -167,14 +182,15 @@ def tiptrack(tipbox: List[Well]) -> None: if tipbox == tips: m1000.pick_up_tip(tipbox[int(tip1k)]) tip1k = tip1k + 8 + if tip1k >= len(tipbox): + tip1k = 0 drop_count = drop_count + 8 if drop_count >= 150: drop_count = 0 - ctx.pause("Empty Waste Bin.") def remove_supernatant(vol: float) -> None: """Remove supernatants.""" - ctx.comment("-----Removing Supernatant-----") + protocol.comment("-----Removing Supernatant-----") m1000.flow_rate.aspirate = 150 num_trans = math.ceil(vol / 980) vol_per_trans = vol / num_trans @@ -192,7 +208,7 @@ def remove_supernatant(vol: float) -> None: m1000.air_gap(20) m1000.drop_tip(tips_sn[8 * i]) if TIP_TRASH else m1000.return_tip() m1000.flow_rate.aspirate = 300 - helpers.move_labware_to_hs(ctx, sample_plate, h_s, h_s_adapter) + helpers.move_labware_to_hs(protocol, sample_plate, h_s, h_s_adapter) def bead_mixing( well: Well, pip: InstrumentContext, mvol: float, reps: int = 8 @@ -284,7 +300,7 @@ def mixing(well: Well, pip: InstrumentContext, mvol: float, reps: int = 8) -> No def A_lysis(vol: float, source: Well) -> None: """A Lysis.""" - ctx.comment("-----Mixing then transferring AL buffer-----") + protocol.comment("-----Mixing then transferring AL buffer-----") num_transfers = math.ceil(vol / 980) tiptrack(tips) for i in range(num_cols): @@ -303,7 +319,6 @@ def A_lysis(vol: float, source: Well) -> None: m1000.require_liquid_presence(src) m1000.aspirate(tvol, src.bottom(1)) m1000.dispense(tvol, src.bottom(4)) - m1000.require_liquid_presence(src) m1000.aspirate(tvol, src.bottom(height)) m1000.air_gap(10) m1000.dispense(m1000.current_volume, samples_m[i].top()) @@ -318,12 +333,12 @@ def A_lysis(vol: float, source: Well) -> None: m1000.air_gap(20) m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - ctx.comment("-----Mixing then Heating AL and Sample-----") + protocol.comment("-----Mixing then Heating AL and Sample-----") - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, A_lysis_time_1, False) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, A_lysis_time_1, False) if not dry_run: h_s.set_and_wait_for_temperature(55) - ctx.delay( + protocol.delay( minutes=A_lysis_time_2, msg="Incubating at 55C " + str(heater_shaker_speed) @@ -347,17 +362,17 @@ def bind(vol: float) -> None: supernatant to the final clean elutions PCR plate. """ - ctx.comment("-----Beginning Bind Steps-----") + protocol.comment("-----Beginning Bind Steps-----") tiptrack(tips) for i, well in enumerate(samples_m): num_trans = math.ceil(vol / 980) vol_per_trans = vol / num_trans - source = binding_buffer[i // 3] + source = binding_buffer[i // 7] if i == 0: reps = 6 if not dry_run else 1 else: reps = 1 - ctx.comment("-----Mixing Beads in Reservoir-----") + protocol.comment("-----Mixing Beads in Reservoir-----") bead_mixing(source, m1000, vol_per_trans, reps=reps if not dry_run else 1) # Transfer beads and binding from source to H-S plate for t in range(num_trans): @@ -370,7 +385,7 @@ def bind(vol: float) -> None: if t < num_trans - 1: m1000.air_gap(20) - ctx.comment("-----Mixing Beads in Plate-----") + protocol.comment("-----Mixing Beads in Plate-----") for i in range(num_cols): if i != 0: tiptrack(tips) @@ -379,19 +394,19 @@ def bind(vol: float) -> None: ) m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - ctx.comment("-----Incubating Beads and Bind on H-S-----") + protocol.comment("-----Incubating Beads and Bind on H-S-----") speed_val = heater_shaker_speed * 0.9 - helpers.set_hs_speed(ctx, h_s, speed_val, bind_time, True) + helpers.set_hs_speed(protocol, h_s, speed_val, bind_time, True) # Transfer from H-S plate to Magdeck plate helpers.move_labware_from_hs_to_destination( - ctx, sample_plate, h_s, magnetic_block + protocol, sample_plate, h_s, magnetic_block ) for bindi in np.arange( settling_time + 1, 0, -0.5 ): # Settling time delay with countdown timer - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(bindi) + " minutes left in the incubation.", ) @@ -410,29 +425,29 @@ def wash(vol: float, source: List[Well]) -> None: if source == wash3: whichwash = 3 - ctx.comment("-----Beginning Wash #" + str(whichwash) + "-----") + protocol.comment("-----Beginning Wash #" + str(whichwash) + "-----") num_trans = math.ceil(vol / 980) vol_per_trans = vol / num_trans tiptrack(tips) for i, m in enumerate(samples_m): - src = source[i // 2] + src = source[i // 4] for n in range(num_trans): if m1000.current_volume > 0: m1000.dispense(m1000.current_volume, src.top()) m1000.transfer(vol_per_trans, src, m.top(), air_gap=20, new_tip="never") m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, elute_wash_time, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, elute_wash_time, True) helpers.move_labware_from_hs_to_destination( - ctx, sample_plate, h_s, magnetic_block + protocol, sample_plate, h_s, magnetic_block ) for washi in np.arange( settling_time, 0, -0.5 ): # settling time timer for washes - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(washi) @@ -445,7 +460,7 @@ def wash(vol: float, source: List[Well]) -> None: def elute(vol: float) -> None: """Elution Function.""" - ctx.comment("-----Beginning Elution Steps-----") + protocol.comment("-----Beginning Elution Steps-----") tiptrack(tips) for i, (m, e) in enumerate(zip(samples_m, elution_samples_m)): m1000.flow_rate.aspirate = 25 @@ -457,15 +472,15 @@ def elute(vol: float) -> None: h_s.set_and_wait_for_shake_speed(heater_shaker_speed * 1.1) speed_val = heater_shaker_speed * 1.1 - helpers.set_hs_speed(ctx, h_s, speed_val, elute_wash_time, True) + helpers.set_hs_speed(protocol, h_s, speed_val, elute_wash_time, True) # Transfer back to magnet helpers.move_labware_from_hs_to_destination( - ctx, sample_plate, h_s, magnetic_block + protocol, sample_plate, h_s, magnetic_block ) for elutei in np.arange(settling_time, 0, -0.5): - ctx.delay( + protocol.delay( minutes=0.5, msg="Incubating on MagDeck for " + str(elutei) + " more minutes.", ) @@ -495,7 +510,7 @@ def elute(vol: float) -> None: else: drybeads = 0.5 for beaddry in np.arange(drybeads, 0, -0.5): - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(beaddry) + " minutes left in the drying step.", ) @@ -504,7 +519,9 @@ def elute(vol: float) -> None: # Probe wells end_wells_with_liquid = [ waste_reservoir.wells()[0], - res1.wells()[0], - elutionplate.wells()[0], ] - helpers.find_liquid_height_of_all_wells(ctx, m1000, end_wells_with_liquid) + m1000.tip_racks = [tips1004] + helpers.clean_up_plates(m1000, [res1, elutionplate], waste_reservoir["A1"], 1000) + helpers.find_liquid_height_of_all_wells(protocol, m1000, end_wells_with_liquid) + if deactivate_modules_bool: + helpers.deactivate_modules(protocol) diff --git a/abr-testing/abr_testing/protocols/active_protocols/8_Illumina and Plate Reader.py b/abr-testing/abr_testing/protocols/active_protocols/8_Illumina and Plate Reader.py index 4894cae41d4..3d8c664956c 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/8_Illumina and Plate Reader.py +++ b/abr-testing/abr_testing/protocols/active_protocols/8_Illumina and Plate Reader.py @@ -1,5 +1,11 @@ """Illumina DNA Prep and Plate Reader Test.""" -from opentrons.protocol_api import ParameterContext, ProtocolContext, Labware +from opentrons.protocol_api import ( + ParameterContext, + ProtocolContext, + Labware, + Well, + InstrumentContext, +) from abr_testing.protocols import helpers from opentrons.protocol_api.module_contexts import ( AbsorbanceReaderContext, @@ -10,9 +16,10 @@ ) from datetime import datetime from opentrons.hardware_control.modules.types import ThermocyclerStep -from typing import List +from typing import List, Dict from opentrons import types + metadata = { "protocolName": "Illumina DNA Prep and Plate Reader Test", "author": "Platform Expansion", @@ -31,7 +38,7 @@ HYBRID_PAUSE = True # True = sets a pause on the Hybridization # PROTOCOL SETTINGS -COLUMNS = 3 # 1-3 +COLUMNS = 4 # 1-4 HYBRIDDECK = True HYBRIDTIME = 1.6 # Hours @@ -55,6 +62,8 @@ def add_parameters(parameters: ParameterContext) -> None: """Add Parameters.""" helpers.create_hs_speed_parameter(parameters) helpers.create_dot_bottom_parameter(parameters) + helpers.create_deactivate_modules_parameter(parameters) + helpers.create_plate_reader_compatible_labware_parameter(parameters) parameters.add_bool( variable_name="plate_orientation", display_name="Hellma Plate Orientation", @@ -103,6 +112,10 @@ def run(protocol: ProtocolContext) -> None: heater_shaker_speed = protocol.params.heater_shaker_speed # type: ignore[attr-defined] dot_bottom = protocol.params.dot_bottom # type: ignore[attr-defined] plate_orientation = protocol.params.plate_orientation # type: ignore[attr-defined] + deactivate_modules_bool = protocol.params.deactivate_modules # type: ignore[attr-defined] + plate_type = protocol.params.labware_plate_reader_compatible # type: ignore [attr-defined] + helpers.comment_protocol_version(protocol, "01") + plate_name_str = "hellma_plate_" + str(plate_orientation) global p200_tips global p50_tips @@ -115,7 +128,9 @@ def run(protocol: ProtocolContext) -> None: tiprack_50_2 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "A3") # MODULES + LABWARE # Reservoir - reservoir = protocol.load_labware("nest_96_wellplate_2ml_deep", "D2") + reservoir = protocol.load_labware( + "nest_96_wellplate_2ml_deep", "D2", "Liquid Waste" + ) # Heatershaker heatershaker: HeaterShakerContext = protocol.load_module( helpers.hs_str, "D1" @@ -123,6 +138,7 @@ def run(protocol: ProtocolContext) -> None: sample_plate_2 = heatershaker.load_labware( "thermoscientificnunc_96_wellplate_1300ul" ) + heatershaker.close_labware_latch() # Magnetic Block mag_block: MagneticBlockContext = protocol.load_module( helpers.mag_str, "C1" @@ -133,6 +149,7 @@ def run(protocol: ProtocolContext) -> None: sample_plate_1 = thermocycler.load_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt" ) + thermocycler.open_lid() # Temperature Module temp_block: TemperatureModuleContext = protocol.load_module( helpers.temp_str, "B3" @@ -144,7 +161,7 @@ def run(protocol: ProtocolContext) -> None: plate_reader: AbsorbanceReaderContext = protocol.load_module( helpers.abs_mod_str, PLATE_READER_SLOT ) # type: ignore[assignment] - hellma_plate = protocol.load_labware("hellma_reference_plate", HELLMA_PLATE_SLOT) + hellma_plate = protocol.load_labware(plate_type, HELLMA_PLATE_SLOT) # PIPETTES p1000 = protocol.load_instrument( "flex_8channel_1000", @@ -154,6 +171,28 @@ def run(protocol: ProtocolContext) -> None: p50 = protocol.load_instrument( "flex_8channel_50", "right", tip_racks=[tiprack_50_1, tiprack_50_2] ) + + # Load liquids and probe + liquid_vols_and_wells: Dict[str, List[Dict[str, Well | List[Well] | float]]] = { + "Reagents": [ + {"well": reagent_plate.columns()[3], "volume": 75.0}, + {"well": reagent_plate.columns()[4], "volume": 15.0}, + {"well": reagent_plate.columns()[5], "volume": 20.0}, + {"well": reagent_plate.columns()[6], "volume": 65.0}, + ], + "AMPure": [{"well": reservoir.columns()[0], "volume": 120.0}], + "SMB": [{"well": reservoir.columns()[1], "volume": 750.0}], + "EtOH": [{"well": reservoir.columns()[3], "volume": 900.0}], + "RSB": [{"well": reservoir.columns()[4], "volume": 96.0}], + "Wash": [ + {"well": sample_plate_2.columns()[9], "volume": 1000.0}, + {"well": sample_plate_2.columns()[10], "volume": 1000.0}, + {"well": sample_plate_2.columns()[11], "volume": 1000.0}, + ], + "Samples": [{"well": sample_plate_1.wells(), "volume": 150.0}], + } + helpers.find_liquid_height_of_loaded_liquids(protocol, liquid_vols_and_wells, p50) + # reagent AMPure = reservoir["A1"] SMB = reservoir["A2"] @@ -165,11 +204,42 @@ def run(protocol: ProtocolContext) -> None: Liquid_trash_well_2 = reservoir["A10"] Liquid_trash_well_3 = reservoir["A11"] Liquid_trash_well_4 = reservoir["A12"] + liquid_trash_list = { + Liquid_trash_well_1: 0.0, + Liquid_trash_well_2: 0.0, + Liquid_trash_well_3: 0.0, + Liquid_trash_well_4: 0.0, + } + + def trash_liquid( + protocol: ProtocolContext, + pipette: InstrumentContext, + vol_to_trash: float, + liquid_trash_list: Dict[Well, float], + ) -> None: + """Determine which wells to use as liquid waste.""" + remaining_volume = vol_to_trash + max_capacity = 1500.0 + # Determine liquid waste location depending on current total volume + # Distribute the liquid volume sequentially + for well, current_volume in liquid_trash_list.items(): + if remaining_volume <= 0.0: + break + available_capacity = max_capacity - current_volume + if available_capacity < remaining_volume: + continue + pipette.dispense(remaining_volume, well.top()) + protocol.delay(minutes=0.1) + pipette.blow_out(well.top()) + liquid_trash_list[well] += remaining_volume + if pipette.current_volume <= 0.0: + break # Will Be distributed during the protocol - EEW_1 = sample_plate_2.wells_by_name()["A10"] - EEW_2 = sample_plate_2.wells_by_name()["A11"] - EEW_3 = sample_plate_2.wells_by_name()["A12"] + EEW_1 = sample_plate_2.wells_by_name()["A9"] + EEW_2 = sample_plate_2.wells_by_name()["A10"] + EEW_3 = sample_plate_2.wells_by_name()["A11"] + EEW_4 = sample_plate_2.wells_by_name()["A12"] NHB2 = reagent_plate.wells_by_name()["A1"] Panel = reagent_plate.wells_by_name()["A2"] @@ -206,6 +276,14 @@ def run(protocol: ProtocolContext) -> None: column_5_list = ["A7", "A8", "A9"] # Plate 2 column_6_list = ["A7", "A8", "A9"] # Plate 1 WASHES = [EEW_1, EEW_2, EEW_3] + if COLUMNS == 4: + column_1_list = ["A1", "A2", "A3", "A4"] # Plate 1 + column_2_list = ["A1", "A2", "A3", "A4"] # Plate 2 + column_3_list = ["A5", "A6", "A7", "A8"] # Plate 2 + column_4_list = ["A5", "A6", "A7", "A8"] # Plate 1 + column_5_list = ["A9", "A10", "A11", "A12"] # Plate 2 + column_6_list = ["A9", "A10", "A11", "A12"] # Plate 1 + WASHES = [EEW_1, EEW_2, EEW_3, EEW_4] def tipcheck() -> None: """Check tips.""" @@ -231,9 +309,7 @@ def tipcheck() -> None: thermocycler.set_block_temperature(58) thermocycler.set_lid_temperature(58) heatershaker.set_and_wait_for_temperature(58) - protocol.pause("Ready") heatershaker.close_labware_latch() - Liquid_trash = Liquid_trash_well_1 # Sample Plate contains 30ul of DNA @@ -409,20 +485,14 @@ def tipcheck() -> None: p1000.pick_up_tip() p1000.move_to(sample_plate_2[X].bottom(4)) p1000.aspirate(200, rate=0.25) - p1000.dispense(200, Liquid_trash.top(z=-7)) + trash_liquid(protocol, p1000, 200, liquid_trash_list) p1000.move_to(sample_plate_2[X].bottom(0.5)) p1000.aspirate(200, rate=0.25) - p1000.dispense(200, Liquid_trash.top(z=-7)) - p1000.move_to(Liquid_trash.top(z=-7)) - protocol.delay(minutes=0.1) - p1000.blow_out(Liquid_trash.top(z=-7)) - p1000.aspirate(20) + trash_liquid(protocol, p1000, 200, liquid_trash_list) p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() p200_tips += 1 tipcheck() - Liquid_trash = Liquid_trash_well_2 - # ============================================================================================ # GRIPPER MOVE sample_plate_2 FROM MAGPLATE TO heatershaker helpers.move_labware_to_hs( @@ -469,9 +539,6 @@ def tipcheck() -> None: if DRYRUN is False: protocol.delay(seconds=1 * 60) - if washcount > 2: - Liquid_trash = Liquid_trash_well_3 - protocol.comment("--> Removing Supernatant") RemoveSup = 200 for loop, X in enumerate(column_2_list): @@ -482,10 +549,7 @@ def tipcheck() -> None: p1000.move_to(sample_plate_2[X].bottom(z=0.5)) p1000.aspirate(100, rate=0.25) p1000.move_to(sample_plate_2[X].top(z=0.5)) - p1000.dispense(200, Liquid_trash.top(z=-7)) - protocol.delay(minutes=0.1) - p1000.blow_out(Liquid_trash.top(z=-7)) - p1000.aspirate(20) + trash_liquid(protocol, p1000, 200, liquid_trash_list) p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() p200_tips += 1 tipcheck() @@ -554,10 +618,7 @@ def tipcheck() -> None: p1000.move_to(sample_plate_2[X].bottom(z=0.5)) p1000.aspirate(100, rate=0.25) p1000.move_to(sample_plate_2[X].top(z=0.5)) - p1000.dispense(200, Liquid_trash.top(z=-7)) - protocol.delay(minutes=0.1) - p1000.blow_out(Liquid_trash.top(z=-7)) - p1000.aspirate(20) + trash_liquid(protocol, p1000, 200, liquid_trash_list) p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() p200_tips += 1 tipcheck() @@ -568,12 +629,7 @@ def tipcheck() -> None: p50.move_to(sample_plate_2[X].bottom(z=dot_bottom)) # original = z=0 p50.aspirate(50, rate=0.25) p50.default_speed = 200 - p50.dispense(50, Liquid_trash.top(z=-7)) - protocol.delay(minutes=0.1) - p50.blow_out() - p50.default_speed = 400 - p50.move_to(Liquid_trash.top(z=-7)) - p50.move_to(Liquid_trash.top(z=0)) + trash_liquid(protocol, p50, 50, liquid_trash_list) p50.return_tip() if TIP_TRASH is False else p50.drop_tip() p50_tips += 1 tipcheck() @@ -722,8 +778,6 @@ def tipcheck() -> None: p50_tips += 1 tipcheck() - Liquid_trash = Liquid_trash_well_4 - protocol.comment("--> ADDING AMPure (0.8x)") AMPureVol = 40.5 AMPureMixRep = 5 * 60 if DRYRUN is False else 0.1 * 60 @@ -777,12 +831,7 @@ def tipcheck() -> None: p1000.default_speed = 5 p1000.move_to(sample_plate_2[X].top(z=2)) p1000.default_speed = 200 - p1000.dispense(200, Liquid_trash.top(z=-7)) - protocol.delay(minutes=0.1) - p1000.blow_out() - p1000.default_speed = 400 - p1000.move_to(Liquid_trash.top(z=-7)) - p1000.move_to(Liquid_trash.top(z=0)) + trash_liquid(protocol, p1000, 200, liquid_trash_list) p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() p200_tips += 1 tipcheck() @@ -821,12 +870,7 @@ def tipcheck() -> None: p1000.default_speed = 5 p1000.move_to(sample_plate_2[X].top(z=2)) p1000.default_speed = 200 - p1000.dispense(200, Liquid_trash.top(z=-7)) - protocol.delay(minutes=0.1) - p1000.blow_out() - p1000.default_speed = 400 - p1000.move_to(Liquid_trash.top(z=-7)) - p1000.move_to(Liquid_trash.top(z=0)) + trash_liquid(protocol, p1000, 200, liquid_trash_list) p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() p200_tips += 1 tipcheck() @@ -842,12 +886,7 @@ def tipcheck() -> None: ) # original = (z=0) p1000.aspirate(50, rate=0.25) p1000.default_speed = 200 - p1000.dispense(50, Liquid_trash.top(z=-7)) - protocol.delay(minutes=0.1) - p1000.blow_out() - p1000.default_speed = 400 - p1000.move_to(Liquid_trash.top(z=-7)) - p1000.move_to(Liquid_trash.top(z=0)) + trash_liquid(protocol, p1000, 50, liquid_trash_list) p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() p200_tips += 1 tipcheck() @@ -945,4 +984,13 @@ def tipcheck() -> None: p1000.return_tip() if TIP_TRASH is False else p1000.drop_tip() p200_tips += 1 tipcheck() + liquids_to_probe_at_end = [ + Liquid_trash_well_1, + Liquid_trash_well_2, + Liquid_trash_well_3, + Liquid_trash_well_4, + ] + helpers.find_liquid_height_of_all_wells(protocol, p50, liquids_to_probe_at_end) plate_reader_actions(protocol, plate_reader, hellma_plate, plate_name_str) + if deactivate_modules_bool: + helpers.deactivate_modules(protocol) diff --git a/abr-testing/abr_testing/protocols/active_protocols/9_Magmax_RNA_Cells_Flex.py b/abr-testing/abr_testing/protocols/active_protocols/9_Magmax_RNA_Cells_Flex.py index 09201e58314..c44e8111490 100644 --- a/abr-testing/abr_testing/protocols/active_protocols/9_Magmax_RNA_Cells_Flex.py +++ b/abr-testing/abr_testing/protocols/active_protocols/9_Magmax_RNA_Cells_Flex.py @@ -24,7 +24,7 @@ } requirements = { - "robotType": "OT-3", + "robotType": "Flex", "apiLevel": "2.21", } """ @@ -44,15 +44,17 @@ Reservoir 1: Well 1 - 8120 ul -Well 2 - 6400 ul -Well 3-7 - 8550 ul +Well 2 - 8120 ul +Well 3 - 12800 ul +Well 4-12 - 9500 ul + """ -whichwash = 1 -sample_max = 48 -tip = 0 +whichwash = 0 +tip_pick_up = 0 drop_count = 0 waste_vol = 0 +wash_volume_tracker = 0.0 # Start protocol @@ -61,22 +63,25 @@ def add_parameters(parameters: ParameterContext) -> None: helpers.create_dot_bottom_parameter(parameters) helpers.create_single_pipette_mount_parameter(parameters) helpers.create_hs_speed_parameter(parameters) + helpers.create_deactivate_modules_parameter(parameters) -def run(ctx: ProtocolContext) -> None: +def run(protocol: ProtocolContext) -> None: """Protocol.""" dry_run = False inc_lysis = True res_type = "nest_12_reservoir_15ml" TIP_TRASH = False - num_samples = 48 + num_samples = 96 wash_vol = 150.0 lysis_vol = 140.0 stop_vol = 100.0 - elution_vol = dnase_vol = 50.0 - heater_shaker_speed = ctx.params.heater_shaker_speed # type: ignore[attr-defined] - dot_bottom = ctx.params.dot_bottom # type: ignore[attr-defined] - pipette_mount = ctx.params.pipette_mount # type: ignore[attr-defined] + elution_vol = dnase_vol = 55.0 + heater_shaker_speed = protocol.params.heater_shaker_speed # type: ignore[attr-defined] + dot_bottom = protocol.params.dot_bottom # type: ignore[attr-defined] + pipette_mount = protocol.params.pipette_mount # type: ignore[attr-defined] + deactivate_modules_bool = protocol.params.deactivate_modules # type: ignore[attr-defined] + helpers.comment_protocol_version(protocol, "01") # Protocol Parameters deepwell_type = "nest_96_wellplate_2ml_deep" @@ -93,63 +98,67 @@ def run(ctx: ProtocolContext) -> None: drybeads = elute_time = 0.25 bind_time = wash_time = dnase_time = stop_time = 0.25 bead_vol = 20.0 - ctx.load_trash_bin("A3") - h_s: HeaterShakerContext = ctx.load_module(helpers.hs_str, "D1") # type: ignore[assignment] + protocol.load_trash_bin("A3") + h_s: HeaterShakerContext = protocol.load_module( + helpers.hs_str, "D1" + ) # type: ignore[assignment] sample_plate, h_s_adapter = helpers.load_hs_adapter_and_labware( deepwell_type, h_s, "Sample Plate" ) h_s.close_labware_latch() - temp: TemperatureModuleContext = ctx.load_module( + temp: TemperatureModuleContext = protocol.load_module( helpers.temp_str, "D3" ) # type: ignore[assignment] elutionplate, temp_adapter = helpers.load_temp_adapter_and_labware( "armadillo_96_wellplate_200ul_pcr_full_skirt", temp, "Elution Plate" ) temp.set_temperature(4) - magblock: MagneticBlockContext = ctx.load_module( + magblock: MagneticBlockContext = protocol.load_module( helpers.mag_str, "C1" ) # type: ignore[assignment] - waste_reservoir = ctx.load_labware("nest_1_reservoir_195ml", "B3", "Liquid Waste") + waste_reservoir = protocol.load_labware( + "nest_1_reservoir_195ml", "B3", "Liquid Waste" + ) waste = waste_reservoir.wells()[0].top() - res1 = ctx.load_labware(res_type, "D2", "reagent reservoir 1") + res1 = protocol.load_labware(res_type, "D2", "reagent reservoir 1") num_cols = math.ceil(num_samples / 8) # Load tips and combine all similar boxes - tips200 = ctx.load_labware("opentrons_flex_96_tiprack_200ul", "A1", "Tips 1") - tips201 = ctx.load_labware("opentrons_flex_96_tiprack_200ul", "A2", "Tips 2") - tips202 = ctx.load_labware("opentrons_flex_96_tiprack_200ul", "B1", "Tips 3") - tips203 = ctx.load_labware("opentrons_flex_96_tiprack_200ul", "B2", "Tips 4") - tips = [ - *tips200.wells()[num_samples:96], - *tips201.wells(), - *tips202.wells(), - *tips203.wells(), - ] + tips200 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "A1", "Tips 1") + tips201 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "A2", "Tips 2") + tips202 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "B1", "Tips 3") + tips203 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "B2", "Tips 4") + tips204 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "C2", "Tips 5") + tips_sn = tips200.wells()[:num_samples] # load P1000M pipette - m1000 = ctx.load_instrument( + m1000 = protocol.load_instrument( "flex_8channel_1000", pipette_mount, - tip_racks=[tips200, tips201, tips202, tips203], + tip_racks=[tips200, tips201, tips202, tips203, tips204], ) # Load Liquid Locations in Reservoir elution_solution = elutionplate.rows()[0][:num_cols] - dnase1 = elutionplate.rows()[0][num_cols : 2 * num_cols] - lysis_ = res1.wells()[0] - stopreaction = res1.wells()[1] - wash1 = res1.wells()[2] - wash2 = res1.wells()[3] - wash3 = res1.wells()[4] - wash4 = res1.wells()[5] - wash5 = res1.wells()[6] - + dnase1 = elutionplate.rows()[0][:num_cols] + lysis_ = res1.wells()[0:2] + stopreaction = res1.wells()[2] + wash1 = res1.wells()[3] + wash2 = res1.wells()[4] + wash3 = res1.wells()[5] + wash4 = res1.wells()[6] + wash5 = res1.wells()[7] + wash6 = res1.wells()[8] + wash7 = res1.wells()[9] + wash8 = res1.wells()[10] + wash9 = res1.wells()[11] + all_washes = res1.wells()[3:12] """ Here is where you can define the locations of your reagents. """ samples_m = sample_plate.rows()[0][:num_cols] # 20ul beads each well - cells_m = sample_plate.rows()[0][num_cols : 2 * num_cols] + cells_m = sample_plate.rows()[0][:num_cols] elution_samples_m = elutionplate.rows()[0][:num_cols] # Do the same for color mapping beads_ = sample_plate.wells()[: (8 * num_cols)] @@ -163,36 +172,42 @@ def run(ctx: ProtocolContext) -> None: "Sample": [{"well": cells_, "volume": 0.0}], "DNAse": [{"well": dnase1_, "volume": dnase_vol}], "Elution Buffer": [{"well": elution_samps, "volume": elution_vol}], - "Lysis": [{"well": lysis_, "volume": lysis_vol}], - "Wash 1": [{"well": wash1, "volume": wash_vol}], - "Wash 2": [{"well": wash2, "volume": wash_vol}], - "Wash 3": [{"well": wash3, "volume": wash_vol}], - "Wash 4": [{"well": wash4, "volume": wash_vol}], - "Wash 5": [{"well": wash5, "volume": wash_vol}], - "Stop": [{"well": stopreaction, "volume": stop_vol}], + "Lysis": [{"well": lysis_, "volume": 8120.0}], + "Stop": [{"well": stopreaction, "volume": 6400.0}], + "Wash 1": [{"well": wash1, "volume": 9500.0}], + "Wash 2": [{"well": wash2, "volume": 9500.0}], + "Wash 3": [{"well": wash3, "volume": 9500.0}], + "Wash 4": [{"well": wash4, "volume": 9500.0}], + "Wash 5": [{"well": wash5, "volume": 9500.0}], + "Wash 6": [{"well": wash6, "volume": 9500.0}], + "Wash 7": [{"well": wash7, "volume": 9500.0}], + "Wash 8": [{"well": wash8, "volume": 9500.0}], + "Wash 9": [{"well": wash9, "volume": 9500.0}], } - helpers.find_liquid_height_of_loaded_liquids(ctx, liquid_vols_and_wells, m1000) + helpers.find_liquid_height_of_loaded_liquids(protocol, liquid_vols_and_wells, m1000) m1000.flow_rate.aspirate = 50 m1000.flow_rate.dispense = 150 m1000.flow_rate.blow_out = 300 - def tiptrack(pip: InstrumentContext, tipbox: List[Well]) -> None: + def tiptrack(pip: InstrumentContext) -> None: """Tip Track.""" - global tip + global tip_pick_up global drop_count - pip.pick_up_tip(tipbox[int(tip)]) - tip = tip + 8 + pip.pick_up_tip() + tip_pick_up += 1 drop_count = drop_count + 8 if drop_count >= 250: drop_count = 0 if TIP_TRASH: - ctx.pause("Empty Trash bin.") + protocol.pause("Empty Trash bin.") + if tip_pick_up >= 59: + pip.reset_tipracks() def remove_supernatant(vol: float) -> None: """Remove Supernatant.""" - ctx.comment("-----Removing Supernatant-----") + protocol.comment("-----Removing Supernatant-----") m1000.flow_rate.aspirate = 30 num_trans = math.ceil(vol / 180) vol_per_trans = vol / num_trans @@ -211,7 +226,7 @@ def remove_supernatant(vol: float) -> None: m1000.drop_tip(tips_sn[8 * i]) if TIP_TRASH else m1000.return_tip() m1000.flow_rate.aspirate = 300 # Move Plate From Magnet to H-S - helpers.move_labware_to_hs(ctx, sample_plate, h_s, h_s_adapter) + helpers.move_labware_to_hs(protocol, sample_plate, h_s, h_s_adapter) def bead_mixing( well: Well, pip: InstrumentContext, mvol: float, reps: int = 8 @@ -301,32 +316,39 @@ def mixing(well: Well, pip: InstrumentContext, mvol: float, reps: int = 8) -> No pip.flow_rate.aspirate = 300 pip.flow_rate.dispense = 300 - def lysis(vol: float, source: Well) -> None: + def lysis(vol: float, source: List[Well]) -> None: """Lysis Steps.""" - ctx.comment("-----Beginning lysis steps-----") + tvol_total = 0.0 + protocol.comment("-----Beginning lysis steps-----") num_transfers = math.ceil(vol / 180) - tiptrack(m1000, tips) + tiptrack(m1000) + src = source[0] for i in range(num_cols): - src = source tvol = vol / num_transfers for t in range(num_transfers): m1000.require_liquid_presence(src) m1000.aspirate(tvol, src.bottom(1)) m1000.dispense(m1000.current_volume, cells_m[i].top(-3)) + tvol_total += tvol * 8 + if tvol_total > 8000.0: + protocol.comment("-----Changing to second lysis well.------") + src = source[1] + protocol.comment(f"new source {src}") + tvol_total = 0.0 # mix after adding all reagent to wells with cells for i in range(num_cols): if i != 0: - tiptrack(m1000, tips) + tiptrack(m1000) for x in range(8 if not dry_run else 1): m1000.aspirate(tvol * 0.75, cells_m[i].bottom(dot_bottom)) m1000.dispense(tvol * 0.75, cells_m[i].bottom(8)) if x == 3: - ctx.delay(minutes=0.0167) + protocol.delay(minutes=0.0167) m1000.blow_out(cells_m[i].bottom(1)) m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, lysis_time, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, lysis_time, True) def bind() -> None: """Bind. @@ -344,10 +366,10 @@ def bind() -> None: supernatant to the final clean elutions PCR plate. """ - ctx.comment("-----Beginning bind steps-----") + protocol.comment("-----Beginning bind steps-----") for i, well in enumerate(samples_m): # Transfer cells+lysis/bind to wells with beads - tiptrack(m1000, tips) + tiptrack(m1000) m1000.aspirate(185, cells_m[i].bottom(dot_bottom)) m1000.air_gap(10) m1000.dispense(m1000.current_volume, well.bottom(8)) @@ -355,15 +377,17 @@ def bind() -> None: bead_mixing(well, m1000, 130, reps=5 if not dry_run else 1) m1000.air_gap(10) m1000.drop_tip() if TIP_TRASH else m1000.return_tip() - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, bind_time, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, bind_time, True) # Transfer from H-S plate to Magdeck plate - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) for bindi in np.arange( settling_time, 0, -0.5 ): # Settling time delay with countdown timer - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(bindi) + " minutes left in the incubation.", ) @@ -371,45 +395,43 @@ def bind() -> None: # remove initial supernatant remove_supernatant(180) - def wash(vol: float, source: Well) -> None: + def wash(vol: float, source: List[Well]) -> None: """Wash Function.""" global whichwash # Defines which wash the protocol is on to log on the app - - if source == wash1: - whichwash = 1 - if source == wash2: - whichwash = 2 - if source == wash3: - whichwash = 3 - if source == wash4: - whichwash = 4 - - ctx.comment("-----Now starting Wash #" + str(whichwash) + "-----") - - tiptrack(m1000, tips) + protocol.comment("-----Now starting Wash #" + str(whichwash) + "-----") + global wash_volume_tracker + tiptrack(m1000) num_trans = math.ceil(vol / 180) vol_per_trans = vol / num_trans for i, m in enumerate(samples_m): - src = source + src = source[whichwash] for n in range(num_trans): m1000.aspirate(vol_per_trans, src) m1000.air_gap(10) m1000.dispense(m1000.current_volume, m.top(-2)) - ctx.delay(seconds=2) + protocol.delay(seconds=2) m1000.blow_out(m.top(-2)) + wash_volume_tracker += vol_per_trans * 8 + if wash_volume_tracker > 9600: + whichwash += 1 + src = source[whichwash] + protocol.comment(f"new wash source {whichwash}") + wash_volume_tracker = 0.0 m1000.air_gap(10) m1000.drop_tip() if TIP_TRASH else m1000.return_tip() # Shake for 5 minutes to mix wash with beads - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, wash_time, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, wash_time, True) # Transfer from H-S plate to Magdeck plate - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) for washi in np.arange( settling_time, 0, -0.5 ): # settling time timer for washes - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(washi) @@ -419,13 +441,14 @@ def wash(vol: float, source: Well) -> None: ) remove_supernatant(vol) + protocol.comment(f"final wash source {whichwash}") def dnase(vol: float, source: List[Well]) -> None: """Steps for DNAseI.""" - ctx.comment("-----DNAseI Steps Beginning-----") + protocol.comment("-----DNAseI Steps Beginning-----") num_trans = math.ceil(vol / 180) vol_per_trans = vol / num_trans - tiptrack(m1000, tips) + tiptrack(m1000) for i, m in enumerate(samples_m): src = source[i] m1000.flow_rate.aspirate = 10 @@ -442,17 +465,17 @@ def dnase(vol: float, source: List[Well]) -> None: # Is this mixing needed? \/\/\/ for i in range(num_cols): if i != 0: - tiptrack(m1000, tips) + tiptrack(m1000) mixing(samples_m[i], m1000, 45, reps=5 if not dry_run else 1) m1000.drop_tip() if TIP_TRASH else m1000.return_tip() # Shake for 10 minutes to mix DNAseI - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, dnase_time, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, dnase_time, True) def stop_reaction(vol: float, source: Well) -> None: """Adding stop solution.""" - ctx.comment("-----Adding Stop Solution-----") - tiptrack(m1000, tips) + protocol.comment("-----Adding Stop Solution-----") + tiptrack(m1000) num_trans = math.ceil(vol / 180) vol_per_trans = vol / num_trans for i, m in enumerate(samples_m): @@ -467,13 +490,15 @@ def stop_reaction(vol: float, source: Well) -> None: m1000.drop_tip() if TIP_TRASH else m1000.return_tip() # Shake for 3 minutes to mix wash with beads - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, stop_time, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, stop_time, True) # Transfer from H-S plate to Magdeck plate - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) for stop in np.arange(settling_time, 0, -0.5): - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(stop) + " minutes left in this incubation.", ) @@ -482,8 +507,8 @@ def stop_reaction(vol: float, source: Well) -> None: def elute(vol: float) -> None: """Elution.""" - ctx.comment("-----Elution Beginning-----") - tiptrack(m1000, tips) + protocol.comment("-----Elution Beginning-----") + tiptrack(m1000) m1000.flow_rate.aspirate = 10 for i, m in enumerate(samples_m): loc = m.top(-2) @@ -498,7 +523,7 @@ def elute(vol: float) -> None: # Is this mixing needed? \/\/\/ for i in range(num_cols): if i != 0: - tiptrack(m1000, tips) + tiptrack(m1000) for mixes in range(10): m1000.aspirate(elution_vol - 10, samples_m[i]) m1000.dispense(elution_vol - 10, samples_m[i].bottom(10)) @@ -510,20 +535,22 @@ def elute(vol: float) -> None: m1000.drop_tip() if TIP_TRASH else m1000.return_tip() # Shake for 3 minutes to mix wash with beads - helpers.set_hs_speed(ctx, h_s, heater_shaker_speed, elute_time, True) + helpers.set_hs_speed(protocol, h_s, heater_shaker_speed, elute_time, True) # Transfer from H-S plate to Magdeck plate - helpers.move_labware_from_hs_to_destination(ctx, sample_plate, h_s, magblock) + helpers.move_labware_from_hs_to_destination( + protocol, sample_plate, h_s, magblock + ) for elutei in np.arange(settling_time, 0, -0.5): - ctx.delay( + protocol.delay( minutes=0.5, msg="Incubating on MagDeck for " + str(elutei) + " more minutes.", ) - ctx.comment("-----Trasnferring Sample to Elution Plate-----") + protocol.comment("-----Trasnferring Sample to Elution Plate-----") for i, (m, e) in enumerate(zip(samples_m, elution_samples_m)): - tiptrack(m1000, tips) + tiptrack(m1000) loc = m.bottom(dot_bottom) m1000.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip="never") m1000.blow_out(e.top(-2)) @@ -537,23 +564,27 @@ def elute(vol: float) -> None: if inc_lysis: lysis(lysis_vol, lysis_) bind() - wash(wash_vol, wash1) - wash(wash_vol, wash2) + wash(wash_vol, all_washes) + wash(wash_vol, all_washes) + wash(wash_vol, all_washes) # dnase1 treatment dnase(dnase_vol, dnase1) stop_reaction(stop_vol, stopreaction) # Resume washes - wash(wash_vol, wash3) - wash(wash_vol, wash4) - wash(wash_vol, wash5) + wash(wash_vol, all_washes) + wash(wash_vol, all_washes) + wash(wash_vol, all_washes) for beaddry in np.arange(drybeads, 0, -0.5): - ctx.delay( + protocol.delay( minutes=0.5, msg="There are " + str(beaddry) + " minutes left in the drying step.", ) elute(elution_vol) - - end_list_of_wells_to_probe = [waste_reservoir["A1"], res1["A1"]] - end_list_of_wells_to_probe.extend(elution_samples_m) - helpers.find_liquid_height_of_all_wells(ctx, m1000, end_list_of_wells_to_probe) + end_list_of_wells_to_probe = [waste_reservoir["A1"]] + helpers.clean_up_plates( + m1000, [elutionplate, sample_plate], waste_reservoir["A1"], 200 + ) + helpers.find_liquid_height_of_all_wells(protocol, m1000, end_list_of_wells_to_probe) + if deactivate_modules_bool: + helpers.deactivate_modules(protocol) diff --git a/abr-testing/abr_testing/protocols/csv_parameters/1_samplevols.csv b/abr-testing/abr_testing/protocols/csv_parameters/1_samplevols.csv new file mode 100644 index 00000000000..132b4dc70fb --- /dev/null +++ b/abr-testing/abr_testing/protocols/csv_parameters/1_samplevols.csv @@ -0,0 +1,97 @@ +Well,Dye,Diluent +A1,0,100 +B1,5,95 +C1,10,90 +D1,20,80 +E1,40,60 +F1,15,40 +G1,40,20 +H1,40,0 +A2,35,65 +B2,38,42 +C2,42,58 +D2,32,8 +E2,38,12 +F2,26,74 +G2,31,69 +H2,46,4 +A3,47,13 +B3,42,18 +C3,46,64 +D3,48,22 +E3,26,74 +F3,34,66 +G3,43,37 +H3,20,80 +A4,44,16 +B4,49,41 +C4,48,42 +D4,44,16 +E4,47,53 +F4,47,33 +G4,42,48 +H4,39,21 +A5,30,20 +B5,36,14 +C5,31,59 +D5,38,52 +E5,36,4 +F5,32,28 +G5,35,55 +H5,39,1 +A6,31,59 +B6,20,80 +C6,38,2 +D6,34,46 +E6,30,70 +F6,32,58 +G6,21,79 +H6,38,52 +A7,33,27 +B7,34,16 +C7,40,60 +D7,34,26 +E7,30,20 +F7,44,56 +G7,26,74 +H7,45,55 +A8,39,1 +B8,38,2 +C8,34,66 +D8,39,11 +E8,46,54 +F8,37,63 +G8,38,42 +H8,34,66 +A9,44,56 +B9,39,11 +C9,30,70 +D9,37,33 +E9,46,54 +F9,39,21 +G9,29,41 +H9,23,77 +A10,26,74 +B10,39,1 +C10,31,49 +D10,38,62 +E10,29,1 +F10,21,79 +G10,29,41 +H10,28,42 +A11,15,55 +B11,28,72 +C11,11,49 +D11,34,66 +E11,27,73 +F11,30,40 +G11,33,67 +H11,31,39 +A12,39,31 +B12,47,53 +C12,46,54 +D12,13,7 +E12,34,46 +F12,45,35 +G12,28,42 +H12,37,63 \ No newline at end of file diff --git a/abr-testing/abr_testing/protocols/csv_parameters/2_samplevols.csv b/abr-testing/abr_testing/protocols/csv_parameters/2_samplevols.csv index fa50562e68b..424aae072c3 100644 --- a/abr-testing/abr_testing/protocols/csv_parameters/2_samplevols.csv +++ b/abr-testing/abr_testing/protocols/csv_parameters/2_samplevols.csv @@ -6,20 +6,92 @@ D1,3,7,40,A1 E1,2,8,40,A2 F1,1,9,40,A2 G1,5,5,40,A2 -H1,3,7,40,A3 +H1,3,7,40,A2 A2,3,7,40,A3 B2,3,7,40,A3 C2,3,7,40,A3 D2,3,7,40,A3 -E2,3,7,40,A3 -F2,3,7,40,A3 -G2,3,7,40,A3 -H2,3,7,40,A3 -A3,3,7,40,A3 -B3,3,7,40,A3 -C3,3,7,45,A3 -D3,3,7,45,A3 -E3,3,5,45,A3 -F3,3,5,45,A3 +E2,3,7,40,A4 +F2,3,7,40,A4 +G2,3,7,40,A4 +H2,3,7,40,A4 +A3,3,7,40,A5 +B3,3,7,40,A5 +C3,3,7,45,A5 +D3,3,7,45,A5 +E3,3,5,45,A6 +F3,3,5,45,A6 G3,3,5,45,A6 -H3,3,4,45,A5 \ No newline at end of file +H3,3,4,45,A6 +A4,3,7,40,A1 +B4,0,10,40,A1 +C4,10,0,40,A1 +D4,3,7,40,A1 +E4,2,8,40,A2 +F4,1,9,40,A2 +G4,5,5,40,A2 +H4,3,7,40,A2 +A5,3,7,40,A3 +B5,3,7,40,A3 +C5,3,7,40,A3 +D5,3,7,40,A3 +E5,3,7,40,A4 +F5,3,7,40,A4 +G5,3,7,40,A4 +H5,3,7,40,A4 +A6,3,7,40,A5 +B6,3,7,40,A5 +C6,3,7,45,A5 +D6,3,7,45,A5 +E6,3,5,45,A6 +F6,3,5,45,A6 +G6,3,5,45,A6 +H6,3,4,45,A6 +A7,3,7,40,A1 +B7,0,10,40,A1 +C7,10,0,40,A1 +D7,3,7,40,A1 +E7,2,8,40,A2 +F7,1,9,40,A2 +G7,5,5,40,A2 +H7,3,7,40,A2 +A8,3,7,40,A3 +B8,3,7,40,A3 +C8,3,7,40,A3 +D8,3,7,40,A3 +E8,3,7,40,A4 +F8,3,7,40,A4 +G8,3,7,40,A4 +H8,3,7,40,A4 +A9,3,7,40,A5 +B9,3,7,40,A5 +C9,3,7,45,A5 +D9,3,7,45,A5 +E9,3,5,45,A6 +F9,3,5,45,A6 +G9,3,5,45,A6 +H9,3,4,45,A6 +A10,3,7,40,A1 +B10,0,10,40,A1 +C10,10,0,40,A1 +D10,3,7,40,A1 +E10,2,8,40,A2 +F10,1,9,40,A2 +G10,5,5,40,A2 +H10,3,7,40,A2 +A11,3,7,40,A3 +B11,3,7,40,A3 +C11,3,7,40,A3 +D11,3,7,40,A3 +E11,3,7,40,A4 +F11,3,7,40,A4 +G11,3,7,40,A4 +H11,3,7,40,A4 +A12,3,7,40,A5 +B12,3,7,40,A5 +C12,3,7,45,A5 +D12,3,7,45,A5 +E12,3,5,45,A6 +F12,3,5,45,A6 +G12,3,5,45,A6 +H12,3,4,45,A6 diff --git a/abr-testing/abr_testing/protocols/helpers.py b/abr-testing/abr_testing/protocols/helpers.py index 12abbfa9b3f..31a1d1a9244 100644 --- a/abr-testing/abr_testing/protocols/helpers.py +++ b/abr-testing/abr_testing/protocols/helpers.py @@ -7,14 +7,15 @@ ParameterContext, Well, ) -from typing import Tuple from opentrons.protocol_api.module_contexts import ( HeaterShakerContext, MagneticBlockContext, ThermocyclerContext, TemperatureModuleContext, + MagneticModuleContext, + AbsorbanceReaderContext, ) -from typing import List, Union, Dict +from typing import List, Union, Dict, Tuple from opentrons.hardware_control.modules.types import ThermocyclerStep from opentrons_shared_data.errors.exceptions import PipetteLiquidNotFoundError @@ -106,7 +107,62 @@ def load_temp_adapter_and_labware( return labware_on_temp_mod, temp_adapter +# FUNCTIONS FOR COMMON COMMENTS + + +def comment_protocol_version(protocol: ProtocolContext, version: str) -> None: + """Comment version number of protocol.""" + protocol.comment(f"Protocol Version: {version}") + + # FUNCTIONS FOR LOADING COMMON PARAMETERS +def create_channel_parameter(parameters: ParameterContext) -> None: + """Create pipette channel parameter.""" + parameters.add_str( + variable_name="channels", + display_name="Number of Pipette Channels", + choices=[ + {"display_name": "1 Channel", "value": "1channel"}, + {"display_name": "8 Channel", "value": "8channel"}, + ], + default="8channel", + ) + + +def create_pipette_parameters(parameters: ParameterContext) -> None: + """Create parameter for pipettes.""" + # NOTE: Place function inside def add_parameters(parameters) in protocol. + # NOTE: Copy ctx.params.left mount, ctx.params.right_mount # type: ignore[attr-defined] + # to get result + # Left Mount + parameters.add_str( + variable_name="left_mount", + display_name="Left Mount", + description="Pipette Type on Left Mount.", + choices=[ + {"display_name": "8ch 50ul", "value": "flex_8channel_50"}, + {"display_name": "8ch 1000ul", "value": "flex_8channel_1000"}, + {"display_name": "1ch 50ul", "value": "flex_1channel_50"}, + {"display_name": "1ch 1000ul", "value": "flex_1channel_1000"}, + {"display_name": "96ch 1000ul", "value": "flex_96channel_1000"}, + {"display_name": "None", "value": "none"}, + ], + default="flex_8channel_1000", + ) + # Right Mount + parameters.add_str( + variable_name="right_mount", + display_name="Right Mount", + description="Pipette Type on Right Mount.", + choices=[ + {"display_name": "8ch 50ul", "value": "flex_8channel_50"}, + {"display_name": "8ch 1000ul", "value": "flex_8channel_1000"}, + {"display_name": "1ch 50ul", "value": "flex_1channel_50"}, + {"display_name": "1ch 1000ul", "value": "flex_1channel_1000"}, + {"display_name": "None", "value": "none"}, + ], + default="none", + ) def create_single_pipette_mount_parameter(parameters: ParameterContext) -> None: @@ -163,6 +219,16 @@ def create_disposable_lid_parameter(parameters: ParameterContext) -> None: ) +def create_disposable_lid_trash_location(parameters: ParameterContext) -> None: + """Create a parameter for lid placement after use.""" + parameters.add_bool( + variable_name="trash_lid", + display_name="Trash Disposable Lid", + description="True means trash lid, false means keep on deck.", + default=True, + ) + + def create_tc_lid_deck_riser_parameter(parameters: ParameterContext) -> None: """Create parameter for tc lid deck riser.""" parameters.add_bool( @@ -184,7 +250,7 @@ def create_tip_size_parameter(parameters: ParameterContext) -> None: {"display_name": "200 µL", "value": "opentrons_flex_96_tiprack_200ul"}, {"display_name": "1000 µL", "value": "opentrons_flex_96_tiprack_1000ul"}, ], - default="opentrons_flex_96_tiprack_1000ul", + default="opentrons_flex_96_tiprack_50ul", ) @@ -224,6 +290,25 @@ def create_hs_speed_parameter(parameters: ParameterContext) -> None: ) +def create_plate_reader_compatible_labware_parameter( + parameters: ParameterContext, +) -> None: + """Create parameter for flat bottom plates compatible with plate reader.""" + parameters.add_str( + variable_name="labware_plate_reader_compatible", + display_name="Plate Reader Labware", + default="nest_96_wellplate_200ul_flat", + choices=[ + { + "display_name": "Corning_96well", + "value": "corning_96_wellplate_360ul_flat", + }, + {"display_name": "Hellma Plate", "value": "hellma_reference_plate"}, + {"display_name": "Nest_96well", "value": "nest_96_wellplate_200ul_flat"}, + ], + ) + + def create_tc_compatible_labware_parameter(parameters: ParameterContext) -> None: """Create parameter for labware type compatible with thermocycler.""" parameters.add_str( @@ -249,7 +334,33 @@ def create_tc_compatible_labware_parameter(parameters: ParameterContext) -> None ) +def create_deactivate_modules_parameter(parameters: ParameterContext) -> None: + """Create parameter for deactivating modules at the end fof run.""" + parameters.add_bool( + variable_name="deactivate_modules", + display_name="Deactivate Modules", + description="deactivate all modules at end of run", + default=True, + ) + + # FUNCTIONS FOR COMMON MODULE SEQUENCES +def deactivate_modules(protocol: ProtocolContext) -> None: + """Deactivate all loaded modules.""" + print("Deactivating Modules") + modules = protocol.loaded_modules + + if modules: + for module in modules.values(): + if isinstance(module, HeaterShakerContext): + module.deactivate_shaker() + module.deactivate_heater() + elif isinstance(module, TemperatureModuleContext): + module.deactivate() + elif isinstance(module, MagneticModuleContext): + module.disengage() + elif isinstance(module, ThermocyclerContext): + module.deactivate() def move_labware_from_hs_to_destination( @@ -314,6 +425,39 @@ def use_disposable_lid_with_tc( # FUNCTIONS FOR COMMON PIPETTE COMMAND SEQUENCES +def clean_up_plates( + pipette: InstrumentContext, + list_of_labware: List[Labware], + liquid_waste: Well, + tip_size: int, +) -> None: + """Aspirate liquid from labware and dispense into liquid waste.""" + pipette.pick_up_tip() + pipette.liquid_presence_detection = False + num_of_active_channels = pipette.active_channels + for labware in list_of_labware: + if num_of_active_channels == 8: + list_of_wells = labware.rows()[0] + elif num_of_active_channels == 1: + list_of_wells = labware.wells() + elif num_of_active_channels == 96: + list_of_wells = [labware.wells()[0]] + for well in list_of_wells: + vol_removed = 0.0 + while well.max_volume > vol_removed: + pipette.aspirate(tip_size, well) + pipette.dispense( + tip_size, + liquid_waste.top(), + ) + pipette.blow_out(liquid_waste.top()) + vol_removed += pipette.max_volume + if pipette.channels != num_of_active_channels: + pipette.drop_tip() + else: + pipette.return_tip() + + def find_liquid_height(pipette: InstrumentContext, well_to_probe: Well) -> float: """Find liquid height of well.""" try: @@ -372,6 +516,18 @@ def load_wells_with_custom_liquids( well.load_liquid(liquid, volume) +def comment_height_of_specific_labware( + protocol: ProtocolContext, labware_name: str, dict_of_labware_heights: Dict +) -> None: + """Comment height found of specific labware.""" + total_height = 0.0 + for key in dict_of_labware_heights.keys(): + if key[0] == labware_name: + height = dict_of_labware_heights[key] + total_height += height + protocol.comment(f"Liquid Waste Total Height: {total_height}") + + def find_liquid_height_of_all_wells( protocol: ProtocolContext, pipette: InstrumentContext, @@ -382,7 +538,7 @@ def find_liquid_height_of_all_wells( pipette.pick_up_tip() pip_channels = pipette.active_channels for well in wells: - labware_name = well.parent.load_name + labware_name = well.parent.name total_number_of_wells_in_plate = len(well.parent.wells()) # if pip_channels is > 1 and total_wells > 12 - only probe 1st row. if ( @@ -402,6 +558,9 @@ def find_liquid_height_of_all_wells( pipette.reset_tipracks() msg = f"result: {dict_of_labware_heights}" protocol.comment(msg=msg) + comment_height_of_specific_labware( + protocol, "Liquid Waste", dict_of_labware_heights + ) return dict_of_labware_heights @@ -423,6 +582,8 @@ def find_liquid_height_of_loaded_liquids( entry["well"] if isinstance(entry["well"], list) else [entry["well"]] ) ] + if pipette.active_channels == 96: + wells = [well for well in wells if well.display_name.split(" ")[0] == "A1"] find_liquid_height_of_all_wells(ctx, pipette, wells) return wells @@ -463,6 +624,14 @@ def load_wells_with_water( "#C0C0C0", ] +# Modules with deactivate +ModuleTypes = Union[ + TemperatureModuleContext, + ThermocyclerContext, + HeaterShakerContext, + MagneticModuleContext, + AbsorbanceReaderContext, +] # THERMOCYCLER PROFILES @@ -501,6 +670,3 @@ def perform_pcr( thermocycler.execute_profile( steps=final_extension_profile, repetitions=1, block_max_volume=50 ) - - -# TODO: Create dictionary of labware, module, and adapter. diff --git a/abr-testing/abr_testing/protocols/liquid_setups/10_ZymoBIOMICS Magbead Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/10_ZymoBIOMICS Magbead Liquid Setup.py index 422102e4321..7fed5d5d052 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/10_ZymoBIOMICS Magbead Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/10_ZymoBIOMICS Magbead Liquid Setup.py @@ -13,7 +13,7 @@ requirements = { "robotType": "Flex", - "apiLevel": "2.20", + "apiLevel": "2.21", } @@ -26,14 +26,17 @@ def run(protocol: protocol_api.ProtocolContext) -> None: p1000, ) = load_common_liquid_setup_labware_and_instruments(protocol) - res1 = protocol.load_labware("nest_12_reservoir_15ml", "C3", "R1") - res2 = protocol.load_labware("nest_12_reservoir_15ml", "B3", "R2") + res1 = protocol.load_labware("nest_12_reservoir_15ml", "D3", "Reagent Reservoir 1") + res2 = protocol.load_labware("nest_12_reservoir_15ml", "C3", "Reagent Reservoir 2") + res3 = protocol.load_labware("nest_12_reservoir_15ml", "B3", "Reagent Reservoir 3") lysis_and_pk = 12320 / 8 beads_and_binding = 11875 / 8 binding2 = 13500 / 8 - wash2 = 9000 / 8 + wash2 = 9800 / 8 wash2_list = [wash2] * 12 + final_elution = 7500 / 8 + # Fill up Plates # Res1 p1000.transfer( @@ -42,7 +45,10 @@ def run(protocol: protocol_api.ProtocolContext) -> None: beads_and_binding, beads_and_binding, beads_and_binding, - binding2, + beads_and_binding, + beads_and_binding, + beads_and_binding, + beads_and_binding, binding2, binding2, binding2, @@ -58,6 +64,9 @@ def run(protocol: protocol_api.ProtocolContext) -> None: res1["A6"].top(), res1["A7"].top(), res1["A8"].top(), + res1["A9"].top(), + res1["A10"].top(), + res1["A11"].top(), res1["A12"].top(), ], blow_out=True, @@ -66,10 +75,19 @@ def run(protocol: protocol_api.ProtocolContext) -> None: ) # Res2 p1000.transfer( - volume=wash2_list, - source=source_reservoir["A1"], + volume=[final_elution] + wash2_list[:11], + source=[source_reservoir["A1"]] * 12, dest=res2.wells(), blow_out=True, blowout_location="source well", trash=False, ) + # Res 3 + p1000.transfer( + volume=[wash2, wash2], + source=[source_reservoir["A1"], source_reservoir["A1"]], + dest=[res3["A1"], res3["A2"]], + blow_out=True, + blowout_location="source well", + trash=False, + ) diff --git a/abr-testing/abr_testing/protocols/liquid_setups/11_Dynabeads RIT Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/11_Dynabeads RIT Liquid Setup.py index 112aec315b5..2d722d410e5 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/11_Dynabeads RIT Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/11_Dynabeads RIT Liquid Setup.py @@ -13,7 +13,7 @@ requirements = { "robotType": "Flex", - "apiLevel": "2.20", + "apiLevel": "2.21", } @@ -27,8 +27,11 @@ def run(protocol: protocol_api.ProtocolContext) -> None: ) = load_common_liquid_setup_labware_and_instruments(protocol) reservoir_wash = protocol.load_labware("nest_12_reservoir_15ml", "D2", "Reservoir") - sample_plate = protocol.load_labware( - "nest_96_wellplate_2ml_deep", "C3", "Sample Plate" + sample_plate1 = protocol.load_labware( + "nest_96_wellplate_2ml_deep", "C3", "Sample Plate 1" + ) + sample_plate2 = protocol.load_labware( + "nest_96_wellplate_2ml_deep", "B3", "Sample Plate 2" ) columns = [ @@ -52,10 +55,24 @@ def run(protocol: protocol_api.ProtocolContext) -> None: p1000.dispense(750, reservoir_wash[i].top()) p1000.blow_out(location=source_reservoir["A1"].top()) p1000.return_tip() + # 1 column 6000 uL + p1000.pick_up_tip() + for i in columns: + p1000.aspirate(750, source_reservoir["A1"].bottom(z=0.5)) + p1000.dispense(750, reservoir_wash[i].top()) + p1000.blow_out(location=source_reservoir["A1"].top()) + p1000.return_tip() + # Nest 96 Deep Well Plate 2 mL: 250 uL per well + p1000.pick_up_tip() + for n in columns: + p1000.aspirate(250, source_reservoir["A1"].bottom(z=0.5)) + p1000.dispense(250, sample_plate1[n].bottom(z=1)) + p1000.blow_out(location=source_reservoir["A1"].top()) + p1000.return_tip() # Nest 96 Deep Well Plate 2 mL: 250 uL per well p1000.pick_up_tip() for n in columns: p1000.aspirate(250, source_reservoir["A1"].bottom(z=0.5)) - p1000.dispense(250, sample_plate[n].bottom(z=1)) + p1000.dispense(250, sample_plate2[n].bottom(z=1)) p1000.blow_out(location=source_reservoir["A1"].top()) p1000.return_tip() diff --git a/abr-testing/abr_testing/protocols/liquid_setups/12_KAPA HyperPlus Library Prep Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/12_KAPA HyperPlus Library Prep Liquid Setup.py index 2575caecf6e..688533ffd55 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/12_KAPA HyperPlus Library Prep Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/12_KAPA HyperPlus Library Prep Liquid Setup.py @@ -13,7 +13,7 @@ requirements = { "robotType": "Flex", - "apiLevel": "2.20", + "apiLevel": "2.21", } diff --git a/abr-testing/abr_testing/protocols/liquid_setups/1_Simple normalize long Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/1_Simple normalize long Liquid Setup.py index 2d995fede39..a99bb0568cf 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/1_Simple normalize long Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/1_Simple normalize long Liquid Setup.py @@ -12,7 +12,7 @@ requirements = { "robotType": "Flex", - "apiLevel": "2.20", + "apiLevel": "2.21", } @@ -26,14 +26,22 @@ def run(protocol: protocol_api.ProtocolContext) -> None: ) = load_common_liquid_setup_labware_and_instruments(protocol) reservoir = protocol.load_labware("nest_12_reservoir_15ml", "D2", "Reservoir") # Transfer Liquid - vol = 5400 / 8 + vol = 6175 / 8 columns = ["A1", "A2", "A3", "A4", "A5"] for i in columns: p1000.transfer( vol, - source=source_reservoir["A1"].bottom(z=0.5), + source=source_reservoir["A1"].bottom(z=2), dest=reservoir[i].top(), blowout=True, blowout_location="source well", trash=False, ) + p1000.transfer( + 8500 / 8, + source=source_reservoir["A1"].bottom(z=2), + dest=reservoir["A6"], + blowout=True, + blowout_location="source well", + trash=False, + ) diff --git a/abr-testing/abr_testing/protocols/liquid_setups/2_BMS_PCR_protocol Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/2_BMS_PCR_protocol Liquid Setup.py index a6c71b563d4..1ffefc48f19 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/2_BMS_PCR_protocol Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/2_BMS_PCR_protocol Liquid Setup.py @@ -7,13 +7,13 @@ metadata = { "protocolName": "DVT1ABR2 Liquids: BMS PCR Protocol", - "author": "Rhyann clarke ", + "author": "Rhyann Clarke ", "source": "Protocol Library", } requirements = { "robotType": "Flex", - "apiLevel": "2.20", + "apiLevel": "2.21", } @@ -33,9 +33,9 @@ def run(protocol: protocol_api.ProtocolContext) -> None: ) # Steps # Dispense into plate 1 - p1000.transfer(50, source_reservoir["A1"], pcr_plate_1.wells(), trash=False) + p1000.transfer(100, source_reservoir["A1"], pcr_plate_1.wells(), trash=False) # Dispense p1000.configure_nozzle_layout(protocol_api.SINGLE, start="H1", tip_racks=[tip_rack]) - p1000.transfer(1500, source_reservoir["A1"], snap_caps["B1"]) - p1000.transfer(1500, source_reservoir["A1"], snap_caps.rows()[0]) + p1000.transfer(1000, source_reservoir["A1"], snap_caps["B1"]) + p1000.transfer(1000, source_reservoir["A1"], snap_caps.rows()[0]) diff --git a/abr-testing/abr_testing/protocols/liquid_setups/3_Tartrazine Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/3_Tartrazine Liquid Setup.py index 9e0b29a03ed..f0941bb398b 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/3_Tartrazine Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/3_Tartrazine Liquid Setup.py @@ -1,8 +1,6 @@ """Plate Filler Protocol for Tartrazine Protocol.""" from opentrons import protocol_api -from abr_testing.protocols.helpers import ( - load_common_liquid_setup_labware_and_instruments, -) +from abr_testing.protocols import helpers metadata = { "protocolName": "DVT1ABR3 Liquids: Tartrazine Protocol", @@ -12,36 +10,77 @@ requirements = { "robotType": "Flex", - "apiLevel": "2.20", + "apiLevel": "2.21", } +def add_parameters(parameters: protocol_api.ParameterContext) -> None: + """Add parameters.""" + parameters.add_int( + variable_name="number_of_plates", + display_name="Number of Plates", + default=4, + minimum=1, + maximum=4, + ) + helpers.create_channel_parameter(parameters) + + def run(protocol: protocol_api.ProtocolContext) -> None: """Protocol.""" + number_of_plates = protocol.params.number_of_plates # type: ignore [attr-defined] + channels = protocol.params.channels # type: ignore [attr-defined] # Initiate Labware ( source_reservoir, tip_rack, p1000, - ) = load_common_liquid_setup_labware_and_instruments(protocol) - reagent_tube = protocol.load_labware( - "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", "D3", "Reagent Tube" - ) - p1000.configure_nozzle_layout( - style=protocol_api.SINGLE, start="H1", tip_racks=[tip_rack] - ) - # Transfer Liquid - p1000.transfer( - 45000, - source_reservoir["A1"], - reagent_tube["B3"].top(), - blowout=True, - blowout_location="source well", - ) - p1000.transfer( - 45000, - source_reservoir["A1"], - reagent_tube["A4"].top(), - blowout=True, - blowout_location="source well", - ) + ) = helpers.load_common_liquid_setup_labware_and_instruments(protocol) + if channels == "1channel": + reagent_tube = protocol.load_labware( + "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", "D3", "Reagent Tube" + ) + p1000.configure_nozzle_layout( + style=protocol_api.SINGLE, start="H1", tip_racks=[tip_rack] + ) + # Transfer Liquid + p1000.transfer( + 45000, + source_reservoir["A1"], + reagent_tube["B3"].top(), + blowout=True, + blowout_location="source well", + ) + p1000.transfer( + 45000, + source_reservoir["A1"], + reagent_tube["A4"].top(), + blowout=True, + blowout_location="source well", + ) + elif channels == "8channel": + reservoir = protocol.load_labware("nest_12_reservoir_15ml", "D3", "Reservoir") + water_max_vol = reservoir["A1"].max_volume - 500 + reservoir_wells = reservoir.wells()[ + 1: + ] # Skip A1 as it's reserved for tartrazine + # NEEDED WATER + needed_water: float = ( + float(number_of_plates) * 96.0 * 250.0 + ) # loading extra as a safety factor + # CALCULATING NEEDED # OF WATER WELLS + needed_wells = round(needed_water / water_max_vol) + water_wells = [] + for i in range(needed_wells + 1): + water_wells.append(reservoir_wells[i]) + # Create lists of volumes and source that matches wells to fill + water_max_vol_list = [water_max_vol] * len(water_wells) + source_list = [source_reservoir["A1"]] * len(water_wells) + p1000.transfer( + water_max_vol_list, + source_list, + water_wells, + blowout=True, + blowout_locaiton="source", + trash=False, + ) diff --git a/abr-testing/abr_testing/protocols/liquid_setups/4_Illumina DNA Enrichment Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/4_Illumina DNA Enrichment Liquid Setup.py index 18aee383ace..937c9f4dafd 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/4_Illumina DNA Enrichment Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/4_Illumina DNA Enrichment Liquid Setup.py @@ -12,7 +12,7 @@ requirements = { "robotType": "Flex", - "apiLevel": "2.20", + "apiLevel": "2.21", } @@ -27,7 +27,7 @@ def run(protocol: protocol_api.ProtocolContext) -> None: reservoir_1 = protocol.load_labware( "nest_96_wellplate_2ml_deep", "D2", "Reservoir 1" ) # Reservoir - reservoir_2 = protocol.load_labware( + sample_plate_2 = protocol.load_labware( "thermoscientificnunc_96_wellplate_1300ul", "D3", "Sample Plate 2" ) # Reservoir sample_plate_1 = protocol.load_labware( @@ -57,10 +57,10 @@ def run(protocol: protocol_api.ProtocolContext) -> None: volume=[120, 750, 900, 96], source=source_reservoir["A1"], dest=[ - reservoir_1["A1"].top(), - reservoir_1["A2"].top(), - reservoir_1["A4"].top(), - reservoir_1["A5"].top(), + reservoir_1["A1"].top(), # AMPure + reservoir_1["A2"].top(), # SMB + reservoir_1["A4"].top(), # EtOH + reservoir_1["A5"].top(), # RSB ], blow_out=True, blowout_location="source well", @@ -68,10 +68,10 @@ def run(protocol: protocol_api.ProtocolContext) -> None: ) # Reservoir 2 Plate Prep: dispense liquid into columns 1-9 total 3690 ul - reservoir_2_wells = reservoir_2.wells() + reservoir_2_wells = sample_plate_1.wells() list_of_locations = [well_location.top() for well_location in reservoir_2_wells] p1000.transfer( - volume=[50, 50, 50, 50, 50, 50, 330, 330, 330, 800, 800, 800], + volume=[150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150], source=source_reservoir["A1"], dest=list_of_locations, blow_out=True, @@ -80,9 +80,14 @@ def run(protocol: protocol_api.ProtocolContext) -> None: ) # Sample Plate Prep: total 303 - dest_list = [sample_plate_1["A1"], sample_plate_1["A2"], sample_plate_1["A3"]] + dest_list = [ + sample_plate_2["A9"], + sample_plate_2["A10"], + sample_plate_2["A11"], + sample_plate_2["A12"], + ] p1000.transfer( - volume=[101, 101, 101], + volume=[1000, 1000, 1000, 1000], source=source_reservoir["A1"], dest=dest_list, blow_out=True, diff --git a/abr-testing/abr_testing/protocols/liquid_setups/5_96ch Complex Protocol Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/5_96ch Complex Protocol Liquid Setup.py index cd263318442..e7a726b6b46 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/5_96ch Complex Protocol Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/5_96ch Complex Protocol Liquid Setup.py @@ -5,14 +5,14 @@ ) metadata = { - "protocolName": "DVT2ABR5 and 6 Liquids: 96ch Complex Protocol", + "protocolName": "DVT2ABR5 Liquids: 96ch Complex Protocol", "author": "Rhyann clarke ", "source": "Protocol Library", } requirements = { "robotType": "Flex", - "apiLevel": "2.16", + "apiLevel": "2.21", } @@ -29,7 +29,7 @@ def run(protocol: protocol_api.ProtocolContext) -> None: "nest_96_wellplate_2ml_deep", "D2", "Reservoir" ) # Reservoir - vol = 500 + vol = 1000 column_list = [ "A1", @@ -45,9 +45,9 @@ def run(protocol: protocol_api.ProtocolContext) -> None: "A11", "A12", ] + p1000.pick_up_tip() for i in column_list: - p1000.pick_up_tip() p1000.aspirate(vol, source_reservoir["A1"].bottom(z=0.5)) p1000.dispense(vol, reservoir[i].top()) p1000.blow_out(location=source_reservoir["A1"].top()) - p1000.return_tip() + p1000.return_tip() diff --git a/abr-testing/abr_testing/protocols/liquid_setups/7_HDQ DNA Bacteria Extraction Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/7_HDQ DNA Bacteria Extraction Liquid Setup.py index 4addbd5c7e8..309f9916d03 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/7_HDQ DNA Bacteria Extraction Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/7_HDQ DNA Bacteria Extraction Liquid Setup.py @@ -13,7 +13,7 @@ requirements = { "robotType": "Flex", - "apiLevel": "2.16", + "apiLevel": "2.21", } @@ -55,9 +55,22 @@ def run(protocol: protocol_api.ProtocolContext) -> None: # Sample Plate p1000.transfer( - volume=180, + volume=200, source=source_reservoir["A1"].bottom(z=0.5), - dest=sample_plate["A1"].top(), + dest=[ + sample_plate["A1"].top(), + sample_plate["A2"].top(), + sample_plate["A3"].top(), + sample_plate["A4"].top(), + sample_plate["A5"].top(), + sample_plate["A6"].top(), + sample_plate["A7"].top(), + sample_plate["A8"].top(), + sample_plate["A9"].top(), + sample_plate["A10"].top(), + sample_plate["A11"].top(), + sample_plate["A12"].top(), + ], blowout=True, blowout_location="source well", trash=False, @@ -66,7 +79,20 @@ def run(protocol: protocol_api.ProtocolContext) -> None: p1000.transfer( volume=100, source=source_reservoir["A1"].bottom(z=0.5), - dest=elution_plate["A1"].top(), + dest=[ + elution_plate["A1"].top(), + elution_plate["A2"].top(), + elution_plate["A3"].top(), + elution_plate["A4"].top(), + elution_plate["A5"].top(), + elution_plate["A6"].top(), + elution_plate["A7"].top(), + elution_plate["A8"].top(), + elution_plate["A9"].top(), + elution_plate["A10"].top(), + elution_plate["A11"].top(), + elution_plate["A12"].top(), + ], blowout=True, blowout_location="source well", trash=False, diff --git a/abr-testing/abr_testing/protocols/liquid_setups/9_Thermo MagMax RNA Extraction Liquid Setup.py b/abr-testing/abr_testing/protocols/liquid_setups/9_Thermo MagMax RNA Extraction Liquid Setup.py index c6ded28719d..e935063ed16 100644 --- a/abr-testing/abr_testing/protocols/liquid_setups/9_Thermo MagMax RNA Extraction Liquid Setup.py +++ b/abr-testing/abr_testing/protocols/liquid_setups/9_Thermo MagMax RNA Extraction Liquid Setup.py @@ -13,7 +13,7 @@ requirements = { "robotType": "Flex", - "apiLevel": "2.16", + "apiLevel": "2.21", } @@ -34,15 +34,28 @@ def run(protocol: protocol_api.ProtocolContext) -> None: ) # Volumes + lysis = 8120 / 8 + stop_reaction_vol = 6400 / 8 elution_vol = 55 - well1 = 8120 / 8 - well2 = 6400 / 8 - well3_7 = 8550 / 8 + well4_12 = 9500 / 8 sample_vol = 100 # Reservoir p1000.transfer( - volume=[well1, well2, well3_7, well3_7, well3_7, well3_7, well3_7], + volume=[ + lysis, + lysis, + stop_reaction_vol, + well4_12, + well4_12, + well4_12, + well4_12, + well4_12, + well4_12, + well4_12, + well4_12, + well4_12, + ], source=source_reservoir["A1"].bottom(z=0.2), dest=[ res1["A1"].top(), @@ -52,6 +65,11 @@ def run(protocol: protocol_api.ProtocolContext) -> None: res1["A5"].top(), res1["A6"].top(), res1["A7"].top(), + res1["A8"].top(), + res1["A9"].top(), + res1["A10"].top(), + res1["A11"].top(), + res1["A12"].top(), ], blow_out=True, blowout_location="source well", @@ -94,7 +112,20 @@ def run(protocol: protocol_api.ProtocolContext) -> None: ) # Sample Plate p1000.transfer( - volume=[sample_vol, sample_vol, sample_vol, sample_vol, sample_vol, sample_vol], + volume=[ + sample_vol, + sample_vol, + sample_vol, + sample_vol, + sample_vol, + sample_vol, + sample_vol, + sample_vol, + sample_vol, + sample_vol, + sample_vol, + sample_vol, + ], source=source_reservoir["A1"].bottom(z=0.2), dest=[ sample_plate["A1"].top(), @@ -103,6 +134,12 @@ def run(protocol: protocol_api.ProtocolContext) -> None: sample_plate["A4"].top(), sample_plate["A5"].top(), sample_plate["A6"].top(), + sample_plate["A7"].top(), + sample_plate["A8"].top(), + sample_plate["A9"].top(), + sample_plate["A10"].top(), + sample_plate["A11"].top(), + sample_plate["A12"].top(), ], blow_out=True, blowout_location="source well", diff --git a/abr-testing/abr_testing/protocols/test_protocols/tc_lid_x_offset_test.py b/abr-testing/abr_testing/protocols/test_protocols/tc_lid_x_offset_test.py index df85453ff28..9dd4ee7b578 100644 --- a/abr-testing/abr_testing/protocols/test_protocols/tc_lid_x_offset_test.py +++ b/abr-testing/abr_testing/protocols/test_protocols/tc_lid_x_offset_test.py @@ -1,12 +1,9 @@ """Protocol to Test the Stacking and Movement of Tough Auto Seal Lid.""" -from opentrons.protocol_api import ( - ParameterContext, - ProtocolContext, -) +from opentrons.protocol_api import ParameterContext, ProtocolContext, Labware from opentrons.protocol_api.module_contexts import ( ThermocyclerContext, ) -from abr_testing.protocols import helpers +from typing import List metadata = {"protocolName": "5 Stack Test"} @@ -23,8 +20,8 @@ def add_parameters(parameters: ParameterContext) -> None: default=5, ) parameters.add_float( - variable_name="x_offset", - display_name="X Offset", + variable_name="num_offset", + display_name="Numerical Offset", choices=[ {"display_name": "0.0", "value": 0.0}, {"display_name": "0.1", "value": 0.1}, @@ -56,41 +53,73 @@ def add_parameters(parameters: ParameterContext) -> None: description="Turn on to make offset negative.", default=False, ) + parameters.add_str( + variable_name="offset", + display_name="Offset", + choices=[ + {"display_name": "Z", "value": "Z"}, + {"display_name": "Y", "value": "Y"}, + {"display_name": "X", "value": "X"}, + ], + default="X", + ) + parameters.add_bool( + variable_name="thermocycler_bool", display_name="thermocycler", default=False + ) def run(protocol: ProtocolContext) -> None: """Runs protocol that moves lids and stacks them.""" # Load Parameters - lids_in_stack = protocol.params.lids_in_a_stack # type: ignore[attr-defined] - x_offset = protocol.params.x_offset # type: ignore[attr-defined] + lids_in_stack: int = protocol.params.lids_in_a_stack # type: ignore[attr-defined] + num_offset = protocol.params.num_offset # type: ignore[attr-defined] + + offset = protocol.params.offset # type: ignore[attr-defined] negative = protocol.params.negative # type: ignore[attr-defined] + thermocycler_bool = protocol.params.thermocycler_bool # type: ignore[attr-defined] if negative: - x_offset = x_offset * -1 + num_offset = num_offset * -1 + # Thermocycler - thermocycler: ThermocyclerContext = protocol.load_module( - "thermocyclerModuleV2" - ) # type: ignore[assignment] - plate_in_cycler = thermocycler.load_labware( - "armadillo_96_wellplate_200ul_pcr_full_skirt" - ) - thermocycler.open_lid() + if thermocycler_bool: + thermocycler: ThermocyclerContext = protocol.load_module( + "thermocyclerModuleV2" + ) # type: ignore[assignment] + plate_in_cycler: Labware = thermocycler.load_labware( + "armadillo_96_wellplate_200ul_pcr_full_skirt" + ) + thermocycler.open_lid() + else: + plate_in_cycler = protocol.load_labware( + "armadillo_96_wellplate_200ul_pcr_full_skirt", "D2" + ) # Load Lids - lid_stack_1 = helpers.load_disposable_lids(protocol, lids_in_stack, ["D2"]) - lid_stack_2 = helpers.load_disposable_lids(protocol, lids_in_stack, ["C2"]) - lid_stack_3 = helpers.load_disposable_lids(protocol, lids_in_stack, ["B2"]) - lid_stack_4 = helpers.load_disposable_lids(protocol, lids_in_stack, ["C3"]) - lid_stack_5 = helpers.load_disposable_lids(protocol, lids_in_stack, ["B3"]) - - drop_offset = {"x": x_offset, "y": 0, "z": 0} + deck_riser_adapter = protocol.load_adapter("opentrons_flex_deck_riser", "D3") + unused_lids: List[Labware] = [ + deck_riser_adapter.load_labware("opentrons_tough_pcr_auto_sealing_lid") + ] + if lids_in_stack > 1: + for i in range(lids_in_stack - 1): + unused_lids.append( + unused_lids[-1].load_labware("opentrons_tough_pcr_auto_sealing_lid") + ) + unused_lids.reverse() + pick_up_offset = { + "X": {"x": num_offset, "y": 0, "z": 0}, + "Y": {"x": 0, "y": num_offset, "z": 0}, + "Z": {"x": 0, "y": 0, "z": num_offset}, + } slot = 0 - lids = [lid_stack_1, lid_stack_2, lid_stack_3, lid_stack_4, lid_stack_5] - for lid_list in lids: - lid_to_move = lid_list[0] - - lid_to_move_back_to = lid_list[1] - protocol.comment(f"Offset {x_offset}, Lid # {slot+1}") - # move lid to plate in thermocycler - protocol.move_labware( - lid_to_move, plate_in_cycler, use_gripper=True, drop_offset=drop_offset - ) - protocol.move_labware(lid_to_move, lid_to_move_back_to, use_gripper=True) + if len(unused_lids) > 1: + lid_to_move_back_to = unused_lids[1] # stack back on top + else: + lid_to_move_back_to = deck_riser_adapter + protocol.comment(f"{offset} Offset {num_offset}, Lid # {slot+1}") + # move lid to plate in thermocycler + protocol.move_labware( + unused_lids[0], + plate_in_cycler, + use_gripper=True, + pick_up_offset=pick_up_offset[offset], + ) + protocol.move_labware(unused_lids[0], lid_to_move_back_to, use_gripper=True) diff --git a/abr-testing/abr_testing/tools/abr_scale.py b/abr-testing/abr_testing/tools/abr_scale.py index a35fee93fbf..e91abf114b2 100644 --- a/abr-testing/abr_testing/tools/abr_scale.py +++ b/abr-testing/abr_testing/tools/abr_scale.py @@ -149,14 +149,11 @@ def get_most_recent_run_and_record( headers, runs_and_lpc, headers_lpc, - list_of_heights, ) = abr_google_drive.create_data_dictionary( most_recent_run_id, storage_directory, "", - labware, - accuracy, - hellma_plate_standards=hellma_file_values, + hellma_file_values, ) google_sheet_abr_data = google_sheets_tool.google_sheet( credentials_path, "ABR-run-data", tab_number=0 @@ -164,15 +161,6 @@ def get_most_recent_run_and_record( start_row = google_sheet_abr_data.get_index_row() + 1 google_sheet_abr_data.batch_update_cells(runs_and_robots, "A", start_row, "0") print("Wrote run to ABR-run-data") - # Add liquid height detection to abr sheet - google_sheet_ldf = google_sheets_tool.google_sheet( - credentials_path, "ABR-run-data", 4 - ) - start_row_lhd = google_sheet_ldf.get_index_row() + 1 - google_sheet_ldf.batch_update_cells( - list_of_heights, "A", start_row_lhd, "1795535088" - ) - print("Wrote found liquid heights to ABR-run-data") # Add LPC to google sheet google_sheet_lpc = google_sheets_tool.google_sheet( credentials_path, "ABR-LPC", tab_number=0 diff --git a/abr-testing/abr_testing/tools/abr_setup.py b/abr-testing/abr_testing/tools/abr_setup.py index 224ba5bf120..d17773965b3 100644 --- a/abr-testing/abr_testing/tools/abr_setup.py +++ b/abr-testing/abr_testing/tools/abr_setup.py @@ -42,7 +42,7 @@ def clean_sheet(sheet_name: str, credentials: str) -> Any: # Check if the date is older than the cutoff if formatted_date < cutoff_date: rem_rows.append(row_id) - if len(rem_rows) > 2000: + if len(rem_rows) > 1500: break if len(rem_rows) == 0: # No more rows to remove @@ -54,8 +54,8 @@ def clean_sheet(sheet_name: str, credentials: str) -> Any: print("deleted rows") except Exception: print("could not delete rows") - traceback.print_exc() - sys.exit(1) + return + clean_sheet(sheet_name, credentials) diff --git a/abr-testing/abr_testing/tools/module_control.py b/abr-testing/abr_testing/tools/module_control.py new file mode 100644 index 00000000000..5bc1f5cfb1d --- /dev/null +++ b/abr-testing/abr_testing/tools/module_control.py @@ -0,0 +1,138 @@ +"""Interface with opentrons modules!""" +from serial import Serial # type: ignore[import-untyped] +import asyncio +import subprocess +from typing import Any + +# Generic +_READ_ALL = "readall" +_READ_LINE = "read" +_DONE = "done" + +# TC commands +_MOVE_SEAL = "ms" +_MOVE_LID = "ml" +tc_gcode_shortcuts = { + "status": "M119", + _MOVE_SEAL: "M241.D", # move seal motor + _MOVE_LID: "M240.D", # move lid stepper motor + "ol": "M126", # open lid + "cl": "M127", # close lid + "sw": "M901.D", # status of all switches + "lt": "M141.D", # get lid temperature + "pt": "M105.D", # get plate temperature +} + +# HS Commands +hs_gcode_shortcuts = { + "srpm": "M3 S{rpm}", # Set RPM + "grpm": "M123", # Get RPM + "home": "G28", # Home + "deactivate": "M106", # Deactivate +} + +gcode_shortcuts = tc_gcode_shortcuts | hs_gcode_shortcuts + + +async def message_read(dev: Serial) -> Any: + """Read message.""" + response = dev.readline().decode() + while not response: + await asyncio.sleep(1) + response = dev.readline().decode() + return response + + +async def message_return(dev: Serial) -> Any: + """Wait until message becomes available.""" + try: + response = await asyncio.wait_for(message_read(dev), timeout=30) + return response + except asyncio.exceptions.TimeoutError: + print("response timed out.") + return "" + + +async def handle_module_gcode_shortcut( + dev: Serial, command: str, in_commands: bool, output: str = "" +) -> None: + """Handle debugging commands that require followup.""" + if in_commands: + if command == _MOVE_SEAL: + distance = input("enter distance in steps => ") + dev.write( + f"{gcode_shortcuts[command]} {distance}\n".encode() + ) # (+) -> retract, (-) -> engage + # print(await message_return(dev)) + elif command == _MOVE_LID: + distance = input( + "enter angular distance in degrees => " + ) # (+) -> open, (-) -> close + dev.write(f"{gcode_shortcuts[command]} {distance}\n".encode()) + # print(await message_return(dev)) + # everything else + else: + dev.write(f"{gcode_shortcuts[command]}\n".encode()) + else: + dev.write(f"{command}\n".encode()) + try: + mr = await message_return(dev) + print(mr) + except TypeError: + print("Invalid input") + return + + if output: + try: + with open(output, "a") as result_file: + if "OK" in mr: + status = command + ": SUCCESS" + else: + status = command + ": FAILURE" + result_file.write(status) + result_file.write(f" {mr}") + result_file.close() + except FileNotFoundError: + print(f"cannot open file: {output}") + + +async def comms_loop(dev: Serial, commands: list, output: str = "") -> bool: + """Loop for commands.""" + _exit = False + try: + command = commands.pop(0) + except IndexError: + command = input("\n>>> ") + if command == _READ_ALL: + print(dev.readlines()) + elif command == _READ_LINE: + print(dev.readline()) + elif command == _DONE: + _exit = True + elif command in gcode_shortcuts: + await handle_module_gcode_shortcut(dev, command, True, output) + else: + await handle_module_gcode_shortcut(dev, command, False, output) + return _exit + + +async def _main(module: str, commands: list = [], output: str = "") -> bool: + """Main process.""" + module_name = ( + subprocess.check_output(["find", "/dev/", "-name", f"*{module}*"]) + .decode() + .strip() + ) + if not module_name: + print(f"{module} not found. Exiting.") + return False + dev = Serial(f"{module_name}", 9600, timeout=2) + _exit = False + while not _exit: + _exit = await comms_loop(dev, commands, output) + dev.close() + return True + + +if __name__ == "__main__": + asyncio.run(_main("heatershaker")) diff --git a/abr-testing/abr_testing/tools/test_modules.py b/abr-testing/abr_testing/tools/test_modules.py new file mode 100644 index 00000000000..8c372fbff53 --- /dev/null +++ b/abr-testing/abr_testing/tools/test_modules.py @@ -0,0 +1,155 @@ +"""Modules Tests Script!""" +import asyncio +import time +from datetime import datetime +import os +import module_control # type: ignore +from typing import Any, Tuple, Dict +import traceback + +# To run: +# SSH into robot +# cd /opt/opentrons-robot-server/abr-testing/tools +# python3 test_modules.py + + +async def tc_test_1(module: str, path_to_file: str) -> None: + """Thermocycler Test 1 Open and Close Lid.""" + duration = int(input("How long to run this test for? (in seconds): ")) + start = time.time() + while time.time() - start < duration: + try: + await (tc_open_lid(module, path_to_file)) + except asyncio.TimeoutError: + return + time.sleep(5) + try: + await (tc_close_lid(module, path_to_file)) + except asyncio.TimeoutError: + return + time.sleep(5) + + +async def hs_test_1(module: str, path_to_file: str) -> None: + """Heater Shaker Test 1. (Home and Shake).""" + duration = int(input("How long to run this test for? (in seconds): ")) + rpm = input("Target RPM (200-3000): ") + start = time.time() + while time.time() - start < duration: + try: + await (hs_test_home(module, path_to_file)) + except asyncio.TimeoutError: + return + time.sleep(5) + try: + await (hs_test_set_shake(module, rpm, path_to_file)) + except asyncio.TimeoutError: + return + time.sleep(10) + try: + await (hs_test_set_shake(module, "0", path_to_file)) + except asyncio.TimeoutError: + return + time.sleep(10) + + +async def input_codes(module: str, path_to_file: str) -> None: + """Opens serial for manual code input.""" + await module_control._main(module, output=path_to_file) + + +hs_tests: Dict[str, Tuple[Any, str]] = { + "Test 1": (hs_test_1, "Repeatedly home heater shaker then set shake speed"), + "Input GCodes": (input_codes, "Input g codes"), +} + +tc_tests: Dict[str, Tuple[Any, str]] = { + "Test 1": (tc_test_1, "Repeatedly open and close TC lid"), + "Input GCodes": (input_codes, "Input g codes"), +} + +global modules + +modules = { + "heatershaker": hs_tests, + "thermocycler": tc_tests, +} + + +async def main(module: str) -> None: + """Select test to be run.""" + # Select test to run + # Set directory for tests + BASE_DIRECTORY = "/userfs/data/testing_data/" + if not os.path.exists(BASE_DIRECTORY): + os.makedirs(BASE_DIRECTORY) + tests = modules[module] + for i, test in enumerate(tests.keys()): + function, description = tests[test] + print(f"{i}) {test} : {description}") + selected_test = int(input("Please select a test: ")) + try: + function, description = tests[list(tests.keys())[selected_test]] + test_dir = BASE_DIRECTORY + f"{module}/test/{list(tests.keys())[selected_test]}" + print(f"{i}, {description}") + print(f"TEST DIR: {test_dir}") + date = datetime.now() + filename = f"results_{datetime.strftime(date, '%Y-%m-%d_%H:%M:%S')}.txt" + output_file = os.path.join(test_dir, filename) + try: + if not os.path.exists(test_dir): + os.makedirs(test_dir) + open(output_file, "a").close() + except Exception: + traceback.print_exc() + print(f"PATH: {output_file} ") + await (function(module, output_file)) + except Exception: + print("Failed to run test") + traceback.print_exc() + + +# HS Test Functions +async def hs_test_home(module: str, path_to_file: str) -> None: + """Home heater shaker.""" + hs_gcodes = module_control.hs_gcode_shortcuts + home_gcode = hs_gcodes["home"] + await (module_control._main(module, [home_gcode, "done"], path_to_file)) + + +async def hs_test_set_shake(module: str, rpm: str, path_to_file: str) -> None: + """Shake heater shaker at specified speed.""" + hs_gcodes = module_control.hs_gcode_shortcuts + set_shake_gcode = hs_gcodes["srpm"].format(rpm=rpm) + await (module_control._main(module, [set_shake_gcode, "done"], path_to_file)) + + +async def hs_deactivate(module: str, path_to_file: str) -> None: + """Deactivate Heater Shaker.""" + hs_gcodes = module_control.hs_gcode_shortcuts + deactivate_gcode = hs_gcodes["deactivate"] + await (module_control._main(module, [deactivate_gcode, "done"], path_to_file)) + + +# TC Test Functions +async def tc_open_lid(module: str, path_to_file: str) -> None: + """Open thermocycler lid.""" + tc_gcodes = module_control.tc_gcode_shortcuts + open_lid_gcode = tc_gcodes["ol"] + await (module_control._main(module, [open_lid_gcode, "done"], path_to_file)) + + +async def tc_close_lid(module: str, path_to_file: str) -> None: + """Open thermocycler lid.""" + tc_gcodes = module_control.tc_gcode_shortcuts + close_lid_gcode = tc_gcodes["cl"] + await (module_control._main(module, [close_lid_gcode, "done"], path_to_file)) + + +if __name__ == "__main__": + print("Modules:") + for i, module in enumerate(modules): + print(f"{i}) {module}") + module_int = int(input("Please select a module: ")) + module = list(modules.keys())[module_int] + asyncio.run(main(module)) diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[004ebb2b82][OT2_S_v2_11_P10S_P300M_MM_TC1_TM_Swift].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[004ebb2b82][OT2_S_v2_11_P10S_P300M_MM_TC1_TM_Swift].json index 1e59022b2a8..8dc5a722eab 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[004ebb2b82][OT2_S_v2_11_P10S_P300M_MM_TC1_TM_Swift].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[004ebb2b82][OT2_S_v2_11_P10S_P300M_MM_TC1_TM_Swift].json @@ -6876,9 +6876,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -6890,9 +6890,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6911,9 +6911,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -6945,9 +6945,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -6978,9 +6978,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7011,9 +7011,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7045,9 +7045,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7079,9 +7079,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7113,9 +7113,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7176,9 +7176,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7208,9 +7208,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -7238,9 +7238,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -7252,9 +7252,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7273,9 +7273,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7307,9 +7307,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7340,9 +7340,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7373,9 +7373,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7407,9 +7407,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7441,9 +7441,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7475,9 +7475,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7538,9 +7538,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7570,9 +7570,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -7600,9 +7600,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -7614,9 +7614,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7635,9 +7635,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7669,9 +7669,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7702,9 +7702,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7735,9 +7735,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7769,9 +7769,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7803,9 +7803,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7837,9 +7837,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7900,9 +7900,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -7932,9 +7932,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -7962,9 +7962,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -7976,9 +7976,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7997,9 +7997,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8031,9 +8031,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8064,9 +8064,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8097,9 +8097,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8131,9 +8131,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8165,9 +8165,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8199,9 +8199,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8262,9 +8262,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8294,9 +8294,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -8324,9 +8324,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -8338,9 +8338,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8359,9 +8359,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8393,9 +8393,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8426,9 +8426,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8459,9 +8459,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8493,9 +8493,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8527,9 +8527,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8561,9 +8561,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8624,9 +8624,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8656,9 +8656,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -8686,9 +8686,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -8700,9 +8700,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8721,9 +8721,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8755,9 +8755,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8788,9 +8788,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8821,9 +8821,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8855,9 +8855,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8889,9 +8889,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8923,9 +8923,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -8986,9 +8986,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9018,9 +9018,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -9048,9 +9048,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -9062,9 +9062,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9083,9 +9083,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9117,9 +9117,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9150,9 +9150,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9183,9 +9183,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9217,9 +9217,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9251,9 +9251,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9285,9 +9285,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9348,9 +9348,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9380,9 +9380,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -9410,9 +9410,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -9424,9 +9424,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9445,9 +9445,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9479,9 +9479,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9512,9 +9512,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9545,9 +9545,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9579,9 +9579,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9613,9 +9613,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9647,9 +9647,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9710,9 +9710,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9742,9 +9742,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -9892,9 +9892,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -9906,9 +9906,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 51.099999999999994, - "tipVolume": 300 + "tipVolume": 300.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9927,9 +9927,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9961,9 +9961,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -9994,9 +9994,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10026,9 +10026,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -10056,9 +10056,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -10070,9 +10070,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 51.099999999999994, - "tipVolume": 300 + "tipVolume": 300.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10091,9 +10091,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10125,9 +10125,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10159,9 +10159,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10193,9 +10193,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10227,9 +10227,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10276,9 +10276,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10309,9 +10309,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10342,9 +10342,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10376,9 +10376,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10410,9 +10410,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10444,9 +10444,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10477,9 +10477,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10509,9 +10509,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -10554,9 +10554,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -10568,9 +10568,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 51.099999999999994, - "tipVolume": 300 + "tipVolume": 300.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10589,9 +10589,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10623,9 +10623,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10672,9 +10672,9 @@ "volume": 19.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10706,9 +10706,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10739,9 +10739,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -10769,9 +10769,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -10783,9 +10783,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 51.099999999999994, - "tipVolume": 300 + "tipVolume": 300.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10804,9 +10804,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10837,9 +10837,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -10912,9 +10912,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -10926,9 +10926,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 51.099999999999994, - "tipVolume": 300 + "tipVolume": 300.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10947,9 +10947,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10981,9 +10981,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11014,9 +11014,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11046,9 +11046,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -11091,9 +11091,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -11105,9 +11105,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11126,9 +11126,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11160,9 +11160,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11193,9 +11193,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11225,9 +11225,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -11255,9 +11255,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -11269,9 +11269,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11290,9 +11290,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11324,9 +11324,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11357,9 +11357,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11389,9 +11389,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -11419,9 +11419,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -11433,9 +11433,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11454,9 +11454,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11488,9 +11488,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11521,9 +11521,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11553,9 +11553,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -11583,9 +11583,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -11597,9 +11597,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11618,9 +11618,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11652,9 +11652,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11685,9 +11685,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11717,9 +11717,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -11747,9 +11747,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -11761,9 +11761,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11782,9 +11782,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11816,9 +11816,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11849,9 +11849,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11881,9 +11881,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -11911,9 +11911,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -11925,9 +11925,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11946,9 +11946,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11980,9 +11980,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12013,9 +12013,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12045,9 +12045,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -12075,9 +12075,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -12089,9 +12089,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12110,9 +12110,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12144,9 +12144,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12177,9 +12177,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12209,9 +12209,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -12239,9 +12239,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -12253,9 +12253,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12274,9 +12274,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12308,9 +12308,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12341,9 +12341,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12373,9 +12373,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -12403,9 +12403,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -12417,9 +12417,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12438,9 +12438,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12472,9 +12472,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12506,9 +12506,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12540,9 +12540,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12573,9 +12573,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -12603,9 +12603,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -12617,9 +12617,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12638,9 +12638,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12672,9 +12672,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12705,9 +12705,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12737,9 +12737,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -12767,9 +12767,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -12781,9 +12781,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12802,9 +12802,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12836,9 +12836,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12870,9 +12870,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12904,9 +12904,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12938,9 +12938,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12972,9 +12972,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13005,9 +13005,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13037,9 +13037,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -13067,9 +13067,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -13081,9 +13081,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13102,9 +13102,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13136,9 +13136,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13169,9 +13169,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13201,9 +13201,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -13231,9 +13231,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -13245,9 +13245,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13266,9 +13266,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13300,9 +13300,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13334,9 +13334,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13368,9 +13368,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13402,9 +13402,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13436,9 +13436,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13469,9 +13469,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13501,9 +13501,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -13531,9 +13531,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -13545,9 +13545,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13566,9 +13566,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13600,9 +13600,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13633,9 +13633,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13665,9 +13665,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -13695,9 +13695,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -13709,9 +13709,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13730,9 +13730,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13764,9 +13764,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13798,9 +13798,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13832,9 +13832,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13866,9 +13866,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13900,9 +13900,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13933,9 +13933,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13965,9 +13965,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -13995,9 +13995,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -14009,9 +14009,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14030,9 +14030,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14064,9 +14064,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14097,9 +14097,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14129,9 +14129,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -14159,9 +14159,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -14173,9 +14173,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14194,9 +14194,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14228,9 +14228,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14262,9 +14262,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14296,9 +14296,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14330,9 +14330,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14364,9 +14364,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14397,9 +14397,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14429,9 +14429,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -14459,9 +14459,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -14473,9 +14473,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14494,9 +14494,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14528,9 +14528,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14561,9 +14561,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14593,9 +14593,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -14623,9 +14623,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -14637,9 +14637,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14658,9 +14658,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14692,9 +14692,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14726,9 +14726,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14760,9 +14760,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14794,9 +14794,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14828,9 +14828,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14861,9 +14861,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14893,9 +14893,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -14923,9 +14923,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -14937,9 +14937,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14958,9 +14958,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14992,9 +14992,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15025,9 +15025,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15057,9 +15057,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15087,9 +15087,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -15101,9 +15101,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15122,9 +15122,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15156,9 +15156,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15190,9 +15190,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15224,9 +15224,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15258,9 +15258,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15292,9 +15292,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15325,9 +15325,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15357,9 +15357,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15387,9 +15387,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -15401,9 +15401,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15422,9 +15422,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15456,9 +15456,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15489,9 +15489,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15521,9 +15521,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15551,9 +15551,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -15565,9 +15565,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15586,9 +15586,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15620,9 +15620,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15654,9 +15654,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15688,9 +15688,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15722,9 +15722,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15756,9 +15756,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15789,9 +15789,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15821,9 +15821,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15851,9 +15851,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -15865,9 +15865,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15886,9 +15886,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15920,9 +15920,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15953,9 +15953,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15985,9 +15985,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16015,9 +16015,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -16029,9 +16029,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 35.910000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16050,9 +16050,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16084,9 +16084,9 @@ "volume": 7.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16118,9 +16118,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16152,9 +16152,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16186,9 +16186,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16220,9 +16220,9 @@ "volume": 8.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16253,9 +16253,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16285,9 +16285,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16405,9 +16405,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -16419,9 +16419,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 51.099999999999994, - "tipVolume": 300 + "tipVolume": 300.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16440,9 +16440,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16474,9 +16474,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16507,9 +16507,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16539,9 +16539,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[011481812b][OT2_S_v2_7_P20S_None_Walkthrough].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[011481812b][OT2_S_v2_7_P20S_None_Walkthrough].json index 387b9f0e3f5..3a1a9bca236 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[011481812b][OT2_S_v2_7_P20S_None_Walkthrough].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[011481812b][OT2_S_v2_7_P20S_None_Walkthrough].json @@ -2348,9 +2348,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -2362,9 +2362,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 30.950000000000003, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2398,9 +2398,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2432,9 +2432,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2466,9 +2466,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2500,9 +2500,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2534,9 +2534,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2568,9 +2568,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2602,9 +2602,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2636,9 +2636,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2670,9 +2670,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2704,9 +2704,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2738,9 +2738,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2772,9 +2772,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2806,9 +2806,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2840,9 +2840,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2874,9 +2874,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2908,9 +2908,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2942,9 +2942,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -2976,9 +2976,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3010,9 +3010,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3059,9 +3059,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3093,9 +3093,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3142,9 +3142,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3176,9 +3176,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3210,9 +3210,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3243,9 +3243,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3276,9 +3276,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3310,9 +3310,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3343,9 +3343,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3376,9 +3376,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3410,9 +3410,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3443,9 +3443,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3475,9 +3475,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -3505,9 +3505,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -3519,9 +3519,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 30.950000000000003, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3555,9 +3555,9 @@ "volume": 4.444444444444445, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3589,9 +3589,9 @@ "volume": 6.666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3638,9 +3638,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3672,9 +3672,9 @@ "volume": 4.444444444444445, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3706,9 +3706,9 @@ "volume": 6.666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3755,9 +3755,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3789,9 +3789,9 @@ "volume": 4.444444444444445, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3823,9 +3823,9 @@ "volume": 6.666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3872,9 +3872,9 @@ "volume": 13.333333333333334, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3906,9 +3906,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3940,9 +3940,9 @@ "volume": 2.5, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -3974,9 +3974,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4008,9 +4008,9 @@ "volume": 2.5, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4056,9 +4056,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4088,9 +4088,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -4118,9 +4118,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -4132,9 +4132,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 30.950000000000003, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4153,9 +4153,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4187,9 +4187,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4221,9 +4221,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4255,9 +4255,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4289,9 +4289,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4323,9 +4323,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4357,9 +4357,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4391,9 +4391,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4425,9 +4425,9 @@ "volume": 13.333333333333332, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4458,9 +4458,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -4488,9 +4488,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -4502,9 +4502,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 30.950000000000003, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4523,9 +4523,9 @@ "volume": 14.333333333333332, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4557,9 +4557,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4591,9 +4591,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4625,9 +4625,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4659,9 +4659,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4693,9 +4693,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4727,9 +4727,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4761,9 +4761,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4795,9 +4795,9 @@ "volume": 1.6666666666666667, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4828,9 +4828,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -4860,9 +4860,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json index df7062d67b5..3d1cdd1d3c1 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json @@ -10789,9 +10789,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -10921,9 +10921,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -11121,9 +11121,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -11253,9 +11253,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json index d1d7e581f85..a7e09aba292 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json @@ -20183,9 +20183,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20583,9 +20583,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20983,9 +20983,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -23990,9 +23990,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -24487,9 +24487,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -24984,9 +24984,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -26804,9 +26804,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27301,9 +27301,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27798,9 +27798,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27956,9 +27956,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -28086,9 +28086,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -28216,9 +28216,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -28498,9 +28498,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -28694,9 +28694,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -28890,9 +28890,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29265,9 +29265,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29509,9 +29509,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29753,9 +29753,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35050,9 +35050,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35547,9 +35547,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36044,9 +36044,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -37850,9 +37850,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -38333,9 +38333,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -38816,9 +38816,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -41809,9 +41809,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42292,9 +42292,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42775,9 +42775,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42933,9 +42933,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -43063,9 +43063,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -43193,9 +43193,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44732,9 +44732,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44962,9 +44962,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -45192,9 +45192,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -56010,9 +56010,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -56507,9 +56507,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -57004,9 +57004,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -58824,9 +58824,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -59321,9 +59321,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -59818,9 +59818,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -62861,9 +62861,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -63358,9 +63358,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -63855,9 +63855,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -64013,9 +64013,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -64143,9 +64143,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -64273,9 +64273,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -64589,9 +64589,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -64819,9 +64819,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -65049,9 +65049,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -65424,9 +65424,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -65668,9 +65668,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -65912,9 +65912,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json index f9343e792c6..705c9658155 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json @@ -14067,9 +14067,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -14199,9 +14199,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -14331,9 +14331,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -14910,9 +14910,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15342,9 +15342,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15774,9 +15774,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19117,9 +19117,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19549,9 +19549,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19981,9 +19981,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22137,9 +22137,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22569,9 +22569,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -23001,9 +23001,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -26344,9 +26344,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -26776,9 +26776,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27208,9 +27208,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27588,9 +27588,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27940,9 +27940,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -28292,9 +28292,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36140,9 +36140,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36540,9 +36540,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36940,9 +36940,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -39946,9 +39946,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40346,9 +40346,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40746,9 +40746,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42565,9 +42565,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42965,9 +42965,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -43365,9 +43365,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -43745,9 +43745,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44097,9 +44097,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44449,9 +44449,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46022,9 +46022,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46286,9 +46286,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46550,9 +46550,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46845,9 +46845,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -47009,9 +47009,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -47173,9 +47173,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json index c5a57c18fc4..84e33cd17bd 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -11844,9 +11844,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15853,9 +15853,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16208,9 +16208,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16562,9 +16562,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16840,9 +16840,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16939,9 +16939,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[134037b2aa][OT2_X_v6_P300M_P20S_HS_MM_TM_TC_AllMods].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[134037b2aa][OT2_X_v6_P300M_P20S_HS_MM_TM_TC_AllMods].json index 19b3454722f..a0e4e4b52b4 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[134037b2aa][OT2_X_v6_P300M_P20S_HS_MM_TM_TC_AllMods].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[134037b2aa][OT2_X_v6_P300M_P20S_HS_MM_TM_TC_AllMods].json @@ -6112,9 +6112,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -6147,8 +6147,8 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -6181,8 +6181,8 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -6214,9 +6214,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -6244,9 +6244,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -6279,8 +6279,8 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -6313,8 +6313,8 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -6346,9 +6346,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -6376,9 +6376,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -6411,8 +6411,8 @@ "volume": 25.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -6445,8 +6445,8 @@ "volume": 25.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -6478,9 +6478,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -6508,9 +6508,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -6543,8 +6543,8 @@ "volume": 25.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -6577,8 +6577,8 @@ "volume": 25.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -6610,9 +6610,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -6640,9 +6640,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -6675,8 +6675,8 @@ "volume": 25.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -6709,8 +6709,8 @@ "volume": 25.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -6742,9 +6742,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -6772,9 +6772,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -6807,8 +6807,8 @@ "volume": 25.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -6841,8 +6841,8 @@ "volume": 25.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -6874,9 +6874,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -6904,9 +6904,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -6939,8 +6939,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -6973,8 +6973,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -7006,9 +7006,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -7036,9 +7036,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -7071,8 +7071,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -7105,8 +7105,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -7138,9 +7138,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -7168,9 +7168,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -7203,8 +7203,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -7237,8 +7237,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -7270,9 +7270,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -7300,9 +7300,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -7335,8 +7335,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -7369,8 +7369,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -7402,9 +7402,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -7432,9 +7432,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -7467,8 +7467,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -7501,8 +7501,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -7534,9 +7534,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -7564,9 +7564,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -7599,8 +7599,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -7633,8 +7633,8 @@ "volume": 22.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -7666,9 +7666,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[194e3c49bb][pl_Normalization_with_PCR].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[194e3c49bb][pl_Normalization_with_PCR].json index 1dad0a643db..15d4ad5cd55 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[194e3c49bb][pl_Normalization_with_PCR].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[194e3c49bb][pl_Normalization_with_PCR].json @@ -6021,9 +6021,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -6636,9 +6636,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -7478,9 +7478,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -8322,9 +8322,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -9166,9 +9166,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19c783e363][Flex_X_v8_P1000_96_HS_GRIP_TC_TM_GripperCollisionWithTips].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19c783e363][Flex_X_v8_P1000_96_HS_GRIP_TC_TM_GripperCollisionWithTips].json index 7a817b9879d..bc40fdbb1d4 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19c783e363][Flex_X_v8_P1000_96_HS_GRIP_TC_TM_GripperCollisionWithTips].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19c783e363][Flex_X_v8_P1000_96_HS_GRIP_TC_TM_GripperCollisionWithTips].json @@ -12022,9 +12022,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -12057,8 +12057,8 @@ "volume": 100.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -12091,8 +12091,8 @@ "volume": 100.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -12165,9 +12165,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -12200,8 +12200,8 @@ "volume": 100.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -12234,8 +12234,8 @@ "volume": 100.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", @@ -12322,9 +12322,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -12357,8 +12357,8 @@ "volume": 200.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 1.0 }, "origin": "bottom", @@ -12391,8 +12391,8 @@ "volume": 200.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, + "x": 0.0, + "y": 0.0, "z": 0.5 }, "origin": "bottom", diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json index d4ea924e585..29df1897867 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json @@ -16970,9 +16970,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -17262,9 +17262,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -17492,9 +17492,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -17722,9 +17722,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -17952,9 +17952,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -18182,9 +18182,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -18412,9 +18412,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -18642,9 +18642,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -18872,9 +18872,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19102,9 +19102,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19332,9 +19332,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19562,9 +19562,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19792,9 +19792,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20103,9 +20103,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20366,9 +20366,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20629,9 +20629,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20892,9 +20892,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21155,9 +21155,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21418,9 +21418,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21681,9 +21681,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21944,9 +21944,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22207,9 +22207,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22470,9 +22470,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22733,9 +22733,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22996,9 +22996,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29040,9 +29040,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29408,9 +29408,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29638,9 +29638,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29868,9 +29868,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -30098,9 +30098,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -30328,9 +30328,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -30558,9 +30558,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -30788,9 +30788,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31018,9 +31018,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31248,9 +31248,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31478,9 +31478,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31708,9 +31708,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31938,9 +31938,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -34042,9 +34042,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -34393,9 +34393,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -34623,9 +34623,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -34853,9 +34853,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35083,9 +35083,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35313,9 +35313,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35543,9 +35543,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35773,9 +35773,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36003,9 +36003,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36233,9 +36233,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36463,9 +36463,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36693,9 +36693,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36923,9 +36923,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -39027,9 +39027,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -39378,9 +39378,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -39608,9 +39608,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -39838,9 +39838,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40068,9 +40068,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40298,9 +40298,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40528,9 +40528,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40758,9 +40758,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40988,9 +40988,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -41218,9 +41218,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -41448,9 +41448,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -41678,9 +41678,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -41908,9 +41908,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44012,9 +44012,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44363,9 +44363,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44593,9 +44593,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44823,9 +44823,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -45053,9 +45053,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -45283,9 +45283,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -45513,9 +45513,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -45743,9 +45743,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -45973,9 +45973,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46203,9 +46203,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46433,9 +46433,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46663,9 +46663,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46893,9 +46893,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -52985,9 +52985,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1c19a2055c][OT2_S_v2_4_P300M_None_MM_TM_Zymo].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1c19a2055c][OT2_S_v2_4_P300M_None_MM_TM_Zymo].json index fc41febf592..25c3ac466ec 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1c19a2055c][OT2_S_v2_4_P300M_None_MM_TM_Zymo].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1c19a2055c][OT2_S_v2_4_P300M_None_MM_TM_Zymo].json @@ -10682,9 +10682,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -10696,9 +10696,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10717,9 +10717,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10751,9 +10751,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10785,9 +10785,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10819,9 +10819,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10853,9 +10853,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10887,9 +10887,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10921,9 +10921,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10955,9 +10955,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -10989,9 +10989,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11023,9 +11023,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11057,9 +11057,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11091,9 +11091,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11125,9 +11125,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11159,9 +11159,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11193,9 +11193,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11227,9 +11227,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11261,9 +11261,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11295,9 +11295,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11329,9 +11329,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11363,9 +11363,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11397,9 +11397,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11431,9 +11431,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11465,9 +11465,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11499,9 +11499,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11533,9 +11533,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11567,9 +11567,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11601,9 +11601,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11635,9 +11635,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11669,9 +11669,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11703,9 +11703,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11737,9 +11737,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11771,9 +11771,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11805,9 +11805,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11839,9 +11839,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11873,9 +11873,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11907,9 +11907,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11941,9 +11941,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -11975,9 +11975,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12009,9 +12009,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12043,9 +12043,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12077,9 +12077,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12111,9 +12111,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12145,9 +12145,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12179,9 +12179,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12213,9 +12213,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12247,9 +12247,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12281,9 +12281,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12315,9 +12315,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12349,9 +12349,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12383,9 +12383,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12417,9 +12417,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12451,9 +12451,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12485,9 +12485,9 @@ "volume": 3.333333333333343, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12519,9 +12519,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12553,9 +12553,9 @@ "volume": 13.333333333333343, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12587,9 +12587,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12621,9 +12621,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12655,9 +12655,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12689,9 +12689,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12723,9 +12723,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12757,9 +12757,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12791,9 +12791,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12825,9 +12825,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12859,9 +12859,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12893,9 +12893,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12927,9 +12927,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12961,9 +12961,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -12995,9 +12995,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13029,9 +13029,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13063,9 +13063,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13097,9 +13097,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13131,9 +13131,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13165,9 +13165,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13199,9 +13199,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13233,9 +13233,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13267,9 +13267,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13301,9 +13301,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13335,9 +13335,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13369,9 +13369,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13403,9 +13403,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13437,9 +13437,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13471,9 +13471,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13505,9 +13505,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13539,9 +13539,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13573,9 +13573,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13607,9 +13607,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13641,9 +13641,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13675,9 +13675,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13709,9 +13709,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13743,9 +13743,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13777,9 +13777,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13811,9 +13811,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13845,9 +13845,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13879,9 +13879,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13913,9 +13913,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13947,9 +13947,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -13981,9 +13981,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14015,9 +14015,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14049,9 +14049,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14083,9 +14083,9 @@ "volume": 3.333333333333343, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14117,9 +14117,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14151,9 +14151,9 @@ "volume": 13.333333333333343, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14185,9 +14185,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14219,9 +14219,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14253,9 +14253,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14287,9 +14287,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14321,9 +14321,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14355,9 +14355,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14389,9 +14389,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14423,9 +14423,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14457,9 +14457,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14491,9 +14491,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14525,9 +14525,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14559,9 +14559,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14593,9 +14593,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14627,9 +14627,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14661,9 +14661,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14695,9 +14695,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14729,9 +14729,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14763,9 +14763,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14797,9 +14797,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14831,9 +14831,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14865,9 +14865,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14899,9 +14899,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14933,9 +14933,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -14967,9 +14967,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15001,9 +15001,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15035,9 +15035,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15069,9 +15069,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15103,9 +15103,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15137,9 +15137,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15171,9 +15171,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15205,9 +15205,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15239,9 +15239,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15273,9 +15273,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15307,9 +15307,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15341,9 +15341,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15375,9 +15375,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15409,9 +15409,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15443,9 +15443,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15477,9 +15477,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15511,9 +15511,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15545,9 +15545,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15579,9 +15579,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15613,9 +15613,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15647,9 +15647,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15681,9 +15681,9 @@ "volume": 3.333333333333343, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15715,9 +15715,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15749,9 +15749,9 @@ "volume": 13.333333333333343, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15782,9 +15782,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15815,9 +15815,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -15848,9 +15848,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15921,9 +15921,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -15935,9 +15935,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15971,9 +15971,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16005,9 +16005,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16039,9 +16039,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16073,9 +16073,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16107,9 +16107,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16141,9 +16141,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16175,9 +16175,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16209,9 +16209,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16243,9 +16243,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16277,9 +16277,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16311,9 +16311,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16345,9 +16345,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16379,9 +16379,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16413,9 +16413,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16447,9 +16447,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16481,9 +16481,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16515,9 +16515,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16549,9 +16549,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16583,9 +16583,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16617,9 +16617,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16651,9 +16651,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16685,9 +16685,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16719,9 +16719,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16753,9 +16753,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16787,9 +16787,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16821,9 +16821,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16855,9 +16855,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16889,9 +16889,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16923,9 +16923,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16957,9 +16957,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -16991,9 +16991,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17025,9 +17025,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17059,9 +17059,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17093,9 +17093,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17127,9 +17127,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17161,9 +17161,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17195,9 +17195,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17229,9 +17229,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17263,9 +17263,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17297,9 +17297,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17331,9 +17331,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17365,9 +17365,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17399,9 +17399,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17433,9 +17433,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17467,9 +17467,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17501,9 +17501,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17535,9 +17535,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17569,9 +17569,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17603,9 +17603,9 @@ "volume": 6.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17637,9 +17637,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17671,9 +17671,9 @@ "volume": 16.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17704,9 +17704,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17737,9 +17737,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17771,9 +17771,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17820,9 +17820,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17854,9 +17854,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17888,9 +17888,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17922,9 +17922,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17956,9 +17956,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -17990,9 +17990,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18024,9 +18024,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18058,9 +18058,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18092,9 +18092,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18126,9 +18126,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18160,9 +18160,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18194,9 +18194,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18228,9 +18228,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18262,9 +18262,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18296,9 +18296,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18330,9 +18330,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18364,9 +18364,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18398,9 +18398,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18432,9 +18432,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18466,9 +18466,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18500,9 +18500,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18534,9 +18534,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18568,9 +18568,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18602,9 +18602,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18636,9 +18636,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18670,9 +18670,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18704,9 +18704,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18738,9 +18738,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18772,9 +18772,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18806,9 +18806,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18840,9 +18840,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18874,9 +18874,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18908,9 +18908,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18942,9 +18942,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -18976,9 +18976,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19010,9 +19010,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19044,9 +19044,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19078,9 +19078,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19112,9 +19112,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19146,9 +19146,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19180,9 +19180,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19214,9 +19214,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19248,9 +19248,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19282,9 +19282,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19316,9 +19316,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19350,9 +19350,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19384,9 +19384,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19418,9 +19418,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19452,9 +19452,9 @@ "volume": 6.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19486,9 +19486,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19520,9 +19520,9 @@ "volume": 16.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19553,9 +19553,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19586,9 +19586,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19620,9 +19620,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19669,9 +19669,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19703,9 +19703,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19737,9 +19737,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19771,9 +19771,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19805,9 +19805,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19839,9 +19839,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19873,9 +19873,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19907,9 +19907,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19941,9 +19941,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -19975,9 +19975,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20009,9 +20009,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20043,9 +20043,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20077,9 +20077,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20111,9 +20111,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20145,9 +20145,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20179,9 +20179,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20213,9 +20213,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20247,9 +20247,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20281,9 +20281,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20315,9 +20315,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20349,9 +20349,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20383,9 +20383,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20417,9 +20417,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20451,9 +20451,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20485,9 +20485,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20519,9 +20519,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20553,9 +20553,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20587,9 +20587,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20621,9 +20621,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20655,9 +20655,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20689,9 +20689,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20723,9 +20723,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20757,9 +20757,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20791,9 +20791,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20825,9 +20825,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20859,9 +20859,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20893,9 +20893,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20927,9 +20927,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20961,9 +20961,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -20995,9 +20995,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21029,9 +21029,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21063,9 +21063,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21097,9 +21097,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21131,9 +21131,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21165,9 +21165,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21199,9 +21199,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21233,9 +21233,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21267,9 +21267,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21301,9 +21301,9 @@ "volume": 6.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21335,9 +21335,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21369,9 +21369,9 @@ "volume": 16.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21402,9 +21402,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21435,9 +21435,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21469,9 +21469,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21518,9 +21518,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21552,9 +21552,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21586,9 +21586,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21620,9 +21620,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21654,9 +21654,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21688,9 +21688,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21722,9 +21722,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21756,9 +21756,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21790,9 +21790,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21824,9 +21824,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21858,9 +21858,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21892,9 +21892,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21926,9 +21926,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21960,9 +21960,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -21994,9 +21994,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22028,9 +22028,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22062,9 +22062,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22096,9 +22096,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22130,9 +22130,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22164,9 +22164,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22198,9 +22198,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22232,9 +22232,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22266,9 +22266,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22300,9 +22300,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22334,9 +22334,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22368,9 +22368,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22402,9 +22402,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22436,9 +22436,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22470,9 +22470,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22504,9 +22504,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22538,9 +22538,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22572,9 +22572,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22606,9 +22606,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22640,9 +22640,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22674,9 +22674,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22708,9 +22708,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22742,9 +22742,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22776,9 +22776,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22810,9 +22810,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22844,9 +22844,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22878,9 +22878,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22912,9 +22912,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22946,9 +22946,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -22980,9 +22980,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23014,9 +23014,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23048,9 +23048,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23082,9 +23082,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23116,9 +23116,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23150,9 +23150,9 @@ "volume": 6.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23184,9 +23184,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23218,9 +23218,9 @@ "volume": 16.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23251,9 +23251,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23284,9 +23284,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23318,9 +23318,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23367,9 +23367,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23401,9 +23401,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23435,9 +23435,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23469,9 +23469,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23503,9 +23503,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23537,9 +23537,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23571,9 +23571,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23605,9 +23605,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23639,9 +23639,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23673,9 +23673,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23707,9 +23707,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23741,9 +23741,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23775,9 +23775,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23809,9 +23809,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23843,9 +23843,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23877,9 +23877,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23911,9 +23911,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23945,9 +23945,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -23979,9 +23979,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24013,9 +24013,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24047,9 +24047,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24081,9 +24081,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24115,9 +24115,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24149,9 +24149,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24183,9 +24183,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24217,9 +24217,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24251,9 +24251,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24285,9 +24285,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24319,9 +24319,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24353,9 +24353,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24387,9 +24387,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24421,9 +24421,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24455,9 +24455,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24489,9 +24489,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24523,9 +24523,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24557,9 +24557,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24591,9 +24591,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24625,9 +24625,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24659,9 +24659,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24693,9 +24693,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24727,9 +24727,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24761,9 +24761,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24795,9 +24795,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24829,9 +24829,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24863,9 +24863,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24897,9 +24897,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24931,9 +24931,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24965,9 +24965,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -24999,9 +24999,9 @@ "volume": 6.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25033,9 +25033,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25067,9 +25067,9 @@ "volume": 16.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25100,9 +25100,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25133,9 +25133,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25166,9 +25166,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -25211,9 +25211,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -25225,9 +25225,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -25246,9 +25246,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25280,9 +25280,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25314,9 +25314,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25348,9 +25348,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25382,9 +25382,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25416,9 +25416,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25450,9 +25450,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25484,9 +25484,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25518,9 +25518,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25552,9 +25552,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25586,9 +25586,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25620,9 +25620,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25654,9 +25654,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25688,9 +25688,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25722,9 +25722,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25756,9 +25756,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25790,9 +25790,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25824,9 +25824,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25858,9 +25858,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25892,9 +25892,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25926,9 +25926,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25960,9 +25960,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -25994,9 +25994,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26028,9 +26028,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26062,9 +26062,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26096,9 +26096,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26130,9 +26130,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26164,9 +26164,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26198,9 +26198,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26232,9 +26232,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26266,9 +26266,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26300,9 +26300,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26334,9 +26334,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26368,9 +26368,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26402,9 +26402,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26436,9 +26436,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26470,9 +26470,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26504,9 +26504,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26538,9 +26538,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26572,9 +26572,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26606,9 +26606,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26640,9 +26640,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26674,9 +26674,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26708,9 +26708,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26742,9 +26742,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26776,9 +26776,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26810,9 +26810,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26844,9 +26844,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26878,9 +26878,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26912,9 +26912,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26946,9 +26946,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -26980,9 +26980,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27014,9 +27014,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27048,9 +27048,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27082,9 +27082,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27116,9 +27116,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27150,9 +27150,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27184,9 +27184,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27218,9 +27218,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27252,9 +27252,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27286,9 +27286,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27320,9 +27320,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27354,9 +27354,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27388,9 +27388,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27422,9 +27422,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27456,9 +27456,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27490,9 +27490,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27524,9 +27524,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27558,9 +27558,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27592,9 +27592,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27626,9 +27626,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27660,9 +27660,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27694,9 +27694,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27728,9 +27728,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27762,9 +27762,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27796,9 +27796,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27830,9 +27830,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27864,9 +27864,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27898,9 +27898,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27932,9 +27932,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -27966,9 +27966,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28000,9 +28000,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28034,9 +28034,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28068,9 +28068,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28102,9 +28102,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28136,9 +28136,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28170,9 +28170,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28204,9 +28204,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28238,9 +28238,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28272,9 +28272,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28306,9 +28306,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28340,9 +28340,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28374,9 +28374,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28408,9 +28408,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28442,9 +28442,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28476,9 +28476,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28510,9 +28510,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28544,9 +28544,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28578,9 +28578,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28612,9 +28612,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28646,9 +28646,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28680,9 +28680,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28714,9 +28714,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28748,9 +28748,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28782,9 +28782,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28816,9 +28816,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28850,9 +28850,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28884,9 +28884,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28918,9 +28918,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28952,9 +28952,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -28986,9 +28986,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29020,9 +29020,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29054,9 +29054,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29088,9 +29088,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29122,9 +29122,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29156,9 +29156,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29190,9 +29190,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29224,9 +29224,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29258,9 +29258,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29292,9 +29292,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29326,9 +29326,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29360,9 +29360,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29394,9 +29394,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29428,9 +29428,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29462,9 +29462,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29496,9 +29496,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29530,9 +29530,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29564,9 +29564,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29598,9 +29598,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29632,9 +29632,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29666,9 +29666,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29700,9 +29700,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29734,9 +29734,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29768,9 +29768,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29802,9 +29802,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29836,9 +29836,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29870,9 +29870,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29904,9 +29904,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29938,9 +29938,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -29972,9 +29972,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30006,9 +30006,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30040,9 +30040,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30074,9 +30074,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30108,9 +30108,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30142,9 +30142,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30176,9 +30176,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30210,9 +30210,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30244,9 +30244,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30278,9 +30278,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30312,9 +30312,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30346,9 +30346,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30380,9 +30380,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30414,9 +30414,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30448,9 +30448,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30482,9 +30482,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30516,9 +30516,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30550,9 +30550,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30599,9 +30599,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30633,9 +30633,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30667,9 +30667,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30701,9 +30701,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30735,9 +30735,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30769,9 +30769,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30803,9 +30803,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30837,9 +30837,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30871,9 +30871,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30905,9 +30905,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30939,9 +30939,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -30973,9 +30973,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31007,9 +31007,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31041,9 +31041,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31075,9 +31075,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31109,9 +31109,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31143,9 +31143,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31177,9 +31177,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31211,9 +31211,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31245,9 +31245,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31279,9 +31279,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31313,9 +31313,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31347,9 +31347,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31381,9 +31381,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31415,9 +31415,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31449,9 +31449,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31483,9 +31483,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31517,9 +31517,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31551,9 +31551,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31585,9 +31585,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31619,9 +31619,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31653,9 +31653,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31687,9 +31687,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31721,9 +31721,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31755,9 +31755,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31789,9 +31789,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31823,9 +31823,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31857,9 +31857,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31891,9 +31891,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31925,9 +31925,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31958,9 +31958,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -31991,9 +31991,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32024,9 +32024,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -32084,9 +32084,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -32098,9 +32098,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -32134,9 +32134,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32168,9 +32168,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32202,9 +32202,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32236,9 +32236,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32270,9 +32270,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32304,9 +32304,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32338,9 +32338,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32372,9 +32372,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32406,9 +32406,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32440,9 +32440,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32474,9 +32474,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32508,9 +32508,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32542,9 +32542,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32576,9 +32576,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32610,9 +32610,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32644,9 +32644,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32678,9 +32678,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32712,9 +32712,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32746,9 +32746,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32780,9 +32780,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32814,9 +32814,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32848,9 +32848,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32882,9 +32882,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32916,9 +32916,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32950,9 +32950,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -32984,9 +32984,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33018,9 +33018,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33052,9 +33052,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33086,9 +33086,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33120,9 +33120,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33154,9 +33154,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33188,9 +33188,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33222,9 +33222,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33256,9 +33256,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33290,9 +33290,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33324,9 +33324,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33358,9 +33358,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33392,9 +33392,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33426,9 +33426,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33460,9 +33460,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33494,9 +33494,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33528,9 +33528,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33562,9 +33562,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33596,9 +33596,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33630,9 +33630,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33664,9 +33664,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33698,9 +33698,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33732,9 +33732,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33766,9 +33766,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33800,9 +33800,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33834,9 +33834,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33867,9 +33867,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33900,9 +33900,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33934,9 +33934,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -33983,9 +33983,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34017,9 +34017,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34051,9 +34051,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34085,9 +34085,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34119,9 +34119,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34153,9 +34153,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34187,9 +34187,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34221,9 +34221,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34255,9 +34255,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34289,9 +34289,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34323,9 +34323,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34357,9 +34357,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34391,9 +34391,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34425,9 +34425,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34459,9 +34459,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34493,9 +34493,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34527,9 +34527,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34561,9 +34561,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34595,9 +34595,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34629,9 +34629,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34663,9 +34663,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34697,9 +34697,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34731,9 +34731,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34765,9 +34765,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34799,9 +34799,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34833,9 +34833,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34867,9 +34867,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34901,9 +34901,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34935,9 +34935,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -34969,9 +34969,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35003,9 +35003,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35037,9 +35037,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35071,9 +35071,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35105,9 +35105,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35139,9 +35139,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35173,9 +35173,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35207,9 +35207,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35241,9 +35241,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35275,9 +35275,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35309,9 +35309,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35343,9 +35343,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35377,9 +35377,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35411,9 +35411,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35445,9 +35445,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35479,9 +35479,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35513,9 +35513,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35547,9 +35547,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35581,9 +35581,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35615,9 +35615,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35649,9 +35649,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35683,9 +35683,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35716,9 +35716,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35749,9 +35749,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35783,9 +35783,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35832,9 +35832,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35866,9 +35866,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35900,9 +35900,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35934,9 +35934,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -35968,9 +35968,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36002,9 +36002,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36036,9 +36036,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36070,9 +36070,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36104,9 +36104,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36138,9 +36138,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36172,9 +36172,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36206,9 +36206,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36240,9 +36240,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36274,9 +36274,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36308,9 +36308,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36342,9 +36342,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36376,9 +36376,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36410,9 +36410,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36444,9 +36444,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36478,9 +36478,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36512,9 +36512,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36546,9 +36546,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36580,9 +36580,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36614,9 +36614,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36648,9 +36648,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36682,9 +36682,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36716,9 +36716,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36750,9 +36750,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36784,9 +36784,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36818,9 +36818,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36852,9 +36852,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36886,9 +36886,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36920,9 +36920,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36954,9 +36954,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -36988,9 +36988,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37022,9 +37022,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37056,9 +37056,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37090,9 +37090,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37124,9 +37124,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37158,9 +37158,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37192,9 +37192,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37226,9 +37226,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37260,9 +37260,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37294,9 +37294,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37328,9 +37328,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37362,9 +37362,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37396,9 +37396,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37430,9 +37430,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37464,9 +37464,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37498,9 +37498,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37532,9 +37532,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37565,9 +37565,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37598,9 +37598,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37631,9 +37631,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -37676,9 +37676,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -37690,9 +37690,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -37711,9 +37711,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37745,9 +37745,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37779,9 +37779,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37813,9 +37813,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37847,9 +37847,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37881,9 +37881,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37915,9 +37915,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37949,9 +37949,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -37983,9 +37983,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38017,9 +38017,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38051,9 +38051,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38085,9 +38085,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38119,9 +38119,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38153,9 +38153,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38187,9 +38187,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38221,9 +38221,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38255,9 +38255,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38289,9 +38289,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38323,9 +38323,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38357,9 +38357,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38391,9 +38391,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38425,9 +38425,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38459,9 +38459,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38493,9 +38493,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38527,9 +38527,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38561,9 +38561,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38595,9 +38595,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38629,9 +38629,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38663,9 +38663,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38697,9 +38697,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38731,9 +38731,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38765,9 +38765,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38799,9 +38799,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38833,9 +38833,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38867,9 +38867,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38901,9 +38901,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38935,9 +38935,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -38969,9 +38969,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39003,9 +39003,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39037,9 +39037,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39071,9 +39071,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39105,9 +39105,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39139,9 +39139,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39173,9 +39173,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39207,9 +39207,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39241,9 +39241,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39275,9 +39275,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39309,9 +39309,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39343,9 +39343,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39377,9 +39377,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39411,9 +39411,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39445,9 +39445,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39479,9 +39479,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39513,9 +39513,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39547,9 +39547,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39581,9 +39581,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39615,9 +39615,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39649,9 +39649,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39683,9 +39683,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39717,9 +39717,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39751,9 +39751,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39785,9 +39785,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39819,9 +39819,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39853,9 +39853,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39887,9 +39887,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39921,9 +39921,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39955,9 +39955,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -39989,9 +39989,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40023,9 +40023,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40057,9 +40057,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40091,9 +40091,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40125,9 +40125,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40159,9 +40159,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40193,9 +40193,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40227,9 +40227,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40261,9 +40261,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40295,9 +40295,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40329,9 +40329,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40363,9 +40363,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40397,9 +40397,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40431,9 +40431,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40465,9 +40465,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40499,9 +40499,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40533,9 +40533,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40567,9 +40567,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40601,9 +40601,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40635,9 +40635,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40669,9 +40669,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40703,9 +40703,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40737,9 +40737,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40771,9 +40771,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40805,9 +40805,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40839,9 +40839,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40873,9 +40873,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40907,9 +40907,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40941,9 +40941,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -40975,9 +40975,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41009,9 +41009,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41043,9 +41043,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41077,9 +41077,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41111,9 +41111,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41145,9 +41145,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41179,9 +41179,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41213,9 +41213,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41247,9 +41247,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41281,9 +41281,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41315,9 +41315,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41349,9 +41349,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41383,9 +41383,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41417,9 +41417,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41451,9 +41451,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41485,9 +41485,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41519,9 +41519,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41553,9 +41553,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41587,9 +41587,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41621,9 +41621,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41655,9 +41655,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41689,9 +41689,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41723,9 +41723,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41757,9 +41757,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41791,9 +41791,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41825,9 +41825,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41859,9 +41859,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41893,9 +41893,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41927,9 +41927,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41961,9 +41961,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -41995,9 +41995,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42029,9 +42029,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42063,9 +42063,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42097,9 +42097,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42131,9 +42131,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42165,9 +42165,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42199,9 +42199,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42233,9 +42233,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42267,9 +42267,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42301,9 +42301,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42335,9 +42335,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42369,9 +42369,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42403,9 +42403,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42437,9 +42437,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42471,9 +42471,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42505,9 +42505,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42539,9 +42539,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42573,9 +42573,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42607,9 +42607,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42641,9 +42641,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42675,9 +42675,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42709,9 +42709,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42743,9 +42743,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42777,9 +42777,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42811,9 +42811,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42845,9 +42845,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42879,9 +42879,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42913,9 +42913,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42947,9 +42947,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -42981,9 +42981,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43015,9 +43015,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43064,9 +43064,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43098,9 +43098,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43132,9 +43132,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43166,9 +43166,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43200,9 +43200,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43234,9 +43234,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43268,9 +43268,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43302,9 +43302,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43336,9 +43336,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43370,9 +43370,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43404,9 +43404,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43438,9 +43438,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43472,9 +43472,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43506,9 +43506,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43540,9 +43540,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43574,9 +43574,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43608,9 +43608,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43642,9 +43642,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43676,9 +43676,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43710,9 +43710,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43744,9 +43744,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43778,9 +43778,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43812,9 +43812,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43846,9 +43846,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43880,9 +43880,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43914,9 +43914,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43948,9 +43948,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -43982,9 +43982,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44016,9 +44016,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44050,9 +44050,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44084,9 +44084,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44118,9 +44118,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44152,9 +44152,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44186,9 +44186,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44220,9 +44220,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44254,9 +44254,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44288,9 +44288,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44322,9 +44322,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44356,9 +44356,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44390,9 +44390,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44423,9 +44423,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44456,9 +44456,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44489,9 +44489,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44549,9 +44549,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -44563,9 +44563,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -44599,9 +44599,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44633,9 +44633,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44667,9 +44667,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44701,9 +44701,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44735,9 +44735,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44769,9 +44769,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44803,9 +44803,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44837,9 +44837,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44871,9 +44871,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44905,9 +44905,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44939,9 +44939,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -44973,9 +44973,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45007,9 +45007,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45041,9 +45041,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45075,9 +45075,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45109,9 +45109,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45143,9 +45143,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45177,9 +45177,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45211,9 +45211,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45245,9 +45245,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45279,9 +45279,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45313,9 +45313,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45347,9 +45347,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45381,9 +45381,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45415,9 +45415,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45449,9 +45449,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45483,9 +45483,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45517,9 +45517,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45551,9 +45551,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45585,9 +45585,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45619,9 +45619,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45653,9 +45653,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45687,9 +45687,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45721,9 +45721,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45755,9 +45755,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45789,9 +45789,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45823,9 +45823,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45857,9 +45857,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45891,9 +45891,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45925,9 +45925,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45959,9 +45959,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -45993,9 +45993,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46027,9 +46027,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46061,9 +46061,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46095,9 +46095,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46129,9 +46129,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46163,9 +46163,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46197,9 +46197,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46231,9 +46231,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46265,9 +46265,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46299,9 +46299,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46332,9 +46332,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46365,9 +46365,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46399,9 +46399,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46448,9 +46448,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46482,9 +46482,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46516,9 +46516,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46550,9 +46550,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46584,9 +46584,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46618,9 +46618,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46652,9 +46652,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46686,9 +46686,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46720,9 +46720,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46754,9 +46754,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46788,9 +46788,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46822,9 +46822,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46856,9 +46856,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46890,9 +46890,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46924,9 +46924,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46958,9 +46958,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -46992,9 +46992,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47026,9 +47026,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47060,9 +47060,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47094,9 +47094,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47128,9 +47128,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47162,9 +47162,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47196,9 +47196,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47230,9 +47230,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47264,9 +47264,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47298,9 +47298,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47332,9 +47332,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47366,9 +47366,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47400,9 +47400,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47434,9 +47434,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47468,9 +47468,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47502,9 +47502,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47536,9 +47536,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47570,9 +47570,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47604,9 +47604,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47638,9 +47638,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47672,9 +47672,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47706,9 +47706,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47740,9 +47740,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47774,9 +47774,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47808,9 +47808,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47842,9 +47842,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47876,9 +47876,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47910,9 +47910,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47944,9 +47944,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -47978,9 +47978,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48012,9 +48012,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48046,9 +48046,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48080,9 +48080,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48114,9 +48114,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48148,9 +48148,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48181,9 +48181,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48214,9 +48214,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48248,9 +48248,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48297,9 +48297,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48331,9 +48331,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48365,9 +48365,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48399,9 +48399,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48433,9 +48433,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48467,9 +48467,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48501,9 +48501,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48535,9 +48535,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48569,9 +48569,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48603,9 +48603,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48637,9 +48637,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48671,9 +48671,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48705,9 +48705,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48739,9 +48739,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48773,9 +48773,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48807,9 +48807,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48841,9 +48841,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48875,9 +48875,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48909,9 +48909,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48943,9 +48943,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -48977,9 +48977,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49011,9 +49011,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49045,9 +49045,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49079,9 +49079,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49113,9 +49113,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49147,9 +49147,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49181,9 +49181,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49215,9 +49215,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49249,9 +49249,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49283,9 +49283,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49317,9 +49317,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49351,9 +49351,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49385,9 +49385,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49419,9 +49419,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49453,9 +49453,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49487,9 +49487,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49521,9 +49521,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49555,9 +49555,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49589,9 +49589,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49623,9 +49623,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49657,9 +49657,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49691,9 +49691,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49725,9 +49725,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49759,9 +49759,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49793,9 +49793,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49827,9 +49827,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49861,9 +49861,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49895,9 +49895,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49929,9 +49929,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49963,9 +49963,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -49997,9 +49997,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50030,9 +50030,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50063,9 +50063,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50096,9 +50096,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -50141,9 +50141,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -50155,9 +50155,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -50176,9 +50176,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50210,9 +50210,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50244,9 +50244,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50278,9 +50278,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50312,9 +50312,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50346,9 +50346,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50380,9 +50380,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50414,9 +50414,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50448,9 +50448,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50482,9 +50482,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50516,9 +50516,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50550,9 +50550,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50584,9 +50584,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50618,9 +50618,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50652,9 +50652,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50686,9 +50686,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50720,9 +50720,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50754,9 +50754,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50788,9 +50788,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50822,9 +50822,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50856,9 +50856,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50890,9 +50890,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50924,9 +50924,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50958,9 +50958,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -50992,9 +50992,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51026,9 +51026,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51060,9 +51060,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51094,9 +51094,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51128,9 +51128,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51162,9 +51162,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51196,9 +51196,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51230,9 +51230,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51264,9 +51264,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51298,9 +51298,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51332,9 +51332,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51366,9 +51366,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51400,9 +51400,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51434,9 +51434,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51468,9 +51468,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51502,9 +51502,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51536,9 +51536,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51570,9 +51570,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51604,9 +51604,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51638,9 +51638,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51672,9 +51672,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51706,9 +51706,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51740,9 +51740,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51774,9 +51774,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51808,9 +51808,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51842,9 +51842,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51876,9 +51876,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51910,9 +51910,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51944,9 +51944,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -51978,9 +51978,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52012,9 +52012,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52046,9 +52046,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52080,9 +52080,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52114,9 +52114,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52148,9 +52148,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52182,9 +52182,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52216,9 +52216,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52250,9 +52250,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52284,9 +52284,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52318,9 +52318,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52352,9 +52352,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52386,9 +52386,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52420,9 +52420,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52454,9 +52454,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52488,9 +52488,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52522,9 +52522,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52556,9 +52556,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52590,9 +52590,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52624,9 +52624,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52658,9 +52658,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52692,9 +52692,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52726,9 +52726,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52760,9 +52760,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52794,9 +52794,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52828,9 +52828,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52862,9 +52862,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52896,9 +52896,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52930,9 +52930,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52964,9 +52964,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -52998,9 +52998,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53032,9 +53032,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53066,9 +53066,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53100,9 +53100,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53134,9 +53134,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53168,9 +53168,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53202,9 +53202,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53236,9 +53236,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53270,9 +53270,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53304,9 +53304,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53338,9 +53338,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53372,9 +53372,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53406,9 +53406,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53440,9 +53440,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53474,9 +53474,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53508,9 +53508,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53542,9 +53542,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53576,9 +53576,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53610,9 +53610,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53644,9 +53644,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53678,9 +53678,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53712,9 +53712,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53746,9 +53746,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53780,9 +53780,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53814,9 +53814,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53848,9 +53848,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53882,9 +53882,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53916,9 +53916,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53950,9 +53950,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -53984,9 +53984,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54018,9 +54018,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54052,9 +54052,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54086,9 +54086,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54120,9 +54120,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54154,9 +54154,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54188,9 +54188,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54222,9 +54222,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54256,9 +54256,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54290,9 +54290,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54324,9 +54324,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54358,9 +54358,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54392,9 +54392,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54426,9 +54426,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54460,9 +54460,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54494,9 +54494,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54528,9 +54528,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54562,9 +54562,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54596,9 +54596,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54630,9 +54630,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54664,9 +54664,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54698,9 +54698,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54732,9 +54732,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54766,9 +54766,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54800,9 +54800,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54834,9 +54834,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54868,9 +54868,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54902,9 +54902,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54936,9 +54936,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -54970,9 +54970,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55004,9 +55004,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55038,9 +55038,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55072,9 +55072,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55106,9 +55106,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55140,9 +55140,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55174,9 +55174,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55208,9 +55208,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55242,9 +55242,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55276,9 +55276,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55310,9 +55310,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55344,9 +55344,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55378,9 +55378,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55412,9 +55412,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55446,9 +55446,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55480,9 +55480,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55529,9 +55529,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55563,9 +55563,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55597,9 +55597,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55631,9 +55631,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55665,9 +55665,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55699,9 +55699,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55733,9 +55733,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55767,9 +55767,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55801,9 +55801,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55835,9 +55835,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55869,9 +55869,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55903,9 +55903,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55937,9 +55937,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -55971,9 +55971,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56005,9 +56005,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56039,9 +56039,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56073,9 +56073,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56107,9 +56107,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56141,9 +56141,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56175,9 +56175,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56209,9 +56209,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56243,9 +56243,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56277,9 +56277,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56311,9 +56311,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56345,9 +56345,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56379,9 +56379,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56413,9 +56413,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56447,9 +56447,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56481,9 +56481,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56515,9 +56515,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56549,9 +56549,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56583,9 +56583,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56617,9 +56617,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56651,9 +56651,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56685,9 +56685,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56719,9 +56719,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56753,9 +56753,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56787,9 +56787,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56821,9 +56821,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56855,9 +56855,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56888,9 +56888,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56921,9 +56921,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -56954,9 +56954,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -57014,9 +57014,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -57028,9 +57028,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -57064,9 +57064,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57098,9 +57098,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57132,9 +57132,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57166,9 +57166,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57200,9 +57200,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57234,9 +57234,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57268,9 +57268,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57302,9 +57302,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57336,9 +57336,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57370,9 +57370,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57404,9 +57404,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57438,9 +57438,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57472,9 +57472,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57506,9 +57506,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57540,9 +57540,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57574,9 +57574,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57608,9 +57608,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57642,9 +57642,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57676,9 +57676,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57710,9 +57710,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57744,9 +57744,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57778,9 +57778,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57812,9 +57812,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57846,9 +57846,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57880,9 +57880,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57914,9 +57914,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57948,9 +57948,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -57982,9 +57982,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58016,9 +58016,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58050,9 +58050,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58084,9 +58084,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58118,9 +58118,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58152,9 +58152,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58186,9 +58186,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58220,9 +58220,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58254,9 +58254,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58288,9 +58288,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58322,9 +58322,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58356,9 +58356,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58390,9 +58390,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58424,9 +58424,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58458,9 +58458,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58492,9 +58492,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58526,9 +58526,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58560,9 +58560,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58594,9 +58594,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58628,9 +58628,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58662,9 +58662,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58696,9 +58696,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58730,9 +58730,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58764,9 +58764,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58797,9 +58797,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58830,9 +58830,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58864,9 +58864,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58913,9 +58913,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58947,9 +58947,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -58981,9 +58981,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59015,9 +59015,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59049,9 +59049,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59083,9 +59083,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59117,9 +59117,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59151,9 +59151,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59185,9 +59185,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59219,9 +59219,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59253,9 +59253,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59287,9 +59287,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59321,9 +59321,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59355,9 +59355,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59389,9 +59389,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59423,9 +59423,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59457,9 +59457,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59491,9 +59491,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59525,9 +59525,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59559,9 +59559,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59593,9 +59593,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59627,9 +59627,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59661,9 +59661,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59695,9 +59695,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59729,9 +59729,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59763,9 +59763,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59797,9 +59797,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59831,9 +59831,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59865,9 +59865,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59899,9 +59899,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59933,9 +59933,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -59967,9 +59967,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60001,9 +60001,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60035,9 +60035,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60069,9 +60069,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60103,9 +60103,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60137,9 +60137,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60171,9 +60171,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60205,9 +60205,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60239,9 +60239,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60273,9 +60273,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60307,9 +60307,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60341,9 +60341,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60375,9 +60375,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60409,9 +60409,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60443,9 +60443,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60477,9 +60477,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60511,9 +60511,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60545,9 +60545,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60579,9 +60579,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60613,9 +60613,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60646,9 +60646,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60679,9 +60679,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60713,9 +60713,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60762,9 +60762,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60796,9 +60796,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60830,9 +60830,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60864,9 +60864,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60898,9 +60898,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60932,9 +60932,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -60966,9 +60966,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61000,9 +61000,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61034,9 +61034,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61068,9 +61068,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61102,9 +61102,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61136,9 +61136,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61170,9 +61170,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61204,9 +61204,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61238,9 +61238,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61272,9 +61272,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61306,9 +61306,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61340,9 +61340,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61374,9 +61374,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61408,9 +61408,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61442,9 +61442,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61476,9 +61476,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61510,9 +61510,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61544,9 +61544,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61578,9 +61578,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61612,9 +61612,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61646,9 +61646,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61680,9 +61680,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61714,9 +61714,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61748,9 +61748,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61782,9 +61782,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61816,9 +61816,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61850,9 +61850,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61884,9 +61884,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61918,9 +61918,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61952,9 +61952,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -61986,9 +61986,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62020,9 +62020,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62054,9 +62054,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62088,9 +62088,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62122,9 +62122,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62156,9 +62156,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62190,9 +62190,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62224,9 +62224,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62258,9 +62258,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62292,9 +62292,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62326,9 +62326,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62360,9 +62360,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62394,9 +62394,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62428,9 +62428,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62462,9 +62462,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62495,9 +62495,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62528,9 +62528,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62561,9 +62561,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -62606,9 +62606,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -62620,9 +62620,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -62641,9 +62641,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62675,9 +62675,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62709,9 +62709,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62743,9 +62743,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62777,9 +62777,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62811,9 +62811,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62845,9 +62845,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62879,9 +62879,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62913,9 +62913,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62947,9 +62947,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -62981,9 +62981,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63015,9 +63015,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63049,9 +63049,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63083,9 +63083,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63117,9 +63117,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63151,9 +63151,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63185,9 +63185,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63219,9 +63219,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63253,9 +63253,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63287,9 +63287,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63321,9 +63321,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63355,9 +63355,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63389,9 +63389,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63423,9 +63423,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63457,9 +63457,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63491,9 +63491,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63525,9 +63525,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63559,9 +63559,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63593,9 +63593,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63627,9 +63627,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63661,9 +63661,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63695,9 +63695,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63729,9 +63729,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63763,9 +63763,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63797,9 +63797,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63831,9 +63831,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63865,9 +63865,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63899,9 +63899,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63933,9 +63933,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -63967,9 +63967,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64001,9 +64001,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64035,9 +64035,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64069,9 +64069,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64103,9 +64103,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64137,9 +64137,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64171,9 +64171,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64205,9 +64205,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64239,9 +64239,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64273,9 +64273,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64307,9 +64307,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64341,9 +64341,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64375,9 +64375,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64409,9 +64409,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64443,9 +64443,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64477,9 +64477,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64511,9 +64511,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64545,9 +64545,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64579,9 +64579,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64613,9 +64613,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64647,9 +64647,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64681,9 +64681,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64715,9 +64715,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64749,9 +64749,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64783,9 +64783,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64817,9 +64817,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64851,9 +64851,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64885,9 +64885,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64919,9 +64919,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64953,9 +64953,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -64987,9 +64987,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65021,9 +65021,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65055,9 +65055,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65089,9 +65089,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65123,9 +65123,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65157,9 +65157,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65191,9 +65191,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65225,9 +65225,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65259,9 +65259,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65293,9 +65293,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65327,9 +65327,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65361,9 +65361,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65395,9 +65395,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65429,9 +65429,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65463,9 +65463,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65497,9 +65497,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65531,9 +65531,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65565,9 +65565,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65599,9 +65599,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65633,9 +65633,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65667,9 +65667,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65701,9 +65701,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65735,9 +65735,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65784,9 +65784,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65818,9 +65818,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65852,9 +65852,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65886,9 +65886,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65920,9 +65920,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65954,9 +65954,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -65988,9 +65988,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66022,9 +66022,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66056,9 +66056,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66090,9 +66090,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66124,9 +66124,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66158,9 +66158,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66192,9 +66192,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66226,9 +66226,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66260,9 +66260,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66294,9 +66294,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66328,9 +66328,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66362,9 +66362,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66396,9 +66396,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66430,9 +66430,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66464,9 +66464,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66498,9 +66498,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66532,9 +66532,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66566,9 +66566,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66600,9 +66600,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66634,9 +66634,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66668,9 +66668,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66702,9 +66702,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66736,9 +66736,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66770,9 +66770,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66804,9 +66804,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66838,9 +66838,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66872,9 +66872,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66906,9 +66906,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66940,9 +66940,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -66974,9 +66974,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67008,9 +67008,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67042,9 +67042,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67076,9 +67076,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67110,9 +67110,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67143,9 +67143,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67176,9 +67176,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67209,9 +67209,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -67269,9 +67269,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -67283,9 +67283,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -67319,9 +67319,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67353,9 +67353,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67387,9 +67387,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67421,9 +67421,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67455,9 +67455,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67489,9 +67489,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67523,9 +67523,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67557,9 +67557,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67591,9 +67591,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67625,9 +67625,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67659,9 +67659,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67693,9 +67693,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67727,9 +67727,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67761,9 +67761,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67795,9 +67795,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67829,9 +67829,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67863,9 +67863,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67897,9 +67897,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67931,9 +67931,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67965,9 +67965,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -67999,9 +67999,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68033,9 +68033,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68067,9 +68067,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68101,9 +68101,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68135,9 +68135,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68169,9 +68169,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68203,9 +68203,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68237,9 +68237,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68271,9 +68271,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68305,9 +68305,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68339,9 +68339,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68373,9 +68373,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68407,9 +68407,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68441,9 +68441,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68475,9 +68475,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68509,9 +68509,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68543,9 +68543,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68577,9 +68577,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68611,9 +68611,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68645,9 +68645,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68679,9 +68679,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68713,9 +68713,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68747,9 +68747,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68781,9 +68781,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68815,9 +68815,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68848,9 +68848,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68881,9 +68881,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68915,9 +68915,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68964,9 +68964,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -68998,9 +68998,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69032,9 +69032,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69066,9 +69066,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69100,9 +69100,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69134,9 +69134,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69168,9 +69168,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69202,9 +69202,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69236,9 +69236,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69270,9 +69270,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69304,9 +69304,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69338,9 +69338,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69372,9 +69372,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69406,9 +69406,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69440,9 +69440,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69474,9 +69474,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69508,9 +69508,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69542,9 +69542,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69576,9 +69576,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69610,9 +69610,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69644,9 +69644,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69678,9 +69678,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69712,9 +69712,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69746,9 +69746,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69780,9 +69780,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69814,9 +69814,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69848,9 +69848,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69882,9 +69882,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69916,9 +69916,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69950,9 +69950,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -69984,9 +69984,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70018,9 +70018,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70052,9 +70052,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70086,9 +70086,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70120,9 +70120,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70154,9 +70154,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70188,9 +70188,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70222,9 +70222,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70256,9 +70256,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70290,9 +70290,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70324,9 +70324,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70358,9 +70358,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70392,9 +70392,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70426,9 +70426,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70460,9 +70460,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70493,9 +70493,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70526,9 +70526,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70559,9 +70559,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -70604,9 +70604,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -70618,9 +70618,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -70639,9 +70639,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70673,9 +70673,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70707,9 +70707,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70741,9 +70741,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70775,9 +70775,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70809,9 +70809,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70843,9 +70843,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70877,9 +70877,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70911,9 +70911,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70945,9 +70945,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -70979,9 +70979,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71013,9 +71013,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71047,9 +71047,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71081,9 +71081,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71115,9 +71115,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71164,9 +71164,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71198,9 +71198,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71232,9 +71232,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71266,9 +71266,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71300,9 +71300,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71334,9 +71334,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71368,9 +71368,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71402,9 +71402,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71436,9 +71436,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71470,9 +71470,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71504,9 +71504,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71538,9 +71538,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71572,9 +71572,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71606,9 +71606,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71640,9 +71640,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71674,9 +71674,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71708,9 +71708,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71742,9 +71742,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71776,9 +71776,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71810,9 +71810,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71844,9 +71844,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71878,9 +71878,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71912,9 +71912,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71946,9 +71946,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -71980,9 +71980,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72014,9 +72014,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72048,9 +72048,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72082,9 +72082,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72116,9 +72116,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72150,9 +72150,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72184,9 +72184,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72218,9 +72218,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72252,9 +72252,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72286,9 +72286,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72320,9 +72320,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72354,9 +72354,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72388,9 +72388,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72422,9 +72422,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72456,9 +72456,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72490,9 +72490,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72523,9 +72523,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72556,9 +72556,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72589,9 +72589,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -72632,9 +72632,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -72646,9 +72646,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 31.000000000000004, - "tipVolume": 20 + "tipVolume": 20.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -72667,9 +72667,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72701,9 +72701,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72735,9 +72735,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72769,9 +72769,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72803,9 +72803,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72837,9 +72837,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72871,9 +72871,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72905,9 +72905,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72939,9 +72939,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -72973,9 +72973,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73007,9 +73007,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73041,9 +73041,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73075,9 +73075,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73109,9 +73109,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73143,9 +73143,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73177,9 +73177,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73211,9 +73211,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73245,9 +73245,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73279,9 +73279,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73313,9 +73313,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73347,9 +73347,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73381,9 +73381,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73415,9 +73415,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73449,9 +73449,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73483,9 +73483,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73517,9 +73517,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73551,9 +73551,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73585,9 +73585,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73619,9 +73619,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73653,9 +73653,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73687,9 +73687,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73721,9 +73721,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73755,9 +73755,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73789,9 +73789,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73823,9 +73823,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73857,9 +73857,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73891,9 +73891,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73925,9 +73925,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73959,9 +73959,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -73993,9 +73993,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74027,9 +74027,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74061,9 +74061,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74095,9 +74095,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74129,9 +74129,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74163,9 +74163,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74197,9 +74197,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74231,9 +74231,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74265,9 +74265,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74299,9 +74299,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74333,9 +74333,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74367,9 +74367,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74401,9 +74401,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74435,9 +74435,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74469,9 +74469,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74503,9 +74503,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74537,9 +74537,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74571,9 +74571,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74605,9 +74605,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74639,9 +74639,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74673,9 +74673,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74707,9 +74707,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74741,9 +74741,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74775,9 +74775,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74809,9 +74809,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74843,9 +74843,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74877,9 +74877,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74911,9 +74911,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74945,9 +74945,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -74979,9 +74979,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75013,9 +75013,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75047,9 +75047,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75081,9 +75081,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75115,9 +75115,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75149,9 +75149,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75183,9 +75183,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75217,9 +75217,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75251,9 +75251,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75285,9 +75285,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75319,9 +75319,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75353,9 +75353,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75387,9 +75387,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75421,9 +75421,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75455,9 +75455,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75489,9 +75489,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75523,9 +75523,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75557,9 +75557,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75591,9 +75591,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75625,9 +75625,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75659,9 +75659,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75693,9 +75693,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75727,9 +75727,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75761,9 +75761,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75795,9 +75795,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75829,9 +75829,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75863,9 +75863,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75897,9 +75897,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75931,9 +75931,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75965,9 +75965,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -75999,9 +75999,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76033,9 +76033,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76067,9 +76067,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76101,9 +76101,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76135,9 +76135,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76169,9 +76169,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76203,9 +76203,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76237,9 +76237,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76271,9 +76271,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76305,9 +76305,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76339,9 +76339,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76373,9 +76373,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76407,9 +76407,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76441,9 +76441,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76475,9 +76475,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76509,9 +76509,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76543,9 +76543,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76577,9 +76577,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76611,9 +76611,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76645,9 +76645,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76679,9 +76679,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76713,9 +76713,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76747,9 +76747,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76781,9 +76781,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76815,9 +76815,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76849,9 +76849,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76883,9 +76883,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76917,9 +76917,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76951,9 +76951,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -76985,9 +76985,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77019,9 +77019,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77053,9 +77053,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77087,9 +77087,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77121,9 +77121,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77155,9 +77155,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77189,9 +77189,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77223,9 +77223,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77257,9 +77257,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77291,9 +77291,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77325,9 +77325,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77359,9 +77359,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77393,9 +77393,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77427,9 +77427,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77461,9 +77461,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77495,9 +77495,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77529,9 +77529,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77563,9 +77563,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77597,9 +77597,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77631,9 +77631,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77665,9 +77665,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77699,9 +77699,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77733,9 +77733,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77767,9 +77767,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77801,9 +77801,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77835,9 +77835,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77869,9 +77869,9 @@ "volume": 20.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77903,9 +77903,9 @@ "volume": 6.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77937,9 +77937,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -77971,9 +77971,9 @@ "volume": 16.666666666666657, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78020,9 +78020,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78054,9 +78054,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78088,9 +78088,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78122,9 +78122,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78156,9 +78156,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78190,9 +78190,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78224,9 +78224,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78258,9 +78258,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78292,9 +78292,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78326,9 +78326,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78360,9 +78360,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78394,9 +78394,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78428,9 +78428,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78462,9 +78462,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78496,9 +78496,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78530,9 +78530,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78564,9 +78564,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78598,9 +78598,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78632,9 +78632,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78666,9 +78666,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78700,9 +78700,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78734,9 +78734,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78768,9 +78768,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78802,9 +78802,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78836,9 +78836,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78870,9 +78870,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78904,9 +78904,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78938,9 +78938,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -78972,9 +78972,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79006,9 +79006,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79040,9 +79040,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79074,9 +79074,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79108,9 +79108,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79142,9 +79142,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79176,9 +79176,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79210,9 +79210,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79244,9 +79244,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79278,9 +79278,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79312,9 +79312,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79346,9 +79346,9 @@ "volume": 18.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79379,9 +79379,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79412,9 +79412,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79445,9 +79445,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -79518,9 +79518,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -79532,9 +79532,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 51.099999999999994, - "tipVolume": 300 + "tipVolume": 300.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -79568,9 +79568,9 @@ "volume": 166.66666666666666, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79602,9 +79602,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79636,9 +79636,9 @@ "volume": 176.66666666666666, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79669,9 +79669,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79702,9 +79702,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79736,9 +79736,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79785,9 +79785,9 @@ "volume": 166.66666666666666, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79819,9 +79819,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79853,9 +79853,9 @@ "volume": 176.66666666666666, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79886,9 +79886,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79919,9 +79919,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -79953,9 +79953,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80002,9 +80002,9 @@ "volume": 166.66666666666666, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80036,9 +80036,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80070,9 +80070,9 @@ "volume": 176.66666666666666, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80103,9 +80103,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80136,9 +80136,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80169,9 +80169,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -80214,9 +80214,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -80228,9 +80228,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 51.099999999999994, - "tipVolume": 300 + "tipVolume": 300.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -80249,9 +80249,9 @@ "volume": 50.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80298,9 +80298,9 @@ "volume": 50.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80347,9 +80347,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80381,9 +80381,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80415,9 +80415,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80449,9 +80449,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80483,9 +80483,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80517,9 +80517,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80551,9 +80551,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80585,9 +80585,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80619,9 +80619,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80653,9 +80653,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80687,9 +80687,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80721,9 +80721,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80755,9 +80755,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80789,9 +80789,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80823,9 +80823,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80857,9 +80857,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80891,9 +80891,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80925,9 +80925,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80959,9 +80959,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -80993,9 +80993,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81027,9 +81027,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81061,9 +81061,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81095,9 +81095,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81129,9 +81129,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81163,9 +81163,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81197,9 +81197,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81231,9 +81231,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81265,9 +81265,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81299,9 +81299,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81333,9 +81333,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81367,9 +81367,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81401,9 +81401,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81435,9 +81435,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81469,9 +81469,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81503,9 +81503,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81537,9 +81537,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81571,9 +81571,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81605,9 +81605,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81639,9 +81639,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81673,9 +81673,9 @@ "volume": 5.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81706,9 +81706,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81739,9 +81739,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81772,9 +81772,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -81832,9 +81832,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top" }, @@ -81846,9 +81846,9 @@ "y": 0.0, "z": 0.0 }, - "tipDiameter": 0, + "tipDiameter": 0.0, "tipLength": 51.099999999999994, - "tipVolume": 300 + "tipVolume": 300.0 }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -81867,9 +81867,9 @@ "volume": 50.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81901,9 +81901,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81935,9 +81935,9 @@ "volume": 60.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -81968,9 +81968,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -82001,9 +82001,9 @@ "volume": 10.0, "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "top", "volumeOffset": 0.0 @@ -82034,9 +82034,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json index 6258b8500a1..03bb82c7b3c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json @@ -12766,9 +12766,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -13646,9 +13646,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -14526,9 +14526,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16474,9 +16474,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -17354,9 +17354,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -18234,9 +18234,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19114,9 +19114,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[238912ff51][Flex_S_v2_18_KAPA_Library_Quant].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[238912ff51][Flex_S_v2_18_KAPA_Library_Quant].json index a18cfa29797..f98ef8886da 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[238912ff51][Flex_S_v2_18_KAPA_Library_Quant].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[238912ff51][Flex_S_v2_18_KAPA_Library_Quant].json @@ -12914,9 +12914,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15070,9 +15070,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16025,9 +16025,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16980,9 +16980,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -17949,9 +17949,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -18904,9 +18904,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19859,9 +19859,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20549,9 +20549,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21145,9 +21145,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21741,9 +21741,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22777,9 +22777,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -23771,9 +23771,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -24765,9 +24765,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -26946,9 +26946,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json index 6e3feab4269..427cd1c997b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json @@ -28560,9 +28560,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31094,9 +31094,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31352,9 +31352,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31532,9 +31532,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31772,9 +31772,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31952,9 +31952,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -32192,9 +32192,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -32372,9 +32372,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -32612,9 +32612,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -34792,9 +34792,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35050,9 +35050,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json index 6a4c99f2bbc..7602c8613f4 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json @@ -20073,9 +20073,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20336,9 +20336,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20599,9 +20599,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20862,9 +20862,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21125,9 +21125,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21388,9 +21388,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21651,9 +21651,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -21914,9 +21914,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22177,9 +22177,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22440,9 +22440,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22703,9 +22703,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -22966,9 +22966,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -23317,9 +23317,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -23547,9 +23547,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -23777,9 +23777,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -24007,9 +24007,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -24237,9 +24237,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -24467,9 +24467,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -24697,9 +24697,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -24927,9 +24927,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -25157,9 +25157,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -25387,9 +25387,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -25617,9 +25617,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -25847,9 +25847,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -26158,9 +26158,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -26421,9 +26421,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -26684,9 +26684,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -26947,9 +26947,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27210,9 +27210,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27473,9 +27473,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27736,9 +27736,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -27999,9 +27999,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -28262,9 +28262,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -28525,9 +28525,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -28788,9 +28788,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29051,9 +29051,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29402,9 +29402,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29632,9 +29632,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -29862,9 +29862,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -30092,9 +30092,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -30322,9 +30322,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -30552,9 +30552,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -30782,9 +30782,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31012,9 +31012,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31242,9 +31242,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31472,9 +31472,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31702,9 +31702,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -31932,9 +31932,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -32243,9 +32243,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -32506,9 +32506,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -32769,9 +32769,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -33032,9 +33032,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -33295,9 +33295,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -33558,9 +33558,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -33821,9 +33821,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -34084,9 +34084,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -34347,9 +34347,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -34610,9 +34610,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -34873,9 +34873,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35136,9 +35136,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35518,9 +35518,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35748,9 +35748,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -35978,9 +35978,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36208,9 +36208,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36438,9 +36438,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36668,9 +36668,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -36898,9 +36898,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -37128,9 +37128,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -37358,9 +37358,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -37588,9 +37588,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -37818,9 +37818,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -38048,9 +38048,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -38359,9 +38359,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -38622,9 +38622,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -38885,9 +38885,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -39148,9 +39148,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -39411,9 +39411,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -39674,9 +39674,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -39937,9 +39937,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40200,9 +40200,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40463,9 +40463,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40726,9 +40726,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -40989,9 +40989,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -41252,9 +41252,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -41603,9 +41603,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -41833,9 +41833,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42063,9 +42063,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42293,9 +42293,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42523,9 +42523,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42753,9 +42753,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -42983,9 +42983,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -43213,9 +43213,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -43443,9 +43443,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -43673,9 +43673,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -43903,9 +43903,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44133,9 +44133,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44444,9 +44444,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44707,9 +44707,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -44970,9 +44970,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -45233,9 +45233,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -45496,9 +45496,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -45759,9 +45759,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46022,9 +46022,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46285,9 +46285,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46548,9 +46548,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -46811,9 +46811,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -47074,9 +47074,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -47337,9 +47337,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -47688,9 +47688,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -47918,9 +47918,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -48148,9 +48148,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -48378,9 +48378,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -48608,9 +48608,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -48838,9 +48838,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -49068,9 +49068,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -49298,9 +49298,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -49528,9 +49528,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -49758,9 +49758,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -49988,9 +49988,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -50218,9 +50218,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -50529,9 +50529,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -50792,9 +50792,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -51055,9 +51055,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -51318,9 +51318,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -51581,9 +51581,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -51844,9 +51844,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -52107,9 +52107,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -52370,9 +52370,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -52633,9 +52633,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -52896,9 +52896,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -53159,9 +53159,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -53422,9 +53422,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -53854,9 +53854,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -54117,9 +54117,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -54380,9 +54380,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -54643,9 +54643,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -54906,9 +54906,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -55169,9 +55169,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -55432,9 +55432,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -55695,9 +55695,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -55958,9 +55958,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -56221,9 +56221,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -56484,9 +56484,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -56747,9 +56747,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json index d52ff5e72e4..1598272fc5c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json @@ -14220,9 +14220,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -14987,9 +14987,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -15754,9 +15754,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -16521,9 +16521,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json index e8cb6c52713..d6a2126b774 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json @@ -17037,9 +17037,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -17819,9 +17819,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -18601,9 +18601,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -19383,9 +19383,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, @@ -20026,9 +20026,9 @@ "pipetteId": "UUID", "wellLocation": { "offset": { - "x": 0, - "y": 0, - "z": 0 + "x": 0.0, + "y": 0.0, + "z": 0.0 }, "origin": "default" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json index 9e8f25df1f1..103852d1fad 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json @@ -5958,25759 +5958,6 @@ }, "startedAt": "TIMESTAMP", "status": "succeeded" - }, - { - "commandType": "loadLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c06d611a9cd16f109d926a07372b0d89", - "notes": [], - "params": { - "displayName": "8", - "loadName": "nest_96_wellplate_2ml_deep", - "location": { - "moduleId": "UUID" - }, - "namespace": "opentrons", - "version": 2 - }, - "result": { - "definition": { - "allowedRoles": [], - "brand": { - "brand": "NEST", - "brandId": [ - "503001", - "503501" - ], - "links": [ - "https://www.nest-biotech.com/deep-well-plates/59253726.html" - ] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.6, - "yDimension": 85.3, - "zDimension": 41 - }, - "gripForce": 15.0, - "gripHeightFromLabwareBottom": 21.9, - "gripperOffsets": {}, - "groups": [ - { - "brand": { - "brand": "NEST", - "brandId": [] - }, - "metadata": { - "displayCategory": "wellPlate", - "displayName": "NEST 96 Deep Well Plate 2mL", - "wellBottomShape": "v" - }, - "wells": [ - "A1", - "A10", - "A11", - "A12", - "A2", - "A3", - "A4", - "A5", - "A6", - "A7", - "A8", - "A9", - "B1", - "B10", - "B11", - "B12", - "B2", - "B3", - "B4", - "B5", - "B6", - "B7", - "B8", - "B9", - "C1", - "C10", - "C11", - "C12", - "C2", - "C3", - "C4", - "C5", - "C6", - "C7", - "C8", - "C9", - "D1", - "D10", - "D11", - "D12", - "D2", - "D3", - "D4", - "D5", - "D6", - "D7", - "D8", - "D9", - "E1", - "E10", - "E11", - "E12", - "E2", - "E3", - "E4", - "E5", - "E6", - "E7", - "E8", - "E9", - "F1", - "F10", - "F11", - "F12", - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "G1", - "G10", - "G11", - "G12", - "G2", - "G3", - "G4", - "G5", - "G6", - "G7", - "G8", - "G9", - "H1", - "H10", - "H11", - "H12", - "H2", - "H3", - "H4", - "H5", - "H6", - "H7", - "H8", - "H9" - ] - } - ], - "metadata": { - "displayCategory": "wellPlate", - "displayName": "NEST 96 Deep Well Plate 2mL", - "displayVolumeUnits": "µL", - "tags": [] - }, - "namespace": "opentrons", - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ] - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": true, - "isTiprack": false, - "loadName": "nest_96_wellplate_2ml_deep", - "magneticModuleEngageHeight": 6.8, - "quirks": [] - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": { - "opentrons_96_deep_well_adapter": { - "x": 0, - "y": 0, - "z": 16.3 - }, - "opentrons_96_deep_well_temp_mod_adapter": { - "x": 0, - "y": 0, - "z": 16.1 - } - }, - "stackingOffsetWithModule": { - "magneticBlockV1": { - "x": 0, - "y": 0, - "z": 2.66 - } - }, - "version": 2, - "wells": { - "A1": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 14.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A10": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 95.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A11": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 104.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A12": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 113.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A2": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 23.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A3": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 32.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A4": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 41.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A5": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 50.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A6": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 59.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A7": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 68.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A8": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 77.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "A9": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 86.3, - "xDimension": 8.2, - "y": 74.15, - "yDimension": 8.2, - "z": 3 - }, - "B1": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 14.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B10": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 95.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B11": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 104.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B12": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 113.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B2": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 23.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B3": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 32.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B4": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 41.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B5": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 50.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B6": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 59.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B7": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 68.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B8": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 77.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "B9": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 86.3, - "xDimension": 8.2, - "y": 65.15, - "yDimension": 8.2, - "z": 3 - }, - "C1": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 14.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C10": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 95.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C11": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 104.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C12": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 113.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C2": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 23.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C3": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 32.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C4": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 41.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C5": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 50.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C6": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 59.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C7": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 68.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C8": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 77.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "C9": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 86.3, - "xDimension": 8.2, - "y": 56.15, - "yDimension": 8.2, - "z": 3 - }, - "D1": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 14.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D10": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 95.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D11": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 104.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D12": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 113.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D2": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 23.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D3": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 32.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D4": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 41.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D5": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 50.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D6": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 59.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D7": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 68.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D8": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 77.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "D9": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 86.3, - "xDimension": 8.2, - "y": 47.15, - "yDimension": 8.2, - "z": 3 - }, - "E1": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 14.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E10": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 95.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E11": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 104.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E12": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 113.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E2": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 23.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E3": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 32.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E4": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 41.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E5": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 50.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E6": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 59.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E7": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 68.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E8": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 77.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "E9": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 86.3, - "xDimension": 8.2, - "y": 38.15, - "yDimension": 8.2, - "z": 3 - }, - "F1": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 14.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F10": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 95.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F11": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 104.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F12": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 113.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F2": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 23.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F3": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 32.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F4": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 41.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F5": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 50.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F6": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 59.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F7": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 68.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F8": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 77.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "F9": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 86.3, - "xDimension": 8.2, - "y": 29.15, - "yDimension": 8.2, - "z": 3 - }, - "G1": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 14.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G10": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 95.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G11": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 104.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G12": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 113.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G2": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 23.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G3": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 32.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G4": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 41.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G5": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 50.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G6": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 59.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G7": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 68.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G8": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 77.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "G9": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 86.3, - "xDimension": 8.2, - "y": 20.15, - "yDimension": 8.2, - "z": 3 - }, - "H1": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 14.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H10": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 95.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H11": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 104.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H12": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 113.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H2": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 23.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H3": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 32.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H4": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 41.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H5": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 50.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H6": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 59.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H7": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 68.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H8": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 77.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - }, - "H9": { - "depth": 38, - "shape": "rectangular", - "totalLiquidVolume": 2000, - "x": 86.3, - "xDimension": 8.2, - "y": 11.15, - "yDimension": 8.2, - "z": 3 - } - } - }, - "labwareId": "UUID" - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "heaterShaker/closeLabwareLatch", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7b9b3bc1ec8ef40fd43a1478e9a1896d", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "80d3c25d5533b9c4f4b83a66d4af895e", - "notes": [], - "params": { - "loadName": "nest_12_reservoir_15ml", - "location": { - "slotName": "A2" - }, - "namespace": "opentrons", - "version": 1 - }, - "result": { - "definition": { - "allowedRoles": [], - "brand": { - "brand": "NEST", - "brandId": [ - "360102" - ], - "links": [ - "https://www.nest-biotech.com/reagent-reserviors/59178414.html" - ] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 31.4 - }, - "gripperOffsets": {}, - "groups": [ - { - "metadata": { - "wellBottomShape": "v" - }, - "wells": [ - "A1", - "A10", - "A11", - "A12", - "A2", - "A3", - "A4", - "A5", - "A6", - "A7", - "A8", - "A9" - ] - } - ], - "metadata": { - "displayCategory": "reservoir", - "displayName": "NEST 12 Well Reservoir 15 mL", - "displayVolumeUnits": "mL", - "tags": [] - }, - "namespace": "opentrons", - "ordering": [ - [ - "A1" - ], - [ - "A10" - ], - [ - "A11" - ], - [ - "A12" - ], - [ - "A2" - ], - [ - "A3" - ], - [ - "A4" - ], - [ - "A5" - ], - [ - "A6" - ], - [ - "A7" - ], - [ - "A8" - ], - [ - "A9" - ] - ], - "parameters": { - "format": "trough", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "nest_12_reservoir_15ml", - "quirks": [ - "centerMultichannelOnWells", - "touchTipDisabled" - ] - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": {}, - "stackingOffsetWithModule": {}, - "version": 1, - "wells": { - "A1": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 14.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A10": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 95.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A11": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 104.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A12": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 113.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A2": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 23.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A3": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 32.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A4": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 41.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A5": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 50.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A6": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 59.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A7": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 68.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A8": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 77.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - }, - "A9": { - "depth": 26.85, - "shape": "rectangular", - "totalLiquidVolume": 15000, - "x": 86.38, - "xDimension": 8.2, - "y": 42.78, - "yDimension": 71.2, - "z": 4.55 - } - } - }, - "labwareId": "UUID" - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "39705bcf605998607e3ff52963471b4d", - "notes": [], - "params": { - "loadName": "opentrons_flex_96_tiprack_50ul", - "location": { - "slotName": "C1" - }, - "namespace": "opentrons", - "version": 1 - }, - "result": { - "definition": { - "allowedRoles": [], - "brand": { - "brand": "Opentrons", - "brandId": [] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.75, - "zDimension": 99 - }, - "gripForce": 16.0, - "gripHeightFromLabwareBottom": 23.9, - "gripperOffsets": {}, - "groups": [ - { - "metadata": {}, - "wells": [ - "A1", - "A10", - "A11", - "A12", - "A2", - "A3", - "A4", - "A5", - "A6", - "A7", - "A8", - "A9", - "B1", - "B10", - "B11", - "B12", - "B2", - "B3", - "B4", - "B5", - "B6", - "B7", - "B8", - "B9", - "C1", - "C10", - "C11", - "C12", - "C2", - "C3", - "C4", - "C5", - "C6", - "C7", - "C8", - "C9", - "D1", - "D10", - "D11", - "D12", - "D2", - "D3", - "D4", - "D5", - "D6", - "D7", - "D8", - "D9", - "E1", - "E10", - "E11", - "E12", - "E2", - "E3", - "E4", - "E5", - "E6", - "E7", - "E8", - "E9", - "F1", - "F10", - "F11", - "F12", - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "G1", - "G10", - "G11", - "G12", - "G2", - "G3", - "G4", - "G5", - "G6", - "G7", - "G8", - "G9", - "H1", - "H10", - "H11", - "H12", - "H2", - "H3", - "H4", - "H5", - "H6", - "H7", - "H8", - "H9" - ] - } - ], - "metadata": { - "displayCategory": "tipRack", - "displayName": "Opentrons Flex 96 Tip Rack 50 µL", - "displayVolumeUnits": "µL", - "tags": [] - }, - "namespace": "opentrons", - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ] - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "opentrons_flex_96_tiprack_50ul", - "quirks": [], - "tipLength": 57.9, - "tipOverlap": 10.5 - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": { - "opentrons_flex_96_tiprack_adapter": { - "x": 0, - "y": 0, - "z": 121 - } - }, - "stackingOffsetWithModule": {}, - "version": 1, - "wells": { - "A1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 74.38, - "z": 1.5 - }, - "A10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 74.38, - "z": 1.5 - }, - "A11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 74.38, - "z": 1.5 - }, - "A12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 74.38, - "z": 1.5 - }, - "A2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 74.38, - "z": 1.5 - }, - "A3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 74.38, - "z": 1.5 - }, - "A4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 74.38, - "z": 1.5 - }, - "A5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 74.38, - "z": 1.5 - }, - "A6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 74.38, - "z": 1.5 - }, - "A7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 74.38, - "z": 1.5 - }, - "A8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 74.38, - "z": 1.5 - }, - "A9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 74.38, - "z": 1.5 - }, - "B1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 65.38, - "z": 1.5 - }, - "B10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 65.38, - "z": 1.5 - }, - "B11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 65.38, - "z": 1.5 - }, - "B12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 65.38, - "z": 1.5 - }, - "B2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 65.38, - "z": 1.5 - }, - "B3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 65.38, - "z": 1.5 - }, - "B4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 65.38, - "z": 1.5 - }, - "B5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 65.38, - "z": 1.5 - }, - "B6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 65.38, - "z": 1.5 - }, - "B7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 65.38, - "z": 1.5 - }, - "B8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 65.38, - "z": 1.5 - }, - "B9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 65.38, - "z": 1.5 - }, - "C1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 56.38, - "z": 1.5 - }, - "C10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 56.38, - "z": 1.5 - }, - "C11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 56.38, - "z": 1.5 - }, - "C12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 56.38, - "z": 1.5 - }, - "C2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 56.38, - "z": 1.5 - }, - "C3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 56.38, - "z": 1.5 - }, - "C4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 56.38, - "z": 1.5 - }, - "C5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 56.38, - "z": 1.5 - }, - "C6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 56.38, - "z": 1.5 - }, - "C7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 56.38, - "z": 1.5 - }, - "C8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 56.38, - "z": 1.5 - }, - "C9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 56.38, - "z": 1.5 - }, - "D1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 47.38, - "z": 1.5 - }, - "D10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 47.38, - "z": 1.5 - }, - "D11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 47.38, - "z": 1.5 - }, - "D12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 47.38, - "z": 1.5 - }, - "D2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 47.38, - "z": 1.5 - }, - "D3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 47.38, - "z": 1.5 - }, - "D4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 47.38, - "z": 1.5 - }, - "D5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 47.38, - "z": 1.5 - }, - "D6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 47.38, - "z": 1.5 - }, - "D7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 47.38, - "z": 1.5 - }, - "D8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 47.38, - "z": 1.5 - }, - "D9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 47.38, - "z": 1.5 - }, - "E1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 38.38, - "z": 1.5 - }, - "E10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 38.38, - "z": 1.5 - }, - "E11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 38.38, - "z": 1.5 - }, - "E12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 38.38, - "z": 1.5 - }, - "E2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 38.38, - "z": 1.5 - }, - "E3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 38.38, - "z": 1.5 - }, - "E4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 38.38, - "z": 1.5 - }, - "E5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 38.38, - "z": 1.5 - }, - "E6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 38.38, - "z": 1.5 - }, - "E7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 38.38, - "z": 1.5 - }, - "E8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 38.38, - "z": 1.5 - }, - "E9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 38.38, - "z": 1.5 - }, - "F1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 29.38, - "z": 1.5 - }, - "F10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 29.38, - "z": 1.5 - }, - "F11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 29.38, - "z": 1.5 - }, - "F12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 29.38, - "z": 1.5 - }, - "F2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 29.38, - "z": 1.5 - }, - "F3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 29.38, - "z": 1.5 - }, - "F4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 29.38, - "z": 1.5 - }, - "F5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 29.38, - "z": 1.5 - }, - "F6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 29.38, - "z": 1.5 - }, - "F7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 29.38, - "z": 1.5 - }, - "F8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 29.38, - "z": 1.5 - }, - "F9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 29.38, - "z": 1.5 - }, - "G1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 20.38, - "z": 1.5 - }, - "G10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 20.38, - "z": 1.5 - }, - "G11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 20.38, - "z": 1.5 - }, - "G12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 20.38, - "z": 1.5 - }, - "G2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 20.38, - "z": 1.5 - }, - "G3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 20.38, - "z": 1.5 - }, - "G4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 20.38, - "z": 1.5 - }, - "G5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 20.38, - "z": 1.5 - }, - "G6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 20.38, - "z": 1.5 - }, - "G7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 20.38, - "z": 1.5 - }, - "G8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 20.38, - "z": 1.5 - }, - "G9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 20.38, - "z": 1.5 - }, - "H1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 11.38, - "z": 1.5 - }, - "H10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 11.38, - "z": 1.5 - }, - "H11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 11.38, - "z": 1.5 - }, - "H12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 11.38, - "z": 1.5 - }, - "H2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 11.38, - "z": 1.5 - }, - "H3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 11.38, - "z": 1.5 - }, - "H4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 11.38, - "z": 1.5 - }, - "H5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 11.38, - "z": 1.5 - }, - "H6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 11.38, - "z": 1.5 - }, - "H7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 11.38, - "z": 1.5 - }, - "H8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 11.38, - "z": 1.5 - }, - "H9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 11.38, - "z": 1.5 - } - } - }, - "labwareId": "UUID" - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "16e6802c3a90fa35fd3ad8570a56c95d", - "notes": [], - "params": { - "loadName": "opentrons_flex_96_tiprack_50ul", - "location": { - "slotName": "C2" - }, - "namespace": "opentrons", - "version": 1 - }, - "result": { - "definition": { - "allowedRoles": [], - "brand": { - "brand": "Opentrons", - "brandId": [] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.75, - "zDimension": 99 - }, - "gripForce": 16.0, - "gripHeightFromLabwareBottom": 23.9, - "gripperOffsets": {}, - "groups": [ - { - "metadata": {}, - "wells": [ - "A1", - "A10", - "A11", - "A12", - "A2", - "A3", - "A4", - "A5", - "A6", - "A7", - "A8", - "A9", - "B1", - "B10", - "B11", - "B12", - "B2", - "B3", - "B4", - "B5", - "B6", - "B7", - "B8", - "B9", - "C1", - "C10", - "C11", - "C12", - "C2", - "C3", - "C4", - "C5", - "C6", - "C7", - "C8", - "C9", - "D1", - "D10", - "D11", - "D12", - "D2", - "D3", - "D4", - "D5", - "D6", - "D7", - "D8", - "D9", - "E1", - "E10", - "E11", - "E12", - "E2", - "E3", - "E4", - "E5", - "E6", - "E7", - "E8", - "E9", - "F1", - "F10", - "F11", - "F12", - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "G1", - "G10", - "G11", - "G12", - "G2", - "G3", - "G4", - "G5", - "G6", - "G7", - "G8", - "G9", - "H1", - "H10", - "H11", - "H12", - "H2", - "H3", - "H4", - "H5", - "H6", - "H7", - "H8", - "H9" - ] - } - ], - "metadata": { - "displayCategory": "tipRack", - "displayName": "Opentrons Flex 96 Tip Rack 50 µL", - "displayVolumeUnits": "µL", - "tags": [] - }, - "namespace": "opentrons", - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ] - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "opentrons_flex_96_tiprack_50ul", - "quirks": [], - "tipLength": 57.9, - "tipOverlap": 10.5 - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": { - "opentrons_flex_96_tiprack_adapter": { - "x": 0, - "y": 0, - "z": 121 - } - }, - "stackingOffsetWithModule": {}, - "version": 1, - "wells": { - "A1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 74.38, - "z": 1.5 - }, - "A10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 74.38, - "z": 1.5 - }, - "A11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 74.38, - "z": 1.5 - }, - "A12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 74.38, - "z": 1.5 - }, - "A2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 74.38, - "z": 1.5 - }, - "A3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 74.38, - "z": 1.5 - }, - "A4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 74.38, - "z": 1.5 - }, - "A5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 74.38, - "z": 1.5 - }, - "A6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 74.38, - "z": 1.5 - }, - "A7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 74.38, - "z": 1.5 - }, - "A8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 74.38, - "z": 1.5 - }, - "A9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 74.38, - "z": 1.5 - }, - "B1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 65.38, - "z": 1.5 - }, - "B10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 65.38, - "z": 1.5 - }, - "B11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 65.38, - "z": 1.5 - }, - "B12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 65.38, - "z": 1.5 - }, - "B2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 65.38, - "z": 1.5 - }, - "B3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 65.38, - "z": 1.5 - }, - "B4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 65.38, - "z": 1.5 - }, - "B5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 65.38, - "z": 1.5 - }, - "B6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 65.38, - "z": 1.5 - }, - "B7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 65.38, - "z": 1.5 - }, - "B8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 65.38, - "z": 1.5 - }, - "B9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 65.38, - "z": 1.5 - }, - "C1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 56.38, - "z": 1.5 - }, - "C10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 56.38, - "z": 1.5 - }, - "C11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 56.38, - "z": 1.5 - }, - "C12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 56.38, - "z": 1.5 - }, - "C2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 56.38, - "z": 1.5 - }, - "C3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 56.38, - "z": 1.5 - }, - "C4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 56.38, - "z": 1.5 - }, - "C5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 56.38, - "z": 1.5 - }, - "C6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 56.38, - "z": 1.5 - }, - "C7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 56.38, - "z": 1.5 - }, - "C8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 56.38, - "z": 1.5 - }, - "C9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 56.38, - "z": 1.5 - }, - "D1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 47.38, - "z": 1.5 - }, - "D10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 47.38, - "z": 1.5 - }, - "D11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 47.38, - "z": 1.5 - }, - "D12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 47.38, - "z": 1.5 - }, - "D2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 47.38, - "z": 1.5 - }, - "D3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 47.38, - "z": 1.5 - }, - "D4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 47.38, - "z": 1.5 - }, - "D5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 47.38, - "z": 1.5 - }, - "D6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 47.38, - "z": 1.5 - }, - "D7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 47.38, - "z": 1.5 - }, - "D8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 47.38, - "z": 1.5 - }, - "D9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 47.38, - "z": 1.5 - }, - "E1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 38.38, - "z": 1.5 - }, - "E10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 38.38, - "z": 1.5 - }, - "E11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 38.38, - "z": 1.5 - }, - "E12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 38.38, - "z": 1.5 - }, - "E2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 38.38, - "z": 1.5 - }, - "E3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 38.38, - "z": 1.5 - }, - "E4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 38.38, - "z": 1.5 - }, - "E5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 38.38, - "z": 1.5 - }, - "E6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 38.38, - "z": 1.5 - }, - "E7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 38.38, - "z": 1.5 - }, - "E8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 38.38, - "z": 1.5 - }, - "E9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 38.38, - "z": 1.5 - }, - "F1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 29.38, - "z": 1.5 - }, - "F10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 29.38, - "z": 1.5 - }, - "F11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 29.38, - "z": 1.5 - }, - "F12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 29.38, - "z": 1.5 - }, - "F2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 29.38, - "z": 1.5 - }, - "F3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 29.38, - "z": 1.5 - }, - "F4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 29.38, - "z": 1.5 - }, - "F5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 29.38, - "z": 1.5 - }, - "F6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 29.38, - "z": 1.5 - }, - "F7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 29.38, - "z": 1.5 - }, - "F8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 29.38, - "z": 1.5 - }, - "F9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 29.38, - "z": 1.5 - }, - "G1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 20.38, - "z": 1.5 - }, - "G10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 20.38, - "z": 1.5 - }, - "G11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 20.38, - "z": 1.5 - }, - "G12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 20.38, - "z": 1.5 - }, - "G2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 20.38, - "z": 1.5 - }, - "G3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 20.38, - "z": 1.5 - }, - "G4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 20.38, - "z": 1.5 - }, - "G5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 20.38, - "z": 1.5 - }, - "G6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 20.38, - "z": 1.5 - }, - "G7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 20.38, - "z": 1.5 - }, - "G8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 20.38, - "z": 1.5 - }, - "G9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 20.38, - "z": 1.5 - }, - "H1": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 14.38, - "y": 11.38, - "z": 1.5 - }, - "H10": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 95.38, - "y": 11.38, - "z": 1.5 - }, - "H11": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 104.38, - "y": 11.38, - "z": 1.5 - }, - "H12": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 113.38, - "y": 11.38, - "z": 1.5 - }, - "H2": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 23.38, - "y": 11.38, - "z": 1.5 - }, - "H3": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 32.38, - "y": 11.38, - "z": 1.5 - }, - "H4": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 41.38, - "y": 11.38, - "z": 1.5 - }, - "H5": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 50.38, - "y": 11.38, - "z": 1.5 - }, - "H6": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 59.38, - "y": 11.38, - "z": 1.5 - }, - "H7": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 68.38, - "y": 11.38, - "z": 1.5 - }, - "H8": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 77.38, - "y": 11.38, - "z": 1.5 - }, - "H9": { - "depth": 97.5, - "diameter": 5.58, - "shape": "circular", - "totalLiquidVolume": 50, - "x": 86.38, - "y": 11.38, - "z": 1.5 - } - } - }, - "labwareId": "UUID" - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e293d3a3d34ffc36672d4ad8587006b8", - "notes": [], - "params": { - "loadName": "opentrons_flex_96_tiprack_200ul", - "location": { - "slotName": "B2" - }, - "namespace": "opentrons", - "version": 1 - }, - "result": { - "definition": { - "allowedRoles": [], - "brand": { - "brand": "Opentrons", - "brandId": [] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.75, - "zDimension": 99 - }, - "gripForce": 16.0, - "gripHeightFromLabwareBottom": 23.9, - "gripperOffsets": {}, - "groups": [ - { - "metadata": {}, - "wells": [ - "A1", - "A10", - "A11", - "A12", - "A2", - "A3", - "A4", - "A5", - "A6", - "A7", - "A8", - "A9", - "B1", - "B10", - "B11", - "B12", - "B2", - "B3", - "B4", - "B5", - "B6", - "B7", - "B8", - "B9", - "C1", - "C10", - "C11", - "C12", - "C2", - "C3", - "C4", - "C5", - "C6", - "C7", - "C8", - "C9", - "D1", - "D10", - "D11", - "D12", - "D2", - "D3", - "D4", - "D5", - "D6", - "D7", - "D8", - "D9", - "E1", - "E10", - "E11", - "E12", - "E2", - "E3", - "E4", - "E5", - "E6", - "E7", - "E8", - "E9", - "F1", - "F10", - "F11", - "F12", - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "G1", - "G10", - "G11", - "G12", - "G2", - "G3", - "G4", - "G5", - "G6", - "G7", - "G8", - "G9", - "H1", - "H10", - "H11", - "H12", - "H2", - "H3", - "H4", - "H5", - "H6", - "H7", - "H8", - "H9" - ] - } - ], - "metadata": { - "displayCategory": "tipRack", - "displayName": "Opentrons Flex 96 Tip Rack 200 µL", - "displayVolumeUnits": "µL", - "tags": [] - }, - "namespace": "opentrons", - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ] - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "opentrons_flex_96_tiprack_200ul", - "quirks": [], - "tipLength": 58.35, - "tipOverlap": 10.5 - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": { - "opentrons_flex_96_tiprack_adapter": { - "x": 0, - "y": 0, - "z": 121 - } - }, - "stackingOffsetWithModule": {}, - "version": 1, - "wells": { - "A1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 74.38, - "z": 1.5 - }, - "A10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 74.38, - "z": 1.5 - }, - "A11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 74.38, - "z": 1.5 - }, - "A12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 74.38, - "z": 1.5 - }, - "A2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 74.38, - "z": 1.5 - }, - "A3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 74.38, - "z": 1.5 - }, - "A4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 74.38, - "z": 1.5 - }, - "A5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 74.38, - "z": 1.5 - }, - "A6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 74.38, - "z": 1.5 - }, - "A7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 74.38, - "z": 1.5 - }, - "A8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 74.38, - "z": 1.5 - }, - "A9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 74.38, - "z": 1.5 - }, - "B1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 65.38, - "z": 1.5 - }, - "B10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 65.38, - "z": 1.5 - }, - "B11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 65.38, - "z": 1.5 - }, - "B12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 65.38, - "z": 1.5 - }, - "B2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 65.38, - "z": 1.5 - }, - "B3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 65.38, - "z": 1.5 - }, - "B4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 65.38, - "z": 1.5 - }, - "B5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 65.38, - "z": 1.5 - }, - "B6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 65.38, - "z": 1.5 - }, - "B7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 65.38, - "z": 1.5 - }, - "B8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 65.38, - "z": 1.5 - }, - "B9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 65.38, - "z": 1.5 - }, - "C1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 56.38, - "z": 1.5 - }, - "C10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 56.38, - "z": 1.5 - }, - "C11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 56.38, - "z": 1.5 - }, - "C12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 56.38, - "z": 1.5 - }, - "C2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 56.38, - "z": 1.5 - }, - "C3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 56.38, - "z": 1.5 - }, - "C4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 56.38, - "z": 1.5 - }, - "C5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 56.38, - "z": 1.5 - }, - "C6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 56.38, - "z": 1.5 - }, - "C7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 56.38, - "z": 1.5 - }, - "C8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 56.38, - "z": 1.5 - }, - "C9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 56.38, - "z": 1.5 - }, - "D1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 47.38, - "z": 1.5 - }, - "D10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 47.38, - "z": 1.5 - }, - "D11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 47.38, - "z": 1.5 - }, - "D12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 47.38, - "z": 1.5 - }, - "D2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 47.38, - "z": 1.5 - }, - "D3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 47.38, - "z": 1.5 - }, - "D4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 47.38, - "z": 1.5 - }, - "D5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 47.38, - "z": 1.5 - }, - "D6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 47.38, - "z": 1.5 - }, - "D7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 47.38, - "z": 1.5 - }, - "D8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 47.38, - "z": 1.5 - }, - "D9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 47.38, - "z": 1.5 - }, - "E1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 38.38, - "z": 1.5 - }, - "E10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 38.38, - "z": 1.5 - }, - "E11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 38.38, - "z": 1.5 - }, - "E12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 38.38, - "z": 1.5 - }, - "E2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 38.38, - "z": 1.5 - }, - "E3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 38.38, - "z": 1.5 - }, - "E4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 38.38, - "z": 1.5 - }, - "E5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 38.38, - "z": 1.5 - }, - "E6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 38.38, - "z": 1.5 - }, - "E7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 38.38, - "z": 1.5 - }, - "E8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 38.38, - "z": 1.5 - }, - "E9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 38.38, - "z": 1.5 - }, - "F1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 29.38, - "z": 1.5 - }, - "F10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 29.38, - "z": 1.5 - }, - "F11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 29.38, - "z": 1.5 - }, - "F12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 29.38, - "z": 1.5 - }, - "F2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 29.38, - "z": 1.5 - }, - "F3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 29.38, - "z": 1.5 - }, - "F4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 29.38, - "z": 1.5 - }, - "F5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 29.38, - "z": 1.5 - }, - "F6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 29.38, - "z": 1.5 - }, - "F7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 29.38, - "z": 1.5 - }, - "F8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 29.38, - "z": 1.5 - }, - "F9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 29.38, - "z": 1.5 - }, - "G1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 20.38, - "z": 1.5 - }, - "G10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 20.38, - "z": 1.5 - }, - "G11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 20.38, - "z": 1.5 - }, - "G12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 20.38, - "z": 1.5 - }, - "G2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 20.38, - "z": 1.5 - }, - "G3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 20.38, - "z": 1.5 - }, - "G4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 20.38, - "z": 1.5 - }, - "G5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 20.38, - "z": 1.5 - }, - "G6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 20.38, - "z": 1.5 - }, - "G7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 20.38, - "z": 1.5 - }, - "G8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 20.38, - "z": 1.5 - }, - "G9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 20.38, - "z": 1.5 - }, - "H1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 11.38, - "z": 1.5 - }, - "H10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 11.38, - "z": 1.5 - }, - "H11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 11.38, - "z": 1.5 - }, - "H12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 11.38, - "z": 1.5 - }, - "H2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 11.38, - "z": 1.5 - }, - "H3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 11.38, - "z": 1.5 - }, - "H4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 11.38, - "z": 1.5 - }, - "H5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 11.38, - "z": 1.5 - }, - "H6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 11.38, - "z": 1.5 - }, - "H7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 11.38, - "z": 1.5 - }, - "H8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 11.38, - "z": 1.5 - }, - "H9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 11.38, - "z": 1.5 - } - } - }, - "labwareId": "UUID" - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c9227d2a0882401c3eb6f1f2f96b8e67", - "notes": [], - "params": { - "loadName": "opentrons_flex_96_tiprack_200ul", - "location": { - "slotName": "B3" - }, - "namespace": "opentrons", - "version": 1 - }, - "result": { - "definition": { - "allowedRoles": [], - "brand": { - "brand": "Opentrons", - "brandId": [] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.75, - "zDimension": 99 - }, - "gripForce": 16.0, - "gripHeightFromLabwareBottom": 23.9, - "gripperOffsets": {}, - "groups": [ - { - "metadata": {}, - "wells": [ - "A1", - "A10", - "A11", - "A12", - "A2", - "A3", - "A4", - "A5", - "A6", - "A7", - "A8", - "A9", - "B1", - "B10", - "B11", - "B12", - "B2", - "B3", - "B4", - "B5", - "B6", - "B7", - "B8", - "B9", - "C1", - "C10", - "C11", - "C12", - "C2", - "C3", - "C4", - "C5", - "C6", - "C7", - "C8", - "C9", - "D1", - "D10", - "D11", - "D12", - "D2", - "D3", - "D4", - "D5", - "D6", - "D7", - "D8", - "D9", - "E1", - "E10", - "E11", - "E12", - "E2", - "E3", - "E4", - "E5", - "E6", - "E7", - "E8", - "E9", - "F1", - "F10", - "F11", - "F12", - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "G1", - "G10", - "G11", - "G12", - "G2", - "G3", - "G4", - "G5", - "G6", - "G7", - "G8", - "G9", - "H1", - "H10", - "H11", - "H12", - "H2", - "H3", - "H4", - "H5", - "H6", - "H7", - "H8", - "H9" - ] - } - ], - "metadata": { - "displayCategory": "tipRack", - "displayName": "Opentrons Flex 96 Tip Rack 200 µL", - "displayVolumeUnits": "µL", - "tags": [] - }, - "namespace": "opentrons", - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ] - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "opentrons_flex_96_tiprack_200ul", - "quirks": [], - "tipLength": 58.35, - "tipOverlap": 10.5 - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": { - "opentrons_flex_96_tiprack_adapter": { - "x": 0, - "y": 0, - "z": 121 - } - }, - "stackingOffsetWithModule": {}, - "version": 1, - "wells": { - "A1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 74.38, - "z": 1.5 - }, - "A10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 74.38, - "z": 1.5 - }, - "A11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 74.38, - "z": 1.5 - }, - "A12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 74.38, - "z": 1.5 - }, - "A2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 74.38, - "z": 1.5 - }, - "A3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 74.38, - "z": 1.5 - }, - "A4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 74.38, - "z": 1.5 - }, - "A5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 74.38, - "z": 1.5 - }, - "A6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 74.38, - "z": 1.5 - }, - "A7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 74.38, - "z": 1.5 - }, - "A8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 74.38, - "z": 1.5 - }, - "A9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 74.38, - "z": 1.5 - }, - "B1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 65.38, - "z": 1.5 - }, - "B10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 65.38, - "z": 1.5 - }, - "B11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 65.38, - "z": 1.5 - }, - "B12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 65.38, - "z": 1.5 - }, - "B2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 65.38, - "z": 1.5 - }, - "B3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 65.38, - "z": 1.5 - }, - "B4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 65.38, - "z": 1.5 - }, - "B5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 65.38, - "z": 1.5 - }, - "B6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 65.38, - "z": 1.5 - }, - "B7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 65.38, - "z": 1.5 - }, - "B8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 65.38, - "z": 1.5 - }, - "B9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 65.38, - "z": 1.5 - }, - "C1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 56.38, - "z": 1.5 - }, - "C10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 56.38, - "z": 1.5 - }, - "C11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 56.38, - "z": 1.5 - }, - "C12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 56.38, - "z": 1.5 - }, - "C2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 56.38, - "z": 1.5 - }, - "C3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 56.38, - "z": 1.5 - }, - "C4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 56.38, - "z": 1.5 - }, - "C5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 56.38, - "z": 1.5 - }, - "C6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 56.38, - "z": 1.5 - }, - "C7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 56.38, - "z": 1.5 - }, - "C8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 56.38, - "z": 1.5 - }, - "C9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 56.38, - "z": 1.5 - }, - "D1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 47.38, - "z": 1.5 - }, - "D10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 47.38, - "z": 1.5 - }, - "D11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 47.38, - "z": 1.5 - }, - "D12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 47.38, - "z": 1.5 - }, - "D2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 47.38, - "z": 1.5 - }, - "D3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 47.38, - "z": 1.5 - }, - "D4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 47.38, - "z": 1.5 - }, - "D5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 47.38, - "z": 1.5 - }, - "D6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 47.38, - "z": 1.5 - }, - "D7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 47.38, - "z": 1.5 - }, - "D8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 47.38, - "z": 1.5 - }, - "D9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 47.38, - "z": 1.5 - }, - "E1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 38.38, - "z": 1.5 - }, - "E10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 38.38, - "z": 1.5 - }, - "E11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 38.38, - "z": 1.5 - }, - "E12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 38.38, - "z": 1.5 - }, - "E2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 38.38, - "z": 1.5 - }, - "E3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 38.38, - "z": 1.5 - }, - "E4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 38.38, - "z": 1.5 - }, - "E5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 38.38, - "z": 1.5 - }, - "E6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 38.38, - "z": 1.5 - }, - "E7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 38.38, - "z": 1.5 - }, - "E8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 38.38, - "z": 1.5 - }, - "E9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 38.38, - "z": 1.5 - }, - "F1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 29.38, - "z": 1.5 - }, - "F10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 29.38, - "z": 1.5 - }, - "F11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 29.38, - "z": 1.5 - }, - "F12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 29.38, - "z": 1.5 - }, - "F2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 29.38, - "z": 1.5 - }, - "F3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 29.38, - "z": 1.5 - }, - "F4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 29.38, - "z": 1.5 - }, - "F5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 29.38, - "z": 1.5 - }, - "F6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 29.38, - "z": 1.5 - }, - "F7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 29.38, - "z": 1.5 - }, - "F8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 29.38, - "z": 1.5 - }, - "F9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 29.38, - "z": 1.5 - }, - "G1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 20.38, - "z": 1.5 - }, - "G10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 20.38, - "z": 1.5 - }, - "G11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 20.38, - "z": 1.5 - }, - "G12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 20.38, - "z": 1.5 - }, - "G2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 20.38, - "z": 1.5 - }, - "G3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 20.38, - "z": 1.5 - }, - "G4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 20.38, - "z": 1.5 - }, - "G5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 20.38, - "z": 1.5 - }, - "G6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 20.38, - "z": 1.5 - }, - "G7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 20.38, - "z": 1.5 - }, - "G8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 20.38, - "z": 1.5 - }, - "G9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 20.38, - "z": 1.5 - }, - "H1": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 11.38, - "z": 1.5 - }, - "H10": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 11.38, - "z": 1.5 - }, - "H11": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 11.38, - "z": 1.5 - }, - "H12": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 11.38, - "z": 1.5 - }, - "H2": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 11.38, - "z": 1.5 - }, - "H3": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 11.38, - "z": 1.5 - }, - "H4": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 11.38, - "z": 1.5 - }, - "H5": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 11.38, - "z": 1.5 - }, - "H6": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 11.38, - "z": 1.5 - }, - "H7": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 11.38, - "z": 1.5 - }, - "H8": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 11.38, - "z": 1.5 - }, - "H9": { - "depth": 97.5, - "diameter": 5.59, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 11.38, - "z": 1.5 - } - } - }, - "labwareId": "UUID" - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadPipette", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "58bf66c06d4c9ef0133ceda2d3fcd0db", - "notes": [], - "params": { - "liquidPresenceDetection": false, - "mount": "left", - "pipetteName": "p50_multi_flex", - "tipOverlapNotAfterVersion": "v0" - }, - "result": { - "pipetteId": "UUID" - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadPipette", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f41b352a27113bc3a9f0595d3f285410", - "notes": [], - "params": { - "liquidPresenceDetection": false, - "mount": "right", - "pipetteName": "p1000_multi_flex", - "tipOverlapNotAfterVersion": "v0" - }, - "result": { - "pipetteId": "UUID" - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8f61100f29f0e3dae391082bcf9c4b33", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "aaa5a61f4a6a6c60e1d02ab560e8ed30", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2e9b37a4b76c8be219754992b50eac87", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ddd20b2c38d4938cfbebedc9e32a0f3a", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5c8c68d760474150e360b8ccb0614254", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f8b997229880175082181fc529ea3906", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9818ef02347426a4ef817c25ccd44b3c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d97431083e1366ed0a2b09b7195fae03", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "779b7b1760eb1092027a3b5813510a32", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5eb0bca7d2181db9880c8105f08fa8fd", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "008e8176fde7fd9caffd459f967acca1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b66801b6f296760e22f9e210a386b1b1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c8a1b0a4298bcec2592014f2bf37d576", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b693187f2934371da9b6eba9d20a3002", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e46b2068448ff0983a798cbef1a3cec0", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9f4f599a30f83a5420e5fb732ca2efc0", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4472cf6cf1f8e71cdd0be1633127c932", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "15d9492cab2583479a4f816ef17a46a1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7f4a24bd41db2e2f75e276418679944c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5e389eada4ee80880ce64d17356c0c81", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7ce70a99c5d3071241add86ec7a937a6", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2bb7f73d43103f0343484b7194519e4c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ef9fda0ac1ab209fe854ae7e7d7f4aa5", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "47674b8e252ba5e9349dd8dbc2e66a40", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "dcc8d9df462cd0c9a1b47ccd02f3eb2d", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2d70199bbce02415accfd10aa3c03c42", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "aa816105a34323703c3bb8cb06146be1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7e0516811ce65b3a61ec6786ea0219d9", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a8fd1948ecc0acbaae6cb41bb8e730de", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c6c5a01e13cc765533e432494ff7f07f", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a9c8d1c1d71ae30d2d011a21e5ffdb3e", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4bdb9bf5d751f40bb798826e2e676870", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5a73e1d4498d560d2951a9b0851d173c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4bedaaa098e7bccd2f2bfdfdd6ec0a2e", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "672d7bbe39d4d9fc5544a9075bfd1f79", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7efec2350ce946b98fbedca57bb2d546", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "96567efe8321030016f11223d404621f", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4b85144700c274e59a52004fe6667c25", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "60537125b393dbadfe94648248132f7c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "990dd741f3dcccafb23cc986b4088ad9", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d8ff455d6832a88e094daf9c9aa2eaa8", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "80fa3121956cee042c5d6dc137e3ca71", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "75bd4c7ef1588a67ea415705b2c8349c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3874e2785cec5c6baf3dff0d664d90ef", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bfdae27d79cc5953ddadab4a39c10466", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e231e7cc6a278ce42d86d6129b01453b", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9aebd50719d690f81b6385ed1533157e", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bfa8b077772ea67face5b5da8ce31feb", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9a3b06420819d013bdd36b9b2b4d2358", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5f5aa88961947babf39b10e37ee23421", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1d856d812464812151e1d5a8dd667237", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ebed53310e7b29d035f6f7a016fff0f8", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2fd7d9f9978f8381228cccb93245fc2d", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d7c19c35227a0340e67f2e0ed968d7d3", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9ac59c380e99317f35830b98fb80871d", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a443653eceb8acf82a3ff5594ec68825", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8c6d4cad0acca6032cee9ed68f3b7b77", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1947ab90ab78e871a5093646a8ad92d0", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0c22e06378cc0cd2d4064974f2fa408b", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4193cbdc63a59a75bcafbf4d97663b9d", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d1103b5929b1b7a0185f58a74468440d", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1b3f07e9f1477115b69ce6331c90d9f1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "303f4d143d7b69932fe4fd18127c81db", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "65f3615cb8230a6ddb6cf35b73c3c5aa", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d5e7c9ba1db7bf2b087d00ca46c472e9", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e01aa7bc7c31a8dffd23546b1945e675", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9247c62d2ead992011f223392961b7b2", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d293202097173e711d291e7259c65611", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "45bcdd313fe6186beac0fabca6a7dbdb", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b550a26ebfeb445caf3784c322b41089", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d1fe7ad1290317d754709b52721cf783", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2830f4f34d964ab48b8957fa864e0316", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "818860ae04707d24dc36e96743884690", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "43aa0a49ca4c34112a19b99640e21beb", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8c658cd713c0ac4f52bc9855b872130a", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "185a3fd2dbd29301fc7e92cb25f0e218", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8633954f726d96cb33537b14a848b4bc", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "620b4f47c73faf6e0265f8741d23dc8b", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2dcce3b03d36d221c7ce487bae928383", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "135d11296e5067afac8847f22d806e79", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d53f49d3f67df5cc18fb4547217e4da9", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "78298f5f0fa0e9043ab4df0549173ba2", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "84571d458086763fbd2d5e30f26a6d1b", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6fec441fec6751579035f49cb02fb651", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9774136549a3a20f61860acb85b83438", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cf2009489d7bcc50208d3cfec70bd176", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f8d7eeec9aabdf5a9e3e7e5f91046003", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5c26c2c63789e7307ea62537c48c1e42", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "466fa95ac331fbb920ab792a52078999", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "427f6c1570b503fcc1e04f26c2369aaf", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "44d529133defc8ddfe4995ce63c3f914", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "437671cc25e87718115772ec6ec66d57", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9fdddc1ec95caa85c91bab332d0af3e4", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f2d35b138c96e986cc8ca9d71bb9f6e8", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "56c24389b4ad55beb7ed6159c4ad00d3", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "120ece00f990ff4566b38892075fc007", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0bf90a90466930017162fadbea9477a6", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7d0d618d19cfbf3b537bed12e0f06f4d", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ffe0929eea2d196d78f265dd2e9926d3", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c8f5cc16090f48b1c5a31908c12e93a5", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4091b25131a60700b2e23a474cefb4f1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e908f3817c89489f66d8e675e0f10e14", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "afd0eadc7fd05676719741b36917d87c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6dfb35b2956e28a771a594758e46a714", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H1": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7ca6001ebb059fefc71631552f8af3d3", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3287ad9cac60f592ab3536068b0f40ec", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "aff52c45c3c1e93af130a41c8c80d19c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b263b9522566c1802676980e23209041", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c8516f441443ee0604fd1a2df54ad7e0", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0e0454a517248a99751a99fe1c08a2f6", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7ea7d18690ec3e20e8ed3535c1defbb9", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "511c7bf60e9439e100ce45ac967da49e", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H2": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "81a78fd07484e98039dafa397331454b", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cd8e8d0d5c7aaa5af541da01bb63f584", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b0e15451bf7b1644960e32675173dacf", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d10f1489d9c872506ebb31cd4b808540", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "43af4a7235622d22806f1be8ffd9519c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ebb3c328819a42ccc866bf0dbdfbae33", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2753b91f935a5083f07680673d6a9adc", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "33803f50aaecf245ec0655dc31be2eb8", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H3": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d982765564753512defadd4ee28cec77", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "511b2c79928728669da32ce6154bd1bc", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9a5cddb2e8602ec8fec98f7bf28918e5", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0328846c95fa6210972c3d45f8b54a74", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5ad886b1e0fdb9708d9c20c267e62220", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "927818362c3ea3c14823ccce4965f727", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1e50241cdb9fcd2bff1534b98ea618b1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8811f7a3c5a117e7f63f04b83de01698", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H4": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5760b7a67c17d86093f73c375bf61015", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f67583d0274c6ef9c3d762329f725f93", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b2ecfd404c288732c092ce69b7da8815", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2d899a259c3a91c64efdf675ed9a2d33", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fcf6ee9795c0a86091de90e908b372f4", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "73d5e752210cfb0d867e78215b598501", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9d289d19747f833f0aa03fbd1ec6a989", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8c5457ceac8bee1ce222d9547cd4d715", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H5": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4496f5d5a2f033bcfc803c3e6d47e8f7", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ca357881aa182f6f45bac132037803c2", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "26a1dc7b1ba51f89274dc8c24c519b5a", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "28533630621c4cb17a03486a46b030a5", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ad02948bafeaaa7d6fb5c0fd66d8c227", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2121bb825bc14b0ab45f167418dc4ad4", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2adb52e7ccd59d289b2a0d35cd314db9", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "40fae1aecd14139e9abcd6c26fa2c28d", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H6": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "38ea01a01df003b05f3e1cc4b045a10f", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A7": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "63beaa12dba5ecc8fad39b64c3852db1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B7": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c875efceaba3272710bc90e5a92c42f3", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C7": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7ca6e36ce75ba4acfcdb44922b69d484", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D7": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "124f2a131f81abeac9cbd0e9fcfcacb1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E7": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "da169522a77ef45b236cb685cc140252", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F7": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "386b7617e29115c4e2b6d4cb87185279", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G7": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e1d20d4c3166b98e92ab93717266d249", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H7": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "eb5db2ecd8e328db99b64db59e32ae09", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A8": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "92f6dc249826e5924338c0e1f80f5b65", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B8": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2b462a5f63f15b04d69c56da3ee88de3", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C8": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3b042a699af6be5f267567394035fe3b", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D8": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a45ffe349ff38d95744c4ef86fa0354f", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E8": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "26bd2430c3c4cc2408ad9a365f2c2891", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F8": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "df281882873d0e1445c2246c90c8a3c8", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G8": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b1ddf115c9e3f3fb1c3ef80e116749ac", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H8": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8e21511c6ffaf00d1bc58e527b893f9f", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A9": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7a8e561af25913e7702fe452cbf82920", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B9": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c5305a0cb530b54ebc46b676eb95f556", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C9": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5accdd553bd1bee18252a9ce7eea55b4", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D9": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0f61f84cea74148cf50b6f65cdf9d961", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E9": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e90e375e3c3ad3df214ffafe47b98111", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F9": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "14a072b4d5ef396d36986342c1c9bae8", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G9": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "06bfa9e5693709b0a2ac5d79a176296a", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H9": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "af95a8489936f9fef2c4925547f3ab1a", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A10": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d2664a413fb9dba6010006408dd2fa5c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B10": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "506ab0fee68596d670f6e284b19f4751", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C10": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "962a559444ed526d9dffa906045e8325", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D10": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c8cd0e9d4856a4d392b6ccab9a42d124", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E10": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f80d8d52b380ca2a2961237de98f7230", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F10": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3303870d02520796d5cab53d697ccbe1", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G10": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "203dc9ea7ded51bd40035af6e158d593", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H10": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b4f0749950b9c0a0fad2015aaac48a0c", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A11": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6f01f1aaa7ee5cc8a4c62144af4d0042", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B11": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "905c8fed115a922f2d89e2c02c27616d", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C11": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "875a960a9980be4f9dd1ba8745bc24cd", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D11": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6aeac56ee731a57aa81f33e3ff861d64", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E11": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2f4754434c34c2c99e5b1465af5c188e", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F11": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e8854207245788771690d1521b43c12f", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G11": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "811183ffe7c1a3ce615213e4e70d75e5", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H11": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2abee4fc1c9c31bd629912d9c8401687", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "A12": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7835e1234f735842daa4f61c575ce72f", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "B12": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "14ff231157b24c887d1ec0813b3c55f2", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "C12": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "858cd1cc7c5c762193c7e4fd67ebb8a9", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "D12": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a2cd720991fdbb2e317b7bada0952dc5", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "E12": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1fd4c6b672e6afe1a21e43ad7f412eb2", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "F12": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9ab95910878dd01da02ef13f3d4b1839", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "G12": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "loadLiquid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8f57d1b217457bcf0a4f4f17a828f1ab", - "notes": [], - "params": { - "labwareId": "UUID", - "liquidId": "UUID", - "volumeByWell": { - "H12": 200.0 - } - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "temperatureModule/setTargetTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d20affad4dcd31700fe9360291f7993d", - "notes": [], - "params": { - "celsius": 4.0, - "moduleId": "UUID" - }, - "result": { - "targetTemperature": 4.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "temperatureModule/waitForTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1cf4e0014a9e172647fc6f4fc603bb61", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetLidTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b6f197a28bfdd6061e504f34a2e2834f", - "notes": [], - "params": { - "celsius": 100.0, - "moduleId": "UUID" - }, - "result": { - "targetLidTemperature": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForLidTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c34383e8fe124015ee44b5838747baae", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "09d94a47b65ddbabfcf509b876834d52", - "notes": [], - "params": { - "message": "\n\n----------ADDING DB1----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "462ab3a580018a704b2f310fffed7dce", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "configureForVolume", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ab75b4de24840f7e2a2af5f5a66769d3", - "notes": [], - "params": { - "pipetteId": "UUID", - "tipOverlapNotAfterVersion": "v0", - "volume": 4.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "02e0185ec5df7ddbb734f5dc8bc35b02", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 4.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.3, - "y": 74.15, - "z": 13.0 - }, - "volume": 4.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "925dc71d217999516f0cb47e48fc7102", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 4.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 4.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bcf7ddbf19d9e5d8da7a913a3776a392", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1802acc6c262e1a9417bd185903c0d2b", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "80f028f4fd8345d9763b55de0afe11b5", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9fbb21cf3a09b3c3af84e8a5b16fd652", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "82da1bd1888beed5c0a18c149b949bde", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "08edda9fab95b7cff943521fcaf0f11b", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c4c1742d26de73b050a5b75444da155c", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "dfd81fde99a69c94a1a712d165467b14", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "da6f938d70af05383d7ca8dd87d0b3a8", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "412ed9d67777f23478129af556b697b7", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "952980a8bab99528215ea511050c1e3a", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2020916ffbf2b5ea23427b3e0becd1d0", - "notes": [], - "params": { - "seconds": 1.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "367507eeb74543f7aaf46d7edda50dd1", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "touchTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5a8cd45b5ca7727e55cb46681326b39e", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "radius": 1.0, - "speed": 60.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -1.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 15.260000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5f25a3b0bd5eb88b36b555b4bb9ca0d5", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 412.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/closeLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8c668c6ac45ac4c3c712ac78fe8974c4", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/runProfile", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "19578f9b13c86b6cff60ae975d2d35c9", - "notes": [], - "params": { - "blockMaxVolumeUl": 15.0, - "moduleId": "UUID", - "profile": [ - { - "celsius": 95.0, - "holdSeconds": 120.0 - } - ] - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "60f6af8e29ff815ea688504e3da56a0f", - "notes": [], - "params": { - "celsius": 95.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 95.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7f3dfa13f21157d4c962c9e8764dd2c0", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cf30e2a36a38713ab8f8b79bc22024d9", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2791a45241c4974df9a0da7f6e512271", - "notes": [], - "params": { - "celsius": 94.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 94.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "709dce4723e76f0601f01d77402c1e0c", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d408d344171dddc8537fd97153ae3d18", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3b9280d9bde865fb1f120ea09947ba66", - "notes": [], - "params": { - "celsius": 93.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 93.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4fdb2a6857f213443c61970e8715e8f3", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c2afc2d7ef6f7750be6f39f23fa230cd", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "af324abb8812f6243ce4f60b561269bc", - "notes": [], - "params": { - "celsius": 92.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 92.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4750d94adf39183b246d31ae65c4bf52", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2acf9066db8f856e48d442c2fd21ceef", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f31a756630eff63d94ada46abc00afb5", - "notes": [], - "params": { - "celsius": 91.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 91.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bc0220bac8ea6f4f6e7365dc26e096d6", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "70dd2e8f92a0eb7c71a4327f9cf14331", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a643f56b9157be084f5a664b564ce763", - "notes": [], - "params": { - "celsius": 90.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 90.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "55729ac300dbb44fb5562e4a4fe52fa9", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6fb71ad687b24fafd5c7375912be7aff", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9a613c7df1dcf551715f4770504606d6", - "notes": [], - "params": { - "celsius": 89.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 89.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "956fba3d0d41f707f022af95e8ea5b10", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "87032579d8ef9f40e333340126277ddc", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "48ec80ea228a99b4b087753fa2cf9cd2", - "notes": [], - "params": { - "celsius": 88.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 88.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a3d85e4e2bc7a287cf4b1fd04f3ad0e4", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d919231fdfc16990e8288543729e68df", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d5fce482cce5eb32f39e2e6e3612193b", - "notes": [], - "params": { - "celsius": 87.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 87.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f065fc7369167d7e8e2052b1d843d1c2", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bacadfeea17404f3e979abd903a22f7a", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2219cc1e8741ba80306cc6959eb4ef80", - "notes": [], - "params": { - "celsius": 86.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 86.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e7ec1b11ffd4865a59326a2557d7f0bb", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2013780df01a388f678df3e0e1ae266b", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7209d0484d7bfa189d1732a7bbbc3a59", - "notes": [], - "params": { - "celsius": 85.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 85.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "20d2514acdab3e3448618809c358ae7a", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ae4feb9d69016017a5b909c5643ce34a", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "885f0a614feac857c796bd6c25671d77", - "notes": [], - "params": { - "celsius": 84.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 84.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8ca2e0d8f75dad16c1d6fdc572333619", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "47b118048e54aef9c5cdf7b6b5c2d74b", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "18dbb0a1a3cc2a907f7b387d6697bf90", - "notes": [], - "params": { - "celsius": 83.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 83.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "766d87e7fe8f4eaa1cff13ab7b37b364", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "08e08d2948fdf31653040e6221e6b24c", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "91cca07b39ae72da34b8a6dbe7a4483c", - "notes": [], - "params": { - "celsius": 82.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 82.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7d662560e11e84d650900d67098731b9", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9bbdfb63c0ce8de6eb75f26e9d39f9e3", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "629fa6ae8b71abab25bbe66f9f393308", - "notes": [], - "params": { - "celsius": 81.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 81.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "99322871b0b7c6f13091d0df69b5f937", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0e3572550a02b0c1337971ff7798330e", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "732b29e7066c4f0600aab01d2d99c1f0", - "notes": [], - "params": { - "celsius": 80.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 80.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c60e07b6aed1e9c1642a0cd211384b96", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "35df839e4614f877bedec488e21f1d20", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5f98a478c5a31272f942cf085b9193e0", - "notes": [], - "params": { - "celsius": 79.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 79.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d9b3ede674c7069718215c83ce60dd28", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5287c6592db2bec6f737849c5e0dec53", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5abef8b61964fccdf8486fbd9ee83f1f", - "notes": [], - "params": { - "celsius": 78.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 78.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4e3c62782ec783f1c57dbd98a8796429", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b5da778f8177c0f33003547e07ac1590", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2172d3afb18d1ae61e017c32495eee0e", - "notes": [], - "params": { - "celsius": 77.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 77.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "06484f7d18a9b6445458cd2ad2f6f507", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "011eb9735c3f22751b5286eda84e986a", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c97542e9721ff61656d06228cdab2ddf", - "notes": [], - "params": { - "celsius": 76.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 76.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2907edf068ca4a350457ad05b9fcea66", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "38cde5b0b2b6be57808d0505452776f9", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7e260670d38ee78f3bf77dbca2222256", - "notes": [], - "params": { - "celsius": 75.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 75.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d3440f65cbee4d12fd1c819b29a5a944", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "62453517166a7f2c67b88512af37d922", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "071775894f0f17b1cd0da7f9bec77426", - "notes": [], - "params": { - "celsius": 74.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 74.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "84f1fed8949a865c2f8637b308b4d9e1", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "12b9cafebf04032b6172e122bb9fe0f3", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7f876f981c311529287bda518287cda8", - "notes": [], - "params": { - "celsius": 73.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 73.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8b7f9d4867e506d964a5d5d0e4308da7", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7e94578f552f97db94b4c8b010ff31e5", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5fdae4f3bb9d2f5a48957eb26f720a2e", - "notes": [], - "params": { - "celsius": 72.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 72.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f45c9fcb71e0f54d5b93d33ae8ead783", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3f31cb260adc9c9560280a4bfb01c414", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f7b42a96363bb86230ca6f85799f5a39", - "notes": [], - "params": { - "celsius": 71.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 71.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b8bc1d21e31bf72fa658f9bee0506704", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cfda1c125e8fc2b993bc6577e7c79302", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "51a35c65b72f8facc402983cee134cf1", - "notes": [], - "params": { - "celsius": 70.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2ba43999b435e4e381c66ad10f0b6849", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1fe5265fa866a637822ecac83c532662", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7f18d9073f427de54acb37b4e35434e9", - "notes": [], - "params": { - "celsius": 69.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 69.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "831ee6cfe31051b44a94fb3d2c6d441a", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2c56d24c082ef09de8874b653f2d6c31", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0b7f04a03a08371286139a202f2712a3", - "notes": [], - "params": { - "celsius": 68.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 68.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "161c4347857dd8598ce3dded3acdfa3c", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "af099f13af8744d459dd30809edebab8", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "31c5cd8831b441e14b342dc0318ffe9f", - "notes": [], - "params": { - "celsius": 67.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 67.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1a064b599037ddf4e4e7ea30c28b0aa1", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5de020e8575d5face143bcce12a9db58", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ae11b2fcf8ff20cc4c8b27805bc3764a", - "notes": [], - "params": { - "celsius": 66.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 66.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cebd72effd7bf193c520cac7e5925291", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "32fc1942a3c2eac289ababaf76b4d9a5", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9619f00c47abba041ad3f9746b80836d", - "notes": [], - "params": { - "celsius": 65.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 65.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "175f79a2dbc8fd5bd61e87d988a74239", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e05d8703343f5f263d7ea70dc1967221", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3ba5b9a01f55e59c95711d78c47a9f36", - "notes": [], - "params": { - "celsius": 64.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 64.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d5594dd1033606855033ef1ad41542f6", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "089a2feab8db04a58ef33c9066918f17", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "75d9121a8719b566ba0f0e5d9ffcdc74", - "notes": [], - "params": { - "celsius": 63.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 63.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d73623f356eb89cfe19ecd18d90cd985", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d636b95a32388ae938c8a332243fb5da", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1dcf255b9b80e01fdbdaeb37d32564de", - "notes": [], - "params": { - "celsius": 62.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 62.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5deb8c94c4f1b96cfc805108b40eedca", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e5feb25ff7197995390beb67cca092b0", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "548caab309c6e891029022781b4f7c72", - "notes": [], - "params": { - "celsius": 61.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 61.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b051a6dd705c10c0b5171576fb461135", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7df7995ccb04711873f7c88ce4f3b22d", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "626a331d3e0a18c6b40f4a2a9470eece", - "notes": [], - "params": { - "celsius": 60.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 60.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0a15ba28b7f16a96829f07c52f3ccd5e", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "03a6b5ea04e006f00320dbb47e31dc3e", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c660e95ac85702c6c7d5e5ac8ebf8094", - "notes": [], - "params": { - "celsius": 59.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 59.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "50ccd309e74a683fa9423c800e81a336", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5cb07049db96dd11130ded42d143ce50", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "206876e176f7bab12078fe5f8ba5bf99", - "notes": [], - "params": { - "celsius": 58.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 58.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "84e968aaca6cc5104f379b6e107d1f70", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "31fde73939cca3e88201d07cdabca09b", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "365d1e4f535103137b1a83ae21285135", - "notes": [], - "params": { - "celsius": 57.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 57.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0d45a7384b5bcc64aec5fea945fbcc05", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "33372e812c8e8be65ad1f5704aa7af28", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a82d40b62d22d6db9826410daf9cfdf0", - "notes": [], - "params": { - "celsius": 56.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 56.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a7257d111ac2c8a1aaec1f29e3c067cb", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cea7b98870afd782e0bc58ef2b906000", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b1029a72e746a925225221dd43d60a6b", - "notes": [], - "params": { - "celsius": 55.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 55.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "449c44fb4436c9d1ad65957a33c7b9de", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0b796c9b826b201f121c71d768c71b05", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c385ccb14390aba280ebcffd846da996", - "notes": [], - "params": { - "celsius": 54.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 54.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "260cd32bf3faa4a107a5d67b82ea947a", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "84b6c721649b947be32a2ecb31238de2", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "450ef1c606121c85f8fd0b546bff883f", - "notes": [], - "params": { - "celsius": 53.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 53.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "76eac448d9f0b9052c76d612b4e0f58f", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8a9f3dac77b1e0c2cb093b0ca8ce64bc", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "228773bdb653246dc79389d67ccddea7", - "notes": [], - "params": { - "celsius": 52.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 52.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8ffa3f17d4d4cf4931bb465b2ab1a655", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "30692ac27903508d3e3433863079b731", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "dc1cdca16de05f0011ff5351962af844", - "notes": [], - "params": { - "celsius": 51.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 51.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f78d14c896c5238880944e3d2745bb61", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "424273bdfd37282cd7225b949612ea5c", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "730e8c948918c889e9f66b4dc3cff123", - "notes": [], - "params": { - "celsius": 50.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e6b7ecbc818b48c811b7dd10382006ec", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4414bdaf007dc3ddc5d4235a713d50e8", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "27e30028dbd12744f9b6e78f8a7df7a3", - "notes": [], - "params": { - "celsius": 49.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 49.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "71139901ce04945ce2b73ba849e88520", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8431c3dea998a92b69fb1f3cc2767753", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5bec11762ff91cdded71fa33ea46b65a", - "notes": [], - "params": { - "celsius": 48.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 48.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a17cd184838f78893d476e0186ba4029", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2b082656959e967bc5c58cf0243ce1d9", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4b2941da4add362fb9eb8eb17c942d25", - "notes": [], - "params": { - "celsius": 47.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 47.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "338175f6bcbb9df6b2afbca596d62f8d", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "770b726c2a1101d3f84ff9be0f86a273", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c9d6d2a0cecd8f1fafd7de19920e634b", - "notes": [], - "params": { - "celsius": 46.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 46.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "25224b56b31f21d331bc7fea57f06eff", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "61fca62767e1fbc35a19e50fe5215f56", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e25db724d46f78376141eff3174266ac", - "notes": [], - "params": { - "celsius": 45.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 45.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cdc239bf1cceae10be83ba50b4eb32e8", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9f340b97951e0170b7c9b12addd11353", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a194b47da99405c0b99b81cb8ac1a90f", - "notes": [], - "params": { - "celsius": 44.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 44.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "aabdde51705e8fa92e5b2483c082510a", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0d8b069bfa036f96833adb4b4fd4e41d", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ca8d6a3d407c7bbc74530c5ac1a7b8a1", - "notes": [], - "params": { - "celsius": 43.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 43.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2e4d0e45c3eab9e8aeda4508ce715edc", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3e6f2d8e3a169b73e8fee74dbd3544f1", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "41a6dd957b991a602b58dd0565687a8f", - "notes": [], - "params": { - "celsius": 42.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 42.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5dbb3aa2977749901bf83f56a47269af", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "27e410b0b7b9d49face7717b6868f7dd", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4e04eba549e4a0fd1eac894e9aa2481d", - "notes": [], - "params": { - "celsius": 41.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 41.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f29e5c61e2a5a78a573d1d7034522573", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6b07572218f8fecff3825fac91e1eaf5", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c595de43769e39fe0e8c379642befc46", - "notes": [], - "params": { - "celsius": 40.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2a530d0e062a7a71d6a219738d801fb2", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ca807ab76984b49bdd7a4aefafcfb6b3", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9f13904fee725ea59eda60ccbb02c6ca", - "notes": [], - "params": { - "celsius": 39.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 39.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6b8b49d9c6502d5a84727f58e2d030ca", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e94bdb33e2e01e20bf87d4715804876d", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e47f9391e6ee5ac78a7c679316246b71", - "notes": [], - "params": { - "celsius": 38.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 38.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "dcb4796feeb12b68fa485a69b2016da7", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7de14b27f54084e4c5eb36098b04c04c", - "notes": [], - "params": { - "seconds": 10.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/openLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6a5013ed2f97714d3cbfd897c559e6fd", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "88f890408b39bf040605a23d06f7c983", - "notes": [], - "params": { - "message": "\n\n----------ADDING RDB----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "00677224c457c69ca08840b54601fa0f", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A2" - }, - "result": { - "position": { - "x": 23.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "configureForVolume", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "830e6f207fd56e9294fba38734d9df00", - "notes": [], - "params": { - "pipetteId": "UUID", - "tipOverlapNotAfterVersion": "v0", - "volume": 5.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "32df21b33f21b23b7250e4b145e9e4cd", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 5.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A2" - }, - "result": { - "position": { - "x": 351.3, - "y": 74.15, - "z": 13.0 - }, - "volume": 5.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ed91e0a804eeaf60876f2bacf6365ee4", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 5.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 5.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ede7c09ba888bf4583780b011f910519", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "69b2b49701561ded20dd7708b73f05cd", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7361d69000d89863baebe5a648b5c0ef", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "796026df1d808f79dd281efb7d87305e", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0c69dbf3f575d6810b555c6da10136ee", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d720aded9efb2b95abddc2cbfa5a0a22", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cc4c04a66bdb066b5722e47ddf845100", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "79ff88e8014131935040cab6ea3382c1", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e011fef8002fb189f1a676f45099df69", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b4778b46da0d23b3b96ffafec1a0d265", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "75e0f72bae3c26d8516056fb2dfa748c", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "aa7d6109f7ee2df4f13fa882503b6002", - "notes": [], - "params": { - "seconds": 1.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b8ab7b6b86fb6e8e07de27a93ee82eba", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "touchTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8ceffaa91c7327a61028b344b3190f2e", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "radius": 1.0, - "speed": 60.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -1.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 15.260000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c772791d372fbc5e453ceecc022ce28d", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 359.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/closeLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a121310b4027654d03d49fc3f61b0f16", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/runProfile", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c800fc18faaa550aa645015b51f5ed30", - "notes": [], - "params": { - "blockMaxVolumeUl": 20.0, - "moduleId": "UUID", - "profile": [ - { - "celsius": 37.0, - "holdSeconds": 900.0 - } - ] - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6be8a1b8d682bea9507b96d9687e7d50", - "notes": [], - "params": { - "celsius": 4.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 4.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c0842bfe516e54d06bf216f39e1f7feb", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/openLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5337f23583d7160c7bd3fb11be7ccdb7", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "45460103ce1c28279b31a9f9f0797a3f", - "notes": [], - "params": { - "message": "\n\n----------ADDING PRB----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4ec57e303dd4a19dab032dd2a031224a", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A3" - }, - "result": { - "position": { - "x": 32.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d240cb5e4c9aae5f378c25d2787a7dac", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A3" - }, - "result": { - "position": { - "x": 360.3, - "y": 74.15, - "z": 13.0 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8614b0539beeec0494fa8391960ddff7", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "afd5d367ed06b78b729d43f653b0d67d", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4248f46e4810d2b632eaa0b0faf9d7dc", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8c430d6585cd69d8322b9e28f7be02e1", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "58fd795fb77022bad31f9f85a2259829", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "14d00b88ebfa904eb28fdea883f7f20a", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "abccec97db2fa96f086ce79c3dcd9526", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ec8628678ddab77e94bd0db329c855d2", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1dbeb989c1418c1f1b41591f9256bd2c", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "61d6aef48803860526736dd654e18168", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b9383b900841cb7e1e8004ca09e8d98a", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 20.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 20.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "feb3786ebd0c0d587e1ef83536b20d70", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ab8317f307f5b5ae3c5dc1c2d51ad4ef", - "notes": [], - "params": { - "seconds": 1.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "812a72ab8e68ec0870c5af969fd673f2", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "touchTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6e3bad6ca7601812c99f71e758fbb4ee", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "radius": 1.0, - "speed": 60.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -1.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 15.260000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fc683ca797abaf2da486ca70b798d012", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 412.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/closeLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4c4e5bae16743ea62b1205bacff45893", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/runProfile", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c720a403f4196e3ba8db997f36bc8996", - "notes": [], - "params": { - "blockMaxVolumeUl": 30.0, - "moduleId": "UUID", - "profile": [ - { - "celsius": 37.0, - "holdSeconds": 900.0 - }, - { - "celsius": 70.0, - "holdSeconds": 900.0 - } - ] - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "85771372837a21e64e5272f105af8da8", - "notes": [], - "params": { - "celsius": 4.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 4.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f147f7cc9ad093b5a4ac9c7cdd80a9b1", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/openLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "eec3952968005fd92c62ad251d9765fb", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "853bada9386caea7f474f43b5b9942cc", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "slotName": "D2" - }, - "strategy": "usingGripper" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1c77c5644cb42239be59cf33ba420dcd", - "notes": [], - "params": { - "celsius": 21.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 21.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b23a4cdccd3f19e07bd7ecc8c9ec139c", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "dd6de2abb6148dc2577700d5e24ff06b", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "moduleId": "UUID" - }, - "strategy": "manualMoveWithPause" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0e8ab8e504563c90b6e712c2efd40eb7", - "notes": [], - "params": { - "message": "\n\n----------ADDING BEADS----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "368d2987166a287f15376baca3fdeb39", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 288.38, - "z": 99.0 - }, - "tipDiameter": 5.59, - "tipLength": 48.25, - "tipVolume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bfdbfbfe2e68f390eab027219030bd81", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "815b95c25828650f547a6b9af13ef9cc", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e3f66cb38bcd61ee1aba73adcaa202d2", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8c558f5aa78272ec1b161696b0ad56c4", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "269d5c8565bb1c5c434a42418f67b0d7", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cbd61ce6087bf9281211ab915e439ec2", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3c66ebd9863837e70126759d45c3acab", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "032af20af9ee8a5158ec1e187cb7f6ba", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a86d2a7c488f7fee4d773c789f355911", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bcbcf4bb60b057f39b3c55634a9e6d3a", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "32b0ab44a5c49dad8b216d4b5ce0fced", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "28123d12168fdc0f3bf245f6f10d0793", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "40715bf4fccfbbe911420e7d9abeb6c5", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5f79a39dadeba2f3514ffacbd60bba56", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7f68bbee78afe7f6b884e47efa2e1072", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "13ffd96786d1ceee4edc58d93d8f2b4d", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0818d997908d21ce9cee773882c3f58f", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d15279d8a3bf0d1a076f44c3e83a4fdc", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "032aa89e17bbfd09dcacf52a15ce18e0", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "30fa39e04a180e805ccf3bde812e4416", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bb468de0a0819c83de68c459d2bc2a3b", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "65fabe75fbb76b8ae64fbe095dbd2b3f", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "573b710f381645ce3be8001d3c236981", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "25d1f00e790d48a9dce31f3e088618e6", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7c1bbb04bafc14155df034c2f15da553", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "529af4dfcaa0c5d1f571bc1be9fb3d1c", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ed452939255d89a625ff82f96c65c52c", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9c9a02898278e87d7215b1c9e392490c", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c2bb1ddf7b51c0dbc497654d4f8c4dc1", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "67497cde9ed8faaf874e00dbf11eb43e", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "47b2201b41a49fdf972b02b2c43c3a3a", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7ad69f1477f0f7065240c3bf5b33ac35", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2fe9faf60fd27b27b0f5a1011f0fd554", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d552b62cebac83b58a3410feab357780", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ea5695819d50dee07e2c9218921f7cdb", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cca1372859c26b02f6746653b6ee3fc2", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9da7d58b925ad38b592bd304000b89b0", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0e355f0015602654601b36f3fe733c7c", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9fa0f5b1ce2cc7efc1afaeac0bc92572", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "395ee0029cbb60d9f36f5a4955a252e4", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7f92051293652d7e5b633281dad5de5d", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 60.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 60.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "494376b85c763d47e43c64a86a1af8d0", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 14.3, - "y": 74.15, - "z": 56.95 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7616f9e1448ab2aaf8444a22a0e5c309", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 60.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 60.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2a75bed14de91780767a2dba2fc63659", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a33188eb7c4689cbbbc5120fbcfc7c30", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4c04d4a332881f459e5b3b64f7dd35f6", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ef7294819777242eba8889672edb5e0a", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7f903dac68a209c04b9f7807783467f3", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "746f439bb4418e6fc7dbf0baa79818f3", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8e7fb9e6e6e9498092442eb6b0de80e5", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "42e1ff8e9bb0d10f536f38547dca4217", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f6ac2c0707b3dd297cfefccf2441b654", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e62d568ad177fb6f7b765a2c1f89bbde", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3c1a1246725e07da8cbf379c35ba374f", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "17c1e8a18b96c71d15bf365a791c3a7d", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "078072d91042c3399cc75c18749eb9a5", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4ea555ffe7f4ea8ec3c16c6d88be7c03", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "002c53f35b6556a3302128bd94c7951f", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0c735b1d5cc19e89268c81062ebf8e30", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "deeaf527616058731ddf81b63a7b4261", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1b082b45d6e92bdb566b26933a376376", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "490719174a027ee2f8ed33c33c375e69", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "800841f6da189a765d8e4c20455930f1", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 70.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 70.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8d2c9a496395a9a1ded71c6b76b65915", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 13.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d4ba58f8ff62e7ae41c88f29d03938bd", - "notes": [], - "params": { - "seconds": 2.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "757be6c16526883c8a48707f09591fad", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 13.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5a1213e3a9c70ead82d418fdd2a1b549", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 359.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7ed0688b2edae638d7f07384107a0117", - "notes": [], - "params": { - "seconds": 300.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5d0b7e3a34dccde14447e701edc94117", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "moduleId": "UUID" - }, - "strategy": "usingGripper" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4d311b4eff2d0b6db3959cb80a612a86", - "notes": [], - "params": { - "seconds": 180.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "244b0c4142617762011b5821edd2e5cb", - "notes": [], - "params": { - "message": "\n\n----------REMOVE SUPER----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "11e24eda4aaea17d19fe594f29cff94c", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A2" - }, - "result": { - "position": { - "x": 187.38, - "y": 288.38, - "z": 99.0 - }, - "tipDiameter": 5.59, - "tipLength": 48.25, - "tipVolume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e03e23625068b2fe01340f043fbcf7e6", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 90.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.949999999999996 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.510000000000005 - }, - "volume": 90.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "66746d07fdd08608be1343cfc9bee132", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.149999999999999 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.31 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a9a2748035ea5336157e177af0fd1625", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 47.459999999999994 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d7c0cecf7abee7221e56bf1562305413", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "02a1ad48dc99e7d22afe884c206ad3c0", - "notes": [], - "params": { - "seconds": 2.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d86a0db1fc9ac4641d8be7762d5a4a59", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "72c6a56b1237e317ea78c68fd44d1ec9", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 509.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f453352b591a769a121caaa4d699e97a", - "notes": [], - "params": { - "message": "\n\n----------TWO WASHES----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f9004be73e3f887db59400d4fec9612e", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A3" - }, - "result": { - "position": { - "x": 196.38, - "y": 288.38, - "z": 99.0 - }, - "tipDiameter": 5.59, - "tipLength": 48.25, - "tipVolume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "73d648448c42c3fe9f59ebee82a03bcf", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A2" - }, - "result": { - "position": { - "x": 23.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8c6870f661fd245f58e78cd630530cd2", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A2" - }, - "result": { - "position": { - "x": 23.3, - "y": 74.15, - "z": 56.95 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "22886609f80251648d4df31266899f92", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 50.459999999999994 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7bd0a6dc80fe6c5b937c1c62786dccb6", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 20.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 70.46 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "40328e27da7174b4bc692d61c929fca5", - "notes": [], - "params": { - "seconds": 30.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "84a9a8cda676dfc363d11e5236a637e8", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.949999999999996 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.510000000000005 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2b9c2e0a5bdbcb142a4c9b7ec03923ce", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.149999999999999 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.31 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8e1d29cdf6a90b3fbe469e54509b5a06", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 47.459999999999994 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1a2647fa45f954247dafedf43a81334a", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 160.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - }, - "volume": 160.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fd65fece18bfe42a335b896faba7164a", - "notes": [], - "params": { - "seconds": 2.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "13b220ee6e41cc137d2aa98490b4e537", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "674eee01810aa366e74e617ed3b99f5a", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 359.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d77fb0a118401dafaec8690ea33837e5", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A4" - }, - "result": { - "position": { - "x": 205.38, - "y": 288.38, - "z": 99.0 - }, - "tipDiameter": 5.59, - "tipLength": 48.25, - "tipVolume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bac23d746d550fbebf80bd28b859e0ff", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A2" - }, - "result": { - "position": { - "x": 23.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "331a6cfd64ef8957a1d5ec1223362fb3", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A2" - }, - "result": { - "position": { - "x": 23.3, - "y": 74.15, - "z": 56.95 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5337ce78a813c809f6bb00618c4fe20a", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 50.459999999999994 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "989ca5a87edf4643238fbc9a3364efc9", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 20.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 70.46 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5364401abcf4dc920adc9ab447efdc73", - "notes": [], - "params": { - "seconds": 30.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1ee8b5cfcf4165f39a0099b7bbeea54d", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.949999999999996 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.510000000000005 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "34e58fe0b2c459fbc3f06920d0769270", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.149999999999999 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.31 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3057863e0b46bc6d14cfddcaa0aacf84", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 47.459999999999994 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "495582e5fad7bd1901c08fb6e7eb50f5", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 160.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - }, - "volume": 160.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ccd5133c5c5d866132fe063c1ae22f9c", - "notes": [], - "params": { - "seconds": 2.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ab97584f3d517de829a20f13ff5791c0", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "21c4f328e8c27e5b8eeae02aa6e69a14", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 509.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bdc01a9029d0a64275e42cdd918ff509", - "notes": [], - "params": { - "seconds": 120.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "20a08a7ac1651a88eeff1c42d5a7fd83", - "notes": [], - "params": { - "message": "\n\n----------ADDING ELUTION BUFFER----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bcd6060410179a5511d523068e7aa8ca", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "slotName": "D2" - }, - "strategy": "usingGripper" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a4af1bda7fb80f69e2384d2636266568", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A4" - }, - "result": { - "position": { - "x": 41.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f5f746debed8dcac8a497a29b31cf186", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A4" - }, - "result": { - "position": { - "x": 41.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 10.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c65c363a455fb00b832481ddec027e5a", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 10.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e2d37a0b98bad9f18001accc5d48f2ec", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c93b23c1e0fc630e0602f22bf92771f4", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "560c787161a5b7b6bc1e4789f309c7eb", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "64468195bc0d12a28b7d33dd318ae9b7", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c1b170c37265b40564968626c228e40a", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5e77139a1eda8ea5a627879417e3412e", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cd2e6a14139282eb596cbe91b211df6f", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "aa01358ba5e110ec8e0ae314196f6ab8", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9658f3926f4e574c676dcb0556367cfe", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1a78c357fe1b8ac9d4cc5b6d3ad8889c", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9b09c58201ed7d85d177642432167b83", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "122379ae04201731c95128ecc84a8c53", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e6e1bdf34d0a30334e1498f9c8cb0162", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f0b7fc1d3b9f5df73fe8fbf36b73ee2d", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "73cb056bee8d98e0d185fb641ccf0730", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "31fc0701b0138e9d517802ce3dae49e8", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0d4e94c8be945d6ebfbde9a7ce5e43a5", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a808ea340d49477099ea1a71dd6f05ba", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "580660e11127c5dfdbcda68853a49ba0", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "23fad1294e92a433838e8d5b886cbaa0", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f60561ce4427bcef72abbbe058be0186", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "aa9a60b020a6368ec75a24dc20864c5e", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bb927ea6fd625099361703d6ab193a10", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9f2659860d0651d5084898e58f18db37", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 7.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 7.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ddc9614e29345c82acaff74cacac8bbc", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 16.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "141e8300f581875761e9dc308946e092", - "notes": [], - "params": { - "seconds": 1.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b22db511c943124628d5b9e12a5214fc", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 16.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "touchTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4fc79926d971451151d9871e600b7387", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "radius": 1.0, - "speed": 60.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -1.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 15.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cfc51d330ae4be9ed06dea079045b04c", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 359.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "642fd4b9b268619544cb12f55a88304c", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "moduleId": "UUID" - }, - "strategy": "usingGripper" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e95a1b9a129d8ccf78f7d6ffd4275c64", - "notes": [], - "params": { - "seconds": 90.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "88a37b605a7fd179714001e800e4d53a", - "notes": [], - "params": { - "message": "\n\n----------ADDING EPH3----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "128ade80924cb01a491759f7e15242cc", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "985b28047bc9bf85068fcd1cad7765a7", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 8.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A4" - }, - "result": { - "position": { - "x": 369.3, - "y": 74.15, - "z": 13.0 - }, - "volume": 8.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "773226e52da048d688c0e39ff7d205bd", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 8.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 8.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6acd32649b09ba4ee59c2e8230d1f1ba", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0bb89ce96ead87c396c38b105a1733b2", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b22f3f2d2723811944d129032a376005", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 412.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3a725551ff77626c661addc11c85e79c", - "notes": [], - "params": { - "message": "\n\n----------TRANSFERRING ELUTE----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "34064f6b319716e8d4bd456e74a85f67", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A6" - }, - "result": { - "position": { - "x": 59.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f1b5a1227acc8e0c996fac4a5b1eed5a", - "notes": [], - "params": { - "flowRate": 7.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 8.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.149999999999999 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.31 - }, - "volume": 8.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "389b353fee2a9932503c102689b31a7d", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 8.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 8.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f37014c13bbbdd7cf997d41b3e9f2555", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 50.459999999999994 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4f2926b08d8ff5716d3d388e5ff3aeda", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "199861e98b6784b606bc3a798cc21adc", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 359.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5e7ffb1e17edf90dd21bb6402f4e61cb", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": "offDeck", - "strategy": "manualMoveWithPause" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/closeLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f596cf492a4aa18c0a78962946317c9f", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/runProfile", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "13c1a4f2e91bd57161ee09096db29059", - "notes": [], - "params": { - "blockMaxVolumeUl": 17.0, - "moduleId": "UUID", - "profile": [ - { - "celsius": 94.0, - "holdSeconds": 60.0 - } - ] - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c4f468125fb7219cc751c069d3c67477", - "notes": [], - "params": { - "celsius": 4.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 4.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "da97683b7f34741bc65ff23fa048b830", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/openLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4221bd22c8a1eb22232ef8e6a7e7ff45", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0f091935a1a7399794f9581e659dcb0e", - "notes": [], - "params": { - "message": "\n\n----------ADDING FSA----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7a176bc03bbf77898f7ffa407ea492a5", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A7" - }, - "result": { - "position": { - "x": 68.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fdd4c037f72192630e23143203453fe6", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 8.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 378.3, - "y": 74.15, - "z": 13.0 - }, - "volume": 8.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c3748efc9cf7809283f676220c486f7c", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 8.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 8.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "12ff084c76776a7fc82b5bb240453304", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6b6f0aae318f1cb134fc40f53ba5c29b", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "79985b87ab70d2619333184824beb425", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d46fe87cae878bc66c847a0cbf663c5f", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d8d223bc3df2ffe1916a94b78c6f75d4", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "55236da67108ce78c1b2fd22b7f58cf5", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5013bedc495e54d9c994ca6ecb6a3304", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6a8b334c3c6dd89d77d727db4a2d0905", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d4697967048dec03f8379d91b2122941", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0e95bac1c6b7e126737543371150ebfd", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 19.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8b1193f8aad3d883df9b1236a7035a97", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8998c1ea61f8979eee45de54caa22fb7", - "notes": [], - "params": { - "seconds": 1.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5cbfa56632670eaa5d85c6dc55eeb9ea", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "touchTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0a798cd4aad04f049902c7b9f500d1c3", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "radius": 1.0, - "speed": 60.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -1.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 15.260000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "59b2e26b7244cb274df157ebedebc0a1", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 412.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/closeLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1caf8473424e9499f11a1c12ff240937", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/runProfile", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7d0b200036ec0bd09dcf980764dbd257", - "notes": [], - "params": { - "blockMaxVolumeUl": 25.0, - "moduleId": "UUID", - "profile": [ - { - "celsius": 25.0, - "holdSeconds": 600.0 - }, - { - "celsius": 42.0, - "holdSeconds": 900.0 - }, - { - "celsius": 70.0, - "holdSeconds": 900.0 - } - ] - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ce231cd2e87c00ca926aa296519bac6a", - "notes": [], - "params": { - "celsius": 4.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 4.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "dab2ad7a7aa227d17ae84bfe3ebe67f1", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/openLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3160b183c42da9abcdfd618d6b375807", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c7ca1b17d1348ed1dd69565e0ab6d559", - "notes": [], - "params": { - "message": "\n\n----------ADDING SMM----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cbf5f3ec41a0236af7ddf7292227da40", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A8" - }, - "result": { - "position": { - "x": 77.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d59a18a21f50aec382438feabac86b5d", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 25.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A6" - }, - "result": { - "position": { - "x": 387.3, - "y": 74.15, - "z": 13.0 - }, - "volume": 25.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fa2874da436a4ce1e1b518b5929a4b7d", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 25.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 25.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ed2888e9812d6ed5b579098d5f7dcadb", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6f984f796140a36b7e4b047af2580cad", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "056bf9604a87b6b7251a0dd7ee0a0533", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2dd228ae53cef058bed3795b223cbd9c", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "401120eb90da95947308e31b43dccb8d", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2f09e6ed15dd6a9c607537f22fd56482", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "57370e705965f5648df3898f2301cd9e", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "06c1334811158883f7c36da25a22e33e", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0fca0fa0c64f8503a2837c9006667146", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "48f33362c3c7f619223ac2cc8c337c38", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 40.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8799e4f3726c598289f8bd7b23f0abf3", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4da4535a7b8dbf796c7361ed841dc830", - "notes": [], - "params": { - "seconds": 1.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "09e205b3ec47cd7f5c507ef7f6f180e1", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "touchTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "86ab24cd106991df03153585488a6bd8", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "radius": 1.0, - "speed": 60.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -1.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 15.260000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c212e5981120f727c6decc1943c152ad", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 359.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetLidTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e842bc8a137ba1d36a17d3faf61e07b1", - "notes": [], - "params": { - "celsius": 40.0, - "moduleId": "UUID" - }, - "result": { - "targetLidTemperature": 40.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForLidTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3a91d0a6da70911cf187829fea8a1c6c", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/closeLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "60ac672f2f39611656b99757dd9bcf74", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/runProfile", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "12e135979be4e41816f8008d391ac2ff", - "notes": [], - "params": { - "blockMaxVolumeUl": 50.0, - "moduleId": "UUID", - "profile": [ - { - "celsius": 16.0, - "holdSeconds": 3600.0 - } - ] - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b719f4e921a8f757f7c4d993f3da43d9", - "notes": [], - "params": { - "celsius": 4.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 4.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8c75d278bb185b008e22212d155ef5dc", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/openLid", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b5f410ba45b213bd477900bef4951843", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b27ed28512232cb0551a5af34c2261e5", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "slotName": "D2" - }, - "strategy": "usingGripper" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/setTargetBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "094738334022c0efdb7d09feb70485a4", - "notes": [], - "params": { - "celsius": 21.0, - "holdTimeSeconds": 0.0, - "moduleId": "UUID" - }, - "result": { - "targetBlockTemperature": 21.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "thermocycler/waitForBlockTemperature", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f53679fa22cc21426034afb9166c4c09", - "notes": [], - "params": { - "moduleId": "UUID" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "16840a171c215462a28e2f4e1363f2c0", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "moduleId": "UUID" - }, - "strategy": "manualMoveWithPause" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e1a5efdc0f7ef98106e4306b5dd2e6b8", - "notes": [], - "params": { - "message": "\n\n----------ADDING BEADS----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "682b477a087dd92ac6159f900115fb35", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 214.38, - "y": 288.38, - "z": 99.0 - }, - "tipDiameter": 5.59, - "tipLength": 48.25, - "tipVolume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "43d5d251497da47db350309e9d0f34dd", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f49285a51e7d0e936653b2e5d52c3bea", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5d4d46d37afbd6ae16e079c02fb55bbc", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "65635c49da6868a4305fac7d5abf5425", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b71e5cacbf131d7daa8a13fb5dd1cf07", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fedf2d26f50dc893ce9ee6b0d7eb9fb6", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f1d932332dc990ca22ca874303e26873", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d25680d8647d4de548ebd009fab58608", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9cd005defed08a0daad0d5b1bd4d03e8", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bf755956d5e9addade84d0cef3331b6e", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d6786c7d0cd83c2509a9959f0f04a593", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a025fc0aa12c342b03016accb2973631", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b47dfd3ccbda1a5b28a165e301a5a0f9", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "216472b31cc3c3d454bbfd7d76b3b7ed", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a4a946ea27a345fbb7e85ad53a45ade1", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4e8f5cfcd829473d768d8cc759a5dac2", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3b94f21a0c88800073a4303564fc63b7", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1b4c2edaee80fe222e4a5b83472ddf1d", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8e03cc5452fe5bd73f794968e234d70b", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5cc98b1e554ad32ca80cb5951f8161d7", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c95e6f872df87081a47ea61603e9b4ca", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0ab71ffdb60d9e4794eb2a6deb883cf4", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "dc4eaa79925d9c73b6fbd25f5441dba9", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8da7cc1166fc139926f6c84baa8c70cc", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5b6f914bea0c4ffdc1f04b6de79ef05b", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4ce0076f932a86c0082742c8e5e7467c", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d928c7a3181f8a98f441585a86e9a972", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "712e51b617d0f48491ce05e0058d50c0", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "89f3ac0193b80bcd369e8ecb32ba1546", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2702670c323384ed41cdad11001069f0", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d0057ae136577bbd0ac88b74ef799412", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d83978b1ca8133a1bba1a15230260e3d", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cb4fd30824e9e428b29558d180c71b46", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3acbc3464821ecc3e7280c0b35081001", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9b8f8c48eae538d5ae472f988cd63797", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7be87f8236a14202c03d6e6252b17165", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "e9de57ce33c992b57fc0ca013dd166bf", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a78f8aa319c9395675cfdfd11d727ed2", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "48e844e531197d305f35b100f4222ec9", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "912ca45f89f86e458cb1415ae6926fe0", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 200.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "377e827673e4ed63668be12d0ccd5fd6", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 90.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 90.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f618f13c5e3cc165d6606d115ad97d83", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A5" - }, - "result": { - "position": { - "x": 50.3, - "y": 74.15, - "z": 56.95 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cd81a730a89ff4b52dcb40b50feb3ceb", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 90.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 90.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "75669bcf0b341326a1d77f0c00436a88", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9168388b37a91f3d345226ab465dc5ee", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "139f3e84c7e8105b637c0272055fe353", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1a6b6222ba580a3f05861298b380d650", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7633fe17308172238547ac37e87ed4ef", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d57db4e9aa442e5462704781bd4431bd", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ba85e92133639b1920fe10d9972440c4", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cf2afde9c174df0484ba43de9c07306b", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b496115ac86d35cea2168e5ad70548cd", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5eb6124ba5865aeede1f06c4e5744095", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1fe26400f63a02249e4c68b0d424e780", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "122fa7f2b2ac35027f935938ac50c8ab", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "05da1119ab89f4124a4b0566dee1ce0d", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0067c6aa4e4e4c88079d66322f1f414a", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8533c051c7c1c3d40baa81ce816a87ea", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "21796119f6ba48327ee82af43d70dedb", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b69b894ad8c8f464e7fa039124fdb44f", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "206d69df9193928f581d8049e9644896", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4bc1dd42516b721e81fe511e76c1bce8", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6e01eb7ee577e28580043089ccebffbf", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 100.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 100.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d70cf2f99fcfd1a78d2918c2a3640277", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 13.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b7ac87f3143a8e94167c971444ea082f", - "notes": [], - "params": { - "seconds": 2.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "74e0fde95013cef52a4b86aca1e31911", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 13.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2167c790163b647e1673430d8407acbe", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 509.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2fe1007571bb088ac9fddbe0e59b54aa", - "notes": [], - "params": { - "seconds": 300.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ef7903a646d62d50c9d0cfc39aa7c364", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "moduleId": "UUID" - }, - "strategy": "usingGripper" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d0001ee8a8bb6a3a3065465468162f92", - "notes": [], - "params": { - "seconds": 180.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1a990ae34fde9280ff36803d451ead8b", - "notes": [], - "params": { - "message": "\n\n----------REMOVE SUPER----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6d4d0312b5bfe8f4fdf1c50d16bcded9", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A6" - }, - "result": { - "position": { - "x": 223.38, - "y": 288.38, - "z": 99.0 - }, - "tipDiameter": 5.59, - "tipLength": 48.25, - "tipVolume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "35d5ea9b45c6e4fe04eaefbe07faa4ca", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 140.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.949999999999996 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.510000000000005 - }, - "volume": 140.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c83da5f07fe58aa4acf6e71a83840a1e", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.149999999999999 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.31 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "34f5ef829533277943b396863d2d3090", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 47.459999999999994 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "561ee6926eb74c52d372fe3bc0c2b891", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f4bea182967bfe77f477c8f134f6edd2", - "notes": [], - "params": { - "seconds": 2.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4d724015d6e939461f04f9b8d3bcf44a", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f7cf56fe34fc2fdea9799801b8399a0e", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 359.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fc1348cb1ac415a29f8f4f565aded186", - "notes": [], - "params": { - "message": "\n\n----------TWO WASHES----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "8017ae087c370713f8e84e54e27337da", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A7" - }, - "result": { - "position": { - "x": 232.38, - "y": 288.38, - "z": 99.0 - }, - "tipDiameter": 5.59, - "tipLength": 48.25, - "tipVolume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cda0933085243585cf946275be748ccd", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A3" - }, - "result": { - "position": { - "x": 32.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d9ca89370731eefd12eab9fd6077bc55", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A3" - }, - "result": { - "position": { - "x": 32.3, - "y": 74.15, - "z": 56.95 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d0652d79b21be209840a2a681e44ddc6", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 50.459999999999994 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "4a7e59dbe17b1adf900c5a6d9f2e7e45", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 20.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 70.46 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "36c3086a297b20a85ef8232b0c21b51a", - "notes": [], - "params": { - "seconds": 30.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7bbcfa08c751fdaba7d6d581370d2955", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.949999999999996 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.510000000000005 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b7308b04d29fd37cc9be1436c087d9b4", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.149999999999999 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.31 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "35d196d5fe5cabfd879b20a2c61cdb10", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 47.459999999999994 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5837f318dfb28b3436b919706eb936c3", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 160.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - }, - "volume": 160.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "bf173b3c58d4fb352e0372d47213119d", - "notes": [], - "params": { - "seconds": 2.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "02cd32879185c6bfb84a65d23807a880", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "15ea5c4abc794d6e7c634b6588a6e9c1", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 509.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3cf3b07d8998d888692eb223b05060df", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A8" - }, - "result": { - "position": { - "x": 241.38, - "y": 288.38, - "z": 99.0 - }, - "tipDiameter": 5.59, - "tipLength": 48.25, - "tipVolume": 200.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "04961eb23d9f6254142ee16ab14248a8", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A3" - }, - "result": { - "position": { - "x": 32.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d70bae5f325b508b99b8dd3e0138d96f", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A3" - }, - "result": { - "position": { - "x": 32.3, - "y": 74.15, - "z": 56.95 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "672debfdee77318ffff1b2cff21ccab7", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 50.459999999999994 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "66093f66f5aa96e91c39f0e3c01e46cd", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 20.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 70.46 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "347c5121278c2810e041c94cff7db2e3", - "notes": [], - "params": { - "seconds": 30.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cee3f5ea84293d86b1ba85b9e338813b", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 150.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.949999999999996 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.510000000000005 - }, - "volume": 150.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fac47a9fd8d07b04483f636217bf69d1", - "notes": [], - "params": { - "flowRate": 107.39999999999999, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 10.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.149999999999999 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.31 - }, - "volume": 10.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9d8ac359ccb52841dfb3e4df5a1f4a18", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 47.459999999999994 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "585038ade3637a88d64e4608c4bb5ee4", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 160.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - }, - "volume": 160.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ba28d9ce128a5b4b3489322a661b3651", - "notes": [], - "params": { - "seconds": 2.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3d2f711f065ca932e8230b8aa3aae811", - "notes": [], - "params": { - "flowRate": 716.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -3.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 363.78, - "z": 28.400000000000002 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9e9947e94d00cd7af2fbd93da9f0a80b", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 359.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "aceac2839f511dd95c277edef67d8fb7", - "notes": [], - "params": { - "seconds": 120.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ca67c1c88c455a5aba1959cd1caf8f2a", - "notes": [], - "params": { - "message": "\n\n----------ADDING ELUTION BUFFER----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5eca5b4fc517fd179f00584d01536884", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "slotName": "D2" - }, - "strategy": "usingGripper" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "32bbdbea3b7c9013fa48ade4fe3324fb", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A9" - }, - "result": { - "position": { - "x": 86.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "5a315c4cd14cb77926724b952a7fbead", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -37.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A6" - }, - "result": { - "position": { - "x": 59.3, - "y": 74.15, - "z": 22.95 - }, - "volume": 19.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "17ec51833aa27af96c25ee6505183966", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 19.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 2.05 - }, - "volume": 19.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "9f24e834779a37078144cf3156cd3db8", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f33cf695ecd2531478a68d2802e148f7", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c429821867b899d5c77969f6fbaacc9f", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "74b9adbac35a2a3a642e07a860b1c426", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "24733fb2d4d18cf9508abd39983f3d38", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a3ec8da86c6e0a867d6969d1297611a9", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "404694e8951bb51adca17738330711d3", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "11d60469d4437e94279c257149f593da", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fdf47b41ab2d95b5f5814f29947d2a3e", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "a7ba68c365c32dd9f9bf5efa42268ead", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7d92a9f1e96414b17520cfc4d0a39df4", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c01967532b5744a89d4ae61978d6e3f3", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ea1d41201d32add509fd9ec69cce92a4", - "notes": [], - "params": { - "flowRate": 35.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.15 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.849999999999999 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "87f5ad959bf21caa837f7be34cb2acbc", - "notes": [], - "params": { - "flowRate": 114.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 15.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -8.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 7.05 - }, - "volume": 15.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "53644c8767ea650bb4a2978c1694951f", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "3a1e1283bc33c1ffc45046a245e7deff", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "613dc6176dd81f519d7271bb1af5bc5a", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "2ea46cbed07c4b44ee476894708bc003", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c3aa22272f7134a79ddffd9136359c37", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6a81677c234f3abe6904d8aa3abab446", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "705582b79c3d98faa603533ac103d651", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f25fb64699eac468c88e4806f5bb3916", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "b9b463d95c4eefeb5814e9982affce67", - "notes": [], - "params": { - "flowRate": 52.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "7d467408fd88a0136fb6c7456c7cc94a", - "notes": [], - "params": { - "flowRate": 85.5, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 14.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.25 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 1.7499999999999993 - }, - "volume": 14.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fea7c6fb5de7e3dcd4bf4957de66f05e", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 16.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "cc92fcbd002554e2ce0855f343a3a68e", - "notes": [], - "params": { - "seconds": 1.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "017af87721e992b5157fb78be01033b2", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 16.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "touchTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d61eb6e9d9b3183f747f70ce29828ff7", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "radius": 1.0, - "speed": 60.0, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -1.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 178.38, - "y": 74.24, - "z": 15.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "ddda43ec173555ea3b16b98ad6d2c39e", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 412.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "0367269519dab3d917ff70e4c2eb3ac5", - "notes": [], - "params": { - "labwareId": "UUID", - "newLocation": { - "moduleId": "UUID" - }, - "strategy": "usingGripper" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "waitForDuration", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "c92eb88b6abd64aee972dffe5e25327a", - "notes": [], - "params": { - "seconds": 120.0 - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "comment", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "fff71392918a3b8f2f00bdefa4a53134", - "notes": [], - "params": { - "message": "\n\n----------TRANSFERRING ELUTE----------\n" - }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "pickUpTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1211dc66481f76a8e1dd9cc3a16fc306", - "notes": [], - "params": { - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top" - }, - "wellName": "A10" - }, - "result": { - "position": { - "x": 95.38, - "y": 181.38, - "z": 99.0 - }, - "tipDiameter": 5.58, - "tipLength": 47.849999999999994, - "tipVolume": 50.0 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "aspirate", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "02042c1eb009e7757551c7d6a5e2493f", - "notes": [], - "params": { - "flowRate": 7.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 17.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -14.149999999999999 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 36.31 - }, - "volume": 17.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dispense", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "f88f2a7423ac5f5070ba46bd9989126c", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "volume": 17.5, - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": -13.95 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 2.3100000000000014 - }, - "volume": 17.5 - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveToWell", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "03a1b309d898cee327e0b3dd131a7507", - "notes": [], - "params": { - "forceDirect": false, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 342.38, - "y": 181.24, - "z": 50.459999999999994 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "blowout", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "674540c74c2dc67ded15c1b937ef28fb", - "notes": [], - "params": { - "flowRate": 57.0, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "origin": "top", - "volumeOffset": 0.0 - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": -5.624999999999998, - "y": 356.2, - "z": 16.26 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "dropTip", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "6498d67c1416ebe7d0b8c12d8b8d3c87", - "notes": [], - "params": { - "alternateDropLocation": true, - "labwareId": "UUID", - "pipetteId": "UUID", - "wellLocation": { - "offset": { - "x": 0, - "y": 0, - "z": 0 - }, - "origin": "default" - }, - "wellName": "A1" - }, - "result": { - "position": { - "x": 359.25, - "y": 364.0, - "z": 40.0 - } - }, - "startedAt": "TIMESTAMP", - "status": "succeeded" } ], "config": { @@ -31721,7 +5968,34 @@ "protocolType": "python" }, "createdAt": "TIMESTAMP", - "errors": [], + "errors": [ + { + "createdAt": "TIMESTAMP", + "detail": "ValidationError [line 54]: 2 validation errors for LoadLabwareParams\ndisplayName.str\n Input should be a valid string [type=string_type, input_value=8, input_type=int]\n For further information visit https://errors.pydantic.dev/2.10/v/string_type\ndisplayName.none\n Input should be None [type=none_required, input_value=8, input_type=int]\n For further information visit https://errors.pydantic.dev/2.10/v/none_required", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "id": "UUID", + "isDefined": false, + "wrappedErrors": [ + { + "createdAt": "TIMESTAMP", + "detail": "pydantic_core._pydantic_core.ValidationError: 2 validation errors for LoadLabwareParams\ndisplayName.str\n Input should be a valid string [type=string_type, input_value=8, input_type=int]\n For further information visit https://errors.pydantic.dev/2.10/v/string_type\ndisplayName.none\n Input should be None [type=none_required, input_value=8, input_type=int]\n For further information visit https://errors.pydantic.dev/2.10/v/none_required", + "errorCode": "4000", + "errorInfo": { + "args": "()", + "class": "ValidationError", + "title": "LoadLabwareParams", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line N, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line N, in \n\n File \"pl_langone_ribo_pt1_ramp.py\", line N, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/module_contexts.py\", line N, in load_labware\n labware_core = self._protocol_core.load_labware(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line N, in load_labware\n cmd.LoadLabwareParams(\n\n File \"/usr/local/lib/python3.10/site-packages/pydantic/main.py\", line N, in __init__\n validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self)\n" + }, + "errorType": "PythonException", + "id": "UUID", + "isDefined": false, + "wrappedErrors": [] + } + ] + } + ], "files": [ { "name": "pl_langone_ribo_pt1_ramp.py", @@ -31737,12 +6011,6 @@ "slotName": "A3" } }, - { - "definitionUri": "opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", - "id": "UUID", - "loadName": "opentrons_96_wellplate_200ul_pcr_full_skirt", - "location": "offDeck" - }, { "definitionUri": "opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "id": "UUID", @@ -31755,155 +6023,25 @@ "definitionUri": "opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "id": "UUID", "loadName": "opentrons_96_wellplate_200ul_pcr_full_skirt", - "location": { - "moduleId": "UUID" - } + "location": "offDeck" }, { - "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "definitionUri": "opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "id": "UUID", - "loadName": "nest_96_wellplate_2ml_deep", - "location": { - "moduleId": "UUID" - } + "loadName": "opentrons_96_wellplate_200ul_pcr_full_skirt", + "location": "offDeck" }, { "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", - "displayName": "8", "id": "UUID", "loadName": "nest_96_wellplate_2ml_deep", "location": { "moduleId": "UUID" } - }, - { - "definitionUri": "opentrons/nest_12_reservoir_15ml/1", - "id": "UUID", - "loadName": "nest_12_reservoir_15ml", - "location": { - "slotName": "A2" - } - }, - { - "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", - "id": "UUID", - "loadName": "opentrons_flex_96_tiprack_50ul", - "location": { - "slotName": "C1" - } - }, - { - "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", - "id": "UUID", - "loadName": "opentrons_flex_96_tiprack_50ul", - "location": { - "slotName": "C2" - } - }, - { - "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", - "id": "UUID", - "loadName": "opentrons_flex_96_tiprack_200ul", - "location": { - "slotName": "B2" - } - }, - { - "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", - "id": "UUID", - "loadName": "opentrons_flex_96_tiprack_200ul", - "location": { - "slotName": "B3" - } } ], "liquidClasses": [], - "liquids": [ - { - "description": "DB1/DP1", - "displayColor": "#7EFF42", - "displayName": "DB1/DP1", - "id": "UUID" - }, - { - "description": "RDB/RDE", - "displayColor": "#50D5FF", - "displayName": "RDB/RDE", - "id": "UUID" - }, - { - "description": "PRB/PRE", - "displayColor": "#FF4F4F", - "displayName": "PRB/PRE", - "id": "UUID" - }, - { - "description": "EPH3", - "displayColor": "#B925FF", - "displayName": "EPH3", - "id": "UUID" - }, - { - "description": "FSA/RVT", - "displayColor": "#FF9900", - "displayName": "FSA/RVT", - "id": "UUID" - }, - { - "description": "SMM", - "displayColor": "#0019FF", - "displayName": "SMM", - "id": "UUID" - }, - { - "description": "BEADS", - "displayColor": "#007AFF", - "displayName": "BEADS", - "id": "UUID" - }, - { - "description": "ETHANOL", - "displayColor": "#FF0076", - "displayName": "ETHANOL", - "id": "UUID" - }, - { - "description": "ELUTION BUFFER", - "displayColor": "#00FFBC", - "displayName": "ELUTION BUFFER", - "id": "UUID" - }, - { - "description": "RSB", - "displayColor": "#00AAFF", - "displayName": "RSB", - "id": "UUID" - }, - { - "description": "Sample", - "displayColor": "#008000", - "displayName": "Sample", - "id": "UUID" - }, - { - "description": "Mastermix", - "displayColor": "#008000", - "displayName": "Mastermix", - "id": "UUID" - }, - { - "description": "Water", - "displayColor": "#A52A2A", - "displayName": "Water", - "id": "UUID" - }, - { - "description": "DNA", - "displayColor": "#A52A2A", - "displayName": "DNA", - "id": "UUID" - } - ], + "liquids": [], "metadata": { "author": "Rami Farawi = '3.8'", "version": "==0.3.1" }, + "annotated-types": { + "hashes": [ + "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", + "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" + ], + "markers": "python_version >= '3.8'", + "version": "==0.7.0" + }, "anyio": { "hashes": [ "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", @@ -32,11 +41,11 @@ }, "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "click": { "hashes": [ @@ -48,19 +57,19 @@ }, "exceptiongroup": { "hashes": [ - "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", - "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" + "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", + "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc" ], "markers": "python_version < '3.11'", - "version": "==1.2.1" + "version": "==1.2.2" }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "jsonschema": { "hashes": [ @@ -179,63 +188,129 @@ }, "packaging": { "hashes": [ - "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", - "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" + "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3", + "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==21.3" + "markers": "python_version >= '3.7'", + "version": "==22.0" + }, + "performance-metrics": { + "editable": true, + "file": "../performance-metrics" }, "pydantic": { "hashes": [ - "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303", - "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe", - "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47", - "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494", - "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33", - "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86", - "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d", - "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c", - "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a", - "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565", - "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb", - "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62", - "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62", - "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0", - "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523", - "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d", - "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405", - "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f", - "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b", - "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718", - "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed", - "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb", - "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5", - "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc", - "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942", - "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe", - "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246", - "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350", - "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303", - "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09", - "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33", - "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8", - "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a", - "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1", - "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6", - "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d" + "sha256:c7a8a9fdf7d100afa49647eae340e2d23efa382466a8d177efcd1381e9be5598", + "sha256:f66a7073abd93214a20c5f7b32d56843137a7a2e70d02111f3be287035c45370" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==1.10.12" + "markers": "python_version >= '3.8'", + "version": "==2.9.0" + }, + "pydantic-core": { + "hashes": [ + "sha256:0102e49ac7d2df3379ef8d658d3bc59d3d769b0bdb17da189b75efa861fc07b4", + "sha256:0123655fedacf035ab10c23450163c2f65a4174f2bb034b188240a6cf06bb123", + "sha256:043ef8469f72609c4c3a5e06a07a1f713d53df4d53112c6d49207c0bd3c3bd9b", + "sha256:0448b81c3dfcde439551bb04a9f41d7627f676b12701865c8a2574bcea034437", + "sha256:05b366fb8fe3d8683b11ac35fa08947d7b92be78ec64e3277d03bd7f9b7cda79", + "sha256:07049ec9306ec64e955b2e7c40c8d77dd78ea89adb97a2013d0b6e055c5ee4c5", + "sha256:084414ffe9a85a52940b49631321d636dadf3576c30259607b75516d131fecd0", + "sha256:086c5db95157dc84c63ff9d96ebb8856f47ce113c86b61065a066f8efbe80acf", + "sha256:12625e69b1199e94b0ae1c9a95d000484ce9f0182f9965a26572f054b1537e44", + "sha256:16b25a4a120a2bb7dab51b81e3d9f3cde4f9a4456566c403ed29ac81bf49744f", + "sha256:19f1352fe4b248cae22a89268720fc74e83f008057a652894f08fa931e77dced", + "sha256:1a2ab4f410f4b886de53b6bddf5dd6f337915a29dd9f22f20f3099659536b2f6", + "sha256:1c7b81beaf7c7ebde978377dc53679c6cba0e946426fc7ade54251dfe24a7604", + "sha256:1cf842265a3a820ebc6388b963ead065f5ce8f2068ac4e1c713ef77a67b71f7c", + "sha256:1eb37f7d6a8001c0f86dc8ff2ee8d08291a536d76e49e78cda8587bb54d8b329", + "sha256:23af245b8f2f4ee9e2c99cb3f93d0e22fb5c16df3f2f643f5a8da5caff12a653", + "sha256:257d6a410a0d8aeb50b4283dea39bb79b14303e0fab0f2b9d617701331ed1515", + "sha256:276ae78153a94b664e700ac362587c73b84399bd1145e135287513442e7dfbc7", + "sha256:2b1a195efd347ede8bcf723e932300292eb13a9d2a3c1f84eb8f37cbbc905b7f", + "sha256:329a721253c7e4cbd7aad4a377745fbcc0607f9d72a3cc2102dd40519be75ed2", + "sha256:358331e21a897151e54d58e08d0219acf98ebb14c567267a87e971f3d2a3be59", + "sha256:3649bd3ae6a8ebea7dc381afb7f3c6db237fc7cebd05c8ac36ca8a4187b03b30", + "sha256:3713dc093d5048bfaedbba7a8dbc53e74c44a140d45ede020dc347dda18daf3f", + "sha256:3ef71ec876fcc4d3bbf2ae81961959e8d62f8d74a83d116668409c224012e3af", + "sha256:41ae8537ad371ec018e3c5da0eb3f3e40ee1011eb9be1da7f965357c4623c501", + "sha256:4a801c5e1e13272e0909c520708122496647d1279d252c9e6e07dac216accc41", + "sha256:4c83c64d05ffbbe12d4e8498ab72bdb05bcc1026340a4a597dc647a13c1605ec", + "sha256:4cebb9794f67266d65e7e4cbe5dcf063e29fc7b81c79dc9475bd476d9534150e", + "sha256:5668b3173bb0b2e65020b60d83f5910a7224027232c9f5dc05a71a1deac9f960", + "sha256:56e6a12ec8d7679f41b3750ffa426d22b44ef97be226a9bab00a03365f217b2b", + "sha256:582871902e1902b3c8e9b2c347f32a792a07094110c1bca6c2ea89b90150caac", + "sha256:5c8aa40f6ca803f95b1c1c5aeaee6237b9e879e4dfb46ad713229a63651a95fb", + "sha256:5d813fd871b3d5c3005157622ee102e8908ad6011ec915a18bd8fde673c4360e", + "sha256:5dd0ec5f514ed40e49bf961d49cf1bc2c72e9b50f29a163b2cc9030c6742aa73", + "sha256:5f3cf3721eaf8741cffaf092487f1ca80831202ce91672776b02b875580e174a", + "sha256:6294907eaaccf71c076abdd1c7954e272efa39bb043161b4b8aa1cd76a16ce43", + "sha256:64d094ea1aa97c6ded4748d40886076a931a8bf6f61b6e43e4a1041769c39dd2", + "sha256:6650a7bbe17a2717167e3e23c186849bae5cef35d38949549f1c116031b2b3aa", + "sha256:67b6655311b00581914aba481729971b88bb8bc7996206590700a3ac85e457b8", + "sha256:6b06c5d4e8701ac2ba99a2ef835e4e1b187d41095a9c619c5b185c9068ed2a49", + "sha256:6ce883906810b4c3bd90e0ada1f9e808d9ecf1c5f0b60c6b8831d6100bcc7dd6", + "sha256:6db09153d8438425e98cdc9a289c5fade04a5d2128faff8f227c459da21b9703", + "sha256:6f80fba4af0cb1d2344869d56430e304a51396b70d46b91a55ed4959993c0589", + "sha256:743e5811b0c377eb830150d675b0847a74a44d4ad5ab8845923d5b3a756d8100", + "sha256:753294d42fb072aa1775bfe1a2ba1012427376718fa4c72de52005a3d2a22178", + "sha256:7568f682c06f10f30ef643a1e8eec4afeecdafde5c4af1b574c6df079e96f96c", + "sha256:7706e15cdbf42f8fab1e6425247dfa98f4a6f8c63746c995d6a2017f78e619ae", + "sha256:785e7f517ebb9890813d31cb5d328fa5eda825bb205065cde760b3150e4de1f7", + "sha256:7a05c0240f6c711eb381ac392de987ee974fa9336071fb697768dfdb151345ce", + "sha256:7ce7eaf9a98680b4312b7cebcdd9352531c43db00fca586115845df388f3c465", + "sha256:7ce8e26b86a91e305858e018afc7a6e932f17428b1eaa60154bd1f7ee888b5f8", + "sha256:7d0324a35ab436c9d768753cbc3c47a865a2cbc0757066cb864747baa61f6ece", + "sha256:7e9b24cca4037a561422bf5dc52b38d390fb61f7bfff64053ce1b72f6938e6b2", + "sha256:810ca06cca91de9107718dc83d9ac4d2e86efd6c02cba49a190abcaf33fb0472", + "sha256:820f6ee5c06bc868335e3b6e42d7ef41f50dfb3ea32fbd523ab679d10d8741c0", + "sha256:82764c0bd697159fe9947ad59b6db6d7329e88505c8f98990eb07e84cc0a5d81", + "sha256:8ae65fdfb8a841556b52935dfd4c3f79132dc5253b12c0061b96415208f4d622", + "sha256:8d5b0ff3218858859910295df6953d7bafac3a48d5cd18f4e3ed9999efd2245f", + "sha256:95d6bf449a1ac81de562d65d180af5d8c19672793c81877a2eda8fde5d08f2fd", + "sha256:964c7aa318da542cdcc60d4a648377ffe1a2ef0eb1e996026c7f74507b720a78", + "sha256:96ef39add33ff58cd4c112cbac076726b96b98bb8f1e7f7595288dcfb2f10b57", + "sha256:a6612c2a844043e4d10a8324c54cdff0042c558eef30bd705770793d70b224aa", + "sha256:a8031074a397a5925d06b590121f8339d34a5a74cfe6970f8a1124eb8b83f4ac", + "sha256:aab9e522efff3993a9e98ab14263d4e20211e62da088298089a03056980a3e69", + "sha256:ae579143826c6f05a361d9546446c432a165ecf1c0b720bbfd81152645cb897d", + "sha256:ae90b9e50fe1bd115b24785e962b51130340408156d34d67b5f8f3fa6540938e", + "sha256:b18cf68255a476b927910c6873d9ed00da692bb293c5b10b282bd48a0afe3ae2", + "sha256:b7efb12e5071ad8d5b547487bdad489fbd4a5a35a0fc36a1941517a6ad7f23e0", + "sha256:c4d9f15ffe68bcd3898b0ad7233af01b15c57d91cd1667f8d868e0eacbfe3f87", + "sha256:c53100c8ee5a1e102766abde2158077d8c374bee0639201f11d3032e3555dfbc", + "sha256:c57e493a0faea1e4c38f860d6862ba6832723396c884fbf938ff5e9b224200e2", + "sha256:c8319e0bd6a7b45ad76166cc3d5d6a36c97d0c82a196f478c3ee5346566eebfd", + "sha256:caffda619099cfd4f63d48462f6aadbecee3ad9603b4b88b60cb821c1b258576", + "sha256:cc0c316fba3ce72ac3ab7902a888b9dc4979162d320823679da270c2d9ad0cad", + "sha256:cdd02a08205dc90238669f082747612cb3c82bd2c717adc60f9b9ecadb540f80", + "sha256:d50ac34835c6a4a0d456b5db559b82047403c4317b3bc73b3455fefdbdc54b0a", + "sha256:d6b9dd6aa03c812017411734e496c44fef29b43dba1e3dd1fa7361bbacfc1354", + "sha256:da3131ef2b940b99106f29dfbc30d9505643f766704e14c5d5e504e6a480c35e", + "sha256:da43cbe593e3c87d07108d0ebd73771dc414488f1f91ed2e204b0370b94b37ac", + "sha256:dd59638025160056687d598b054b64a79183f8065eae0d3f5ca523cde9943940", + "sha256:e1895e949f8849bc2757c0dbac28422a04be031204df46a56ab34bcf98507342", + "sha256:e1a79ad49f346aa1a2921f31e8dbbab4d64484823e813a002679eaa46cba39e1", + "sha256:e460475719721d59cd54a350c1f71c797c763212c836bf48585478c5514d2854", + "sha256:e64ffaf8f6e17ca15eb48344d86a7a741454526f3a3fa56bc493ad9d7ec63936", + "sha256:e6e3ccebdbd6e53474b0bb7ab8b88e83c0cfe91484b25e058e581348ee5a01a5", + "sha256:e758d271ed0286d146cf7c04c539a5169a888dd0b57026be621547e756af55bc", + "sha256:f087879f1ffde024dd2788a30d55acd67959dcf6c431e9d3682d1c491a0eb474", + "sha256:f477d26183e94eaafc60b983ab25af2a809a1b48ce4debb57b343f671b7a90b6", + "sha256:fc535cb898ef88333cf317777ecdfe0faac1c2a3187ef7eb061b6f7ecf7e6bae" + ], + "markers": "python_version >= '3.8'", + "version": "==2.23.2" }, - "pyparsing": { + "pydantic-settings": { "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" + "sha256:bb6849dc067f1687574c12a639e231f3a6feeed0a12d710c1382045c5db1c315", + "sha256:ed81c3a0f46392b4d7c0a565c05884e6e54b3456e6f0fe4d8814981172dc9a88" ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.4.0" }, "pyrsistent": { "hashes": [ @@ -290,6 +365,14 @@ "markers": "python_version >= '3.7'", "version": "==4.2.2" }, + "python-dotenv": { + "hashes": [ + "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", + "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.1" + }, "pyusb": { "hashes": [ "sha256:2b4c7cb86dbadf044dfb9d3a4ff69fd217013dbe78a792177a3feb172449ea36", @@ -301,11 +384,11 @@ }, "setuptools": { "hashes": [ - "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650", - "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95" + "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308", + "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6" ], "markers": "python_version >= '3.8'", - "version": "==70.1.1" + "version": "==74.1.2" }, "sniffio": { "hashes": [ @@ -320,9 +403,17 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.13'", "version": "==4.12.2" }, + "tzdata": { + "hashes": [ + "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", + "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" + ], + "markers": "python_version >= '3.9'", + "version": "==2024.1" + }, "wrapt": { "hashes": [ "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc", @@ -419,19 +510,19 @@ }, "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "babel": { "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" + "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", + "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316" ], "markers": "python_version >= '3.8'", - "version": "==2.15.0" + "version": "==2.16.0" }, "backports.tarfile": { "hashes": [ @@ -473,11 +564,11 @@ }, "certifi": { "hashes": [ - "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", - "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.6.2" + "version": "==2024.8.30" }, "charset-normalizer": { "hashes": [ @@ -730,11 +821,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", - "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" + "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", + "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc" ], "markers": "python_version < '3.11'", - "version": "==1.2.1" + "version": "==1.2.2" }, "execnet": { "hashes": [ @@ -782,51 +873,51 @@ }, "fonttools": { "hashes": [ - "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d", - "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64", - "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2", - "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4", - "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6", - "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b", - "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f", - "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380", - "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e", - "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749", - "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20", - "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0", - "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4", - "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5", - "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206", - "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9", - "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac", - "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1", - "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce", - "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4", - "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12", - "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca", - "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d", - "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068", - "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796", - "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec", - "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea", - "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f", - "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005", - "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2", - "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06", - "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109", - "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002", - "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9", - "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a", - "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68", - "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6", - "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161", - "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd", - "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d", - "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee", - "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af" + "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", + "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", + "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", + "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", + "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", + "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", + "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", + "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", + "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", + "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", + "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", + "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", + "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", + "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", + "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", + "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", + "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", + "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", + "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", + "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", + "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", + "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", + "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", + "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", + "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", + "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", + "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", + "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", + "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", + "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", + "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", + "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", + "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", + "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", + "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", + "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", + "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", + "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", + "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", + "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", + "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", + "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" ], "markers": "python_version >= '3.8'", - "version": "==4.53.0" + "version": "==4.53.1" }, "gprof2dot": { "hashes": [ @@ -847,11 +938,11 @@ }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "imagesize": { "hashes": [ @@ -863,11 +954,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:509ecb2ab77071db5137c655e24ceb3eee66e7bbc6574165d0d114d9fc4bbe68", - "sha256:ffef94b0b66046dd8ea2d619b701fe978d9264d38f3998bc4c27ec3b146a87c8" + "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", + "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5" ], "markers": "python_version >= '3.8'", - "version": "==7.2.1" + "version": "==8.4.0" }, "iniconfig": { "hashes": [ @@ -887,19 +978,19 @@ }, "jaraco.context": { "hashes": [ - "sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266", - "sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2" + "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", + "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4" ], "markers": "python_version >= '3.8'", - "version": "==5.3.0" + "version": "==6.0.1" }, "jaraco.functools": { "hashes": [ - "sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664", - "sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8" + "sha256:3460c74cd0d32bf82b9576bbb3527c4364d5b27a21f5158a62aed6c4b42e23f5", + "sha256:c9d16a3ed4ccb5a889ad8e0b7a343401ee5b2a71cee6ed192d3f68bc351e94e3" ], "markers": "python_version >= '3.8'", - "version": "==4.0.1" + "version": "==4.0.2" }, "jinja2": { "hashes": [ @@ -910,132 +1001,133 @@ "markers": "python_version >= '3.6'", "version": "==3.0.3" }, - "jsonschema": { - "hashes": [ - "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d", - "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==4.17.3" - }, "keyring": { "hashes": [ - "sha256:2458681cdefc0dbc0b7eb6cf75d0b98e59f9ad9b2d4edd319d18f68bdca95e50", - "sha256:daaffd42dbda25ddafb1ad5fec4024e5bbcfe424597ca1ca452b299861e49f1b" + "sha256:8d85a1ea5d6db8515b59e1c5d1d1678b03cf7fc8b8dcfb1651e8c4a524eb42ef", + "sha256:8d963da00ccdf06e356acd9bf3b743208878751032d8599c6cc89eb51310ffae" ], "markers": "python_version >= '3.8'", - "version": "==25.2.1" + "version": "==25.3.0" }, "kiwisolver": { "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" + "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a", + "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95", + "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5", + "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0", + "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d", + "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18", + "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b", + "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258", + "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95", + "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e", + "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383", + "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02", + "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b", + "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523", + "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee", + "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88", + "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd", + "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb", + "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4", + "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e", + "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c", + "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935", + "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee", + "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e", + "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038", + "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d", + "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b", + "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5", + "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107", + "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f", + "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2", + "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17", + "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb", + "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674", + "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706", + "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327", + "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3", + "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a", + "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2", + "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f", + "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948", + "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3", + "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e", + "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545", + "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc", + "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f", + "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650", + "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a", + "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8", + "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750", + "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b", + "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34", + "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225", + "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51", + "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c", + "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3", + "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde", + "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599", + "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c", + "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76", + "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6", + "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39", + "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9", + "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933", + "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad", + "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520", + "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1", + "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503", + "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b", + "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36", + "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a", + "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643", + "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60", + "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483", + "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf", + "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d", + "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6", + "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644", + "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2", + "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9", + "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2", + "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640", + "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade", + "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a", + "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c", + "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6", + "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00", + "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27", + "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2", + "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4", + "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379", + "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54", + "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09", + "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a", + "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c", + "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89", + "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407", + "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904", + "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376", + "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583", + "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278", + "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a", + "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d", + "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935", + "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb", + "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895", + "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b", + "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417", + "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608", + "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07", + "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05", + "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a", + "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d", + "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052" ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" + "markers": "python_version >= '3.8'", + "version": "==1.4.7" }, "markdown-it-py": { "hashes": [ @@ -1172,45 +1264,45 @@ }, "more-itertools": { "hashes": [ - "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463", - "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320" + "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", + "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6" ], "markers": "python_version >= '3.8'", - "version": "==10.3.0" + "version": "==10.5.0" }, "mypy": { "hashes": [ - "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6", - "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d", - "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02", - "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d", - "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3", - "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3", - "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3", - "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66", - "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259", - "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835", - "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd", - "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d", - "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8", - "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07", - "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b", - "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e", - "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6", - "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae", - "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9", - "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d", - "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a", - "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592", - "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218", - "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817", - "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4", - "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410", - "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55" + "sha256:0bea2a0e71c2a375c9fa0ede3d98324214d67b3cbbfcbd55ac8f750f85a414e3", + "sha256:104e9c1620c2675420abd1f6c44bab7dd33cc85aea751c985006e83dcd001095", + "sha256:14f9294528b5f5cf96c721f231c9f5b2733164e02c1c018ed1a0eff8a18005ac", + "sha256:1a5d8d8dd8613a3e2be3eae829ee891b6b2de6302f24766ff06cb2875f5be9c6", + "sha256:1d44c1e44a8be986b54b09f15f2c1a66368eb43861b4e82573026e04c48a9e20", + "sha256:25bcfa75b9b5a5f8d67147a54ea97ed63a653995a82798221cca2a315c0238c1", + "sha256:35ce88b8ed3a759634cb4eb646d002c4cef0a38f20565ee82b5023558eb90c00", + "sha256:56913ec8c7638b0091ef4da6fcc9136896914a9d60d54670a75880c3e5b99ace", + "sha256:65f190a6349dec29c8d1a1cd4aa71284177aee5949e0502e6379b42873eddbe7", + "sha256:6801319fe76c3f3a3833f2b5af7bd2c17bb93c00026a2a1b924e6762f5b19e13", + "sha256:72596a79bbfb195fd41405cffa18210af3811beb91ff946dbcb7368240eed6be", + "sha256:93743608c7348772fdc717af4aeee1997293a1ad04bc0ea6efa15bf65385c538", + "sha256:940bfff7283c267ae6522ef926a7887305945f716a7704d3344d6d07f02df850", + "sha256:96f8dbc2c85046c81bcddc246232d500ad729cb720da4e20fce3b542cab91287", + "sha256:98790025861cb2c3db8c2f5ad10fc8c336ed2a55f4daf1b8b3f877826b6ff2eb", + "sha256:a3824187c99b893f90c845bab405a585d1ced4ff55421fdf5c84cb7710995229", + "sha256:a83ec98ae12d51c252be61521aa5731f5512231d0b738b4cb2498344f0b840cd", + "sha256:becc9111ca572b04e7e77131bc708480cc88a911adf3d0239f974c034b78085c", + "sha256:c1a184c64521dc549324ec6ef7cbaa6b351912be9cb5edb803c2808a0d7e85ac", + "sha256:c7b73a856522417beb78e0fb6d33ef89474e7a622db2653bc1285af36e2e3e3d", + "sha256:cea3d0fb69637944dd321f41bc896e11d0fb0b0aa531d887a6da70f6e7473aba", + "sha256:d2b3d36baac48e40e3064d2901f2fbd2a2d6880ec6ce6358825c85031d7c0d4d", + "sha256:d7b54c27783991399046837df5c7c9d325d921394757d09dbcbf96aee4649fe9", + "sha256:d8e2e43977f0e09f149ea69fd0556623919f816764e26d74da0c8a7b48f3e18a", + "sha256:dbe286303241fea8c2ea5466f6e0e6a046a135a7e7609167b07fd4e7baf151bf", + "sha256:f006e955718ecd8d159cee9932b64fba8f86ee6f7728ca3ac66c3a54b0062abe", + "sha256:f2268d9fcd9686b61ab64f077be7ffbc6fbcdfb4103e5dd0cc5eaab53a8886c2" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.8.0" + "version": "==1.11.0" }, "mypy-extensions": { "hashes": [ @@ -1222,24 +1314,24 @@ }, "nh3": { "hashes": [ - "sha256:0316c25b76289cf23be6b66c77d3608a4fdf537b35426280032f432f14291b9a", - "sha256:1a814dd7bba1cb0aba5bcb9bebcc88fd801b63e21e2450ae6c52d3b3336bc911", - "sha256:1aa52a7def528297f256de0844e8dd680ee279e79583c76d6fa73a978186ddfb", - "sha256:22c26e20acbb253a5bdd33d432a326d18508a910e4dcf9a3316179860d53345a", - "sha256:40015514022af31975c0b3bca4014634fa13cb5dc4dbcbc00570acc781316dcc", - "sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028", - "sha256:551672fd71d06cd828e282abdb810d1be24e1abb7ae2543a8fa36a71c1006fe9", - "sha256:66f17d78826096291bd264f260213d2b3905e3c7fae6dfc5337d49429f1dc9f3", - "sha256:85cdbcca8ef10733bd31f931956f7fbb85145a4d11ab9e6742bbf44d88b7e351", - "sha256:a3f55fabe29164ba6026b5ad5c3151c314d136fd67415a17660b4aaddacf1b10", - "sha256:b4427ef0d2dfdec10b641ed0bdaf17957eb625b2ec0ea9329b3d28806c153d71", - "sha256:ba73a2f8d3a1b966e9cdba7b211779ad8a2561d2dba9674b8a19ed817923f65f", - "sha256:c21bac1a7245cbd88c0b0e4a420221b7bfa838a2814ee5bb924e9c2f10a1120b", - "sha256:c551eb2a3876e8ff2ac63dff1585236ed5dfec5ffd82216a7a174f7c5082a78a", - "sha256:c790769152308421283679a142dbdb3d1c46c79c823008ecea8e8141db1a2062", - "sha256:d7a25fd8c86657f5d9d576268e3b3767c5cd4f42867c9383618be8517f0f022a" - ], - "version": "==0.2.17" + "sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", + "sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", + "sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", + "sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", + "sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", + "sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", + "sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", + "sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", + "sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f", + "sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", + "sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", + "sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", + "sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be", + "sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50", + "sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", + "sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe" + ], + "version": "==0.2.18" }, "numpy": { "hashes": [ @@ -1275,19 +1367,14 @@ "index": "pypi", "version": "==0.9.1" }, - "opentrons-shared-data": { - "editable": true, - "markers": "python_version >= '3.10'", - "path": "../shared-data/python" - }, "packaging": { "hashes": [ - "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", - "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" + "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3", + "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==21.3" + "markers": "python_version >= '3.7'", + "version": "==22.0" }, "pathspec": { "hashes": [ @@ -1297,84 +1384,91 @@ "markers": "python_version >= '3.8'", "version": "==0.12.1" }, - "performance-metrics": { - "editable": true, - "file": "../performance-metrics" - }, "pillow": { "hashes": [ - "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c", - "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2", - "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb", - "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d", - "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa", - "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3", - "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1", - "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a", - "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd", - "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8", - "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999", - "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599", - "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936", - "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375", - "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d", - "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b", - "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60", - "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572", - "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3", - "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced", - "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f", - "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b", - "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19", - "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f", - "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d", - "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383", - "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795", - "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355", - "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57", - "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09", - "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b", - "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462", - "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf", - "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f", - "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a", - "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad", - "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9", - "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d", - "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45", - "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994", - "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d", - "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338", - "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463", - "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451", - "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591", - "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c", - "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd", - "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32", - "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9", - "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf", - "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5", - "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828", - "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3", - "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5", - "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2", - "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b", - "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2", - "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475", - "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3", - "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb", - "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef", - "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015", - "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002", - "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170", - "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84", - "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57", - "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f", - "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27", - "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a" + "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", + "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", + "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", + "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", + "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", + "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", + "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", + "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", + "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", + "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", + "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", + "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", + "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", + "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", + "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", + "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", + "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", + "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", + "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", + "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", + "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", + "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", + "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", + "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", + "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", + "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", + "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", + "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", + "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", + "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", + "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", + "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", + "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", + "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", + "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", + "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", + "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", + "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", + "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", + "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", + "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", + "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", + "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", + "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", + "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", + "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", + "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", + "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", + "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", + "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", + "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", + "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", + "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", + "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", + "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", + "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", + "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", + "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", + "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", + "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", + "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", + "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", + "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", + "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", + "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", + "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", + "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", + "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", + "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", + "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", + "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", + "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", + "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", + "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", + "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", + "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", + "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", + "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", + "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", + "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" ], "markers": "python_version >= '3.8'", - "version": "==10.3.0" + "version": "==10.4.0" }, "pkginfo": { "hashes": [ @@ -1416,49 +1510,6 @@ "markers": "python_version >= '3.8'", "version": "==2.11.1" }, - "pydantic": { - "hashes": [ - "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303", - "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe", - "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47", - "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494", - "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33", - "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86", - "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d", - "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c", - "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a", - "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565", - "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb", - "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62", - "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62", - "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0", - "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523", - "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d", - "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405", - "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f", - "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b", - "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718", - "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed", - "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb", - "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5", - "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc", - "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942", - "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe", - "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246", - "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350", - "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303", - "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09", - "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33", - "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8", - "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a", - "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1", - "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6", - "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==1.10.12" - }, "pydocstyle": { "hashes": [ "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019", @@ -1485,49 +1536,11 @@ }, "pyparsing": { "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" + "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", + "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032" ], "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" + "version": "==3.1.4" }, "pytest": { "hashes": [ @@ -1540,12 +1553,12 @@ }, "pytest-asyncio": { "hashes": [ - "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b", - "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268" + "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2", + "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==0.23.7" + "version": "==0.23.8" }, "pytest-cov": { "hashes": [ @@ -1596,7 +1609,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "readme-renderer": { @@ -1633,18 +1646,18 @@ }, "rich": { "hashes": [ - "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222", - "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432" + "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc", + "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4" ], "markers": "python_full_version >= '3.7.0'", - "version": "==13.7.1" + "version": "==13.8.0" }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "snowballstemmer": { @@ -1695,27 +1708,27 @@ }, "sphinxcontrib-applehelp": { "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" + "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", + "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5" ], "markers": "python_version >= '3.9'", - "version": "==1.0.8" + "version": "==2.0.0" }, "sphinxcontrib-devhelp": { "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" + "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", + "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2" ], "markers": "python_version >= '3.9'", - "version": "==1.0.6" + "version": "==2.0.0" }, "sphinxcontrib-htmlhelp": { "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" + "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", + "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9" ], "markers": "python_version >= '3.9'", - "version": "==2.0.5" + "version": "==2.1.0" }, "sphinxcontrib-jsmath": { "hashes": [ @@ -1727,19 +1740,19 @@ }, "sphinxcontrib-qthelp": { "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" + "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", + "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb" ], "markers": "python_version >= '3.9'", - "version": "==1.0.7" + "version": "==2.0.0" }, "sphinxcontrib-serializinghtml": { "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" + "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", + "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d" ], "markers": "python_version >= '3.9'", - "version": "==1.1.10" + "version": "==2.0.0" }, "sphinxext-opengraph": { "hashes": [ @@ -1798,7 +1811,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.13'", "version": "==4.12.2" }, "urllib3": { @@ -1820,11 +1833,11 @@ }, "zipp": { "hashes": [ - "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", - "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" + "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064", + "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b" ], "markers": "python_version >= '3.8'", - "version": "==3.19.2" + "version": "==3.20.1" } } } diff --git a/api/pytest.ini b/api/pytest.ini index 61288b3f3c1..78115d41057 100644 --- a/api/pytest.ini +++ b/api/pytest.ini @@ -6,8 +6,13 @@ markers = addopts = --color=yes --strict-markers asyncio_mode = auto -# TODO this should be looked into being removed upon updating the Decoy library. The purpose of this warning is to -# catch missing attributes, but it raises for any property referenced in a test which accounts for about ~250 warnings -# which aren't serving any useful purpose and obscure other warnings. filterwarnings = + # TODO this should be looked into being removed upon updating the Decoy library. The purpose of this warning is to + # catch missing attributes, but it raises for any property referenced in a test which accounts for about ~250 warnings + # which aren't serving any useful purpose and obscure other warnings. ignore::decoy.warnings.MissingSpecAttributeWarning + # Pydantic's shims for its legacy v1 methods (e.g. `BaseModel.construct()`) + # are not type-checked properly. Forbid them, so we're forced to use their newer + # v2 replacements which are type-checked (e.g. ``BaseModel.model_construct()`) + error::pydantic.PydanticDeprecatedSince20 + diff --git a/api/setup.py b/api/setup.py index 92f06b49bef..a85fc83f114 100755 --- a/api/setup.py +++ b/api/setup.py @@ -59,9 +59,11 @@ def get_version(): f"opentrons-shared-data=={VERSION}", "aionotify==0.3.1", "anyio>=3.6.1,<4.0.0", + # todo(mm, 2024-12-14): investigate ref resolution problems caused by jsonschema>=4.18.1. "jsonschema>=3.0.1,<4.18.0", "numpy>=1.20.0,<2", - "pydantic>=1.10.9,<2.0.0", + "pydantic>=2.0.0,<3", + "pydantic-settings>=2,<3", "pyserial>=3.5", "typing-extensions>=4.0.0,<5", "click>=8.0.0,<9", diff --git a/api/src/opentrons/calibration_storage/deck_configuration.py b/api/src/opentrons/calibration_storage/deck_configuration.py index a627fce73c9..857c2c22d3f 100644 --- a/api/src/opentrons/calibration_storage/deck_configuration.py +++ b/api/src/opentrons/calibration_storage/deck_configuration.py @@ -10,7 +10,7 @@ class _CutoutFixturePlacementModel(pydantic.BaseModel): cutoutId: str cutoutFixtureId: str - opentronsModuleSerialNumber: Optional[str] + opentronsModuleSerialNumber: Optional[str] = None class _DeckConfigurationModel(pydantic.BaseModel): @@ -24,9 +24,9 @@ def serialize_deck_configuration( cutout_fixture_placements: List[CutoutFixturePlacement], last_modified: datetime ) -> bytes: """Serialize a deck configuration for storing on the filesystem.""" - data = _DeckConfigurationModel.construct( + data = _DeckConfigurationModel.model_construct( cutoutFixtures=[ - _CutoutFixturePlacementModel.construct( + _CutoutFixturePlacementModel.model_construct( cutoutId=e.cutout_id, cutoutFixtureId=e.cutout_fixture_id, opentronsModuleSerialNumber=e.opentrons_module_serial_number, diff --git a/api/src/opentrons/calibration_storage/file_operators.py b/api/src/opentrons/calibration_storage/file_operators.py index 70c16297ecd..bf80a034d54 100644 --- a/api/src/opentrons/calibration_storage/file_operators.py +++ b/api/src/opentrons/calibration_storage/file_operators.py @@ -103,7 +103,7 @@ def save_to_file( directory_path.mkdir(parents=True, exist_ok=True) file_path = directory_path / f"{file_name}.json" json_data = ( - data.json() + data.model_dump_json() if isinstance(data, pydantic.BaseModel) else json.dumps(data, cls=encoder) ) @@ -112,7 +112,7 @@ def save_to_file( def serialize_pydantic_model(data: pydantic.BaseModel) -> bytes: """Safely serialize data from a Pydantic model into a form suitable for storing on disk.""" - return data.json(by_alias=True).encode("utf-8") + return data.model_dump_json(by_alias=True).encode("utf-8") _ModelT = typing.TypeVar("_ModelT", bound=pydantic.BaseModel) @@ -133,7 +133,7 @@ def deserialize_pydantic_model( Returns `None` if the file is missing or corrupt. """ try: - return model.parse_raw(serialized) + return model.model_validate_json(serialized) except json.JSONDecodeError: _log.warning("Data is not valid JSON.", exc_info=True) return None diff --git a/api/src/opentrons/calibration_storage/helpers.py b/api/src/opentrons/calibration_storage/helpers.py index 1d271add9dd..db11dac3453 100644 --- a/api/src/opentrons/calibration_storage/helpers.py +++ b/api/src/opentrons/calibration_storage/helpers.py @@ -31,7 +31,9 @@ def convert_to_dict(obj: Any) -> Dict[str, Any]: # https://github.com/python/mypy/issues/6568 # Unfortunately, since it's not currently supported I have an # assert check instead. - assert is_dataclass(obj), "This function is intended for dataclasses only" + assert is_dataclass(obj) and not isinstance( + obj, type + ), "This function is intended for dataclasses only" return asdict(obj, dict_factory=dict_filter_none) diff --git a/api/src/opentrons/calibration_storage/ot2/models/v1.py b/api/src/opentrons/calibration_storage/ot2/models/v1.py index 922922415c8..23836e67c98 100644 --- a/api/src/opentrons/calibration_storage/ot2/models/v1.py +++ b/api/src/opentrons/calibration_storage/ot2/models/v1.py @@ -1,7 +1,7 @@ import typing from typing_extensions import Literal -from pydantic import BaseModel, Field, validator +from pydantic import field_validator, BaseModel, Field, PlainSerializer from datetime import datetime from opentrons_shared_data.pipette.types import LabwareUri @@ -9,11 +9,16 @@ from opentrons.types import Point from opentrons.calibration_storage import types +DatetimeType = typing.Annotated[ + datetime, + PlainSerializer(lambda x: x.isoformat(), when_used="json"), +] + class CalibrationStatus(BaseModel): markedBad: bool = False source: typing.Optional[types.SourceType] = None - markedAt: typing.Optional[datetime] = None + markedAt: typing.Optional[DatetimeType] = None # Schemas used to store the data types @@ -22,7 +27,7 @@ class CalibrationStatus(BaseModel): # they are currently saved in on the OT-2 to avoid a large migration. class TipLengthModel(BaseModel): tipLength: float = Field(..., description="Tip length data found from calibration.") - lastModified: datetime = Field( + lastModified: DatetimeType = Field( ..., description="The last time this tip length was calibrated." ) source: types.SourceType = Field( @@ -40,22 +45,19 @@ class TipLengthModel(BaseModel): ..., description="The tiprack hash associated with the tip length data." ) - @validator("tipLength") + @field_validator("tipLength") + @classmethod def ensure_tip_length_positive(cls, tipLength: float) -> float: if tipLength < 0.0: raise ValueError("Tip Length must be a positive number") return tipLength - class Config: - json_encoders = {datetime: lambda obj: obj.isoformat()} - json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)} - class DeckCalibrationModel(BaseModel): attitude: types.AttitudeMatrix = Field( ..., description="Attitude matrix for deck found from calibration." ) - last_modified: typing.Optional[datetime] = Field( + last_modified: typing.Optional[DatetimeType] = Field( default=None, description="The last time this deck was calibrated." ) source: types.SourceType = Field( @@ -72,10 +74,6 @@ class DeckCalibrationModel(BaseModel): description="The status of the calibration data.", ) - class Config: - json_encoders = {datetime: lambda obj: obj.isoformat()} - json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)} - class InstrumentOffsetModel(BaseModel): offset: Point = Field(..., description="Instrument offset found from calibration.") @@ -83,7 +81,7 @@ class InstrumentOffsetModel(BaseModel): uri: str = Field( ..., description="The URI of the labware used for instrument offset" ) - last_modified: datetime = Field( + last_modified: DatetimeType = Field( ..., description="The last time this instrument was calibrated." ) source: types.SourceType = Field( @@ -94,10 +92,6 @@ class InstrumentOffsetModel(BaseModel): description="The status of the calibration data.", ) - class Config: - json_encoders = {datetime: lambda obj: obj.isoformat()} - json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)} - # TODO(lc 09-19-2022) We need to refactor the calibration endpoints # so that we only need to use one data model schema. This model is a @@ -112,7 +106,7 @@ class PipetteOffsetCalibration(BaseModel): uri: str = Field( ..., description="The URI of the labware used for instrument offset" ) - last_modified: datetime = Field( + last_modified: DatetimeType = Field( ..., description="The last time this instrument was calibrated." ) source: types.SourceType = Field( @@ -123,10 +117,6 @@ class PipetteOffsetCalibration(BaseModel): description="The status of the calibration data.", ) - class Config: - json_encoders = {datetime: lambda obj: obj.isoformat()} - json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)} - # TODO(lc 09-19-2022) We need to refactor the calibration endpoints # so that we only need to use one data model schema. This model is a @@ -137,7 +127,7 @@ class TipLengthCalibration(BaseModel): ..., description="The tiprack hash associated with this tip length data." ) tipLength: float = Field(..., description="Tip length data found from calibration.") - lastModified: datetime = Field( + lastModified: DatetimeType = Field( ..., description="The last time this tip length was calibrated." ) source: types.SourceType = Field( @@ -151,12 +141,9 @@ class TipLengthCalibration(BaseModel): ..., description="The tiprack URI associated with the tip length data." ) - @validator("tipLength") + @field_validator("tipLength") + @classmethod def ensure_tip_length_positive(cls, tipLength: float) -> float: if tipLength < 0.0: raise ValueError("Tip Length must be a positive number") return tipLength - - class Config: - json_encoders = {datetime: lambda obj: obj.isoformat()} - json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)} diff --git a/api/src/opentrons/calibration_storage/ot2/tip_length.py b/api/src/opentrons/calibration_storage/ot2/tip_length.py index a0bcdcabf9d..979916bd85e 100644 --- a/api/src/opentrons/calibration_storage/ot2/tip_length.py +++ b/api/src/opentrons/calibration_storage/ot2/tip_length.py @@ -24,13 +24,14 @@ def _convert_tip_length_model_to_dict( - to_dict: typing.Dict[LabwareUri, v1.TipLengthModel] + to_dict: typing.Dict[LabwareUri, v1.TipLengthModel], ) -> typing.Dict[LabwareUri, typing.Any]: + # TODO[pydantic]: supported in Pydantic V2 # This is a workaround since pydantic doesn't have a nice way to # add encoders when converting to a dict. dict_of_tip_lengths = {} for key, item in to_dict.items(): - dict_of_tip_lengths[key] = json.loads(item.json()) + dict_of_tip_lengths[key] = json.loads(item.model_dump_json()) return dict_of_tip_lengths @@ -175,12 +176,14 @@ def delete_tip_length_calibration( io.save_to_file(tip_length_dir, pipette_id, dict_of_tip_lengths) else: io.delete_file(tip_length_dir / f"{pipette_id}.json") - elif tiprack_hash and any(tiprack_hash in v.dict() for v in tip_lengths.values()): + elif tiprack_hash and any( + tiprack_hash in v.model_dump() for v in tip_lengths.values() + ): # NOTE this is for backwards compatibilty only # TODO delete this check once the tip_length DELETE router # no longer depends on a tiprack hash for k, v in tip_lengths.items(): - if tiprack_hash in v.dict(): + if tiprack_hash in v.model_dump(): tip_lengths.pop(k) if tip_lengths: dict_of_tip_lengths = _convert_tip_length_model_to_dict(tip_lengths) diff --git a/api/src/opentrons/calibration_storage/ot3/models/v1.py b/api/src/opentrons/calibration_storage/ot3/models/v1.py index 55e028465c7..b895eac4c89 100644 --- a/api/src/opentrons/calibration_storage/ot3/models/v1.py +++ b/api/src/opentrons/calibration_storage/ot3/models/v1.py @@ -3,7 +3,7 @@ from typing_extensions import Literal from opentrons.hardware_control.modules.types import ModuleType from opentrons.hardware_control.types import OT3Mount -from pydantic import BaseModel, Field, validator +from pydantic import field_validator, BaseModel, Field, PlainSerializer from datetime import datetime from opentrons_shared_data.pipette.types import LabwareUri @@ -12,15 +12,21 @@ from opentrons.calibration_storage import types +DatetimeType = typing.Annotated[ + datetime, + PlainSerializer(lambda x: x.isoformat(), when_used="json"), +] + + class CalibrationStatus(BaseModel): markedBad: bool = False source: typing.Optional[types.SourceType] = None - markedAt: typing.Optional[datetime] = None + markedAt: typing.Optional[DatetimeType] = None class TipLengthModel(BaseModel): tipLength: float = Field(..., description="Tip length data found from calibration.") - lastModified: datetime = Field( + lastModified: DatetimeType = Field( ..., description="The last time this tip length was calibrated." ) uri: typing.Union[LabwareUri, Literal[""]] = Field( @@ -34,22 +40,19 @@ class TipLengthModel(BaseModel): description="The status of the calibration data.", ) - @validator("tipLength") + @field_validator("tipLength") + @classmethod def ensure_tip_length_positive(cls, tipLength: float) -> float: if tipLength < 0.0: raise ValueError("Tip Length must be a positive number") return tipLength - class Config: - json_encoders = {datetime: lambda obj: obj.isoformat()} - json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)} - class BeltCalibrationModel(BaseModel): attitude: types.AttitudeMatrix = Field( ..., description="Attitude matrix for belts found from calibration." ) - lastModified: datetime = Field( + lastModified: DatetimeType = Field( ..., description="The last time this deck was calibrated." ) source: types.SourceType = Field( @@ -63,14 +66,10 @@ class BeltCalibrationModel(BaseModel): description="The status of the calibration data.", ) - class Config: - json_encoders = {datetime: lambda obj: obj.isoformat()} - json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)} - class InstrumentOffsetModel(BaseModel): offset: Point = Field(..., description="Instrument offset found from calibration.") - lastModified: datetime = Field( + lastModified: DatetimeType = Field( ..., description="The last time this instrument was calibrated." ) source: types.SourceType = Field( @@ -81,10 +80,6 @@ class InstrumentOffsetModel(BaseModel): description="The status of the calibration data.", ) - class Config: - json_encoders = {datetime: lambda obj: obj.isoformat()} - json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)} - class ModuleOffsetModel(BaseModel): offset: Point = Field(..., description="Module offset found from calibration.") @@ -99,7 +94,7 @@ class ModuleOffsetModel(BaseModel): ..., description="The unique id of the instrument used to calibrate this module.", ) - lastModified: datetime = Field( + lastModified: DatetimeType = Field( ..., description="The last time this module was calibrated." ) source: types.SourceType = Field( @@ -109,7 +104,3 @@ class ModuleOffsetModel(BaseModel): default_factory=CalibrationStatus, description="The status of the calibration data.", ) - - class Config: - json_encoders = {datetime: lambda obj: obj.isoformat()} - json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)} diff --git a/api/src/opentrons/cli/analyze.py b/api/src/opentrons/cli/analyze.py index e98f3e807d7..1ce161a96a7 100644 --- a/api/src/opentrons/cli/analyze.py +++ b/api/src/opentrons/cli/analyze.py @@ -382,16 +382,20 @@ async def _analyze( else: result = AnalysisResult.OK - results = AnalyzeResults.construct( + results = AnalyzeResults.model_construct( createdAt=datetime.now(tz=timezone.utc), files=[ - ProtocolFile.construct(name=f.path.name, role=f.role) + ProtocolFile.model_construct(name=f.path.name, role=f.role) for f in protocol_source.files ], config=( - JsonConfig.construct(schemaVersion=protocol_source.config.schema_version) + JsonConfig.model_construct( + schemaVersion=protocol_source.config.schema_version + ) if isinstance(protocol_source.config, JsonProtocolConfig) - else PythonConfig.construct(apiVersion=protocol_source.config.api_version) + else PythonConfig.model_construct( + apiVersion=protocol_source.config.api_version + ) ), result=result, metadata=protocol_source.metadata, @@ -411,14 +415,14 @@ async def _analyze( "json", outputs, lambda to_file: to_file.write( - results.json(exclude_none=True).encode("utf-8"), + results.model_dump_json(exclude_none=True).encode("utf-8"), ), ) _call_for_output_of_kind( "human-json", outputs, lambda to_file: to_file.write( - results.json(exclude_none=True, indent=2).encode("utf-8") + results.model_dump_json(exclude_none=True, indent=2).encode("utf-8") ), ) if check: diff --git a/api/src/opentrons/drivers/asyncio/communication/serial_connection.py b/api/src/opentrons/drivers/asyncio/communication/serial_connection.py index 294e5779a7b..f925cfe8680 100644 --- a/api/src/opentrons/drivers/asyncio/communication/serial_connection.py +++ b/api/src/opentrons/drivers/asyncio/communication/serial_connection.py @@ -298,6 +298,7 @@ async def create( alarm_keyword: Optional[str] = None, reset_buffer_before_write: bool = False, async_error_ack: Optional[str] = None, + number_of_retries: int = 0, ) -> AsyncResponseSerialConnection: """ Create a connection. @@ -340,6 +341,7 @@ async def create( error_keyword=error_keyword or "err", alarm_keyword=alarm_keyword or "alarm", async_error_ack=async_error_ack or "async", + number_of_retries=number_of_retries, ) def __init__( @@ -352,6 +354,7 @@ def __init__( error_keyword: str, alarm_keyword: str, async_error_ack: str, + number_of_retries: int = 0, ) -> None: """ Constructor @@ -383,6 +386,7 @@ def __init__( self._name = name self._ack = ack.encode() self._retry_wait_time_seconds = retry_wait_time_seconds + self._number_of_retries = number_of_retries self._error_keyword = error_keyword.lower() self._alarm_keyword = alarm_keyword.lower() self._async_error_ack = async_error_ack.lower() @@ -403,7 +407,9 @@ async def send_command( Raises: SerialException """ return await self.send_data( - data=command.build(), retries=retries, timeout=timeout + data=command.build(), + retries=retries or self._number_of_retries, + timeout=timeout, ) async def send_data( @@ -424,7 +430,9 @@ async def send_data( async with super().send_data_lock, self._serial.timeout_override( "timeout", timeout ): - return await self._send_data(data=data, retries=retries) + return await self._send_data( + data=data, retries=retries or self._number_of_retries + ) async def _send_data(self, data: str, retries: int = 0) -> str: """ @@ -439,6 +447,7 @@ async def _send_data(self, data: str, retries: int = 0) -> str: Raises: SerialException """ data_encode = data.encode() + retries = retries or self._number_of_retries for retry in range(retries + 1): log.debug(f"{self._name}: Write -> {data_encode!r}") diff --git a/api/src/opentrons/drivers/command_builder.py b/api/src/opentrons/drivers/command_builder.py index 99ac5c7890c..ea90a12b946 100644 --- a/api/src/opentrons/drivers/command_builder.py +++ b/api/src/opentrons/drivers/command_builder.py @@ -6,7 +6,7 @@ class CommandBuilder: """Class used to build GCODE commands.""" - def __init__(self, terminator: str) -> None: + def __init__(self, terminator: str = "\n") -> None: """ Construct a command builder. @@ -17,7 +17,7 @@ def __init__(self, terminator: str) -> None: self._elements: List[str] = [] def add_float( - self, prefix: str, value: float, precision: Optional[int] + self, prefix: str, value: float, precision: Optional[int] = None ) -> CommandBuilder: """ Add a float value. diff --git a/api/src/opentrons/drivers/flex_stacker/__init__.py b/api/src/opentrons/drivers/flex_stacker/__init__.py new file mode 100644 index 00000000000..cd4866c179a --- /dev/null +++ b/api/src/opentrons/drivers/flex_stacker/__init__.py @@ -0,0 +1,9 @@ +from .abstract import AbstractStackerDriver +from .driver import FlexStackerDriver +from .simulator import SimulatingDriver + +__all__ = [ + "AbstractStackerDriver", + "FlexStackerDriver", + "SimulatingDriver", +] diff --git a/api/src/opentrons/drivers/flex_stacker/abstract.py b/api/src/opentrons/drivers/flex_stacker/abstract.py new file mode 100644 index 00000000000..5ba3cdcb026 --- /dev/null +++ b/api/src/opentrons/drivers/flex_stacker/abstract.py @@ -0,0 +1,89 @@ +from typing import Protocol + +from .types import ( + StackerAxis, + PlatformStatus, + Direction, + MoveParams, + StackerInfo, + LEDColor, +) + + +class AbstractStackerDriver(Protocol): + """Protocol for the Stacker driver.""" + + async def connect(self) -> None: + """Connect to stacker.""" + ... + + async def disconnect(self) -> None: + """Disconnect from stacker.""" + ... + + async def is_connected(self) -> bool: + """Check connection to stacker.""" + ... + + async def update_firmware(self, firmware_file_path: str) -> None: + """Updates the firmware on the device.""" + ... + + async def get_device_info(self) -> StackerInfo: + """Get Device Info.""" + ... + + async def set_serial_number(self, sn: str) -> bool: + """Set Serial Number.""" + ... + + async def stop_motors(self) -> bool: + """Stop all motor movement.""" + ... + + async def get_limit_switch(self, axis: StackerAxis, direction: Direction) -> bool: + """Get limit switch status. + + :return: True if limit switch is triggered, False otherwise + """ + ... + + async def get_platform_sensor(self, direction: Direction) -> bool: + """Get platform sensor status. + + :return: True if platform is present, False otherwise + """ + ... + + async def get_platform_status(self) -> PlatformStatus: + """Get platform status.""" + ... + + async def get_hopper_door_closed(self) -> bool: + """Get whether or not door is closed. + + :return: True if door is closed, False otherwise + """ + ... + + async def move_in_mm( + self, axis: StackerAxis, distance: float, params: MoveParams | None = None + ) -> bool: + """Move axis.""" + ... + + async def move_to_limit_switch( + self, axis: StackerAxis, direction: Direction, params: MoveParams | None = None + ) -> bool: + """Move until limit switch is triggered.""" + ... + + async def home_axis(self, axis: StackerAxis, direction: Direction) -> bool: + """Home axis.""" + ... + + async def set_led( + self, power: float, color: LEDColor | None = None, external: bool | None = None + ) -> bool: + """Set LED color of status bar.""" + ... diff --git a/api/src/opentrons/drivers/flex_stacker/driver.py b/api/src/opentrons/drivers/flex_stacker/driver.py new file mode 100644 index 00000000000..83671023772 --- /dev/null +++ b/api/src/opentrons/drivers/flex_stacker/driver.py @@ -0,0 +1,260 @@ +import asyncio +import re +from typing import Optional + +from opentrons.drivers.command_builder import CommandBuilder +from opentrons.drivers.asyncio.communication import AsyncResponseSerialConnection + +from .abstract import AbstractStackerDriver +from .types import ( + GCODE, + StackerAxis, + PlatformStatus, + Direction, + StackerInfo, + HardwareRevision, + MoveParams, + LimitSwitchStatus, + LEDColor, +) + + +FS_BAUDRATE = 115200 +DEFAULT_FS_TIMEOUT = 40 +FS_ACK = "OK\n" +FS_ERROR_KEYWORD = "err" +FS_ASYNC_ERROR_ACK = "async" +DEFAULT_COMMAND_RETRIES = 0 +GCODE_ROUNDING_PRECISION = 2 + + +class FlexStackerDriver(AbstractStackerDriver): + """FLEX Stacker driver.""" + + @classmethod + def parse_device_info(cls, response: str) -> StackerInfo: + """Parse stacker info.""" + # TODO: Validate serial number format once established + _RE = re.compile( + f"^{GCODE.DEVICE_INFO} FW:(?P\\S+) HW:Opentrons-flex-stacker-(?P\\S+) SerialNo:(?P\\S+)$" + ) + m = _RE.match(response) + if not m: + raise ValueError(f"Incorrect Response for device info: {response}") + return StackerInfo( + m.group("fw"), HardwareRevision(m.group("hw")), m.group("sn") + ) + + @classmethod + def parse_limit_switch_status(cls, response: str) -> LimitSwitchStatus: + """Parse limit switch statuses.""" + field_names = LimitSwitchStatus.get_fields() + pattern = r"\s".join([rf"{name}:(?P<{name}>\d)" for name in field_names]) + _RE = re.compile(f"^{GCODE.GET_LIMIT_SWITCH} {pattern}$") + m = _RE.match(response) + if not m: + raise ValueError(f"Incorrect Response for limit switch status: {response}") + return LimitSwitchStatus(*(bool(int(m.group(name))) for name in field_names)) + + @classmethod + def parse_platform_sensor_status(cls, response: str) -> PlatformStatus: + """Parse platform statuses.""" + field_names = PlatformStatus.get_fields() + pattern = r"\s".join([rf"{name}:(?P<{name}>\d)" for name in field_names]) + _RE = re.compile(f"^{GCODE.GET_PLATFORM_SENSOR} {pattern}$") + m = _RE.match(response) + if not m: + raise ValueError(f"Incorrect Response for platform status: {response}") + return PlatformStatus(*(bool(int(m.group(name))) for name in field_names)) + + @classmethod + def parse_door_closed(cls, response: str) -> bool: + """Parse door closed.""" + _RE = re.compile(r"^M122 D:(\d)$") + match = _RE.match(response) + if not match: + raise ValueError(f"Incorrect Response for door closed: {response}") + return bool(int(match.group(1))) + + @classmethod + def append_move_params( + cls, command: CommandBuilder, params: MoveParams | None + ) -> CommandBuilder: + """Append move params.""" + if params is not None: + if params.max_speed is not None: + command.add_float("V", params.max_speed, GCODE_ROUNDING_PRECISION) + if params.acceleration is not None: + command.add_float("A", params.acceleration, GCODE_ROUNDING_PRECISION) + if params.max_speed_discont is not None: + command.add_float( + "D", params.max_speed_discont, GCODE_ROUNDING_PRECISION + ) + return command + + @classmethod + async def create( + cls, port: str, loop: Optional[asyncio.AbstractEventLoop] + ) -> "FlexStackerDriver": + """Create a FLEX Stacker driver.""" + connection = await AsyncResponseSerialConnection.create( + port=port, + baud_rate=FS_BAUDRATE, + timeout=DEFAULT_FS_TIMEOUT, + number_of_retries=DEFAULT_COMMAND_RETRIES, + ack=FS_ACK, + loop=loop, + error_keyword=FS_ERROR_KEYWORD, + async_error_ack=FS_ASYNC_ERROR_ACK, + ) + return cls(connection) + + def __init__(self, connection: AsyncResponseSerialConnection) -> None: + """ + Constructor + + Args: + connection: Connection to the FLEX Stacker + """ + self._connection = connection + + async def connect(self) -> None: + """Connect to stacker.""" + await self._connection.open() + + async def disconnect(self) -> None: + """Disconnect from stacker.""" + await self._connection.close() + + async def is_connected(self) -> bool: + """Check connection to stacker.""" + return await self._connection.is_open() + + async def get_device_info(self) -> StackerInfo: + """Get Device Info.""" + response = await self._connection.send_command( + GCODE.DEVICE_INFO.build_command() + ) + await self._connection.send_command(GCODE.GET_RESET_REASON.build_command()) + return self.parse_device_info(response) + + async def set_serial_number(self, sn: str) -> bool: + """Set Serial Number.""" + # TODO: validate the serial number format + resp = await self._connection.send_command( + GCODE.SET_SERIAL_NUMBER.build_command().add_element(sn) + ) + if not re.match(rf"^{GCODE.SET_SERIAL_NUMBER}$", resp): + raise ValueError(f"Incorrect Response for set serial number: {resp}") + return True + + async def stop_motors(self) -> bool: + """Stop all motor movement.""" + resp = await self._connection.send_command(GCODE.STOP_MOTORS.build_command()) + if not re.match(rf"^{GCODE.STOP_MOTORS}$", resp): + raise ValueError(f"Incorrect Response for stop motors: {resp}") + return True + + async def get_limit_switch(self, axis: StackerAxis, direction: Direction) -> bool: + """Get limit switch status. + + :return: True if limit switch is triggered, False otherwise + """ + response = await self.get_limit_switches_status() + return response.get(axis, direction) + + async def get_limit_switches_status(self) -> LimitSwitchStatus: + """Get limit switch statuses for all axes.""" + response = await self._connection.send_command( + GCODE.GET_LIMIT_SWITCH.build_command() + ) + return self.parse_limit_switch_status(response) + + async def get_platform_sensor(self, direction: Direction) -> bool: + """Get platform sensor at one direction.""" + response = await self.get_platform_status() + return response.get(direction) + + async def get_platform_status(self) -> PlatformStatus: + """Get platform sensor status. + + :return: True if platform is detected, False otherwise + """ + response = await self._connection.send_command( + GCODE.GET_PLATFORM_SENSOR.build_command() + ) + return self.parse_platform_sensor_status(response) + + async def get_hopper_door_closed(self) -> bool: + """Get whether or not door is closed. + + :return: True if door is closed, False otherwise + """ + response = await self._connection.send_command( + GCODE.GET_DOOR_SWITCH.build_command() + ) + return self.parse_door_closed(response) + + async def move_in_mm( + self, axis: StackerAxis, distance: float, params: MoveParams | None = None + ) -> bool: + """Move axis.""" + command = self.append_move_params( + GCODE.MOVE_TO.build_command().add_float( + axis.name, distance, GCODE_ROUNDING_PRECISION + ), + params, + ) + resp = await self._connection.send_command(command) + if not re.match(rf"^{GCODE.MOVE_TO}$", resp): + raise ValueError(f"Incorrect Response for move to: {resp}") + return True + + async def move_to_limit_switch( + self, axis: StackerAxis, direction: Direction, params: MoveParams | None = None + ) -> bool: + """Move until limit switch is triggered.""" + command = self.append_move_params( + GCODE.MOVE_TO_SWITCH.build_command().add_int(axis.name, direction.value), + params, + ) + resp = await self._connection.send_command(command) + if not re.match(rf"^{GCODE.MOVE_TO_SWITCH}$", resp): + raise ValueError(f"Incorrect Response for move to switch: {resp}") + return True + + async def home_axis(self, axis: StackerAxis, direction: Direction) -> bool: + """Home axis.""" + resp = await self._connection.send_command( + GCODE.HOME_AXIS.build_command().add_int(axis.name, direction.value) + ) + if not re.match(rf"^{GCODE.HOME_AXIS}$", resp): + raise ValueError(f"Incorrect Response for home axis: {resp}") + return True + + async def set_led( + self, power: float, color: LEDColor | None = None, external: bool | None = None + ) -> bool: + """Set LED color. + + :param power: Power of the LED (0-1.0), 0 is off, 1 is full power + :param color: Color of the LED + :param external: True if external LED, False if internal LED + """ + power = max(0, min(power, 1.0)) + command = GCODE.SET_LED.build_command().add_float( + "P", power, GCODE_ROUNDING_PRECISION + ) + if color is not None: + command.add_int("C", color.value) + if external is not None: + command.add_int("E", external) + resp = await self._connection.send_command(command) + if not re.match(rf"^{GCODE.SET_LED}$", resp): + raise ValueError(f"Incorrect Response for set led: {resp}") + return True + + async def update_firmware(self, firmware_file_path: str) -> None: + """Updates the firmware on the device.""" + # TODO: Implement firmware update + pass diff --git a/api/src/opentrons/drivers/flex_stacker/simulator.py b/api/src/opentrons/drivers/flex_stacker/simulator.py new file mode 100644 index 00000000000..1e0b59b19de --- /dev/null +++ b/api/src/opentrons/drivers/flex_stacker/simulator.py @@ -0,0 +1,109 @@ +from typing import Optional + +from opentrons.util.async_helpers import ensure_yield + +from .abstract import AbstractStackerDriver +from .types import ( + StackerAxis, + PlatformStatus, + Direction, + StackerInfo, + HardwareRevision, + MoveParams, + LimitSwitchStatus, +) + + +class SimulatingDriver(AbstractStackerDriver): + """FLEX Stacker driver simulator.""" + + def __init__(self, serial_number: Optional[str] = None) -> None: + self._sn = serial_number or "dummySerialFS" + self._limit_switch_status = LimitSwitchStatus(False, False, False, False, False) + self._platform_sensor_status = PlatformStatus(False, False) + self._door_closed = True + + def set_limit_switch(self, status: LimitSwitchStatus) -> bool: + self._limit_switch_status = status + return True + + def set_platform_sensor(self, status: PlatformStatus) -> bool: + self._platform_sensor_status = status + return True + + def set_door_closed(self, door_closed: bool) -> bool: + self._door_closed = door_closed + return True + + @ensure_yield + async def connect(self) -> None: + """Connect to stacker.""" + pass + + @ensure_yield + async def disconnect(self) -> None: + """Disconnect from stacker.""" + pass + + @ensure_yield + async def is_connected(self) -> bool: + """Check connection to stacker.""" + return True + + @ensure_yield + async def get_device_info(self) -> StackerInfo: + """Get Device Info.""" + return StackerInfo(fw="stacker-fw", hw=HardwareRevision.EVT, sn=self._sn) + + @ensure_yield + async def set_serial_number(self, sn: str) -> bool: + """Set Serial Number.""" + return True + + @ensure_yield + async def stop_motor(self) -> bool: + """Stop motor movement.""" + return True + + @ensure_yield + async def get_limit_switch(self, axis: StackerAxis, direction: Direction) -> bool: + """Get limit switch status. + + :return: True if limit switch is triggered, False otherwise + """ + return self._limit_switch_status.get(axis, direction) + + @ensure_yield + async def get_limit_switches_status(self) -> LimitSwitchStatus: + """Get limit switch statuses for all axes.""" + return self._limit_switch_status + + @ensure_yield + async def get_platform_sensor_status(self) -> PlatformStatus: + """Get platform sensor status. + + :return: True if platform is detected, False otherwise + """ + return self._platform_sensor_status + + @ensure_yield + async def get_hopper_door_closed(self) -> bool: + """Get whether or not door is closed. + + :return: True if door is closed, False otherwise + """ + return self._door_closed + + @ensure_yield + async def move_in_mm( + self, axis: StackerAxis, distance: float, params: MoveParams | None = None + ) -> bool: + """Move axis.""" + return True + + @ensure_yield + async def move_to_limit_switch( + self, axis: StackerAxis, direction: Direction, params: MoveParams | None = None + ) -> bool: + """Move until limit switch is triggered.""" + return True diff --git a/api/src/opentrons/drivers/flex_stacker/types.py b/api/src/opentrons/drivers/flex_stacker/types.py new file mode 100644 index 00000000000..4035aaaa755 --- /dev/null +++ b/api/src/opentrons/drivers/flex_stacker/types.py @@ -0,0 +1,138 @@ +from enum import Enum +from dataclasses import dataclass, fields +from typing import List + +from opentrons.drivers.command_builder import CommandBuilder + + +class GCODE(str, Enum): + + MOVE_TO = "G0" + MOVE_TO_SWITCH = "G5" + HOME_AXIS = "G28" + STOP_MOTORS = "M0" + GET_RESET_REASON = "M114" + DEVICE_INFO = "M115" + GET_LIMIT_SWITCH = "M119" + SET_LED = "M200" + GET_PLATFORM_SENSOR = "M121" + GET_DOOR_SWITCH = "M122" + SET_SERIAL_NUMBER = "M996" + ENTER_BOOTLOADER = "dfu" + + def build_command(self) -> CommandBuilder: + """Build command.""" + return CommandBuilder().add_gcode(self) + + +STACKER_VID = 0x483 +STACKER_PID = 0xEF24 +STACKER_FREQ = 115200 + + +class HardwareRevision(Enum): + """Hardware Revision.""" + + NFF = "nff" + EVT = "a1" + + +@dataclass +class StackerInfo: + """Stacker Info.""" + + fw: str + hw: HardwareRevision + sn: str + + +class StackerAxis(Enum): + """Stacker Axis.""" + + X = "X" + Z = "Z" + L = "L" + + def __str__(self) -> str: + """Name.""" + return self.name + + +class LEDColor(Enum): + """Stacker LED Color.""" + + WHITE = 0 + RED = 1 + GREEN = 2 + BLUE = 3 + + +class Direction(Enum): + """Direction.""" + + RETRACT = 0 # negative + EXTENT = 1 # positive + + def __str__(self) -> str: + """Convert to tag for clear logging.""" + return "negative" if self == Direction.RETRACT else "positive" + + def opposite(self) -> "Direction": + """Get opposite direction.""" + return Direction.EXTENT if self == Direction.RETRACT else Direction.RETRACT + + def distance(self, distance: float) -> float: + """Get signed distance, where retract direction is negative.""" + return distance * -1 if self == Direction.RETRACT else distance + + +@dataclass +class LimitSwitchStatus: + """Stacker Limit Switch Statuses.""" + + XE: bool + XR: bool + ZE: bool + ZR: bool + LR: bool + + @classmethod + def get_fields(cls) -> List[str]: + """Get fields.""" + return [f.name for f in fields(cls)] + + def get(self, axis: StackerAxis, direction: Direction) -> bool: + """Get limit switch status.""" + if axis == StackerAxis.X: + return self.XE if direction == Direction.EXTENT else self.XR + if axis == StackerAxis.Z: + return self.ZE if direction == Direction.EXTENT else self.ZR + if direction == Direction.EXTENT: + raise ValueError("Latch does not have extent limit switch") + return self.LR + + +@dataclass +class PlatformStatus: + """Stacker Platform Statuses.""" + + E: bool + R: bool + + @classmethod + def get_fields(cls) -> List[str]: + """Get fields.""" + return [f.name for f in fields(cls)] + + def get(self, direction: Direction) -> bool: + """Get platform status.""" + return self.E if direction == Direction.EXTENT else self.R + + +@dataclass +class MoveParams: + """Move Parameters.""" + + max_speed: float | None = None + acceleration: float | None = None + max_speed_discont: float | None = None diff --git a/api/src/opentrons/execute.py b/api/src/opentrons/execute.py index a9b3562d82b..998d6bc6597 100644 --- a/api/src/opentrons/execute.py +++ b/api/src/opentrons/execute.py @@ -560,7 +560,9 @@ def _create_live_context_pe( # Non-async would use call_soon_threadsafe(), which makes the waiting harder. async def add_all_extra_labware() -> None: for labware_definition_dict in extra_labware.values(): - labware_definition = LabwareDefinition.parse_obj(labware_definition_dict) + labware_definition = LabwareDefinition.model_validate( + labware_definition_dict + ) pe.add_labware_definition(labware_definition) # Add extra_labware to ProtocolEngine, being careful not to modify ProtocolEngine from this diff --git a/api/src/opentrons/hardware_control/__init__.py b/api/src/opentrons/hardware_control/__init__.py index d575a2eada5..b49f1462249 100644 --- a/api/src/opentrons/hardware_control/__init__.py +++ b/api/src/opentrons/hardware_control/__init__.py @@ -38,8 +38,7 @@ ] HardwareControlAPI = Union[OT2HardwareControlAPI, OT3HardwareControlAPI] -# this type ignore is because of https://github.com/python/mypy/issues/13437 -ThreadManagedHardware = ThreadManager[HardwareControlAPI] # type: ignore[misc] +ThreadManagedHardware = ThreadManager[HardwareControlAPI] SyncHardwareAPI = SynchronousAdapter[HardwareControlAPI] __all__ = [ diff --git a/api/src/opentrons/hardware_control/backends/ot3controller.py b/api/src/opentrons/hardware_control/backends/ot3controller.py index cdbd8818111..84ffbffd8da 100644 --- a/api/src/opentrons/hardware_control/backends/ot3controller.py +++ b/api/src/opentrons/hardware_control/backends/ot3controller.py @@ -1072,6 +1072,7 @@ def _build_attached_pip( converted_name.pipette_type, converted_name.pipette_channels, converted_name.pipette_version, + converted_name.oem_type, ), "id": OT3Controller._combine_serial_number(attached), } diff --git a/api/src/opentrons/hardware_control/backends/ot3simulator.py b/api/src/opentrons/hardware_control/backends/ot3simulator.py index 10f4ebcfe2a..b7466386be6 100644 --- a/api/src/opentrons/hardware_control/backends/ot3simulator.py +++ b/api/src/opentrons/hardware_control/backends/ot3simulator.py @@ -511,6 +511,7 @@ def _attached_pipette_to_mount( converted_name.pipette_type, converted_name.pipette_channels, converted_name.pipette_version, + converted_name.oem_type, ), "id": None, } @@ -533,6 +534,7 @@ def _attached_pipette_to_mount( converted_name.pipette_type, converted_name.pipette_channels, converted_name.pipette_version, + converted_name.oem_type, ), "id": init_instr["id"], } @@ -544,6 +546,7 @@ def _attached_pipette_to_mount( converted_name.pipette_type, converted_name.pipette_channels, converted_name.pipette_version, + converted_name.oem_type, ), "id": None, } diff --git a/api/src/opentrons/hardware_control/emulation/module_server/client.py b/api/src/opentrons/hardware_control/emulation/module_server/client.py index 4108fe76069..5adcde0f267 100644 --- a/api/src/opentrons/hardware_control/emulation/module_server/client.py +++ b/api/src/opentrons/hardware_control/emulation/module_server/client.py @@ -66,7 +66,7 @@ async def read(self) -> Message: """Read a message from the module server.""" try: b = await self._reader.readuntil(MessageDelimiter) - m: Message = Message.parse_raw(b) + m: Message = Message.model_validate_json(b) return m except LimitOverrunError as e: raise ModuleServerClientError(str(e)) diff --git a/api/src/opentrons/hardware_control/emulation/module_server/server.py b/api/src/opentrons/hardware_control/emulation/module_server/server.py index 5a3d696eb7b..36878c342e3 100644 --- a/api/src/opentrons/hardware_control/emulation/module_server/server.py +++ b/api/src/opentrons/hardware_control/emulation/module_server/server.py @@ -53,7 +53,9 @@ def on_server_connected( self._connections[identifier] = connection for c in self._clients: c.write( - Message(status="connected", connections=[connection]).json().encode() + Message(status="connected", connections=[connection]) + .model_dump_json() + .encode() ) c.write(b"\n") @@ -72,7 +74,7 @@ def on_server_disconnected(self, identifier: str) -> None: for c in self._clients: c.write( Message(status="disconnected", connections=[connection]) - .json() + .model_dump_json() .encode() ) c.write(MessageDelimiter) @@ -95,7 +97,7 @@ async def _handle_connection( # A client connected. Send a dump of all connected modules. m = Message(status="dump", connections=list(self._connections.values())) - writer.write(m.json().encode()) + writer.write(m.model_dump_json().encode()) writer.write(MessageDelimiter) self._clients.add(writer) diff --git a/api/src/opentrons/hardware_control/emulation/settings.py b/api/src/opentrons/hardware_control/emulation/settings.py index 538b0281808..dd4da4dfc54 100644 --- a/api/src/opentrons/hardware_control/emulation/settings.py +++ b/api/src/opentrons/hardware_control/emulation/settings.py @@ -1,7 +1,8 @@ from typing import List from opentrons.hardware_control.emulation.types import ModuleType from opentrons.hardware_control.emulation.util import TEMPERATURE_ROOM -from pydantic import BaseSettings, BaseModel +from pydantic import BaseModel +from pydantic_settings import BaseSettings, SettingsConfigDict class PipetteSettings(BaseModel): @@ -113,8 +114,6 @@ class Settings(BaseSettings): emulator_port=9003, driver_port=9998 ) magdeck_proxy: ProxySettings = ProxySettings(emulator_port=9004, driver_port=9999) - - class Config: - env_prefix = "OT_EMULATOR_" + model_config = SettingsConfigDict(env_prefix="OT_EMULATOR_") module_server: ModuleServerSettings = ModuleServerSettings() diff --git a/api/src/opentrons/hardware_control/instruments/ot2/instrument_calibration.py b/api/src/opentrons/hardware_control/instruments/ot2/instrument_calibration.py index e093763dcd1..b3b82b22421 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/instrument_calibration.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/instrument_calibration.py @@ -123,7 +123,8 @@ def load_tip_length_for_pipette( ) -> TipLengthCalibration: if isinstance(tiprack, LabwareDefinition): tiprack = typing.cast( - "TypeDictLabwareDef", tiprack.dict(exclude_none=True, exclude_unset=True) + "TypeDictLabwareDef", + tiprack.model_dump(exclude_none=True, exclude_unset=True), ) tip_length_data = calibration_storage.load_tip_length_calibration( diff --git a/api/src/opentrons/hardware_control/instruments/ot2/pipette.py b/api/src/opentrons/hardware_control/instruments/ot2/pipette.py index 2d63342cf19..2205da161f1 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/pipette.py @@ -56,6 +56,7 @@ UlPerMmAction, PipetteName, PipetteModel, + PipetteOEMType, ) from opentrons.hardware_control.dev_types import InstrumentHardwareConfigs @@ -96,7 +97,7 @@ def __init__( use_old_aspiration_functions: bool = False, ) -> None: self._config = config - self._config_as_dict = config.dict() + self._config_as_dict = config.model_dump() self._pipette_offset = pipette_offset_cal self._pipette_type = self._config.pipette_type self._pipette_version = self._config.version @@ -112,17 +113,20 @@ def __init__( pipette_type=config.pipette_type, pipette_channels=config.channels, pipette_generation=config.display_category, + oem_type=PipetteOEMType.OT, ) self._acting_as = self._pipette_name self._pipette_model = PipetteModelVersionType( pipette_type=config.pipette_type, pipette_channels=config.channels, pipette_version=config.version, + oem_type=PipetteOEMType.OT, ) self._valid_nozzle_maps = load_pipette_data.load_valid_nozzle_maps( self._pipette_model.pipette_type, self._pipette_model.pipette_channels, self._pipette_model.pipette_version, + PipetteOEMType.OT, ) self._nozzle_offset = self._config.nozzle_offset self._nozzle_manager = ( @@ -189,7 +193,7 @@ def act_as(self, name: PipetteNameType) -> None: ], f"{self.name} is not back-compatible with {name}" liquid_model = load_pipette_data.load_liquid_model( - name.pipette_type, name.pipette_channels, name.get_version() + name.pipette_type, name.pipette_channels, name.get_version(), name.oem_type ) # TODO need to grab name config here to deal with act as test self._liquid_class.max_volume = liquid_model["default"].max_volume @@ -273,15 +277,16 @@ def update_config_item( self._config, elements, liquid_class ) # Update the cached dict representation - self._config_as_dict = self._config.dict() + self._config_as_dict = self._config.model_dump() def reload_configurations(self) -> None: self._config = load_pipette_data.load_definition( self._pipette_model.pipette_type, self._pipette_model.pipette_channels, self._pipette_model.pipette_version, + self._pipette_model.oem_type, ) - self._config_as_dict = self._config.dict() + self._config_as_dict = self._config.model_dump() def reset_state(self) -> None: self._current_volume = 0.0 @@ -656,8 +661,8 @@ def _reload_and_check_skip( # Same config, good enough return attached_instr, True else: - newdict = new_config.dict() - olddict = attached_instr.config.dict() + newdict = new_config.model_dump() + olddict = attached_instr.config.model_dump() changed: Set[str] = set() for k in newdict.keys(): if newdict[k] != olddict[k]: diff --git a/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py b/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py index 7bd41e02e74..9da14196d52 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py @@ -230,7 +230,7 @@ def get_attached_instrument(self, mount: MountType) -> PipetteDict: result["current_nozzle_map"] = instr.nozzle_manager.current_configuration result["min_volume"] = instr.liquid_class.min_volume result["max_volume"] = instr.liquid_class.max_volume - result["channels"] = instr.channels + result["channels"] = instr._max_channels.value result["has_tip"] = instr.has_tip result["tip_length"] = instr.current_tip_length result["aspirate_speed"] = self.plunger_speed( diff --git a/api/src/opentrons/hardware_control/instruments/ot3/gripper.py b/api/src/opentrons/hardware_control/instruments/ot3/gripper.py index ba49ea7d5e7..bd70547ee45 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/gripper.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/gripper.py @@ -318,8 +318,8 @@ def _reload_gripper( # Same config, good enough return attached_instr, True else: - newdict = new_config.dict() - olddict = attached_instr.config.dict() + newdict = new_config.model_dump() + olddict = attached_instr.config.model_dump() changed: Set[str] = set() for k in newdict.keys(): if newdict[k] != olddict[k]: diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py index b9355874906..bd7671d745d 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py @@ -42,6 +42,7 @@ PipetteName, PipetteModel, Quirks, + PipetteOEMType, ) from opentrons_shared_data.pipette import ( load_data as load_pipette_data, @@ -79,7 +80,7 @@ def __init__( use_old_aspiration_functions: bool = False, ) -> None: self._config = config - self._config_as_dict = config.dict() + self._config_as_dict = config.model_dump() self._plunger_motor_current = config.plunger_motor_configurations self._pick_up_configurations = config.pick_up_tip_configurations self._plunger_homing_configurations = config.plunger_homing_configurations @@ -93,22 +94,26 @@ def __init__( self._liquid_class_name = pip_types.LiquidClasses.default self._liquid_class = self._config.liquid_properties[self._liquid_class_name] + oem = PipetteOEMType.get_oem_from_quirks(config.quirks) # TODO (lc 12-05-2022) figure out how we can safely deprecate "name" and "model" self._pipette_name = PipetteNameType( pipette_type=config.pipette_type, pipette_channels=config.channels, pipette_generation=config.display_category, + oem_type=oem, ) self._acting_as = self._pipette_name self._pipette_model = PipetteModelVersionType( pipette_type=config.pipette_type, pipette_channels=config.channels, pipette_version=config.version, + oem_type=oem, ) self._valid_nozzle_maps = load_pipette_data.load_valid_nozzle_maps( self._pipette_model.pipette_type, self._pipette_model.pipette_channels, self._pipette_model.pipette_version, + self._pipette_model.oem_type, ) self._nozzle_offset = self._config.nozzle_offset self._nozzle_manager = ( @@ -250,8 +255,9 @@ def reload_configurations(self) -> None: self._pipette_model.pipette_type, self._pipette_model.pipette_channels, self._pipette_model.pipette_version, + self._pipette_model.oem_type, ) - self._config_as_dict = self._config.dict() + self._config_as_dict = self._config.model_dump() def reset_state(self) -> None: self._current_volume = 0.0 @@ -770,8 +776,8 @@ def _reload_and_check_skip( # Same config, good enough return attached_instr, True else: - newdict = new_config.dict() - olddict = attached_instr.config.dict() + newdict = new_config.model_dump() + olddict = attached_instr.config.model_dump() changed: Set[str] = set() for k in newdict.keys(): if newdict[k] != olddict[k]: diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py index dda5031a8a3..ef081b95a62 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py @@ -237,6 +237,7 @@ def get_attached_instrument(self, mount: OT3Mount) -> PipetteDict: "back_compat_names", "supported_tips", "lld_settings", + "available_sensors", ] instr_dict = instr.as_dict() @@ -248,7 +249,7 @@ def get_attached_instrument(self, mount: OT3Mount) -> PipetteDict: result["current_nozzle_map"] = instr.nozzle_manager.current_configuration result["min_volume"] = instr.liquid_class.min_volume result["max_volume"] = instr.liquid_class.max_volume - result["channels"] = instr._max_channels + result["channels"] = instr._max_channels.value result["has_tip"] = instr.has_tip result["tip_length"] = instr.current_tip_length result["aspirate_speed"] = self.plunger_speed( @@ -289,6 +290,7 @@ def get_attached_instrument(self, mount: OT3Mount) -> PipetteDict: "drop_tip": instr.plunger_positions.drop_tip, } result["shaft_ul_per_mm"] = instr.config.shaft_ul_per_mm + result["available_sensors"] = instr.config.available_sensors return cast(PipetteDict, result) @property diff --git a/api/src/opentrons/hardware_control/modules/mod_abc.py b/api/src/opentrons/hardware_control/modules/mod_abc.py index b07c6156a88..ebc0da2fa13 100644 --- a/api/src/opentrons/hardware_control/modules/mod_abc.py +++ b/api/src/opentrons/hardware_control/modules/mod_abc.py @@ -2,7 +2,7 @@ import asyncio import logging import re -from typing import ClassVar, Mapping, Optional, TypeVar, cast +from typing import ClassVar, Mapping, Optional, TypeVar from packaging.version import InvalidVersion, parse, Version from opentrons.config import IS_ROBOT, ROBOT_FIRMWARE_DIR from opentrons.drivers.rpi_drivers.types import USBPort @@ -31,7 +31,7 @@ def parse_fw_version(version: str) -> Version: raise InvalidVersion() except InvalidVersion: device_version = parse("v0.0.0") - return cast(Version, device_version) + return device_version class AbstractModule(abc.ABC): diff --git a/api/src/opentrons/hardware_control/ot3_calibration.py b/api/src/opentrons/hardware_control/ot3_calibration.py index b0ebcd027ce..9303add23d6 100644 --- a/api/src/opentrons/hardware_control/ot3_calibration.py +++ b/api/src/opentrons/hardware_control/ot3_calibration.py @@ -968,7 +968,7 @@ def load_attitude_matrix(to_default: bool = True) -> DeckCalibration: return DeckCalibration( attitude=apply_machine_transform(calibration_data.attitude), source=calibration_data.source, - status=types.CalibrationStatus(**calibration_data.status.dict()), + status=types.CalibrationStatus(**calibration_data.status.model_dump()), belt_attitude=calibration_data.attitude, last_modified=calibration_data.lastModified, pipette_calibrated_with=calibration_data.pipetteCalibratedWith, diff --git a/api/src/opentrons/hardware_control/robot_calibration.py b/api/src/opentrons/hardware_control/robot_calibration.py index 270344fff2f..8ecf6b67be6 100644 --- a/api/src/opentrons/hardware_control/robot_calibration.py +++ b/api/src/opentrons/hardware_control/robot_calibration.py @@ -154,7 +154,7 @@ def load_attitude_matrix() -> DeckCalibration: return DeckCalibration( attitude=calibration_data.attitude, source=calibration_data.source, - status=types.CalibrationStatus(**calibration_data.status.dict()), + status=types.CalibrationStatus(**calibration_data.status.model_dump()), last_modified=calibration_data.last_modified, pipette_calibrated_with=calibration_data.pipette_calibrated_with, tiprack=calibration_data.tiprack, diff --git a/api/src/opentrons/protocol_api/core/engine/labware.py b/api/src/opentrons/protocol_api/core/engine/labware.py index 4d868bd30ac..d462401927f 100644 --- a/api/src/opentrons/protocol_api/core/engine/labware.py +++ b/api/src/opentrons/protocol_api/core/engine/labware.py @@ -92,12 +92,14 @@ def get_name(self) -> str: def get_definition(self) -> LabwareDefinitionDict: """Get the labware's definition as a plain dictionary.""" - return cast(LabwareDefinitionDict, self._definition.dict(exclude_none=True)) + return cast( + LabwareDefinitionDict, self._definition.model_dump(exclude_none=True) + ) def get_parameters(self) -> LabwareParametersDict: return cast( LabwareParametersDict, - self._definition.parameters.dict(exclude_none=True), + self._definition.parameters.model_dump(exclude_none=True), ) def get_quirks(self) -> List[str]: @@ -118,7 +120,7 @@ def set_calibration(self, delta: Point) -> None: details={"kind": "labware-not-in-slot"}, ) - request = LabwareOffsetCreate.construct( + request = LabwareOffsetCreate.model_construct( definitionUri=self.get_uri(), location=offset_location, vector=LabwareOffsetVector(x=delta.x, y=delta.y, z=delta.z), diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index d43fc9a2058..ece431b0d1e 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -6,6 +6,7 @@ from opentrons.protocol_engine import commands as cmd from opentrons.protocol_engine.commands import LoadModuleResult + from opentrons_shared_data.deck.types import DeckDefinitionV5, SlotDefV3 from opentrons_shared_data.labware.labware_definition import LabwareDefinition from opentrons_shared_data.labware.types import LabwareDefinition as LabwareDefDict @@ -192,7 +193,7 @@ def add_labware_definition( ) -> LabwareLoadParams: """Add a labware definition to the set of loadable definitions.""" uri = self._engine_client.add_labware_definition( - LabwareDefinition.parse_obj(definition) + LabwareDefinition.model_validate(definition) ) return LabwareLoadParams.from_uri(uri) @@ -232,6 +233,9 @@ def load_labware( ) # FIXME(jbl, 2023-08-14) validating after loading the object issue validation.ensure_definition_is_labware(load_result.definition) + validation.ensure_definition_is_not_lid_after_api_version( + self.api_version, load_result.definition + ) # FIXME(mm, 2023-02-21): # @@ -321,6 +325,52 @@ def load_adapter( return labware_core + def load_lid( + self, + load_name: str, + location: LabwareCore, + namespace: Optional[str], + version: Optional[int], + ) -> LabwareCore: + """Load an individual lid using its identifying parameters. Must be loaded on an existing Labware.""" + load_location = self._convert_labware_location(location=location) + custom_labware_params = ( + self._engine_client.state.labware.find_custom_labware_load_params() + ) + namespace, version = load_labware_params.resolve( + load_name, namespace, version, custom_labware_params + ) + load_result = self._engine_client.execute_command_without_recovery( + cmd.LoadLidParams( + loadName=load_name, + location=load_location, + namespace=namespace, + version=version, + ) + ) + # FIXME(chb, 2024-12-06) validating after loading the object issue + validation.ensure_definition_is_lid(load_result.definition) + + deck_conflict.check( + engine_state=self._engine_client.state, + new_labware_id=load_result.labwareId, + existing_disposal_locations=self._disposal_locations, + # TODO: We can now fetch these IDs from engine too. + # See comment in self.load_labware(). + # + # Wrapping .keys() in list() is just to make Decoy verification easier. + existing_labware_ids=list(self._labware_cores_by_id.keys()), + existing_module_ids=list(self._module_cores_by_id.keys()), + ) + + labware_core = LabwareCore( + labware_id=load_result.labwareId, + engine_client=self._engine_client, + ) + + self._labware_cores_by_id[labware_core.labware_id] = labware_core + return labware_core + def move_labware( self, labware_core: LabwareCore, @@ -643,6 +693,72 @@ def set_last_location( self._last_location = location self._last_mount = mount + def load_lid_stack( + self, + load_name: str, + location: Union[DeckSlotName, StagingSlotName, LabwareCore], + quantity: int, + namespace: Optional[str], + version: Optional[int], + ) -> LabwareCore: + """Load a Stack of Lids to a given location, creating a Lid Stack.""" + if quantity < 1: + raise ValueError( + "When loading a lid stack quantity cannot be less than one." + ) + if isinstance(location, DeckSlotName) or isinstance(location, StagingSlotName): + load_location = self._convert_labware_location(location=location) + else: + if isinstance(location, LabwareCore): + load_location = self._convert_labware_location(location=location) + else: + raise ValueError( + "Expected type of Labware Location for lid stack must be Labware, not Legacy Labware or Well." + ) + + custom_labware_params = ( + self._engine_client.state.labware.find_custom_labware_load_params() + ) + namespace, version = load_labware_params.resolve( + load_name, namespace, version, custom_labware_params + ) + + load_result = self._engine_client.execute_command_without_recovery( + cmd.LoadLidStackParams( + loadName=load_name, + location=load_location, + namespace=namespace, + version=version, + quantity=quantity, + ) + ) + + # FIXME(CHB, 2024-12-04) just like load labware and load adapter we have a validating after loading the object issue + validation.ensure_definition_is_lid(load_result.definition) + + deck_conflict.check( + engine_state=self._engine_client.state, + new_labware_id=load_result.stackLabwareId, + existing_disposal_locations=self._disposal_locations, + # TODO (spp, 2023-11-27): We've been using IDs from _labware_cores_by_id + # and _module_cores_by_id instead of getting the lists directly from engine + # because of the chance of engine carrying labware IDs from LPC too. + # But with https://github.com/Opentrons/opentrons/pull/13943, + # & LPC in maintenance runs, we can now rely on engine state for these IDs too. + # Wrapping .keys() in list() is just to make Decoy verification easier. + existing_labware_ids=list(self._labware_cores_by_id.keys()), + existing_module_ids=list(self._module_cores_by_id.keys()), + ) + + labware_core = LabwareCore( + labware_id=load_result.stackLabwareId, + engine_client=self._engine_client, + ) + + self._labware_cores_by_id[labware_core.labware_id] = labware_core + + return labware_core + def get_deck_definition(self) -> DeckDefinitionV5: """Get the geometry definition of the robot's deck.""" return self._engine_client.state.labware.get_deck_definition() @@ -736,9 +852,7 @@ def define_liquid( _id=liquid.id, name=liquid.displayName, description=liquid.description, - display_color=( - liquid.displayColor.__root__ if liquid.displayColor else None - ), + display_color=(liquid.displayColor.root if liquid.displayColor else None), ) def define_liquid_class(self, name: str) -> LiquidClass: diff --git a/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py b/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py index d0b95ed82ca..8adadbe1ecf 100644 --- a/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py +++ b/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py @@ -6,7 +6,13 @@ from opentrons_shared_data.pipette.types import PipetteNameType from opentrons_shared_data.robot.types import RobotType -from opentrons.types import DeckSlotName, StagingSlotName, Location, Mount, Point +from opentrons.types import ( + DeckSlotName, + StagingSlotName, + Location, + Mount, + Point, +) from opentrons.util.broker import Broker from opentrons.hardware_control import SyncHardwareAPI from opentrons.hardware_control.modules import AbstractModule, ModuleModel, ModuleType @@ -267,6 +273,16 @@ def load_adapter( """Load an adapter using its identifying parameters""" raise APIVersionError(api_element="Loading adapter") + def load_lid( + self, + load_name: str, + location: LegacyLabwareCore, + namespace: Optional[str], + version: Optional[int], + ) -> LegacyLabwareCore: + """Load an individual lid labware using its identifying parameters. Must be loaded on a labware.""" + raise APIVersionError(api_element="Loading lid") + def load_robot(self) -> None: # type: ignore """Load an adapter using its identifying parameters""" raise APIVersionError(api_element="Loading robot") @@ -478,6 +494,17 @@ def set_last_location( self._last_location = location self._last_mount = mount + def load_lid_stack( + self, + load_name: str, + location: Union[DeckSlotName, StagingSlotName, LegacyLabwareCore], + quantity: int, + namespace: Optional[str], + version: Optional[int], + ) -> LegacyLabwareCore: + """Load a Stack of Lids to a given location, creating a Lid Stack.""" + raise APIVersionError(api_element="Lid stack") + def get_module_cores(self) -> List[legacy_module_core.LegacyModuleCore]: """Get loaded module cores.""" return self._module_cores diff --git a/api/src/opentrons/protocol_api/core/protocol.py b/api/src/opentrons/protocol_api/core/protocol.py index ba9f9a7d14a..27d41b921b0 100644 --- a/api/src/opentrons/protocol_api/core/protocol.py +++ b/api/src/opentrons/protocol_api/core/protocol.py @@ -10,7 +10,13 @@ from opentrons_shared_data.labware.types import LabwareDefinition from opentrons_shared_data.robot.types import RobotType -from opentrons.types import DeckSlotName, StagingSlotName, Location, Mount, Point +from opentrons.types import ( + DeckSlotName, + StagingSlotName, + Location, + Mount, + Point, +) from opentrons.hardware_control import SyncHardwareAPI from opentrons.hardware_control.modules.types import ModuleModel from opentrons.protocols.api_support.util import AxisMaxSpeeds @@ -94,6 +100,17 @@ def load_adapter( """Load an adapter using its identifying parameters""" ... + @abstractmethod + def load_lid( + self, + load_name: str, + location: LabwareCoreType, + namespace: Optional[str], + version: Optional[int], + ) -> LabwareCoreType: + """Load an individual lid labware using its identifying parameters. Must be loaded on a labware.""" + ... + @abstractmethod def move_labware( self, @@ -191,6 +208,17 @@ def set_last_location( ) -> None: ... + @abstractmethod + def load_lid_stack( + self, + load_name: str, + location: Union[DeckSlotName, StagingSlotName, LabwareCoreType], + quantity: int, + namespace: Optional[str], + version: Optional[int], + ) -> LabwareCoreType: + ... + @abstractmethod def get_deck_definition(self) -> DeckDefinitionV5: """Get the geometry definition of the robot's deck.""" diff --git a/api/src/opentrons/protocol_api/labware.py b/api/src/opentrons/protocol_api/labware.py index 5e919a44f86..bb8a094e4c2 100644 --- a/api/src/opentrons/protocol_api/labware.py +++ b/api/src/opentrons/protocol_api/labware.py @@ -544,6 +544,7 @@ def load_labware( self, name: str, label: Optional[str] = None, + lid: Optional[str] = None, namespace: Optional[str] = None, version: Optional[int] = None, ) -> Labware: @@ -573,6 +574,20 @@ def load_labware( self._core_map.add(labware_core, labware) + if lid is not None: + if self._api_version < validation.LID_STACK_VERSION_GATE: + raise APIVersionError( + api_element="Loading a Lid on a Labware", + until_version="2.23", + current_version=f"{self._api_version}", + ) + self._protocol_core.load_lid( + load_name=lid, + location=labware_core, + namespace=namespace, + version=version, + ) + return labware @requires_version(2, 15) @@ -597,6 +612,65 @@ def load_labware_from_definition( label=label, ) + @requires_version(2, 23) + def load_lid_stack( + self, + load_name: str, + quantity: int, + namespace: Optional[str] = None, + version: Optional[int] = None, + ) -> Labware: + """ + Load a stack of Lids onto a valid Deck Location or Adapter. + + :param str load_name: A string to use for looking up a lid definition. + You can find the ``load_name`` for any standard lid on the Opentrons + `Labware Library `_. + :param int quantity: The quantity of lids to be loaded in the stack. + :param str namespace: The namespace that the lid labware definition belongs to. + If unspecified, the API will automatically search two namespaces: + + - ``"opentrons"``, to load standard Opentrons labware definitions. + - ``"custom_beta"``, to load custom labware definitions created with the + `Custom Labware Creator `__. + + You might need to specify an explicit ``namespace`` if you have a custom + definition whose ``load_name`` is the same as an Opentrons-verified + definition, and you want to explicitly choose one or the other. + + :param version: The version of the labware definition. You should normally + leave this unspecified to let ``load_lid_stack()`` choose a version + automatically. + + :return: The initialized and loaded labware object representing the Lid Stack. + """ + if self._api_version < validation.LID_STACK_VERSION_GATE: + raise APIVersionError( + api_element="Loading a Lid Stack", + until_version="2.23", + current_version=f"{self._api_version}", + ) + + load_location = self._core + + load_name = validation.ensure_lowercase_name(load_name) + + result = self._protocol_core.load_lid_stack( + load_name=load_name, + location=load_location, + quantity=quantity, + namespace=namespace, + version=version, + ) + + labware = Labware( + core=result, + api_version=self._api_version, + protocol_core=self._protocol_core, + core_map=self._core_map, + ) + return labware + def set_calibration(self, delta: Point) -> None: """ An internal, deprecated method used for updating the labware offset. diff --git a/api/src/opentrons/protocol_api/module_contexts.py b/api/src/opentrons/protocol_api/module_contexts.py index 96950b927ef..614bb4f53c7 100644 --- a/api/src/opentrons/protocol_api/module_contexts.py +++ b/api/src/opentrons/protocol_api/module_contexts.py @@ -125,6 +125,7 @@ def load_labware( namespace: Optional[str] = None, version: Optional[int] = None, adapter: Optional[str] = None, + lid: Optional[str] = None, ) -> Labware: """Load a labware onto the module using its load parameters. @@ -180,6 +181,19 @@ def load_labware( version=version, location=load_location, ) + if lid is not None: + if self._api_version < validation.LID_STACK_VERSION_GATE: + raise APIVersionError( + api_element="Loading a lid on a Labware", + until_version="2.23", + current_version=f"{self._api_version}", + ) + self._protocol_core.load_lid( + load_name=lid, + location=labware_core, + namespace=namespace, + version=version, + ) if isinstance(self._core, LegacyModuleCore): labware = self._core.add_labware_core(cast(LegacyLabwareCore, labware_core)) diff --git a/api/src/opentrons/protocol_api/protocol_context.py b/api/src/opentrons/protocol_api/protocol_context.py index 182019674a5..b9f96e4d536 100644 --- a/api/src/opentrons/protocol_api/protocol_context.py +++ b/api/src/opentrons/protocol_api/protocol_context.py @@ -399,6 +399,7 @@ def load_labware( namespace: Optional[str] = None, version: Optional[int] = None, adapter: Optional[str] = None, + lid: Optional[str] = None, ) -> Labware: """Load a labware onto a location. @@ -443,6 +444,10 @@ def load_labware( values as the ``load_name`` parameter of :py:meth:`.load_adapter`. The adapter will use the same namespace as the labware, and the API will choose the adapter's version automatically. + :param lid: A lid to load the on top of the main labware. Accepts the same + values as the ``load_name`` parameter of :py:meth:`.load_lid_stack`. The + lid will use the same namespace as the labware, and the API will + choose the lid's version automatically. .. versionadded:: 2.15 """ @@ -483,6 +488,20 @@ def load_labware( version=version, ) + if lid is not None: + if self._api_version < validation.LID_STACK_VERSION_GATE: + raise APIVersionError( + api_element="Loading a Lid on a Labware", + until_version="2.23", + current_version=f"{self._api_version}", + ) + self._core.load_lid( + load_name=lid, + location=labware_core, + namespace=namespace, + version=version, + ) + labware = Labware( core=labware_core, api_version=self._api_version, @@ -1334,6 +1353,94 @@ def door_closed(self) -> bool: """Returns ``True`` if the front door of the robot is closed.""" return self._core.door_closed() + @requires_version(2, 23) + def load_lid_stack( + self, + load_name: str, + location: Union[DeckLocation, Labware], + quantity: int, + adapter: Optional[str] = None, + namespace: Optional[str] = None, + version: Optional[int] = None, + ) -> Labware: + """ + Load a stack of Lids onto a valid Deck Location or Adapter. + + :param str load_name: A string to use for looking up a lid definition. + You can find the ``load_name`` for any standard lid on the Opentrons + `Labware Library `_. + :param location: Either a :ref:`deck slot `, + like ``1``, ``"1"``, or ``"D1"``, or the a valid Opentrons Adapter. + :param int quantity: The quantity of lids to be loaded in the stack. + :param adapter: An adapter to load the lid stack on top of. Accepts the same + values as the ``load_name`` parameter of :py:meth:`.load_adapter`. The + adapter will use the same namespace as the lid labware, and the API will + choose the adapter's version automatically. + :param str namespace: The namespace that the lid labware definition belongs to. + If unspecified, the API will automatically search two namespaces: + + - ``"opentrons"``, to load standard Opentrons labware definitions. + - ``"custom_beta"``, to load custom labware definitions created with the + `Custom Labware Creator `__. + + You might need to specify an explicit ``namespace`` if you have a custom + definition whose ``load_name`` is the same as an Opentrons-verified + definition, and you want to explicitly choose one or the other. + + :param version: The version of the labware definition. You should normally + leave this unspecified to let ``load_lid_stack()`` choose a version + automatically. + + :return: The initialized and loaded labware object representing the Lid Stack. + """ + if self._api_version < validation.LID_STACK_VERSION_GATE: + raise APIVersionError( + api_element="Loading a Lid Stack", + until_version="2.23", + current_version=f"{self._api_version}", + ) + + load_location: Union[DeckSlotName, StagingSlotName, LabwareCore] + if isinstance(location, Labware): + load_location = location._core + else: + load_location = validation.ensure_and_convert_deck_slot( + location, self._api_version, self._core.robot_type + ) + + if adapter is not None: + if isinstance(load_location, DeckSlotName) or isinstance( + load_location, StagingSlotName + ): + loaded_adapter = self.load_adapter( + load_name=adapter, + location=load_location.value, + namespace=namespace, + ) + load_location = loaded_adapter._core + else: + raise ValueError( + "Location cannot be a Labware or Adapter when the 'adapter' field is not None." + ) + + load_name = validation.ensure_lowercase_name(load_name) + + result = self._core.load_lid_stack( + load_name=load_name, + location=load_location, + quantity=quantity, + namespace=namespace, + version=version, + ) + + labware = Labware( + core=result, + api_version=self._api_version, + protocol_core=self._core, + core_map=self._core_map, + ) + return labware + def _create_module_context( module_core: Union[ModuleCore, NonConnectedModuleCore], diff --git a/api/src/opentrons/protocol_api/validation.py b/api/src/opentrons/protocol_api/validation.py index f0db8a71e5e..e734a98e818 100644 --- a/api/src/opentrons/protocol_api/validation.py +++ b/api/src/opentrons/protocol_api/validation.py @@ -53,6 +53,9 @@ # The first APIVersion where Python protocols can specify staging deck slots (e.g. "D4") _STAGING_DECK_SLOT_VERSION_GATE = APIVersion(2, 16) +# The first APIVersion where Python protocols can load lids as stacks and treat them as attributes of a parent labware. +LID_STACK_VERSION_GATE = APIVersion(2, 23) + # Mapping of public Python Protocol API pipette load names # to names used by the internal Opentrons system _PIPETTE_NAMES_MAP = { @@ -72,6 +75,7 @@ "flex_8channel_50": PipetteNameType.P50_MULTI_FLEX, "flex_1channel_1000": PipetteNameType.P1000_SINGLE_FLEX, "flex_8channel_1000": PipetteNameType.P1000_MULTI_FLEX, + "flex_8channel_1000_em": PipetteNameType.P1000_MULTI_EM, "flex_96channel_1000": PipetteNameType.P1000_96, "flex_96channel_200": PipetteNameType.P200_96, } @@ -363,6 +367,27 @@ def ensure_definition_is_labware(definition: LabwareDefinition) -> None: ) +def ensure_definition_is_lid(definition: LabwareDefinition) -> None: + """Ensure that one of the definition's allowed roles is `lid` or that that field is empty.""" + if LabwareRole.lid not in definition.allowedRoles: + raise LabwareDefinitionIsNotLabwareError( + f"Labware {definition.parameters.loadName} is not a lid." + ) + + +def ensure_definition_is_not_lid_after_api_version( + api_version: APIVersion, definition: LabwareDefinition +) -> None: + """Ensure that one of the definition's allowed roles is not `lid` or that the API Version is below the release where lid loading was seperated.""" + if ( + LabwareRole.lid in definition.allowedRoles + and api_version >= LID_STACK_VERSION_GATE + ): + raise APIVersionError( + f"Labware Lids cannot be loaded like standard labware in Protocols written with an API version greater than {LID_STACK_VERSION_GATE}." + ) + + _MODULE_ALIASES: Dict[str, ModuleModel] = { "magdeck": MagneticModuleModel.MAGNETIC_V1, "magnetic module": MagneticModuleModel.MAGNETIC_V1, diff --git a/api/src/opentrons/protocol_engine/clients/sync_client.py b/api/src/opentrons/protocol_engine/clients/sync_client.py index 71837a7a2ca..4d04353b271 100644 --- a/api/src/opentrons/protocol_engine/clients/sync_client.py +++ b/api/src/opentrons/protocol_engine/clients/sync_client.py @@ -77,6 +77,18 @@ def execute_command_without_recovery( ) -> commands.LoadPipetteResult: pass + @overload + def execute_command_without_recovery( + self, params: commands.LoadLidStackParams + ) -> commands.LoadLidStackResult: + pass + + @overload + def execute_command_without_recovery( + self, params: commands.LoadLidParams + ) -> commands.LoadLidResult: + pass + @overload def execute_command_without_recovery( self, params: commands.LiquidProbeParams diff --git a/api/src/opentrons/protocol_engine/commands/__init__.py b/api/src/opentrons/protocol_engine/commands/__init__.py index 4774a45c475..4ad91012b11 100644 --- a/api/src/opentrons/protocol_engine/commands/__init__.py +++ b/api/src/opentrons/protocol_engine/commands/__init__.py @@ -35,8 +35,10 @@ from .command_unions import ( Command, + CommandAdapter, CommandParams, CommandCreate, + CommandCreateAdapter, CommandResult, CommandType, CommandDefinedErrorData, @@ -172,6 +174,22 @@ LoadPipetteCommandType, ) +from .load_lid_stack import ( + LoadLidStack, + LoadLidStackParams, + LoadLidStackCreate, + LoadLidStackResult, + LoadLidStackCommandType, +) + +from .load_lid import ( + LoadLid, + LoadLidParams, + LoadLidCreate, + LoadLidResult, + LoadLidCommandType, +) + from .move_labware import ( MoveLabware, MoveLabwareParams, @@ -365,8 +383,10 @@ __all__ = [ # command type unions "Command", + "CommandAdapter", "CommandParams", "CommandCreate", + "CommandCreateAdapter", "CommandResult", "CommandType", "CommandPrivateResult", @@ -472,6 +492,20 @@ "LoadPipetteResult", "LoadPipetteCommandType", "LoadPipettePrivateResult", + # load lid stack command models + "LoadLidStack", + "LoadLidStackCreate", + "LoadLidStackParams", + "LoadLidStackResult", + "LoadLidStackCommandType", + "LoadLidStackPrivateResult", + # load lid command models + "LoadLid", + "LoadLidCreate", + "LoadLidParams", + "LoadLidResult", + "LoadLidCommandType", + "LoadLidPrivateResult", # move labware command models "MoveLabware", "MoveLabwareCreate", diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py index 14c1f0f9ea3..41c1e65bce9 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py @@ -60,7 +60,6 @@ async def execute(self, params: CloseLidParams) -> SuccessData[CloseLidResult]: hardware_lid_status = AbsorbanceReaderLidStatus.OFF if not self._state_view.config.use_virtual_modules: abs_reader = self._equipment.get_module_hardware_api(mod_substate.module_id) - if abs_reader is not None: hardware_lid_status = await abs_reader.get_current_lid_status() else: diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py index 458225ad1bb..bcb2639d0a5 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py @@ -1,9 +1,10 @@ """Command models to initialize an Absorbance Reader.""" from __future__ import annotations -from typing import List, Optional, Literal, TYPE_CHECKING +from typing import List, Optional, Literal, TYPE_CHECKING, Any from typing_extensions import Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.drivers.types import ABSMeasurementMode from opentrons.protocol_engine.types import ABSMeasureMode @@ -11,6 +12,7 @@ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence from ...errors import InvalidWavelengthError +from ...state import update_types if TYPE_CHECKING: from opentrons.protocol_engine.state.state import StateView @@ -20,6 +22,10 @@ InitializeCommandType = Literal["absorbanceReader/initialize"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class InitializeParams(BaseModel): """Input parameters to initialize an absorbance reading.""" @@ -28,8 +34,10 @@ class InitializeParams(BaseModel): ..., description="Initialize single or multi measurement mode." ) sampleWavelengths: List[int] = Field(..., description="Sample wavelengths in nm.") - referenceWavelength: Optional[int] = Field( - None, description="Optional reference wavelength in nm." + referenceWavelength: int | SkipJsonSchema[None] = Field( + None, + description="Optional reference wavelength in nm.", + json_schema_extra=_remove_default, ) @@ -53,6 +61,7 @@ def __init__( async def execute(self, params: InitializeParams) -> SuccessData[InitializeResult]: """Initiate a single absorbance measurement.""" + state_update = update_types.StateUpdate() abs_reader_substate = self._state_view.modules.get_absorbance_reader_substate( module_id=params.moduleId ) @@ -113,10 +122,15 @@ async def execute(self, params: InitializeParams) -> SuccessData[InitializeResul reference_wavelength=params.referenceWavelength, ) - return SuccessData( - public=InitializeResult(), + state_update.initialize_absorbance_reader( + abs_reader_substate.module_id, + params.measureMode, + params.sampleWavelengths, + params.referenceWavelength, ) + return SuccessData(public=InitializeResult(), state_update=state_update) + class Initialize(BaseCommand[InitializeParams, InitializeResult, ErrorOccurrence]): """A command to initialize an Absorbance Reader.""" diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py index 556db619cb5..c8f7dca8706 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py @@ -1,10 +1,11 @@ """Command models to read absorbance.""" from __future__ import annotations from datetime import datetime -from typing import Optional, Dict, TYPE_CHECKING, List -from typing_extensions import Literal, Type +from typing import Optional, Dict, TYPE_CHECKING, List, Any +from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors import CannotPerformModuleAction, StorageLimitReachedError @@ -23,6 +24,10 @@ from opentrons.protocol_engine.execution import EquipmentHandler +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + ReadAbsorbanceCommandType = Literal["absorbanceReader/read"] @@ -30,9 +35,10 @@ class ReadAbsorbanceParams(BaseModel): """Input parameters for an absorbance reading.""" moduleId: str = Field(..., description="Unique ID of the Absorbance Reader.") - fileName: Optional[str] = Field( + fileName: str | SkipJsonSchema[None] = Field( None, description="Optional file name to use when storing the results of a measurement.", + json_schema_extra=_remove_default, ) @@ -68,6 +74,7 @@ async def execute( # noqa: C901 self, params: ReadAbsorbanceParams ) -> SuccessData[ReadAbsorbanceResult]: """Initiate an absorbance measurement.""" + state_update = update_types.StateUpdate() abs_reader_substate = self._state_view.modules.get_absorbance_reader_substate( module_id=params.moduleId ) @@ -118,7 +125,9 @@ async def execute( # noqa: C901 ) asbsorbance_result[wavelength] = converted_values transform_results.append( - ReadData.construct(wavelength=wavelength, data=converted_values) + ReadData.model_construct( + wavelength=wavelength, data=converted_values + ) ) # Handle the virtual module case for data creation (all zeroes) elif self._state_view.config.use_virtual_modules: @@ -132,13 +141,18 @@ async def execute( # noqa: C901 ) asbsorbance_result[wavelength] = converted_values transform_results.append( - ReadData.construct(wavelength=wavelength, data=converted_values) + ReadData.model_construct( + wavelength=wavelength, data=converted_values + ) ) else: raise CannotPerformModuleAction( "Plate Reader data cannot be requested with a module that has not been initialized." ) + state_update.set_absorbance_reader_data( + module_id=abs_reader_substate.module_id, read_result=asbsorbance_result + ) # TODO (cb, 10-17-2024): FILE PROVIDER - Some day we may want to break the file provider behavior into a seperate API function. # When this happens, we probably will to have the change the command results handler we utilize to track file IDs in engine. # Today, the action handler for the FileStore looks for a ReadAbsorbanceResult command action, this will need to be delinked. @@ -147,7 +161,7 @@ async def execute( # noqa: C901 file_ids: list[str] = [] if params.fileName is not None: # Create the Plate Reader Transform - plate_read_result = PlateReaderData.construct( + plate_read_result = PlateReaderData.model_construct( read_results=transform_results, reference_wavelength=abs_reader_substate.reference_wavelength, start_time=start_time, @@ -171,18 +185,20 @@ async def execute( # noqa: C901 # Return success data to api return SuccessData( public=ReadAbsorbanceResult( - data=asbsorbance_result, fileIds=file_ids + data=asbsorbance_result, + fileIds=file_ids, ), + state_update=state_update, ) + state_update.files_added = update_types.FilesAddedUpdate(file_ids=file_ids) + return SuccessData( public=ReadAbsorbanceResult( data=asbsorbance_result, fileIds=file_ids, ), - state_update=update_types.StateUpdate( - files_added=update_types.FilesAddedUpdate(file_ids=file_ids) - ), + state_update=state_update, ) diff --git a/api/src/opentrons/protocol_engine/commands/aspirate.py b/api/src/opentrons/protocol_engine/commands/aspirate.py index fa84afbde8c..9664d733b8a 100644 --- a/api/src/opentrons/protocol_engine/commands/aspirate.py +++ b/api/src/opentrons/protocol_engine/commands/aspirate.py @@ -226,7 +226,7 @@ class Aspirate( commandType: AspirateCommandType = "aspirate" params: AspirateParams - result: Optional[AspirateResult] + result: Optional[AspirateResult] = None _ImplementationCls: Type[AspirateImplementation] = AspirateImplementation diff --git a/api/src/opentrons/protocol_engine/commands/aspirate_in_place.py b/api/src/opentrons/protocol_engine/commands/aspirate_in_place.py index 1f89c9c5d74..434924928d7 100644 --- a/api/src/opentrons/protocol_engine/commands/aspirate_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/aspirate_in_place.py @@ -165,7 +165,7 @@ class AspirateInPlace( commandType: AspirateInPlaceCommandType = "aspirateInPlace" params: AspirateInPlaceParams - result: Optional[AspirateInPlaceResult] + result: Optional[AspirateInPlaceResult] = None _ImplementationCls: Type[ AspirateInPlaceImplementation diff --git a/api/src/opentrons/protocol_engine/commands/blow_out.py b/api/src/opentrons/protocol_engine/commands/blow_out.py index b2e8765b4a1..07582781a3a 100644 --- a/api/src/opentrons/protocol_engine/commands/blow_out.py +++ b/api/src/opentrons/protocol_engine/commands/blow_out.py @@ -130,7 +130,7 @@ class BlowOut( commandType: BlowOutCommandType = "blowout" params: BlowOutParams - result: Optional[BlowOutResult] + result: Optional[BlowOutResult] = None _ImplementationCls: Type[BlowOutImplementation] = BlowOutImplementation diff --git a/api/src/opentrons/protocol_engine/commands/blow_out_in_place.py b/api/src/opentrons/protocol_engine/commands/blow_out_in_place.py index f5f648bcec8..527c921e499 100644 --- a/api/src/opentrons/protocol_engine/commands/blow_out_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/blow_out_in_place.py @@ -100,7 +100,7 @@ class BlowOutInPlace( commandType: BlowOutInPlaceCommandType = "blowOutInPlace" params: BlowOutInPlaceParams - result: Optional[BlowOutInPlaceResult] + result: Optional[BlowOutInPlaceResult] = None _ImplementationCls: Type[ BlowOutInPlaceImplementation diff --git a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_gripper.py b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_gripper.py index 0333a171077..25ab19e2cd4 100644 --- a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +++ b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_gripper.py @@ -1,10 +1,11 @@ """Models and implementation for the calibrateGripper command.""" from enum import Enum -from typing import Optional, Type +from typing import Optional, Type, Any from typing_extensions import Literal from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.types import Point from opentrons.hardware_control import HardwareControlAPI @@ -22,6 +23,10 @@ CalibrateGripperCommandType = Literal["calibration/calibrateGripper"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class CalibrateGripperParamsJaw(Enum): # noqa: D101 FRONT = "front" REAR = "rear" @@ -39,7 +44,7 @@ class CalibrateGripperParams(BaseModel): ), ) - otherJawOffset: Optional[Vec3f] = Field( + otherJawOffset: Vec3f | SkipJsonSchema[None] = Field( None, description=( "If an offset for the other probe is already found, then specifying it here" @@ -48,6 +53,7 @@ class CalibrateGripperParams(BaseModel): " If this param is not specified then the command will only find and return" " the offset for the specified probe." ), + json_schema_extra=_remove_default, ) @@ -62,11 +68,12 @@ class CalibrateGripperResult(BaseModel): ), ) - savedCalibration: Optional[GripperCalibrationOffset] = Field( + savedCalibration: GripperCalibrationOffset | SkipJsonSchema[None] = Field( None, description=( "Gripper calibration result data, when `otherJawOffset` is provided." ), + json_schema_extra=_remove_default, ) @@ -118,8 +125,8 @@ async def execute( calibration_data = result return SuccessData( - public=CalibrateGripperResult.construct( - jawOffset=Vec3f.construct( + public=CalibrateGripperResult.model_construct( + jawOffset=Vec3f.model_construct( x=probe_offset.x, y=probe_offset.y, z=probe_offset.z ), savedCalibration=calibration_data, @@ -143,7 +150,7 @@ class CalibrateGripper( commandType: CalibrateGripperCommandType = "calibration/calibrateGripper" params: CalibrateGripperParams - result: Optional[CalibrateGripperResult] + result: Optional[CalibrateGripperResult] = None _ImplementationCls: Type[ CalibrateGripperImplementation diff --git a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_module.py b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_module.py index f488e8eab97..e203dcc19be 100644 --- a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_module.py +++ b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_module.py @@ -101,7 +101,7 @@ class CalibrateModule( commandType: CalibrateModuleCommandType = "calibration/calibrateModule" params: CalibrateModuleParams - result: Optional[CalibrateModuleResult] + result: Optional[CalibrateModuleResult] = None _ImplementationCls: Type[ CalibrateModuleImplementation diff --git a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_pipette.py b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_pipette.py index fbe754f6389..cb0eb93876c 100644 --- a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +++ b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_pipette.py @@ -65,8 +65,8 @@ async def execute( await ot3_api.save_instrument_offset(mount=ot3_mount, delta=pipette_offset) return SuccessData( - public=CalibratePipetteResult.construct( - pipetteOffset=InstrumentOffsetVector.construct( + public=CalibratePipetteResult.model_construct( + pipetteOffset=InstrumentOffsetVector.model_construct( x=pipette_offset.x, y=pipette_offset.y, z=pipette_offset.z ) ), @@ -80,7 +80,7 @@ class CalibratePipette( commandType: CalibratePipetteCommandType = "calibration/calibratePipette" params: CalibratePipetteParams - result: Optional[CalibratePipetteResult] + result: Optional[CalibratePipetteResult] = None _ImplementationCls: Type[ CalibratePipetteImplementation diff --git a/api/src/opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py b/api/src/opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py index afb178cae99..ca18d70a265 100644 --- a/api/src/opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +++ b/api/src/opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py @@ -136,7 +136,7 @@ class MoveToMaintenancePosition( "calibration/moveToMaintenancePosition" ) params: MoveToMaintenancePositionParams - result: Optional[MoveToMaintenancePositionResult] + result: Optional[MoveToMaintenancePositionResult] = None _ImplementationCls: Type[ MoveToMaintenancePositionImplementation diff --git a/api/src/opentrons/protocol_engine/commands/command.py b/api/src/opentrons/protocol_engine/commands/command.py index c009f314afb..38d1512905e 100644 --- a/api/src/opentrons/protocol_engine/commands/command.py +++ b/api/src/opentrons/protocol_engine/commands/command.py @@ -14,10 +14,12 @@ List, Type, Union, + Any, + Dict, ) from pydantic import BaseModel, Field -from pydantic.generics import GenericModel +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control import HardwareControlAPI from opentrons.protocol_engine.state.update_types import StateUpdate @@ -62,8 +64,12 @@ class CommandIntent(str, enum.Enum): FIXIT = "fixit" +def _pop_default(s: Dict[str, Any]) -> None: + s.pop("default", None) + + class BaseCommandCreate( - GenericModel, + BaseModel, # These type parameters need to be invariant because our fields are mutable. Generic[_ParamsT], ): @@ -81,7 +87,7 @@ class BaseCommandCreate( ), ) params: _ParamsT = Field(..., description="Command execution data payload") - intent: Optional[CommandIntent] = Field( + intent: CommandIntent | SkipJsonSchema[None] = Field( None, description=( "The reason the command was added. If not specified or `protocol`," @@ -94,14 +100,16 @@ class BaseCommandCreate( "Use setup commands for activities like pre-run calibration checks" " and module setup, like pre-heating." ), + json_schema_extra=_pop_default, ) - key: Optional[str] = Field( + key: str | SkipJsonSchema[None] = Field( None, description=( "A key value, unique in this run, that can be used to track" " the same logical command across multiple runs of the same protocol." " If a value is not provided, one will be generated." ), + json_schema_extra=_pop_default, ) @@ -143,8 +151,65 @@ class DefinedErrorData(Generic[_ErrorT_co]): ) +_ExecuteReturnT_co = TypeVar( + "_ExecuteReturnT_co", + bound=Union[ + SuccessData[BaseModel], + DefinedErrorData[ErrorOccurrence], + ], + covariant=True, +) + + +class AbstractCommandImpl( + ABC, + Generic[_ParamsT_contra, _ExecuteReturnT_co], +): + """Abstract command creation and execution implementation. + + A given command request should map to a specific command implementation, + which defines how to execute the command and map data from execution into the + result model. + """ + + def __init__( + self, + state_view: StateView, + hardware_api: HardwareControlAPI, + equipment: execution.EquipmentHandler, + file_provider: execution.FileProvider, + movement: execution.MovementHandler, + gantry_mover: execution.GantryMover, + labware_movement: execution.LabwareMovementHandler, + pipetting: execution.PipettingHandler, + tip_handler: execution.TipHandler, + run_control: execution.RunControlHandler, + rail_lights: execution.RailLightsHandler, + model_utils: ModelUtils, + status_bar: execution.StatusBarHandler, + command_note_adder: CommandNoteAdder, + ) -> None: + """Initialize the command implementation with execution handlers.""" + pass + + @abstractmethod + async def execute(self, params: _ParamsT_contra) -> _ExecuteReturnT_co: + """Execute the command, mapping data from execution into a response model. + + This should either: + + - Return a `SuccessData`, if the command completed normally. + - Return a `DefinedErrorData`, if the command failed with a "defined error." + Defined errors are errors that are documented as part of the robot's public + API. + - Raise an exception, if the command failed with any other error + (in other words, an undefined error). + """ + ... + + class BaseCommand( - GenericModel, + BaseModel, # These type parameters need to be invariant because our fields are mutable. Generic[_ParamsT, _ResultT, _ErrorT], ): @@ -241,60 +306,3 @@ class BaseCommand( ], ] ] - - -_ExecuteReturnT_co = TypeVar( - "_ExecuteReturnT_co", - bound=Union[ - SuccessData[BaseModel], - DefinedErrorData[ErrorOccurrence], - ], - covariant=True, -) - - -class AbstractCommandImpl( - ABC, - Generic[_ParamsT_contra, _ExecuteReturnT_co], -): - """Abstract command creation and execution implementation. - - A given command request should map to a specific command implementation, - which defines how to execute the command and map data from execution into the - result model. - """ - - def __init__( - self, - state_view: StateView, - hardware_api: HardwareControlAPI, - equipment: execution.EquipmentHandler, - file_provider: execution.FileProvider, - movement: execution.MovementHandler, - gantry_mover: execution.GantryMover, - labware_movement: execution.LabwareMovementHandler, - pipetting: execution.PipettingHandler, - tip_handler: execution.TipHandler, - run_control: execution.RunControlHandler, - rail_lights: execution.RailLightsHandler, - model_utils: ModelUtils, - status_bar: execution.StatusBarHandler, - command_note_adder: CommandNoteAdder, - ) -> None: - """Initialize the command implementation with execution handlers.""" - pass - - @abstractmethod - async def execute(self, params: _ParamsT_contra) -> _ExecuteReturnT_co: - """Execute the command, mapping data from execution into a response model. - - This should either: - - - Return a `SuccessData`, if the command completed normally. - - Return a `DefinedErrorData`, if the command failed with a "defined error." - Defined errors are errors that are documented as part of the robot's public - API. - - Raise an exception, if the command failed with any other error - (in other words, an undefined error). - """ - ... diff --git a/api/src/opentrons/protocol_engine/commands/command_unions.py b/api/src/opentrons/protocol_engine/commands/command_unions.py index 16663bf6df6..b04b381ae6b 100644 --- a/api/src/opentrons/protocol_engine/commands/command_unions.py +++ b/api/src/opentrons/protocol_engine/commands/command_unions.py @@ -3,7 +3,7 @@ from collections.abc import Collection from typing import Annotated, Type, Union, get_type_hints -from pydantic import Field +from pydantic import Field, TypeAdapter from opentrons.util.get_union_elements import get_union_elements @@ -161,6 +161,22 @@ LoadPipetteCommandType, ) +from .load_lid_stack import ( + LoadLidStack, + LoadLidStackParams, + LoadLidStackCreate, + LoadLidStackResult, + LoadLidStackCommandType, +) + +from .load_lid import ( + LoadLid, + LoadLidParams, + LoadLidCreate, + LoadLidResult, + LoadLidCommandType, +) + from .move_labware import ( GripperMovementError, MoveLabware, @@ -367,6 +383,8 @@ LoadLiquidClass, LoadModule, LoadPipette, + LoadLidStack, + LoadLid, MoveLabware, MoveRelative, MoveToCoordinates, @@ -448,6 +466,8 @@ HomeParams, RetractAxisParams, LoadLabwareParams, + LoadLidStackParams, + LoadLidParams, ReloadLabwareParams, LoadLiquidParams, LoadLiquidClassParams, @@ -537,6 +557,8 @@ LoadLiquidClassCommandType, LoadModuleCommandType, LoadPipetteCommandType, + LoadLidStackCommandType, + LoadLidCommandType, MoveLabwareCommandType, MoveRelativeCommandType, MoveToCoordinatesCommandType, @@ -622,6 +644,8 @@ LoadLiquidClassCreate, LoadModuleCreate, LoadPipetteCreate, + LoadLidStackCreate, + LoadLidCreate, MoveLabwareCreate, MoveRelativeCreate, MoveToCoordinatesCreate, @@ -686,6 +710,13 @@ Field(discriminator="commandType"), ] +# Each time a TypeAdapter is instantiated, it will construct a new validator and +# serializer. To improve performance, TypeAdapters are instantiated once. +# See https://docs.pydantic.dev/latest/concepts/performance/#typeadapter-instantiated-once +CommandCreateAdapter: TypeAdapter[CommandCreate] = TypeAdapter(CommandCreate) + +CommandAdapter: TypeAdapter[Command] = TypeAdapter(Command) + CommandResult = Union[ AirGapInPlaceResult, AspirateResult, @@ -708,6 +739,8 @@ LoadLiquidClassResult, LoadModuleResult, LoadPipetteResult, + LoadLidStackResult, + LoadLidResult, MoveLabwareResult, MoveRelativeResult, MoveToCoordinatesResult, diff --git a/api/src/opentrons/protocol_engine/commands/comment.py b/api/src/opentrons/protocol_engine/commands/comment.py index 5cd0b0c3113..f14a9a9992c 100644 --- a/api/src/opentrons/protocol_engine/commands/comment.py +++ b/api/src/opentrons/protocol_engine/commands/comment.py @@ -43,7 +43,7 @@ class Comment(BaseCommand[CommentParams, CommentResult, ErrorOccurrence]): commandType: CommentCommandType = "comment" params: CommentParams - result: Optional[CommentResult] + result: Optional[CommentResult] = None _ImplementationCls: Type[CommentImplementation] = CommentImplementation diff --git a/api/src/opentrons/protocol_engine/commands/configure_for_volume.py b/api/src/opentrons/protocol_engine/commands/configure_for_volume.py index 1c8aa21f491..50e1e7546bc 100644 --- a/api/src/opentrons/protocol_engine/commands/configure_for_volume.py +++ b/api/src/opentrons/protocol_engine/commands/configure_for_volume.py @@ -1,7 +1,9 @@ """Configure for volume command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .pipetting_common import PipetteIdMixin @@ -16,6 +18,10 @@ ConfigureForVolumeCommandType = Literal["configureForVolume"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class ConfigureForVolumeParams(PipetteIdMixin): """Parameters required to configure volume for a specific pipette.""" @@ -25,12 +31,13 @@ class ConfigureForVolumeParams(PipetteIdMixin): "than a pipette-specific maximum volume.", ge=0, ) - tipOverlapNotAfterVersion: Optional[str] = Field( + tipOverlapNotAfterVersion: str | SkipJsonSchema[None] = Field( None, description="A version of tip overlap data to not exceed. The highest-versioned " "tip overlap data that does not exceed this version will be used. Versions are " "expressed as vN where N is an integer, counting up from v0. If None, the current " "highest version will be used.", + json_schema_extra=_remove_default, ) @@ -81,7 +88,7 @@ class ConfigureForVolume( commandType: ConfigureForVolumeCommandType = "configureForVolume" params: ConfigureForVolumeParams - result: Optional[ConfigureForVolumeResult] + result: Optional[ConfigureForVolumeResult] = None _ImplementationCls: Type[ ConfigureForVolumeImplementation diff --git a/api/src/opentrons/protocol_engine/commands/configure_nozzle_layout.py b/api/src/opentrons/protocol_engine/commands/configure_nozzle_layout.py index f78839773ec..072307a0609 100644 --- a/api/src/opentrons/protocol_engine/commands/configure_nozzle_layout.py +++ b/api/src/opentrons/protocol_engine/commands/configure_nozzle_layout.py @@ -61,9 +61,11 @@ async def execute( self, params: ConfigureNozzleLayoutParams ) -> SuccessData[ConfigureNozzleLayoutResult]: """Check that requested pipette can support the requested nozzle layout.""" - primary_nozzle = params.configurationParams.dict().get("primaryNozzle") - front_right_nozzle = params.configurationParams.dict().get("frontRightNozzle") - back_left_nozzle = params.configurationParams.dict().get("backLeftNozzle") + primary_nozzle = params.configurationParams.model_dump().get("primaryNozzle") + front_right_nozzle = params.configurationParams.model_dump().get( + "frontRightNozzle" + ) + back_left_nozzle = params.configurationParams.model_dump().get("backLeftNozzle") nozzle_params = await self._tip_handler.available_for_nozzle_layout( pipette_id=params.pipetteId, style=params.configurationParams.style, @@ -97,7 +99,7 @@ class ConfigureNozzleLayout( commandType: ConfigureNozzleLayoutCommandType = "configureNozzleLayout" params: ConfigureNozzleLayoutParams - result: Optional[ConfigureNozzleLayoutResult] + result: Optional[ConfigureNozzleLayoutResult] = None _ImplementationCls: Type[ ConfigureNozzleLayoutImplementation diff --git a/api/src/opentrons/protocol_engine/commands/custom.py b/api/src/opentrons/protocol_engine/commands/custom.py index 1bdf07084be..b15b5cdb8d3 100644 --- a/api/src/opentrons/protocol_engine/commands/custom.py +++ b/api/src/opentrons/protocol_engine/commands/custom.py @@ -10,7 +10,7 @@ If you are implementing a custom command, you should probably put your own disambiguation identifier in the payload. """ -from pydantic import BaseModel, Extra +from pydantic import ConfigDict, BaseModel, SerializeAsAny from typing import Optional, Type from typing_extensions import Literal @@ -24,19 +24,13 @@ class CustomParams(BaseModel): """Payload used by a custom command.""" - class Config: - """Allow arbitrary fields.""" - - extra = Extra.allow + model_config = ConfigDict(extra="allow") class CustomResult(BaseModel): """Result data from a custom command.""" - class Config: - """Allow arbitrary fields.""" - - extra = Extra.allow + model_config = ConfigDict(extra="allow") class CustomImplementation( @@ -50,7 +44,7 @@ class CustomImplementation( async def execute(self, params: CustomParams) -> SuccessData[CustomResult]: """A custom command does nothing when executed directly.""" return SuccessData( - public=CustomResult.construct(), + public=CustomResult.model_construct(), ) @@ -58,8 +52,8 @@ class Custom(BaseCommand[CustomParams, CustomResult, ErrorOccurrence]): """Custom command model.""" commandType: CustomCommandType = "custom" - params: CustomParams - result: Optional[CustomResult] + params: SerializeAsAny[CustomParams] + result: Optional[CustomResult] = None _ImplementationCls: Type[CustomImplementation] = CustomImplementation diff --git a/api/src/opentrons/protocol_engine/commands/dispense.py b/api/src/opentrons/protocol_engine/commands/dispense.py index 18f157934d4..8ad2365ccb5 100644 --- a/api/src/opentrons/protocol_engine/commands/dispense.py +++ b/api/src/opentrons/protocol_engine/commands/dispense.py @@ -1,11 +1,12 @@ """Dispense command request, result, and implementation models.""" from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Type, Union +from typing import TYPE_CHECKING, Optional, Type, Union, Any from typing_extensions import Literal from pydantic import Field +from pydantic.json_schema import SkipJsonSchema from ..state.update_types import StateUpdate, CLEAR from .pipetting_common import ( @@ -39,14 +40,19 @@ DispenseCommandType = Literal["dispense"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class DispenseParams( PipetteIdMixin, DispenseVolumeMixin, FlowRateMixin, LiquidHandlingWellLocationMixin ): """Payload required to dispense to a specific well.""" - pushOut: Optional[float] = Field( + pushOut: float | SkipJsonSchema[None] = Field( None, description="push the plunger a small amount farther than necessary for accurate low-volume dispensing", + json_schema_extra=_remove_default, ) @@ -172,7 +178,7 @@ class Dispense( commandType: DispenseCommandType = "dispense" params: DispenseParams - result: Optional[DispenseResult] + result: Optional[DispenseResult] = None _ImplementationCls: Type[DispenseImplementation] = DispenseImplementation diff --git a/api/src/opentrons/protocol_engine/commands/dispense_in_place.py b/api/src/opentrons/protocol_engine/commands/dispense_in_place.py index fc1f9e19610..117aa011a84 100644 --- a/api/src/opentrons/protocol_engine/commands/dispense_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/dispense_in_place.py @@ -1,9 +1,10 @@ """Dispense-in-place command request, result, and implementation models.""" from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Type, Union +from typing import TYPE_CHECKING, Optional, Type, Union, Any from typing_extensions import Literal from pydantic import Field +from pydantic.json_schema import SkipJsonSchema from .pipetting_common import ( PipetteIdMixin, @@ -32,12 +33,17 @@ DispenseInPlaceCommandType = Literal["dispenseInPlace"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class DispenseInPlaceParams(PipetteIdMixin, DispenseVolumeMixin, FlowRateMixin): """Payload required to dispense in place.""" - pushOut: Optional[float] = Field( + pushOut: float | SkipJsonSchema[None] = Field( None, description="push the plunger a small amount farther than necessary for accurate low-volume dispensing", + json_schema_extra=_remove_default, ) @@ -154,7 +160,7 @@ class DispenseInPlace( commandType: DispenseInPlaceCommandType = "dispenseInPlace" params: DispenseInPlaceParams - result: Optional[DispenseInPlaceResult] + result: Optional[DispenseInPlaceResult] = None _ImplementationCls: Type[ DispenseInPlaceImplementation diff --git a/api/src/opentrons/protocol_engine/commands/drop_tip.py b/api/src/opentrons/protocol_engine/commands/drop_tip.py index 4faee3d5e2f..2c393064eb6 100644 --- a/api/src/opentrons/protocol_engine/commands/drop_tip.py +++ b/api/src/opentrons/protocol_engine/commands/drop_tip.py @@ -1,9 +1,11 @@ """Drop tip command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any from pydantic import Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema + from typing_extensions import Literal from opentrons.protocol_engine.errors.exceptions import TipAttachedError @@ -37,6 +39,10 @@ DropTipCommandType = Literal["dropTip"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class DropTipParams(PipetteIdMixin): """Payload required to drop a tip in a specific well.""" @@ -46,15 +52,16 @@ class DropTipParams(PipetteIdMixin): default_factory=DropTipWellLocation, description="Relative well location at which to drop the tip.", ) - homeAfter: Optional[bool] = Field( + homeAfter: bool | SkipJsonSchema[None] = Field( None, description=( "Whether to home this pipette's plunger after dropping the tip." " You should normally leave this unspecified to let the robot choose" " a safe default depending on its hardware." ), + json_schema_extra=_remove_default, ) - alternateDropLocation: Optional[bool] = Field( + alternateDropLocation: bool | SkipJsonSchema[None] = Field( False, description=( "Whether to alternate location where tip is dropped within the labware." @@ -63,6 +70,7 @@ class DropTipParams(PipetteIdMixin): " labware well." " If False, the tip will be dropped at the top center of the well." ), + json_schema_extra=_remove_default, ) @@ -184,7 +192,7 @@ class DropTip( commandType: DropTipCommandType = "dropTip" params: DropTipParams - result: Optional[DropTipResult] + result: Optional[DropTipResult] = None _ImplementationCls: Type[DropTipImplementation] = DropTipImplementation diff --git a/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py b/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py index 8687382b53f..09bd73b8bb1 100644 --- a/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py @@ -1,7 +1,10 @@ """Drop tip in place command request, result, and implementation models.""" from __future__ import annotations + +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import Field, BaseModel -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .command import ( @@ -24,16 +27,21 @@ DropTipInPlaceCommandType = Literal["dropTipInPlace"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class DropTipInPlaceParams(PipetteIdMixin): """Payload required to drop a tip in place.""" - homeAfter: Optional[bool] = Field( + homeAfter: bool | SkipJsonSchema[None] = Field( None, description=( "Whether to home this pipette's plunger after dropping the tip." " You should normally leave this unspecified to let the robot choose" " a safe default depending on its hardware." ), + json_schema_extra=_remove_default, ) @@ -112,7 +120,7 @@ class DropTipInPlace( commandType: DropTipInPlaceCommandType = "dropTipInPlace" params: DropTipInPlaceParams - result: Optional[DropTipInPlaceResult] + result: Optional[DropTipInPlaceResult] = None _ImplementationCls: Type[ DropTipInPlaceImplementation diff --git a/api/src/opentrons/protocol_engine/commands/generate_command_schema.py b/api/src/opentrons/protocol_engine/commands/generate_command_schema.py index acc0923bcdf..938244b74e8 100644 --- a/api/src/opentrons/protocol_engine/commands/generate_command_schema.py +++ b/api/src/opentrons/protocol_engine/commands/generate_command_schema.py @@ -1,24 +1,17 @@ """Generate a JSON schema against which all create commands statically validate.""" + import json -import pydantic import argparse import sys -from opentrons.protocol_engine.commands.command_unions import CommandCreate - - -class CreateCommandUnion(pydantic.BaseModel): - """Model that validates a union of all CommandCreate models.""" - - __root__: CommandCreate +from opentrons.protocol_engine.commands.command_unions import CommandCreateAdapter def generate_command_schema(version: str) -> str: """Generate a JSON Schema that all valid create commands can validate against.""" - raw_json_schema = CreateCommandUnion.schema_json() - schema_as_dict = json.loads(raw_json_schema) + schema_as_dict = CommandCreateAdapter.json_schema(mode="validation") schema_as_dict["$id"] = f"opentronsCommandSchemaV{version}" schema_as_dict["$schema"] = "http://json-schema.org/draft-07/schema#" - return json.dumps(schema_as_dict, indent=2) + return json.dumps(schema_as_dict, indent=2, sort_keys=True) if __name__ == "__main__": diff --git a/api/src/opentrons/protocol_engine/commands/get_next_tip.py b/api/src/opentrons/protocol_engine/commands/get_next_tip.py index 7ff10681bfb..f9f2cb8ba61 100644 --- a/api/src/opentrons/protocol_engine/commands/get_next_tip.py +++ b/api/src/opentrons/protocol_engine/commands/get_next_tip.py @@ -2,7 +2,9 @@ from __future__ import annotations from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type, List, Literal, Union +from typing import TYPE_CHECKING, Any, Optional, Type, List, Literal, Union + +from pydantic.json_schema import SkipJsonSchema from opentrons.types import NozzleConfigurationType @@ -21,6 +23,10 @@ from ..state.state import StateView +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + GetNextTipCommandType = Literal["getNextTip"] @@ -32,10 +38,11 @@ class GetNextTipParams(PipetteIdMixin): description="Labware ID(s) of tip racks to resolve next available tip(s) from" " Labware IDs will be resolved sequentially", ) - startingTipWell: Optional[str] = Field( + startingTipWell: str | SkipJsonSchema[None] = Field( None, description="Name of starting tip rack 'well'." " This only applies to the first tip rack in the list provided in labwareIDs", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/get_tip_presence.py b/api/src/opentrons/protocol_engine/commands/get_tip_presence.py index 6bbe5fa2fe3..05f9e1052c1 100644 --- a/api/src/opentrons/protocol_engine/commands/get_tip_presence.py +++ b/api/src/opentrons/protocol_engine/commands/get_tip_presence.py @@ -71,7 +71,7 @@ class GetTipPresence( commandType: GetTipPresenceCommandType = "getTipPresence" params: GetTipPresenceParams - result: Optional[GetTipPresenceResult] + result: Optional[GetTipPresenceResult] = None _ImplementationCls: Type[ GetTipPresenceImplementation diff --git a/api/src/opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py b/api/src/opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py index 2151fb05877..211b374be7e 100644 --- a/api/src/opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +++ b/api/src/opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py @@ -69,7 +69,7 @@ class CloseLabwareLatch( commandType: CloseLabwareLatchCommandType = "heaterShaker/closeLabwareLatch" params: CloseLabwareLatchParams - result: Optional[CloseLabwareLatchResult] + result: Optional[CloseLabwareLatchResult] = None _ImplementationCls: Type[CloseLabwareLatchImpl] = CloseLabwareLatchImpl diff --git a/api/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py b/api/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py index 3932f1d6490..6ac76f020d3 100644 --- a/api/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +++ b/api/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py @@ -68,7 +68,7 @@ class DeactivateHeater( commandType: DeactivateHeaterCommandType = "heaterShaker/deactivateHeater" params: DeactivateHeaterParams - result: Optional[DeactivateHeaterResult] + result: Optional[DeactivateHeaterResult] = None _ImplementationCls: Type[DeactivateHeaterImpl] = DeactivateHeaterImpl diff --git a/api/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py b/api/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py index b259745ea3d..e7e50b07fee 100644 --- a/api/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +++ b/api/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py @@ -70,7 +70,7 @@ class DeactivateShaker( commandType: DeactivateShakerCommandType = "heaterShaker/deactivateShaker" params: DeactivateShakerParams - result: Optional[DeactivateShakerResult] + result: Optional[DeactivateShakerResult] = None _ImplementationCls: Type[DeactivateShakerImpl] = DeactivateShakerImpl diff --git a/api/src/opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py b/api/src/opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py index 9c3a9d8ae7d..8bb869c47ee 100644 --- a/api/src/opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +++ b/api/src/opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py @@ -96,7 +96,7 @@ class OpenLabwareLatch( commandType: OpenLabwareLatchCommandType = "heaterShaker/openLabwareLatch" params: OpenLabwareLatchParams - result: Optional[OpenLabwareLatchResult] + result: Optional[OpenLabwareLatchResult] = None _ImplementationCls: Type[OpenLabwareLatchImpl] = OpenLabwareLatchImpl diff --git a/api/src/opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py b/api/src/opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py index 8828195c658..2bcf1d48ba3 100644 --- a/api/src/opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +++ b/api/src/opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py @@ -109,7 +109,7 @@ class SetAndWaitForShakeSpeed( "heaterShaker/setAndWaitForShakeSpeed" ) params: SetAndWaitForShakeSpeedParams - result: Optional[SetAndWaitForShakeSpeedResult] + result: Optional[SetAndWaitForShakeSpeedResult] = None _ImplementationCls: Type[SetAndWaitForShakeSpeedImpl] = SetAndWaitForShakeSpeedImpl diff --git a/api/src/opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py b/api/src/opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py index fa29390b910..f0b0533aca3 100644 --- a/api/src/opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py @@ -76,7 +76,7 @@ class SetTargetTemperature( commandType: SetTargetTemperatureCommandType = "heaterShaker/setTargetTemperature" params: SetTargetTemperatureParams - result: Optional[SetTargetTemperatureResult] + result: Optional[SetTargetTemperatureResult] = None _ImplementationCls: Type[SetTargetTemperatureImpl] = SetTargetTemperatureImpl diff --git a/api/src/opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py b/api/src/opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py index bb440a2674c..676fbcd4bfb 100644 --- a/api/src/opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py @@ -1,9 +1,10 @@ """Command models to wait for a Heater-Shaker Module's target temperature.""" from __future__ import annotations -from typing import Optional, TYPE_CHECKING -from typing_extensions import Literal, Type +from typing import Optional, TYPE_CHECKING, Any +from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence @@ -16,11 +17,15 @@ WaitForTemperatureCommandType = Literal["heaterShaker/waitForTemperature"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class WaitForTemperatureParams(BaseModel): """Input parameters to wait for a Heater-Shaker's target temperature.""" moduleId: str = Field(..., description="Unique ID of the Heater-Shaker Module.") - celsius: Optional[float] = Field( + celsius: float | SkipJsonSchema[None] = Field( None, description="Target temperature in °C. If not specified, will " "default to the module's target temperature. " @@ -28,6 +33,7 @@ class WaitForTemperatureParams(BaseModel): "could lead to unpredictable behavior and hence is not " "recommended for use. This parameter can be removed in a " "future version without prior notice.", + json_schema_extra=_remove_default, ) @@ -82,7 +88,7 @@ class WaitForTemperature( commandType: WaitForTemperatureCommandType = "heaterShaker/waitForTemperature" params: WaitForTemperatureParams - result: Optional[WaitForTemperatureResult] + result: Optional[WaitForTemperatureResult] = None _ImplementationCls: Type[WaitForTemperatureImpl] = WaitForTemperatureImpl diff --git a/api/src/opentrons/protocol_engine/commands/home.py b/api/src/opentrons/protocol_engine/commands/home.py index 7b82f90e1fd..f096740958f 100644 --- a/api/src/opentrons/protocol_engine/commands/home.py +++ b/api/src/opentrons/protocol_engine/commands/home.py @@ -1,7 +1,10 @@ """Home command payload, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, List, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, List, Type +from pydantic.json_schema import SkipJsonSchema + from typing_extensions import Literal from opentrons.types import MountType @@ -17,24 +20,30 @@ HomeCommandType = Literal["home"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class HomeParams(BaseModel): """Payload required for a Home command.""" - axes: Optional[List[MotorAxis]] = Field( + axes: List[MotorAxis] | SkipJsonSchema[None] = Field( None, description=( "Axes to return to their home positions. If omitted," " will home all motors. Extra axes may be implicitly homed" " to ensure accurate homing of the explicitly specified axes." ), + json_schema_extra=_remove_default, ) - skipIfMountPositionOk: Optional[MountType] = Field( + skipIfMountPositionOk: MountType | SkipJsonSchema[None] = Field( None, description=( "If this parameter is provided, the gantry will only be homed if the" " specified mount has an invalid position. If omitted, the homing action" " will be executed unconditionally." ), + json_schema_extra=_remove_default, ) @@ -77,7 +86,7 @@ class Home(BaseCommand[HomeParams, HomeResult, ErrorOccurrence]): commandType: HomeCommandType = "home" params: HomeParams - result: Optional[HomeResult] + result: Optional[HomeResult] = None _ImplementationCls: Type[HomeImplementation] = HomeImplementation diff --git a/api/src/opentrons/protocol_engine/commands/liquid_probe.py b/api/src/opentrons/protocol_engine/commands/liquid_probe.py index 1bf58e8be26..a0418d53c9a 100644 --- a/api/src/opentrons/protocol_engine/commands/liquid_probe.py +++ b/api/src/opentrons/protocol_engine/commands/liquid_probe.py @@ -1,10 +1,11 @@ """The liquidProbe and tryLiquidProbe commands.""" from __future__ import annotations -from typing import TYPE_CHECKING, NamedTuple, Optional, Type, Union -from typing_extensions import Literal +from typing import TYPE_CHECKING, NamedTuple, Optional, Type, Union, Any +from typing_extensions import Literal from pydantic import Field +from pydantic.json_schema import SkipJsonSchema from opentrons.protocol_engine.state import update_types from opentrons.protocol_engine.errors.exceptions import ( @@ -47,6 +48,10 @@ from ..state.state import StateView +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + LiquidProbeCommandType = Literal["liquidProbe"] TryLiquidProbeCommandType = Literal["tryLiquidProbe"] @@ -82,12 +87,13 @@ class LiquidProbeResult(DestinationPositionResult): class TryLiquidProbeResult(DestinationPositionResult): """Result data from the execution of a `tryLiquidProbe` command.""" - z_position: Optional[float] = Field( + z_position: float | SkipJsonSchema[None] = Field( ..., description=( "The Z coordinate, in mm, of the found liquid in deck space." " If no liquid was found, `null` or omitted." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/load_labware.py b/api/src/opentrons/protocol_engine/commands/load_labware.py index 2d8b8c3df78..d0e83863616 100644 --- a/api/src/opentrons/protocol_engine/commands/load_labware.py +++ b/api/src/opentrons/protocol_engine/commands/load_labware.py @@ -1,7 +1,9 @@ """Load labware command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from opentrons_shared_data.labware.labware_definition import LabwareDefinition @@ -29,6 +31,10 @@ LoadLabwareCommandType = Literal["loadLabware"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class LoadLabwareParams(BaseModel): """Payload required to load a labware into a slot.""" @@ -48,18 +54,20 @@ class LoadLabwareParams(BaseModel): ..., description="The labware definition version.", ) - labwareId: Optional[str] = Field( + labwareId: str | SkipJsonSchema[None] = Field( None, description="An optional ID to assign to this labware. If None, an ID " "will be generated.", + json_schema_extra=_remove_default, ) - displayName: Optional[str] = Field( + displayName: str | SkipJsonSchema[None] = Field( None, description="An optional user-specified display name " "or label for this labware.", # NOTE: v4/5 JSON protocols will always have a displayName which will be the # user-specified label OR the displayName property of the labware's definition. # TODO: Make sure v6 JSON protocols don't do that. + json_schema_extra=_remove_default, ) @@ -164,6 +172,19 @@ async def execute( top_labware_definition=loaded_labware.definition, bottom_labware_id=verified_location.labwareId, ) + # Validate load location is valid for lids + if ( + labware_validation.validate_definition_is_lid( + definition=loaded_labware.definition + ) + and loaded_labware.definition.compatibleParentLabware is not None + and self._state_view.labware.get_load_name(verified_location.labwareId) + not in loaded_labware.definition.compatibleParentLabware + ): + raise ValueError( + f"Labware Lid {params.loadName} may not be loaded on parent labware {self._state_view.labware.get_display_name(verified_location.labwareId)}." + ) + # Validate labware for the absorbance reader elif isinstance(params.location, ModuleLocation): module = self._state_view.modules.get(params.location.moduleId) @@ -171,7 +192,6 @@ async def execute( self._state_view.labware.raise_if_labware_incompatible_with_plate_reader( loaded_labware.definition ) - return SuccessData( public=LoadLabwareResult( labwareId=loaded_labware.labware_id, @@ -187,7 +207,7 @@ class LoadLabware(BaseCommand[LoadLabwareParams, LoadLabwareResult, ErrorOccurre commandType: LoadLabwareCommandType = "loadLabware" params: LoadLabwareParams - result: Optional[LoadLabwareResult] + result: Optional[LoadLabwareResult] = None _ImplementationCls: Type[LoadLabwareImplementation] = LoadLabwareImplementation diff --git a/api/src/opentrons/protocol_engine/commands/load_lid.py b/api/src/opentrons/protocol_engine/commands/load_lid.py new file mode 100644 index 00000000000..4f2e49c7447 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/load_lid.py @@ -0,0 +1,146 @@ +"""Load lid command request, result, and implementation models.""" +from __future__ import annotations +from pydantic import BaseModel, Field +from typing import TYPE_CHECKING, Optional, Type +from typing_extensions import Literal + +from opentrons_shared_data.labware.labware_definition import LabwareDefinition + +from ..errors import LabwareCannotBeStackedError, LabwareIsNotAllowedInLocationError +from ..resources import labware_validation +from ..types import ( + LabwareLocation, + OnLabwareLocation, +) + +from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData +from ..errors.error_occurrence import ErrorOccurrence +from ..state.update_types import StateUpdate + +if TYPE_CHECKING: + from ..state.state import StateView + from ..execution import EquipmentHandler + + +LoadLidCommandType = Literal["loadLid"] + + +class LoadLidParams(BaseModel): + """Payload required to load a lid onto a labware.""" + + location: LabwareLocation = Field( + ..., + description="Labware the lid should be loaded onto.", + ) + loadName: str = Field( + ..., + description="Name used to reference a lid labware definition.", + ) + namespace: str = Field( + ..., + description="The namespace the lid labware definition belongs to.", + ) + version: int = Field( + ..., + description="The lid labware definition version.", + ) + + +class LoadLidResult(BaseModel): + """Result data from the execution of a LoadLabware command.""" + + labwareId: str = Field( + ..., + description="An ID to reference this lid labware in subsequent commands.", + ) + definition: LabwareDefinition = Field( + ..., + description="The full definition data for this lid labware.", + ) + + +class LoadLidImplementation( + AbstractCommandImpl[LoadLidParams, SuccessData[LoadLidResult]] +): + """Load lid command implementation.""" + + def __init__( + self, equipment: EquipmentHandler, state_view: StateView, **kwargs: object + ) -> None: + self._equipment = equipment + self._state_view = state_view + + async def execute(self, params: LoadLidParams) -> SuccessData[LoadLidResult]: + """Load definition and calibration data necessary for a lid.""" + if not isinstance(params.location, OnLabwareLocation): + raise LabwareIsNotAllowedInLocationError( + "Lid Labware is only allowed to be loaded on top of a labware. Try `load_lid_stack(...)` to load lids without parent labware." + ) + + verified_location = self._state_view.geometry.ensure_location_not_occupied( + params.location + ) + loaded_labware = await self._equipment.load_labware( + load_name=params.loadName, + namespace=params.namespace, + version=params.version, + location=verified_location, + labware_id=None, + ) + + # TODO(chb 2024-12-12) these validation checks happen after the labware is loaded, because they rely on + # on the definition. In practice this will not cause any issues since they will raise protocol ending + # exception, but for correctness should be refactored to do this check beforehand. + if not labware_validation.validate_definition_is_lid(loaded_labware.definition): + raise LabwareCannotBeStackedError( + f"Labware {params.loadName} is not a Lid and cannot be loaded onto {self._state_view.labware.get_display_name(params.location.labwareId)}." + ) + + state_update = StateUpdate() + + # In the case of lids being loaded on top of other labware, set the parent labware's lid + state_update.set_lid( + parent_labware_id=params.location.labwareId, + lid_id=loaded_labware.labware_id, + ) + + state_update.set_loaded_labware( + labware_id=loaded_labware.labware_id, + offset_id=loaded_labware.offsetId, + definition=loaded_labware.definition, + location=verified_location, + display_name=None, + ) + + if isinstance(verified_location, OnLabwareLocation): + self._state_view.labware.raise_if_labware_cannot_be_stacked( + top_labware_definition=loaded_labware.definition, + bottom_labware_id=verified_location.labwareId, + ) + + return SuccessData( + public=LoadLidResult( + labwareId=loaded_labware.labware_id, + definition=loaded_labware.definition, + ), + state_update=state_update, + ) + + +class LoadLid(BaseCommand[LoadLidParams, LoadLidResult, ErrorOccurrence]): + """Load lid command resource model.""" + + commandType: LoadLidCommandType = "loadLid" + params: LoadLidParams + result: Optional[LoadLidResult] + + _ImplementationCls: Type[LoadLidImplementation] = LoadLidImplementation + + +class LoadLidCreate(BaseCommandCreate[LoadLidParams]): + """Load lid command creation request.""" + + commandType: LoadLidCommandType = "loadLid" + params: LoadLidParams + + _CommandCls: Type[LoadLid] = LoadLid diff --git a/api/src/opentrons/protocol_engine/commands/load_lid_stack.py b/api/src/opentrons/protocol_engine/commands/load_lid_stack.py new file mode 100644 index 00000000000..7b430dfaf45 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/load_lid_stack.py @@ -0,0 +1,189 @@ +"""Load lid stack command request, result, and implementation models.""" +from __future__ import annotations +from pydantic import BaseModel, Field +from typing import TYPE_CHECKING, Optional, Type, List +from typing_extensions import Literal + +from opentrons_shared_data.labware.labware_definition import LabwareDefinition + +from ..errors import LabwareIsNotAllowedInLocationError, ProtocolEngineError +from ..resources import fixture_validation, labware_validation +from ..types import ( + LabwareLocation, + OnLabwareLocation, + DeckSlotLocation, + AddressableAreaLocation, +) + +from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData +from ..errors.error_occurrence import ErrorOccurrence +from ..state.update_types import StateUpdate + +if TYPE_CHECKING: + from ..state.state import StateView + from ..execution import EquipmentHandler + + +LoadLidStackCommandType = Literal["loadLidStack"] + +_LID_STACK_PE_LABWARE = "protocol_engine_lid_stack_object" +_LID_STACK_PE_NAMESPACE = "opentrons" +_LID_STACK_PE_VERSION = 1 + + +class LoadLidStackParams(BaseModel): + """Payload required to load a lid stack onto a location.""" + + location: LabwareLocation = Field( + ..., + description="Location the lid stack should be loaded into.", + ) + loadName: str = Field( + ..., + description="Name used to reference a lid labware definition.", + ) + namespace: str = Field( + ..., + description="The namespace the lid labware definition belongs to.", + ) + version: int = Field( + ..., + description="The lid labware definition version.", + ) + quantity: int = Field( + ..., + description="The quantity of lids to load.", + ) + + +class LoadLidStackResult(BaseModel): + """Result data from the execution of a LoadLidStack command.""" + + stackLabwareId: str = Field( + ..., + description="An ID to reference the Protocol Engine Labware Lid Stack in subsequent commands.", + ) + labwareIds: List[str] = Field( + ..., + description="A list of lid labware IDs to reference the lids in this stack by. The first ID is the bottom of the stack.", + ) + definition: LabwareDefinition = Field( + ..., + description="The full definition data for this lid labware.", + ) + location: LabwareLocation = Field( + ..., description="The Location that the stack of lid labware has been loaded." + ) + + +class LoadLidStackImplementation( + AbstractCommandImpl[LoadLidStackParams, SuccessData[LoadLidStackResult]] +): + """Load lid stack command implementation.""" + + def __init__( + self, equipment: EquipmentHandler, state_view: StateView, **kwargs: object + ) -> None: + self._equipment = equipment + self._state_view = state_view + + async def execute( + self, params: LoadLidStackParams + ) -> SuccessData[LoadLidStackResult]: + """Load definition and calibration data necessary for a lid stack.""" + if isinstance(params.location, AddressableAreaLocation): + area_name = params.location.addressableAreaName + if not ( + fixture_validation.is_deck_slot(params.location.addressableAreaName) + or fixture_validation.is_abs_reader(params.location.addressableAreaName) + ): + raise LabwareIsNotAllowedInLocationError( + f"Cannot load {params.loadName} onto addressable area {area_name}" + ) + self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration( + area_name + ) + elif isinstance(params.location, DeckSlotLocation): + self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration( + params.location.slotName.id + ) + + verified_location = self._state_view.geometry.ensure_location_not_occupied( + params.location + ) + + lid_stack_object = await self._equipment.load_labware( + load_name=_LID_STACK_PE_LABWARE, + namespace=_LID_STACK_PE_NAMESPACE, + version=_LID_STACK_PE_VERSION, + location=verified_location, + labware_id=None, + ) + if not labware_validation.validate_definition_is_system( + lid_stack_object.definition + ): + raise ProtocolEngineError( + message="Lid Stack Labware Object Labware Definition does not contain required allowed role 'system'." + ) + + loaded_lid_labwares = await self._equipment.load_lids( + load_name=params.loadName, + namespace=params.namespace, + version=params.version, + location=OnLabwareLocation(labwareId=lid_stack_object.labware_id), + quantity=params.quantity, + ) + loaded_lid_locations_by_id = {} + load_location = OnLabwareLocation(labwareId=lid_stack_object.labware_id) + for loaded_lid in loaded_lid_labwares: + loaded_lid_locations_by_id[loaded_lid.labware_id] = load_location + load_location = OnLabwareLocation(labwareId=loaded_lid.labware_id) + + state_update = StateUpdate() + state_update.set_loaded_lid_stack( + stack_id=lid_stack_object.labware_id, + stack_object_definition=lid_stack_object.definition, + stack_location=verified_location, + labware_ids=list(loaded_lid_locations_by_id.keys()), + labware_definition=loaded_lid_labwares[0].definition, + locations=loaded_lid_locations_by_id, + ) + + if isinstance(verified_location, OnLabwareLocation): + self._state_view.labware.raise_if_labware_cannot_be_stacked( + top_labware_definition=loaded_lid_labwares[ + params.quantity - 1 + ].definition, + bottom_labware_id=verified_location.labwareId, + ) + + return SuccessData( + public=LoadLidStackResult( + stackLabwareId=lid_stack_object.labware_id, + labwareIds=list(loaded_lid_locations_by_id.keys()), + definition=loaded_lid_labwares[0].definition, + location=params.location, + ), + state_update=state_update, + ) + + +class LoadLidStack( + BaseCommand[LoadLidStackParams, LoadLidStackResult, ErrorOccurrence] +): + """Load lid stack command resource model.""" + + commandType: LoadLidStackCommandType = "loadLidStack" + params: LoadLidStackParams + result: Optional[LoadLidStackResult] + + _ImplementationCls: Type[LoadLidStackImplementation] = LoadLidStackImplementation + + +class LoadLidStackCreate(BaseCommandCreate[LoadLidStackParams]): + """Load lid stack command creation request.""" + + commandType: LoadLidStackCommandType = "loadLidStack" + params: LoadLidStackParams + + _CommandCls: Type[LoadLidStack] = LoadLidStack diff --git a/api/src/opentrons/protocol_engine/commands/load_liquid.py b/api/src/opentrons/protocol_engine/commands/load_liquid.py index f6aa037fa01..a1ed1e8401c 100644 --- a/api/src/opentrons/protocol_engine/commands/load_liquid.py +++ b/api/src/opentrons/protocol_engine/commands/load_liquid.py @@ -81,7 +81,7 @@ class LoadLiquid(BaseCommand[LoadLiquidParams, LoadLiquidResult, ErrorOccurrence commandType: LoadLiquidCommandType = "loadLiquid" params: LoadLiquidParams - result: Optional[LoadLiquidResult] + result: Optional[LoadLiquidResult] = None _ImplementationCls: Type[LoadLiquidImplementation] = LoadLiquidImplementation diff --git a/api/src/opentrons/protocol_engine/commands/load_liquid_class.py b/api/src/opentrons/protocol_engine/commands/load_liquid_class.py index bd267abe567..8cb3d4a06fb 100644 --- a/api/src/opentrons/protocol_engine/commands/load_liquid_class.py +++ b/api/src/opentrons/protocol_engine/commands/load_liquid_class.py @@ -1,9 +1,11 @@ """LoadLiquidClass stores the liquid class settings used for a transfer into the Protocol Engine.""" from __future__ import annotations -from typing import Optional, Type, TYPE_CHECKING +from typing import Optional, Type, TYPE_CHECKING, Any + from typing_extensions import Literal from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ..errors import LiquidClassDoesNotExistError @@ -19,13 +21,18 @@ LoadLiquidClassCommandType = Literal["loadLiquidClass"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class LoadLiquidClassParams(BaseModel): """The liquid class transfer properties to store.""" - liquidClassId: Optional[str] = Field( + liquidClassId: str | SkipJsonSchema[None] = Field( None, description="Unique identifier for the liquid class to store. " "If you do not supply a liquidClassId, we will generate one.", + json_schema_extra=_remove_default, ) liquidClassRecord: LiquidClassRecord = Field( ..., diff --git a/api/src/opentrons/protocol_engine/commands/load_module.py b/api/src/opentrons/protocol_engine/commands/load_module.py index f8b88e08814..a0f4736a3a4 100644 --- a/api/src/opentrons/protocol_engine/commands/load_module.py +++ b/api/src/opentrons/protocol_engine/commands/load_module.py @@ -1,8 +1,9 @@ """Implementation, request models, and response models for the load module command.""" from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Type +from typing import TYPE_CHECKING, Optional, Type, Any from typing_extensions import Literal from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.protocol_engine.state.update_types import StateUpdate @@ -27,6 +28,10 @@ LoadModuleCommandType = Literal["loadModule"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class LoadModuleParams(BaseModel): """Payload required to load a module.""" @@ -59,12 +64,13 @@ class LoadModuleParams(BaseModel): ), ) - moduleId: Optional[str] = Field( + moduleId: str | SkipJsonSchema[None] = Field( None, description=( "An optional ID to assign to this module." " If None, an ID will be generated." ), + json_schema_extra=_remove_default, ) @@ -77,7 +83,7 @@ class LoadModuleResult(BaseModel): # TODO(mm, 2023-04-13): Remove this field. Jira RSS-221. definition: ModuleDefinition = Field( - deprecated=True, + json_schema_extra={"deprecated": True}, description=( "The definition of the connected module." " This field is an implementation detail. We might change or remove it without warning." @@ -204,7 +210,7 @@ class LoadModule(BaseCommand[LoadModuleParams, LoadModuleResult, ErrorOccurrence commandType: LoadModuleCommandType = "loadModule" params: LoadModuleParams - result: Optional[LoadModuleResult] + result: Optional[LoadModuleResult] = None _ImplementationCls: Type[LoadModuleImplementation] = LoadModuleImplementation diff --git a/api/src/opentrons/protocol_engine/commands/load_pipette.py b/api/src/opentrons/protocol_engine/commands/load_pipette.py index 6d8d74b4fa2..812299a6da1 100644 --- a/api/src/opentrons/protocol_engine/commands/load_pipette.py +++ b/api/src/opentrons/protocol_engine/commands/load_pipette.py @@ -1,20 +1,23 @@ """Load pipette command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + +from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema +from typing_extensions import Literal -from opentrons.protocol_engine.state.update_types import StateUpdate from opentrons_shared_data.pipette.pipette_load_name_conversions import ( convert_to_pipette_name_type, ) from opentrons_shared_data.pipette.types import PipetteGenerationType from opentrons_shared_data.robot import user_facing_robot_type from opentrons_shared_data.robot.types import RobotTypeEnum -from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type -from typing_extensions import Literal + from opentrons_shared_data.pipette.types import PipetteNameType from opentrons.types import MountType +from opentrons.protocol_engine.state.update_types import StateUpdate from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ..errors.error_occurrence import ErrorOccurrence from ..errors import InvalidSpecificationForRobotTypeError, InvalidLoadPipetteSpecsError @@ -27,6 +30,10 @@ LoadPipetteCommandType = Literal["loadPipette"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class LoadPipetteParams(BaseModel): """Payload needed to load a pipette on to a mount.""" @@ -38,21 +45,24 @@ class LoadPipetteParams(BaseModel): ..., description="The mount the pipette should be present on.", ) - pipetteId: Optional[str] = Field( + pipetteId: str | SkipJsonSchema[None] = Field( None, description="An optional ID to assign to this pipette. If None, an ID " "will be generated.", + json_schema_extra=_remove_default, ) - tipOverlapNotAfterVersion: Optional[str] = Field( + tipOverlapNotAfterVersion: str | SkipJsonSchema[None] = Field( None, description="A version of tip overlap data to not exceed. The highest-versioned " "tip overlap data that does not exceed this version will be used. Versions are " "expressed as vN where N is an integer, counting up from v0. If None, the current " "highest version will be used.", + json_schema_extra=_remove_default, ) - liquidPresenceDetection: Optional[bool] = Field( + liquidPresenceDetection: bool | SkipJsonSchema[None] = Field( None, description="Enable liquid presence detection for this pipette. Defaults to False.", + json_schema_extra=_remove_default, ) @@ -140,7 +150,7 @@ class LoadPipette(BaseCommand[LoadPipetteParams, LoadPipetteResult, ErrorOccurre commandType: LoadPipetteCommandType = "loadPipette" params: LoadPipetteParams - result: Optional[LoadPipetteResult] + result: Optional[LoadPipetteResult] = None _ImplementationCls: Type[LoadPipetteImplementation] = LoadPipetteImplementation diff --git a/api/src/opentrons/protocol_engine/commands/magnetic_module/disengage.py b/api/src/opentrons/protocol_engine/commands/magnetic_module/disengage.py index c20b18e481d..d0c7abef5a4 100644 --- a/api/src/opentrons/protocol_engine/commands/magnetic_module/disengage.py +++ b/api/src/opentrons/protocol_engine/commands/magnetic_module/disengage.py @@ -83,7 +83,7 @@ class Disengage(BaseCommand[DisengageParams, DisengageResult, ErrorOccurrence]): commandType: DisengageCommandType = "magneticModule/disengage" params: DisengageParams - result: Optional[DisengageResult] + result: Optional[DisengageResult] = None _ImplementationCls: Type[DisengageImplementation] = DisengageImplementation diff --git a/api/src/opentrons/protocol_engine/commands/magnetic_module/engage.py b/api/src/opentrons/protocol_engine/commands/magnetic_module/engage.py index 62f4e24eef4..6686d88edba 100644 --- a/api/src/opentrons/protocol_engine/commands/magnetic_module/engage.py +++ b/api/src/opentrons/protocol_engine/commands/magnetic_module/engage.py @@ -105,7 +105,7 @@ class Engage(BaseCommand[EngageParams, EngageResult, ErrorOccurrence]): commandType: EngageCommandType = "magneticModule/engage" params: EngageParams - result: Optional[EngageResult] + result: Optional[EngageResult] = None _ImplementationCls: Type[EngageImplementation] = EngageImplementation diff --git a/api/src/opentrons/protocol_engine/commands/move_labware.py b/api/src/opentrons/protocol_engine/commands/move_labware.py index b64491f5192..8eb93ce9217 100644 --- a/api/src/opentrons/protocol_engine/commands/move_labware.py +++ b/api/src/opentrons/protocol_engine/commands/move_labware.py @@ -1,14 +1,17 @@ """Models and implementation for the ``moveLabware`` command.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + +from pydantic.json_schema import SkipJsonSchema +from pydantic import BaseModel, Field +from typing_extensions import Literal + from opentrons_shared_data.errors.exceptions import ( FailedGripperPickupError, LabwareDroppedError, StallOrCollisionDetectedError, ) -from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type -from typing_extensions import Literal from opentrons.protocol_engine.resources.model_utils import ModelUtils from opentrons.types import Point @@ -49,6 +52,10 @@ MoveLabwareCommandType = Literal["moveLabware"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + # Extra buffer on top of minimum distance to move to the right _TRASH_CHUTE_DROP_BUFFER_MM = 8 @@ -63,15 +70,17 @@ class MoveLabwareParams(BaseModel): description="Whether to use the gripper to perform the labware movement" " or to perform a manual movement with an option to pause.", ) - pickUpOffset: Optional[LabwareOffsetVector] = Field( + pickUpOffset: LabwareOffsetVector | SkipJsonSchema[None] = Field( None, description="Offset to use when picking up labware. " "Experimental param, subject to change", + json_schema_extra=_remove_default, ) - dropOffset: Optional[LabwareOffsetVector] = Field( + dropOffset: LabwareOffsetVector | SkipJsonSchema[None] = Field( None, description="Offset to use when dropping off labware. " "Experimental param, subject to change", + json_schema_extra=_remove_default, ) @@ -359,7 +368,7 @@ class MoveLabware( commandType: MoveLabwareCommandType = "moveLabware" params: MoveLabwareParams - result: Optional[MoveLabwareResult] + result: Optional[MoveLabwareResult] = None _ImplementationCls: Type[MoveLabwareImplementation] = MoveLabwareImplementation diff --git a/api/src/opentrons/protocol_engine/commands/move_relative.py b/api/src/opentrons/protocol_engine/commands/move_relative.py index 54c877a3693..d54f9470184 100644 --- a/api/src/opentrons/protocol_engine/commands/move_relative.py +++ b/api/src/opentrons/protocol_engine/commands/move_relative.py @@ -88,7 +88,7 @@ class MoveRelative( commandType: MoveRelativeCommandType = "moveRelative" params: MoveRelativeParams - result: Optional[MoveRelativeResult] + result: Optional[MoveRelativeResult] = None _ImplementationCls: Type[MoveRelativeImplementation] = MoveRelativeImplementation diff --git a/api/src/opentrons/protocol_engine/commands/move_to_addressable_area.py b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area.py index 7380a01951a..2ac788b33cf 100644 --- a/api/src/opentrons/protocol_engine/commands/move_to_addressable_area.py +++ b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area.py @@ -160,7 +160,7 @@ class MoveToAddressableArea( commandType: MoveToAddressableAreaCommandType = "moveToAddressableArea" params: MoveToAddressableAreaParams - result: Optional[MoveToAddressableAreaResult] + result: Optional[MoveToAddressableAreaResult] = None _ImplementationCls: Type[ MoveToAddressableAreaImplementation diff --git a/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py index 679e769cc2e..f4afcd5d1ff 100644 --- a/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +++ b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py @@ -1,9 +1,11 @@ """Move to addressable area for drop tip command request, result, and implementation models.""" from __future__ import annotations -from pydantic import Field -from typing import TYPE_CHECKING, Optional, Type +from typing import TYPE_CHECKING, Optional, Type, Any from typing_extensions import Literal +from pydantic import Field +from pydantic.json_schema import SkipJsonSchema + from ..errors import LocationNotAccessibleByPipetteError from ..types import AddressableOffsetVector from ..resources import fixture_validation @@ -32,6 +34,10 @@ MoveToAddressableAreaForDropTipCommandType = Literal["moveToAddressableAreaForDropTip"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin): """Payload required to move a pipette to a specific addressable area. @@ -65,7 +71,7 @@ class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin): AddressableOffsetVector(x=0, y=0, z=0), description="Relative offset of addressable area to move pipette's critical point.", ) - alternateDropLocation: Optional[bool] = Field( + alternateDropLocation: bool | SkipJsonSchema[None] = Field( False, description=( "Whether to alternate location where tip is dropped within the addressable area." @@ -74,8 +80,9 @@ class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin): " labware well." " If False, the tip will be dropped at the top center of the area." ), + json_schema_extra=_remove_default, ) - ignoreTipConfiguration: Optional[bool] = Field( + ignoreTipConfiguration: bool | SkipJsonSchema[None] = Field( True, description=( "Whether to utilize the critical point of the tip configuraiton when moving to an addressable area." @@ -83,6 +90,7 @@ class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin): " as the critical point for movement." " If False, this command will use the critical point provided by the current tip configuration." ), + json_schema_extra=_remove_default, ) @@ -170,7 +178,7 @@ class MoveToAddressableAreaForDropTip( "moveToAddressableAreaForDropTip" ) params: MoveToAddressableAreaForDropTipParams - result: Optional[MoveToAddressableAreaForDropTipResult] + result: Optional[MoveToAddressableAreaForDropTipResult] = None _ImplementationCls: Type[ MoveToAddressableAreaForDropTipImplementation diff --git a/api/src/opentrons/protocol_engine/commands/move_to_coordinates.py b/api/src/opentrons/protocol_engine/commands/move_to_coordinates.py index 36b7ff64ed0..3493f5d6ea6 100644 --- a/api/src/opentrons/protocol_engine/commands/move_to_coordinates.py +++ b/api/src/opentrons/protocol_engine/commands/move_to_coordinates.py @@ -91,7 +91,7 @@ class MoveToCoordinates( commandType: MoveToCoordinatesCommandType = "moveToCoordinates" params: MoveToCoordinatesParams - result: Optional[MoveToCoordinatesResult] + result: Optional[MoveToCoordinatesResult] = None _ImplementationCls: Type[ MoveToCoordinatesImplementation diff --git a/api/src/opentrons/protocol_engine/commands/move_to_well.py b/api/src/opentrons/protocol_engine/commands/move_to_well.py index 6aaf398650f..73ebfbff638 100644 --- a/api/src/opentrons/protocol_engine/commands/move_to_well.py +++ b/api/src/opentrons/protocol_engine/commands/move_to_well.py @@ -106,7 +106,7 @@ class MoveToWell( commandType: MoveToWellCommandType = "moveToWell" params: MoveToWellParams - result: Optional[MoveToWellResult] + result: Optional[MoveToWellResult] = None _ImplementationCls: Type[MoveToWellImplementation] = MoveToWellImplementation diff --git a/api/src/opentrons/protocol_engine/commands/movement_common.py b/api/src/opentrons/protocol_engine/commands/movement_common.py index ca12d2d1ad8..babf70b29d9 100644 --- a/api/src/opentrons/protocol_engine/commands/movement_common.py +++ b/api/src/opentrons/protocol_engine/commands/movement_common.py @@ -2,9 +2,10 @@ from __future__ import annotations -from typing import Optional, Union, TYPE_CHECKING, Literal +from typing import Optional, Union, TYPE_CHECKING, Literal, Any from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons_shared_data.errors import ErrorCodes from opentrons_shared_data.errors.exceptions import StallOrCollisionDetectedError @@ -26,6 +27,10 @@ from ..resources.model_utils import ModelUtils +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class WellLocationMixin(BaseModel): """Mixin for command requests that take a location that's somewhere in a well.""" @@ -63,13 +68,14 @@ class LiquidHandlingWellLocationMixin(BaseModel): class MovementMixin(BaseModel): """Mixin for command requests that move a pipette.""" - minimumZHeight: Optional[float] = Field( + minimumZHeight: float | SkipJsonSchema[None] = Field( None, description=( "Optional minimal Z margin in mm." " If this is larger than the API's default safe Z margin," " it will make the arc higher. If it's smaller, it will have no effect." ), + json_schema_extra=_remove_default, ) forceDirect: bool = Field( @@ -83,12 +89,13 @@ class MovementMixin(BaseModel): ), ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( None, description=( "Override the travel speed in mm/s." " This controls the straight linear speed of motion." ), + json_schema_extra=_remove_default, ) @@ -175,7 +182,7 @@ async def move_to_well( state_update=StateUpdate().clear_all_pipette_locations(), ) else: - deck_point = DeckPoint.construct(x=position.x, y=position.y, z=position.z) + deck_point = DeckPoint.model_construct(x=position.x, y=position.y, z=position.z) return SuccessData( public=DestinationPositionResult( position=deck_point, @@ -215,7 +222,7 @@ async def move_relative( state_update=StateUpdate().clear_all_pipette_locations(), ) else: - deck_point = DeckPoint.construct(x=position.x, y=position.y, z=position.z) + deck_point = DeckPoint.model_construct(x=position.x, y=position.y, z=position.z) return SuccessData( public=DestinationPositionResult( position=deck_point, @@ -270,7 +277,7 @@ async def move_to_addressable_area( .set_addressable_area_used(addressable_area_name=addressable_area_name), ) else: - deck_point = DeckPoint.construct(x=x, y=y, z=z) + deck_point = DeckPoint.model_construct(x=x, y=y, z=z) return SuccessData( public=DestinationPositionResult(position=deck_point), state_update=StateUpdate() @@ -317,7 +324,7 @@ async def move_to_coordinates( state_update=StateUpdate().clear_all_pipette_locations(), ) else: - deck_point = DeckPoint.construct(x=x, y=y, z=z) + deck_point = DeckPoint.model_construct(x=x, y=y, z=z) return SuccessData( public=DestinationPositionResult(position=DeckPoint(x=x, y=y, z=z)), diff --git a/api/src/opentrons/protocol_engine/commands/pick_up_tip.py b/api/src/opentrons/protocol_engine/commands/pick_up_tip.py index af8723a5bba..e5612bb3cdc 100644 --- a/api/src/opentrons/protocol_engine/commands/pick_up_tip.py +++ b/api/src/opentrons/protocol_engine/commands/pick_up_tip.py @@ -212,7 +212,7 @@ class PickUpTip( commandType: PickUpTipCommandType = "pickUpTip" params: PickUpTipParams - result: Optional[PickUpTipResult] + result: Optional[PickUpTipResult] = None _ImplementationCls: Type[PickUpTipImplementation] = PickUpTipImplementation diff --git a/api/src/opentrons/protocol_engine/commands/pipetting_common.py b/api/src/opentrons/protocol_engine/commands/pipetting_common.py index 0292b51eee1..c373642a02e 100644 --- a/api/src/opentrons/protocol_engine/commands/pipetting_common.py +++ b/api/src/opentrons/protocol_engine/commands/pipetting_common.py @@ -1,10 +1,12 @@ """Common pipetting command base models.""" from __future__ import annotations -from opentrons_shared_data.errors import ErrorCodes +from typing import Literal, Tuple, TYPE_CHECKING + +from typing_extensions import TypedDict from pydantic import BaseModel, Field -from typing import Literal, Tuple, TypedDict, TYPE_CHECKING +from opentrons_shared_data.errors import ErrorCodes from opentrons.protocol_engine.errors.error_occurrence import ErrorOccurrence from opentrons.protocol_engine.types import AspiratedFluid, FluidKind from opentrons_shared_data.errors.exceptions import PipetteOverpressureError @@ -71,6 +73,10 @@ class BaseLiquidHandlingResult(BaseModel): ) +class EmptyResult(BaseModel): + """A result with no data.""" + + class ErrorLocationInfo(TypedDict): """Holds a retry location for in-place error recovery. @@ -139,7 +145,7 @@ async def prepare_for_aspirate( pipetting: PipettingHandler, model_utils: ModelUtils, location_if_error: ErrorLocationInfo, -) -> SuccessData[BaseModel] | DefinedErrorData[OverpressureError]: +) -> SuccessData[EmptyResult] | DefinedErrorData[OverpressureError]: """Execute pipetting.prepare_for_aspirate, handle errors, and marshal success.""" try: await pipetting.prepare_for_aspirate(pipette_id) @@ -161,7 +167,7 @@ async def prepare_for_aspirate( ) else: return SuccessData( - public=BaseModel(), + public=EmptyResult(), state_update=StateUpdate().set_fluid_empty(pipette_id=pipette_id), ) @@ -259,7 +265,7 @@ async def blow_out_in_place( location_if_error: ErrorLocationInfo, pipetting: PipettingHandler, model_utils: ModelUtils, -) -> SuccessData[BaseModel] | DefinedErrorData[OverpressureError]: +) -> SuccessData[EmptyResult] | DefinedErrorData[OverpressureError]: """Execute a blow-out-in-place micro-operation.""" try: await pipetting.blow_out_in_place(pipette_id=pipette_id, flow_rate=flow_rate) @@ -281,6 +287,6 @@ async def blow_out_in_place( ) else: return SuccessData( - public=BaseModel(), + public=EmptyResult(), state_update=StateUpdate().set_fluid_empty(pipette_id=pipette_id), ) diff --git a/api/src/opentrons/protocol_engine/commands/prepare_to_aspirate.py b/api/src/opentrons/protocol_engine/commands/prepare_to_aspirate.py index cabcb2039eb..beaf6e1ca0c 100644 --- a/api/src/opentrons/protocol_engine/commands/prepare_to_aspirate.py +++ b/api/src/opentrons/protocol_engine/commands/prepare_to_aspirate.py @@ -95,7 +95,7 @@ class PrepareToAspirate( commandType: PrepareToAspirateCommandType = "prepareToAspirate" params: PrepareToAspirateParams - result: Optional[PrepareToAspirateResult] + result: Optional[PrepareToAspirateResult] = None _ImplementationCls: Type[ PrepareToAspirateImplementation diff --git a/api/src/opentrons/protocol_engine/commands/reload_labware.py b/api/src/opentrons/protocol_engine/commands/reload_labware.py index 60230a1c6dd..07d70957cdb 100644 --- a/api/src/opentrons/protocol_engine/commands/reload_labware.py +++ b/api/src/opentrons/protocol_engine/commands/reload_labware.py @@ -89,7 +89,7 @@ class ReloadLabware( commandType: ReloadLabwareCommandType = "reloadLabware" params: ReloadLabwareParams - result: Optional[ReloadLabwareResult] + result: Optional[ReloadLabwareResult] = None _ImplementationCls: Type[ReloadLabwareImplementation] = ReloadLabwareImplementation diff --git a/api/src/opentrons/protocol_engine/commands/retract_axis.py b/api/src/opentrons/protocol_engine/commands/retract_axis.py index 49020eb517e..19c7653793f 100644 --- a/api/src/opentrons/protocol_engine/commands/retract_axis.py +++ b/api/src/opentrons/protocol_engine/commands/retract_axis.py @@ -61,7 +61,7 @@ class RetractAxis(BaseCommand[RetractAxisParams, RetractAxisResult, ErrorOccurre commandType: RetractAxisCommandType = "retractAxis" params: RetractAxisParams - result: Optional[RetractAxisResult] + result: Optional[RetractAxisResult] = None _ImplementationCls: Type[RetractAxisImplementation] = RetractAxisImplementation diff --git a/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py b/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py index 965c6d2ec72..36b027c351a 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +++ b/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py @@ -1,10 +1,12 @@ """Command models for opening a gripper jaw.""" from __future__ import annotations -from typing import Literal, Type, Optional -from opentrons.hardware_control import HardwareControlAPI -from opentrons.protocol_engine.resources import ensure_ot3_hardware +from typing import Literal, Type, Optional, Any from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema + +from opentrons.hardware_control import HardwareControlAPI +from opentrons.protocol_engine.resources import ensure_ot3_hardware from ..command import ( AbstractCommandImpl, @@ -18,12 +20,17 @@ closeGripperJawCommandType = Literal["robot/closeGripperJaw"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class closeGripperJawParams(BaseModel): """Payload required to close a gripper.""" - force: Optional[float] = Field( + force: float | SkipJsonSchema[None] = Field( default=None, description="The force the gripper should use to hold the jaws, falls to default if none is provided.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py b/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py index 238229ebce6..99b30e9595a 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py +++ b/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py @@ -1,8 +1,10 @@ """Command models for moving any robot axis relative.""" + from __future__ import annotations -from typing import Literal, Type, Optional, TYPE_CHECKING +from typing import Literal, Type, Optional, TYPE_CHECKING, Any from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control import HardwareControlAPI from opentrons.protocol_engine.resources import ensure_ot3_hardware @@ -23,15 +25,20 @@ MoveAxesRelativeCommandType = Literal["robot/moveAxesRelative"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class MoveAxesRelativeParams(BaseModel): """Payload required to move axes relative to position.""" axis_map: MotorAxisMapType = Field( ..., description="A dictionary mapping axes to relative movements in mm." ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( default=None, description="The max velocity to move the axes at. Will fall to hardware defaults if none provided.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py b/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py index 0d17d5f171f..93fc2746c84 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py +++ b/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py @@ -1,7 +1,9 @@ """Command models for moving any robot axis to an absolute position.""" from __future__ import annotations -from typing import Literal, Optional, Type, TYPE_CHECKING +from typing import Literal, Optional, Type, TYPE_CHECKING, Any + from pydantic import Field, BaseModel +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control import HardwareControlAPI from opentrons.protocol_engine.resources import ensure_ot3_hardware @@ -22,18 +24,25 @@ MoveAxesToCommandType = Literal["robot/moveAxesTo"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class MoveAxesToParams(BaseModel): """Payload required to move axes to absolute position.""" axis_map: MotorAxisMapType = Field( ..., description="The specified axes to move to an absolute deck position with." ) - critical_point: Optional[MotorAxisMapType] = Field( - default=None, description="The critical point to move the mount with." + critical_point: MotorAxisMapType | SkipJsonSchema[None] = Field( + default=None, + description="The critical point to move the mount with.", + json_schema_extra=_remove_default, ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( default=None, description="The max velocity to move the axes at. Will fall to hardware defaults if none provided.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/robot/move_to.py b/api/src/opentrons/protocol_engine/commands/robot/move_to.py index 199d5be5079..e2a3af07767 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/move_to.py +++ b/api/src/opentrons/protocol_engine/commands/robot/move_to.py @@ -1,8 +1,10 @@ """Command models for moving any robot mount to a destination point.""" from __future__ import annotations -from typing import Literal, Type, Optional, TYPE_CHECKING +from typing import Literal, Type, Optional, TYPE_CHECKING, Any from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema + from opentrons.types import MountType from ..movement_common import DestinationPositionResult @@ -23,6 +25,10 @@ MoveToCommandType = Literal["robot/moveTo"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class MoveToParams(BaseModel): """Payload required to move to a destination position.""" @@ -34,9 +40,10 @@ class MoveToParams(BaseModel): ..., description="X, Y and Z coordinates in mm from deck's origin location (left-front-bottom corner of work space)", ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( default=None, description="The max velocity to move the axes at. Will fall to hardware defaults if none provided.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/save_position.py b/api/src/opentrons/protocol_engine/commands/save_position.py index 4bc208d1421..6a1d22c4687 100644 --- a/api/src/opentrons/protocol_engine/commands/save_position.py +++ b/api/src/opentrons/protocol_engine/commands/save_position.py @@ -1,8 +1,10 @@ """Save pipette position command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from ..types import DeckPoint @@ -16,19 +18,26 @@ SavePositionCommandType = Literal["savePosition"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class SavePositionParams(BaseModel): """Payload needed to save a pipette's current position.""" pipetteId: str = Field( ..., description="Unique identifier of the pipette in question." ) - positionId: Optional[str] = Field( + positionId: str | SkipJsonSchema[None] = Field( None, description="An optional ID to assign to this command instance. " "Auto-assigned if not defined.", + json_schema_extra=_remove_default, ) - failOnNotHomed: Optional[bool] = Field( - True, descrption="Require all axes to be homed before saving position." + failOnNotHomed: bool | SkipJsonSchema[None] = Field( + True, + description="Require all axes to be homed before saving position.", + json_schema_extra=_remove_default, ) @@ -86,7 +95,7 @@ class SavePosition( commandType: SavePositionCommandType = "savePosition" params: SavePositionParams - result: Optional[SavePositionResult] + result: Optional[SavePositionResult] = None _ImplementationCls: Type[SavePositionImplementation] = SavePositionImplementation diff --git a/api/src/opentrons/protocol_engine/commands/set_rail_lights.py b/api/src/opentrons/protocol_engine/commands/set_rail_lights.py index 09254dbe966..7ca3929695b 100644 --- a/api/src/opentrons/protocol_engine/commands/set_rail_lights.py +++ b/api/src/opentrons/protocol_engine/commands/set_rail_lights.py @@ -53,7 +53,7 @@ class SetRailLights( commandType: SetRailLightsCommandType = "setRailLights" params: SetRailLightsParams - result: Optional[SetRailLightsResult] + result: Optional[SetRailLightsResult] = None _ImplementationCls: Type[SetRailLightsImplementation] = SetRailLightsImplementation diff --git a/api/src/opentrons/protocol_engine/commands/set_status_bar.py b/api/src/opentrons/protocol_engine/commands/set_status_bar.py index 2e1483f6d93..62ca9b7682a 100644 --- a/api/src/opentrons/protocol_engine/commands/set_status_bar.py +++ b/api/src/opentrons/protocol_engine/commands/set_status_bar.py @@ -75,7 +75,7 @@ class SetStatusBar( commandType: SetStatusBarCommandType = "setStatusBar" params: SetStatusBarParams - result: Optional[SetStatusBarResult] + result: Optional[SetStatusBarResult] = None _ImplementationCls: Type[SetStatusBarImplementation] = SetStatusBarImplementation diff --git a/api/src/opentrons/protocol_engine/commands/temperature_module/deactivate.py b/api/src/opentrons/protocol_engine/commands/temperature_module/deactivate.py index e56c98e6e30..e1514c91f30 100644 --- a/api/src/opentrons/protocol_engine/commands/temperature_module/deactivate.py +++ b/api/src/opentrons/protocol_engine/commands/temperature_module/deactivate.py @@ -72,7 +72,7 @@ class DeactivateTemperature( commandType: DeactivateTemperatureCommandType = "temperatureModule/deactivate" params: DeactivateTemperatureParams - result: Optional[DeactivateTemperatureResult] + result: Optional[DeactivateTemperatureResult] = None _ImplementationCls: Type[DeactivateTemperatureImpl] = DeactivateTemperatureImpl diff --git a/api/src/opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py b/api/src/opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py index 6d65bf47bb0..b0aa7bd5cd0 100644 --- a/api/src/opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py @@ -81,7 +81,7 @@ class SetTargetTemperature( "temperatureModule/setTargetTemperature" ) params: SetTargetTemperatureParams - result: Optional[SetTargetTemperatureResult] + result: Optional[SetTargetTemperatureResult] = None _ImplementationCls: Type[SetTargetTemperatureImpl] = SetTargetTemperatureImpl diff --git a/api/src/opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py b/api/src/opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py index fa7784de141..5f3f052d91b 100644 --- a/api/src/opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py @@ -1,9 +1,10 @@ """Command models to wait for target temperature of a Temperature Module.""" from __future__ import annotations -from typing import Optional, TYPE_CHECKING -from typing_extensions import Literal, Type +from typing import Optional, TYPE_CHECKING, Any +from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence @@ -15,11 +16,15 @@ WaitForTemperatureCommandType = Literal["temperatureModule/waitForTemperature"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class WaitForTemperatureParams(BaseModel): """Input parameters to wait for a Temperature Module's target temperature.""" moduleId: str = Field(..., description="Unique ID of the Temperature Module.") - celsius: Optional[float] = Field( + celsius: float | SkipJsonSchema[None] = Field( None, description="Target temperature in °C. If not specified, will " "default to the module's target temperature. " @@ -27,6 +32,7 @@ class WaitForTemperatureParams(BaseModel): "could lead to unpredictable behavior and hence is not " "recommended for use. This parameter can be removed in a " "future version without prior notice.", + json_schema_extra=_remove_default, ) @@ -84,7 +90,7 @@ class WaitForTemperature( commandType: WaitForTemperatureCommandType = "temperatureModule/waitForTemperature" params: WaitForTemperatureParams - result: Optional[WaitForTemperatureResult] + result: Optional[WaitForTemperatureResult] = None _ImplementationCls: Type[WaitForTemperatureImpl] = WaitForTemperatureImpl diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/close_lid.py b/api/src/opentrons/protocol_engine/commands/thermocycler/close_lid.py index 578a5d6b7a7..c5171c82da8 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/close_lid.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/close_lid.py @@ -73,7 +73,7 @@ class CloseLid(BaseCommand[CloseLidParams, CloseLidResult, ErrorOccurrence]): commandType: CloseLidCommandType = "thermocycler/closeLid" params: CloseLidParams - result: Optional[CloseLidResult] + result: Optional[CloseLidResult] = None _ImplementationCls: Type[CloseLidImpl] = CloseLidImpl diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/deactivate_block.py b/api/src/opentrons/protocol_engine/commands/thermocycler/deactivate_block.py index 67199577d53..fb49f031ac4 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/deactivate_block.py @@ -66,7 +66,7 @@ class DeactivateBlock( commandType: DeactivateBlockCommandType = "thermocycler/deactivateBlock" params: DeactivateBlockParams - result: Optional[DeactivateBlockResult] + result: Optional[DeactivateBlockResult] = None _ImplementationCls: Type[DeactivateBlockImpl] = DeactivateBlockImpl diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py b/api/src/opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py index 9c3541efb12..f92065c88e9 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py @@ -66,7 +66,7 @@ class DeactivateLid( commandType: DeactivateLidCommandType = "thermocycler/deactivateLid" params: DeactivateLidParams - result: Optional[DeactivateLidResult] + result: Optional[DeactivateLidResult] = None _ImplementationCls: Type[DeactivateLidImpl] = DeactivateLidImpl diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/open_lid.py b/api/src/opentrons/protocol_engine/commands/thermocycler/open_lid.py index 3df32d1ec99..6eedb9f4c60 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/open_lid.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/open_lid.py @@ -73,7 +73,7 @@ class OpenLid(BaseCommand[OpenLidParams, OpenLidResult, ErrorOccurrence]): commandType: OpenLidCommandType = "thermocycler/openLid" params: OpenLidParams - result: Optional[OpenLidResult] + result: Optional[OpenLidResult] = None _ImplementationCls: Type[OpenLidImpl] = OpenLidImpl diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py b/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py index 6f63aed8fe3..40f87af7772 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py @@ -1,9 +1,10 @@ """Command models to execute a Thermocycler profile.""" from __future__ import annotations -from typing import List, Optional, TYPE_CHECKING, overload, Union +from typing import List, Optional, TYPE_CHECKING, overload, Union, Any from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control.modules.types import ThermocyclerStep, ThermocyclerCycle @@ -21,6 +22,10 @@ RunExtendedProfileCommandType = Literal["thermocycler/runExtendedProfile"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class ProfileStep(BaseModel): """An individual step in a Thermocycler extended profile.""" @@ -45,10 +50,11 @@ class RunExtendedProfileParams(BaseModel): ..., description="Elements of the profile. Each can be either a step or a cycle.", ) - blockMaxVolumeUl: Optional[float] = Field( + blockMaxVolumeUl: float | SkipJsonSchema[None] = Field( None, description="Amount of liquid in uL of the most-full well" " in labware loaded onto the thermocycler.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/run_profile.py b/api/src/opentrons/protocol_engine/commands/thermocycler/run_profile.py index 02aa7ad93e2..fee6ed82bb3 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/run_profile.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/run_profile.py @@ -1,9 +1,10 @@ """Command models to execute a Thermocycler profile.""" from __future__ import annotations -from typing import List, Optional, TYPE_CHECKING +from typing import List, Optional, TYPE_CHECKING, Any from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control.modules.types import ThermocyclerStep @@ -18,6 +19,10 @@ RunProfileCommandType = Literal["thermocycler/runProfile"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class RunProfileStepParams(BaseModel): """Input parameters for an individual Thermocycler profile step.""" @@ -35,10 +40,11 @@ class RunProfileParams(BaseModel): ..., description="Array of profile steps with target temperature and temperature hold time.", ) - blockMaxVolumeUl: Optional[float] = Field( + blockMaxVolumeUl: float | SkipJsonSchema[None] = Field( None, description="Amount of liquid in uL of the most-full well" " in labware loaded onto the thermocycler.", + json_schema_extra=_remove_default, ) @@ -104,7 +110,7 @@ class RunProfile(BaseCommand[RunProfileParams, RunProfileResult, ErrorOccurrence commandType: RunProfileCommandType = "thermocycler/runProfile" params: RunProfileParams - result: Optional[RunProfileResult] + result: Optional[RunProfileResult] = None _ImplementationCls: Type[RunProfileImpl] = RunProfileImpl diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py b/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py index b69bb15ea90..f1884e8ee9e 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py @@ -1,9 +1,10 @@ """Command models to start heating a Thermocycler's block.""" from __future__ import annotations -from typing import Optional, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING, Any from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence @@ -16,21 +17,27 @@ SetTargetBlockTemperatureCommandType = Literal["thermocycler/setTargetBlockTemperature"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class SetTargetBlockTemperatureParams(BaseModel): """Input parameters to set a Thermocycler's target block temperature.""" moduleId: str = Field(..., description="Unique ID of the Thermocycler Module.") celsius: float = Field(..., description="Target temperature in °C.") - blockMaxVolumeUl: Optional[float] = Field( + blockMaxVolumeUl: float | SkipJsonSchema[None] = Field( None, description="Amount of liquid in uL of the most-full well" " in labware loaded onto the thermocycler.", + json_schema_extra=_remove_default, ) - holdTimeSeconds: Optional[float] = Field( + holdTimeSeconds: float | SkipJsonSchema[None] = Field( None, description="Amount of time, in seconds, to hold the temperature for." " If specified, a waitForBlockTemperature command will block until" " the given hold time has elapsed.", + json_schema_extra=_remove_default, ) @@ -113,7 +120,7 @@ class SetTargetBlockTemperature( "thermocycler/setTargetBlockTemperature" ) params: SetTargetBlockTemperatureParams - result: Optional[SetTargetBlockTemperatureResult] + result: Optional[SetTargetBlockTemperatureResult] = None _ImplementationCls: Type[ SetTargetBlockTemperatureImpl diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py b/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py index 37217e047ae..a1af8941ee9 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py @@ -84,7 +84,7 @@ class SetTargetLidTemperature( "thermocycler/setTargetLidTemperature" ) params: SetTargetLidTemperatureParams - result: Optional[SetTargetLidTemperatureResult] + result: Optional[SetTargetLidTemperatureResult] = None _ImplementationCls: Type[SetTargetLidTemperatureImpl] = SetTargetLidTemperatureImpl diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py b/api/src/opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py index 8e8c9b1a4ec..388d1af13d9 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py @@ -77,7 +77,7 @@ class WaitForBlockTemperature( "thermocycler/waitForBlockTemperature" ) params: WaitForBlockTemperatureParams - result: Optional[WaitForBlockTemperatureResult] + result: Optional[WaitForBlockTemperatureResult] = None _ImplementationCls: Type[WaitForBlockTemperatureImpl] = WaitForBlockTemperatureImpl diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py b/api/src/opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py index 95e5fbc4f0a..233e4ff5a8c 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py @@ -75,7 +75,7 @@ class WaitForLidTemperature( commandType: WaitForLidTemperatureCommandType = "thermocycler/waitForLidTemperature" params: WaitForLidTemperatureParams - result: Optional[WaitForLidTemperatureResult] + result: Optional[WaitForLidTemperatureResult] = None _ImplementationCls: Type[WaitForLidTemperatureImpl] = WaitForLidTemperatureImpl diff --git a/api/src/opentrons/protocol_engine/commands/touch_tip.py b/api/src/opentrons/protocol_engine/commands/touch_tip.py index 2eefd572d9a..d4591bf1d27 100644 --- a/api/src/opentrons/protocol_engine/commands/touch_tip.py +++ b/api/src/opentrons/protocol_engine/commands/touch_tip.py @@ -1,9 +1,11 @@ """Touch tip command request, result, and implementation models.""" from __future__ import annotations -from pydantic import Field -from typing import TYPE_CHECKING, Optional, Type +from typing import TYPE_CHECKING, Optional, Type, Any + from typing_extensions import Literal +from pydantic import Field +from pydantic.json_schema import SkipJsonSchema from opentrons.types import Point @@ -39,6 +41,10 @@ TouchTipCommandType = Literal["touchTip"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class TouchTipParams(PipetteIdMixin, WellLocationMixin): """Payload needed to touch a pipette tip the sides of a specific well.""" @@ -49,18 +55,20 @@ class TouchTipParams(PipetteIdMixin, WellLocationMixin): ), ) - mmFromEdge: Optional[float] = Field( + mmFromEdge: float | SkipJsonSchema[None] = Field( None, description="Offset away from the the well edge, in millimeters." "Incompatible when a radius is included as a non 1.0 value.", + json_schema_extra=_remove_default, ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( None, description=( "Override the travel speed in mm/s." " This controls the straight linear speed of motion." ), + json_schema_extra=_remove_default, ) @@ -146,7 +154,7 @@ async def execute( waypoints=touch_waypoints, speed=touch_speed, ) - final_deck_point = DeckPoint.construct( + final_deck_point = DeckPoint.model_construct( x=final_point.x, y=final_point.y, z=final_point.z ) state_update = center_result.state_update.set_pipette_location( @@ -167,7 +175,7 @@ class TouchTip(BaseCommand[TouchTipParams, TouchTipResult, StallOrCollisionError commandType: TouchTipCommandType = "touchTip" params: TouchTipParams - result: Optional[TouchTipResult] + result: Optional[TouchTipResult] = None _ImplementationCls: Type[TouchTipImplementation] = TouchTipImplementation diff --git a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py index 5aa4e292f63..56a87a468dd 100644 --- a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py @@ -1,13 +1,16 @@ """Command models to drop tip in place while plunger positions are unknown.""" + from __future__ import annotations -from opentrons.protocol_engine.state.update_types import StateUpdate +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import Field, BaseModel -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from opentrons.hardware_control import HardwareControlAPI from opentrons.hardware_control.types import Axis +from opentrons.protocol_engine.state.update_types import StateUpdate from ..pipetting_common import PipetteIdMixin from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence @@ -21,16 +24,21 @@ UnsafeDropTipInPlaceCommandType = Literal["unsafe/dropTipInPlace"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class UnsafeDropTipInPlaceParams(PipetteIdMixin): """Payload required to drop a tip in place even if the plunger position is not known.""" - homeAfter: Optional[bool] = Field( + homeAfter: bool | SkipJsonSchema[None] = Field( None, description=( "Whether to home this pipette's plunger after dropping the tip." " You should normally leave this unspecified to let the robot choose" " a safe default depending on its hardware." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py b/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py index e0412022e85..dc6f451e3e4 100644 --- a/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py +++ b/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py @@ -1,8 +1,9 @@ """Verify tip presence command request, result and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any from pydantic import Field, BaseModel -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .pipetting_common import PipetteIdMixin @@ -18,14 +19,20 @@ VerifyTipPresenceCommandType = Literal["verifyTipPresence"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class VerifyTipPresenceParams(PipetteIdMixin): """Payload required for a VerifyTipPresence command.""" expectedState: TipPresenceStatus = Field( ..., description="The expected tip presence status on the pipette." ) - followSingularSensor: Optional[InstrumentSensorId] = Field( - default=None, description="The sensor id to follow if the other can be ignored." + followSingularSensor: InstrumentSensorId | SkipJsonSchema[None] = Field( + default=None, + description="The sensor id to follow if the other can be ignored.", + json_schema_extra=_remove_default, ) @@ -77,7 +84,7 @@ class VerifyTipPresence( commandType: VerifyTipPresenceCommandType = "verifyTipPresence" params: VerifyTipPresenceParams - result: Optional[VerifyTipPresenceResult] + result: Optional[VerifyTipPresenceResult] = None _ImplementationCls: Type[ VerifyTipPresenceImplementation diff --git a/api/src/opentrons/protocol_engine/commands/wait_for_duration.py b/api/src/opentrons/protocol_engine/commands/wait_for_duration.py index 04f8693386e..26a4372c8ca 100644 --- a/api/src/opentrons/protocol_engine/commands/wait_for_duration.py +++ b/api/src/opentrons/protocol_engine/commands/wait_for_duration.py @@ -1,7 +1,9 @@ """Wait for duration command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData @@ -14,13 +16,18 @@ WaitForDurationCommandType = Literal["waitForDuration"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class WaitForDurationParams(BaseModel): """Payload required to pause the protocol.""" seconds: float = Field(..., description="Duration, in seconds, to wait for.") - message: Optional[str] = Field( + message: str | SkipJsonSchema[None] = Field( None, description="A user-facing message associated with the pause", + json_schema_extra=_remove_default, ) @@ -53,7 +60,7 @@ class WaitForDuration( commandType: WaitForDurationCommandType = "waitForDuration" params: WaitForDurationParams - result: Optional[WaitForDurationResult] + result: Optional[WaitForDurationResult] = None _ImplementationCls: Type[ WaitForDurationImplementation diff --git a/api/src/opentrons/protocol_engine/commands/wait_for_resume.py b/api/src/opentrons/protocol_engine/commands/wait_for_resume.py index f5066d52521..28458aa3721 100644 --- a/api/src/opentrons/protocol_engine/commands/wait_for_resume.py +++ b/api/src/opentrons/protocol_engine/commands/wait_for_resume.py @@ -1,7 +1,9 @@ """Wait for resume command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData @@ -16,12 +18,17 @@ WaitForResumeCommandType = Literal["waitForResume", "pause"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default", None) + + class WaitForResumeParams(BaseModel): """Payload required to pause the protocol.""" - message: Optional[str] = Field( + message: str | SkipJsonSchema[None] = Field( None, description="A user-facing message associated with the pause", + json_schema_extra=_remove_default, ) @@ -54,7 +61,7 @@ class WaitForResume( commandType: WaitForResumeCommandType = "waitForResume" params: WaitForResumeParams - result: Optional[WaitForResumeResult] + result: Optional[WaitForResumeResult] = None _ImplementationCls: Type[WaitForResumeImplementation] = WaitForResumeImplementation diff --git a/api/src/opentrons/protocol_engine/errors/error_occurrence.py b/api/src/opentrons/protocol_engine/errors/error_occurrence.py index 4141befe9b8..002596d0172 100644 --- a/api/src/opentrons/protocol_engine/errors/error_occurrence.py +++ b/api/src/opentrons/protocol_engine/errors/error_occurrence.py @@ -4,7 +4,7 @@ from datetime import datetime from textwrap import dedent from typing import Any, Dict, Mapping, List, Type, Union, Optional, Sequence -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, ConfigDict from opentrons_shared_data.errors.codes import ErrorCodes from .exceptions import ProtocolEngineError from opentrons_shared_data.errors.exceptions import EnumeratedError @@ -29,7 +29,7 @@ def from_failed( wrappedErrors = [ cls.from_failed(id, createdAt, err) for err in error.wrapping ] - return cls.construct( + return cls.model_construct( id=id, createdAt=createdAt, errorType=type(error).__name__, @@ -39,6 +39,21 @@ def from_failed( wrappedErrors=wrappedErrors, ) + @staticmethod + def schema_extra(schema: Dict[str, Any], model: object) -> None: + """Append the schema to make the errorCode appear required. + + `errorCode`, `wrappedErrors`, and `errorInfo` have defaults because they are not included in earlier + versions of this model, _and_ this model is loaded directly from + the on-robot store. That means that, without a default, it will + fail to parse. Once a default is defined, the automated schema will + mark this as a non-required field, which is misleading as this is + a response from the server to the client and it will always have an + errorCode defined. This hack is required because it informs the client + that it does not, in fact, have to account for a missing errorCode, wrappedError, or errorInfo. + """ + schema["required"].extend(["errorCode", "wrappedErrors", "errorInfo"]) + id: str = Field(..., description="Unique identifier of this error occurrence.") createdAt: datetime = Field(..., description="When the error occurred.") @@ -145,23 +160,7 @@ def from_failed( default=[], description="Errors that may have caused this one." ) - class Config: - """Customize configuration for this model.""" - - @staticmethod - def schema_extra(schema: Dict[str, Any], model: object) -> None: - """Append the schema to make the errorCode appear required. - - `errorCode`, `wrappedErrors`, and `errorInfo` have defaults because they are not included in earlier - versions of this model, _and_ this model is loaded directly from - the on-robot store. That means that, without a default, it will - fail to parse. Once a default is defined, the automated schema will - mark this as a non-required field, which is misleading as this is - a response from the server to the client and it will always have an - errorCode defined. This hack is required because it informs the client - that it does not, in fact, have to account for a missing errorCode, wrappedError, or errorInfo. - """ - schema["required"].extend(["errorCode", "wrappedErrors", "errorInfo"]) + model_config = ConfigDict(json_schema_extra=schema_extra) # TODO (tz, 7-12-23): move this to exceptions.py when we stop relaying on ErrorOccurrence. @@ -180,4 +179,4 @@ def __init__( self.original_error = original_error -ErrorOccurrence.update_forward_refs() +ErrorOccurrence.model_rebuild() diff --git a/api/src/opentrons/protocol_engine/execution/command_executor.py b/api/src/opentrons/protocol_engine/execution/command_executor.py index b6c686e0b11..47184d94ef2 100644 --- a/api/src/opentrons/protocol_engine/execution/command_executor.py +++ b/api/src/opentrons/protocol_engine/execution/command_executor.py @@ -188,7 +188,7 @@ async def execute(self, command_id: str) -> None: "completedAt": self._model_utils.get_timestamp(), "notes": note_tracker.get_notes(), } - succeeded_command = running_command.copy(update=update) + succeeded_command = running_command.model_copy(update=update) self._action_dispatcher.dispatch( SucceedCommandAction( command=succeeded_command, diff --git a/api/src/opentrons/protocol_engine/execution/equipment.py b/api/src/opentrons/protocol_engine/execution/equipment.py index 792bd583b88..3d26b355741 100644 --- a/api/src/opentrons/protocol_engine/execution/equipment.py +++ b/api/src/opentrons/protocol_engine/execution/equipment.py @@ -1,6 +1,6 @@ """Equipment command side-effect logic.""" from dataclasses import dataclass -from typing import Optional, overload, Union +from typing import Optional, overload, Union, List from opentrons_shared_data.pipette.types import PipetteNameType @@ -152,10 +152,6 @@ async def load_labware( Returns: A LoadedLabwareData object. """ - labware_id = ( - labware_id if labware_id is not None else self._model_utils.generate_id() - ) - definition_uri = uri_from_details( load_name=load_name, namespace=namespace, @@ -172,6 +168,10 @@ async def load_labware( version=version, ) + labware_id = ( + labware_id if labware_id is not None else self._model_utils.generate_id() + ) + # Allow propagation of ModuleNotLoadedError. offset_id = self.find_applicable_labware_offset_id( labware_definition_uri=definition_uri, @@ -379,6 +379,74 @@ async def load_module( definition=attached_module.definition, ) + async def load_lids( + self, + load_name: str, + namespace: str, + version: int, + location: LabwareLocation, + quantity: int, + ) -> List[LoadedLabwareData]: + """Load one or many lid labware by assigning an identifier and pulling required data. + + Args: + load_name: The lid labware's load name. + namespace: The lid labware's namespace. + version: The lid labware's version. + location: The deck location at which lid(s) will be placed. + labware_ids: An optional list of identifiers to assign the labware. If None, + an identifier will be generated. + + Raises: + ModuleNotLoadedError: If `location` references a module ID + that doesn't point to a valid loaded module. + + Returns: + A list of LoadedLabwareData objects. + """ + definition_uri = uri_from_details( + load_name=load_name, + namespace=namespace, + version=version, + ) + try: + # Try to use existing definition in state. + definition = self._state_store.labware.get_definition_by_uri(definition_uri) + except LabwareDefinitionDoesNotExistError: + definition = await self._labware_data_provider.get_labware_definition( + load_name=load_name, + namespace=namespace, + version=version, + ) + + stack_limit = definition.stackLimit if definition.stackLimit is not None else 1 + if quantity > stack_limit: + raise ValueError( + f"Requested quantity {quantity} is greater than the stack limit of {stack_limit} provided by definition for {load_name}." + ) + + # Allow propagation of ModuleNotLoadedError. + if ( + isinstance(location, DeckSlotLocation) + and definition.parameters.isDeckSlotCompatible is not None + and not definition.parameters.isDeckSlotCompatible + ): + raise ValueError( + f"Lid Labware {load_name} cannot be loaded onto a Deck Slot." + ) + + load_labware_data_list = [] + for i in range(quantity): + load_labware_data_list.append( + LoadedLabwareData( + labware_id=self._model_utils.generate_id(), + definition=definition, + offsetId=None, + ) + ) + + return load_labware_data_list + async def configure_for_volume( self, pipette_id: str, volume: float, tip_overlap_version: Optional[str] ) -> LoadedConfigureForVolumeData: diff --git a/api/src/opentrons/protocol_engine/notes/notes.py b/api/src/opentrons/protocol_engine/notes/notes.py index 8c349d167cd..2ec71d90b55 100644 --- a/api/src/opentrons/protocol_engine/notes/notes.py +++ b/api/src/opentrons/protocol_engine/notes/notes.py @@ -35,7 +35,7 @@ def make_error_recovery_debug_note(type: "ErrorRecoveryType") -> CommandNote: This is intended to be read by developers and support people, not computers. """ message = f"Handling this command failure with {type.name}." - return CommandNote.construct( + return CommandNote.model_construct( noteKind="debugErrorRecovery", shortMessage=message, longMessage=message, diff --git a/api/src/opentrons/protocol_engine/resources/labware_data_provider.py b/api/src/opentrons/protocol_engine/resources/labware_data_provider.py index 0b08720d4e9..8d5cdfc7899 100644 --- a/api/src/opentrons/protocol_engine/resources/labware_data_provider.py +++ b/api/src/opentrons/protocol_engine/resources/labware_data_provider.py @@ -44,7 +44,7 @@ async def get_labware_definition( def _get_labware_definition_sync( load_name: str, namespace: str, version: int ) -> LabwareDefinition: - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( get_labware_definition(load_name, namespace, version) ) diff --git a/api/src/opentrons/protocol_engine/resources/labware_validation.py b/api/src/opentrons/protocol_engine/resources/labware_validation.py index 090723ffb7e..efe6d6daf65 100644 --- a/api/src/opentrons/protocol_engine/resources/labware_validation.py +++ b/api/src/opentrons/protocol_engine/resources/labware_validation.py @@ -32,6 +32,11 @@ def validate_definition_is_lid(definition: LabwareDefinition) -> bool: return LabwareRole.lid in definition.allowedRoles +def validate_definition_is_system(definition: LabwareDefinition) -> bool: + """Validate that one of the definition's allowed roles is `system`.""" + return LabwareRole.system in definition.allowedRoles + + def validate_labware_can_be_stacked( top_labware_definition: LabwareDefinition, below_labware_load_name: str ) -> bool: diff --git a/api/src/opentrons/protocol_engine/resources/module_data_provider.py b/api/src/opentrons/protocol_engine/resources/module_data_provider.py index a12b85ee5b3..3ee7b5d6bd9 100644 --- a/api/src/opentrons/protocol_engine/resources/module_data_provider.py +++ b/api/src/opentrons/protocol_engine/resources/module_data_provider.py @@ -22,7 +22,7 @@ class ModuleDataProvider: def get_definition(model: ModuleModel) -> ModuleDefinition: """Get the module definition.""" data = load_definition(model_or_loadname=model.value, version="3") - return ModuleDefinition.parse_obj(data) + return ModuleDefinition.model_validate(data) @staticmethod def load_module_calibrations() -> Dict[str, ModuleOffsetData]: diff --git a/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py b/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py index 4df6b0d4d77..ee721c88f2c 100644 --- a/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py +++ b/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py @@ -98,6 +98,7 @@ def configure_virtual_pipette_nozzle_layout( config.pipette_type, config.channels, config.version, + pip_types.PipetteOEMType.OT, ) new_nozzle_manager = NozzleConfigurationManager.build_from_config( config, valid_nozzle_maps @@ -130,6 +131,7 @@ def configure_virtual_pipette_for_volume( pipette_model.pipette_type, pipette_model.pipette_channels, pipette_model.pipette_version, + pipette_model.oem_type, ) liquid_class = pipette_definition.liquid_class_for_volume_between_default_and_defaultlowvolume( @@ -163,6 +165,7 @@ def _get_virtual_pipette_full_config_by_model_string( pipette_model.pipette_type, pipette_model.pipette_channels, pipette_model.pipette_version, + pipette_model.oem_type, ) def _get_virtual_pipette_static_config_by_model( # noqa: C901 @@ -179,6 +182,7 @@ def _get_virtual_pipette_static_config_by_model( # noqa: C901 pipette_model.pipette_type, pipette_model.pipette_channels, pipette_model.pipette_version, + pipette_model.oem_type, ) try: tip_type = pip_types.PipetteTipType( @@ -195,6 +199,7 @@ def _get_virtual_pipette_static_config_by_model( # noqa: C901 pipette_model.pipette_type, pipette_model.pipette_channels, pipette_model.pipette_version, + pipette_model.oem_type, ) if pipette_id not in self._nozzle_manager_layout_by_id: nozzle_manager = NozzleConfigurationManager.build_from_config( diff --git a/api/src/opentrons/protocol_engine/slot_standardization.py b/api/src/opentrons/protocol_engine/slot_standardization.py index b600258bbf0..d940517eebe 100644 --- a/api/src/opentrons/protocol_engine/slot_standardization.py +++ b/api/src/opentrons/protocol_engine/slot_standardization.py @@ -35,9 +35,9 @@ def standardize_labware_offset( original: LabwareOffsetCreate, robot_type: RobotType ) -> LabwareOffsetCreate: """Convert the deck slot in the given `LabwareOffsetCreate` to match the given robot type.""" - return original.copy( + return original.model_copy( update={ - "location": original.location.copy( + "location": original.location.model_copy( update={ "slotName": original.location.slotName.to_equivalent_for_robot_type( robot_type @@ -70,40 +70,40 @@ def standardize_command( def _standardize_load_labware( original: commands.LoadLabwareCreate, robot_type: RobotType ) -> commands.LoadLabwareCreate: - params = original.params.copy( + params = original.params.model_copy( update={ "location": _standardize_labware_location( original.params.location, robot_type ) } ) - return original.copy(update={"params": params}) + return original.model_copy(update={"params": params}) def _standardize_load_module( original: commands.LoadModuleCreate, robot_type: RobotType ) -> commands.LoadModuleCreate: - params = original.params.copy( + params = original.params.model_copy( update={ "location": _standardize_deck_slot_location( original.params.location, robot_type ) } ) - return original.copy(update={"params": params}) + return original.model_copy(update={"params": params}) def _standardize_move_labware( original: commands.MoveLabwareCreate, robot_type: RobotType ) -> commands.MoveLabwareCreate: - params = original.params.copy( + params = original.params.model_copy( update={ "newLocation": _standardize_labware_location( original.params.newLocation, robot_type ) } ) - return original.copy(update={"params": params}) + return original.model_copy(update={"params": params}) _standardize_command_functions: Dict[ @@ -135,6 +135,6 @@ def _standardize_labware_location( def _standardize_deck_slot_location( original: DeckSlotLocation, robot_type: RobotType ) -> DeckSlotLocation: - return original.copy( + return original.model_copy( update={"slotName": original.slotName.to_equivalent_for_robot_type(robot_type)} ) diff --git a/api/src/opentrons/protocol_engine/state/commands.py b/api/src/opentrons/protocol_engine/state/commands.py index 8aa71c9c1f8..e059212e73f 100644 --- a/api/src/opentrons/protocol_engine/state/commands.py +++ b/api/src/opentrons/protocol_engine/state/commands.py @@ -304,7 +304,7 @@ def _handle_queue_command_action(self, action: QueueCommandAction) -> None: # TODO(mc, 2021-06-22): mypy has trouble with this automatic # request > command mapping, figure out how to type precisely # (or wait for a future mypy version that can figure it out). - queued_command = action.request._CommandCls.construct( + queued_command = action.request._CommandCls.model_construct( # type: ignore[call-arg] id=action.command_id, key=( action.request.key @@ -326,7 +326,7 @@ def _handle_queue_command_action(self, action: QueueCommandAction) -> None: def _handle_run_command_action(self, action: RunCommandAction) -> None: prev_entry = self._state.command_history.get(action.command_id) - running_command = prev_entry.command.copy( + running_command = prev_entry.command.model_copy( update={ "status": CommandStatus.RUNNING, "startedAt": action.started_at, @@ -525,7 +525,7 @@ def _update_to_failed( notes: Optional[List[CommandNote]], ) -> None: prev_entry = self._state.command_history.get(command_id) - failed_command = prev_entry.command.copy( + failed_command = prev_entry.command.model_copy( update={ "completedAt": failed_at, "status": CommandStatus.FAILED, @@ -679,7 +679,7 @@ def get_error(self) -> Optional[ErrorOccurrence]: finish_error = self._state.finish_error if run_error and finish_error: - combined_error = ErrorOccurrence.construct( + combined_error = ErrorOccurrence( id=finish_error.id, createdAt=finish_error.createdAt, errorType="RunAndFinishFailed", diff --git a/api/src/opentrons/protocol_engine/state/geometry.py b/api/src/opentrons/protocol_engine/state/geometry.py index ed915530b90..e0d9cb1afa1 100644 --- a/api/src/opentrons/protocol_engine/state/geometry.py +++ b/api/src/opentrons/protocol_engine/state/geometry.py @@ -489,7 +489,7 @@ def get_well_position( well_depth=well_depth, operation_volume=operation_volume, ) - offset = offset.copy(update={"z": offset.z + offset_adjustment}) + offset = offset.model_copy(update={"z": offset.z + offset_adjustment}) self.validate_well_position( well_location=well_location, z_offset=offset.z, pipette_id=pipette_id ) diff --git a/api/src/opentrons/protocol_engine/state/labware.py b/api/src/opentrons/protocol_engine/state/labware.py index 95b2baa1974..70cb43c8403 100644 --- a/api/src/opentrons/protocol_engine/state/labware.py +++ b/api/src/opentrons/protocol_engine/state/labware.py @@ -131,7 +131,7 @@ def __init__( for fixed_labware in deck_fixed_labware } labware_by_id = { - fixed_labware.labware_id: LoadedLabware.construct( + fixed_labware.labware_id: LoadedLabware.model_construct( id=fixed_labware.labware_id, location=fixed_labware.location, loadName=fixed_labware.definition.parameters.loadName, @@ -156,10 +156,12 @@ def handle_action(self, action: Action) -> None: """Modify state in reaction to an action.""" for state_update in get_state_updates(action): self._add_loaded_labware(state_update) + self._add_loaded_lid_stack(state_update) self._set_labware_location(state_update) + self._set_labware_lid(state_update) if isinstance(action, AddLabwareOffsetAction): - labware_offset = LabwareOffset.construct( + labware_offset = LabwareOffset.model_construct( id=action.labware_offset_id, createdAt=action.created_at, definitionUri=action.request.definitionUri, @@ -212,7 +214,7 @@ def _add_loaded_labware(self, state_update: update_types.StateUpdate) -> None: self._state.labware_by_id[ loaded_labware_update.labware_id - ] = LoadedLabware.construct( + ] = LoadedLabware.model_construct( id=loaded_labware_update.labware_id, location=location, loadName=loaded_labware_update.definition.parameters.loadName, @@ -221,6 +223,63 @@ def _add_loaded_labware(self, state_update: update_types.StateUpdate) -> None: displayName=display_name, ) + def _add_loaded_lid_stack(self, state_update: update_types.StateUpdate) -> None: + loaded_lid_stack_update = state_update.loaded_lid_stack + if loaded_lid_stack_update != update_types.NO_CHANGE: + # Add the stack object + stack_definition_uri = uri_from_details( + namespace=loaded_lid_stack_update.stack_object_definition.namespace, + load_name=loaded_lid_stack_update.stack_object_definition.parameters.loadName, + version=loaded_lid_stack_update.stack_object_definition.version, + ) + self.state.definitions_by_uri[ + stack_definition_uri + ] = loaded_lid_stack_update.stack_object_definition + self._state.labware_by_id[ + loaded_lid_stack_update.stack_id + ] = LoadedLabware.construct( + id=loaded_lid_stack_update.stack_id, + location=loaded_lid_stack_update.stack_location, + loadName=loaded_lid_stack_update.stack_object_definition.parameters.loadName, + definitionUri=stack_definition_uri, + offsetId=None, + displayName=None, + ) + + # Add the Lids on top of the stack object + for i in range(len(loaded_lid_stack_update.labware_ids)): + definition_uri = uri_from_details( + namespace=loaded_lid_stack_update.definition.namespace, + load_name=loaded_lid_stack_update.definition.parameters.loadName, + version=loaded_lid_stack_update.definition.version, + ) + + self._state.definitions_by_uri[ + definition_uri + ] = loaded_lid_stack_update.definition + + location = loaded_lid_stack_update.new_locations_by_id[ + loaded_lid_stack_update.labware_ids[i] + ] + + self._state.labware_by_id[ + loaded_lid_stack_update.labware_ids[i] + ] = LoadedLabware.construct( + id=loaded_lid_stack_update.labware_ids[i], + location=location, + loadName=loaded_lid_stack_update.definition.parameters.loadName, + definitionUri=definition_uri, + offsetId=None, + displayName=None, + ) + + def _set_labware_lid(self, state_update: update_types.StateUpdate) -> None: + labware_lid_update = state_update.labware_lid + if labware_lid_update != update_types.NO_CHANGE: + parent_labware_id = labware_lid_update.parent_labware_id + lid_id = labware_lid_update.lid_id + self._state.labware_by_id[parent_labware_id].lid_id = lid_id + def _set_labware_location(self, state_update: update_types.StateUpdate) -> None: labware_location_update = state_update.labware_location if labware_location_update != update_types.NO_CHANGE: @@ -441,21 +500,7 @@ def get_labware_stacking_maximum(self, labware: LabwareDefinition) -> int: If not defined within a labware, defaults to one. """ - stacking_quirks = { - "stackingMaxFive": 5, - "stackingMaxFour": 4, - "stackingMaxThree": 3, - "stackingMaxTwo": 2, - "stackingMaxOne": 1, - "stackingMaxZero": 0, - } - for quirk in stacking_quirks.keys(): - if ( - labware.parameters.quirks is not None - and quirk in labware.parameters.quirks - ): - return stacking_quirks[quirk] - return 1 + return labware.stackLimit if labware.stackLimit is not None else 1 def get_should_center_pipette_on_target_well(self, labware_id: str) -> bool: """True if a pipette moving to a well of this labware should center its body on the target. @@ -815,6 +860,11 @@ def raise_if_labware_inaccessible_by_pipette(self, labware_id: str) -> None: return self.raise_if_labware_inaccessible_by_pipette( labware_location.labwareId ) + elif labware.lid_id is not None: + raise errors.LocationNotAccessibleByPipetteError( + f"Cannot move pipette to {labware.loadName} " + "because labware is currently covered by a lid." + ) elif isinstance(labware_location, AddressableAreaLocation): if fixture_validation.is_staging_slot(labware_location.addressableAreaName): raise errors.LocationNotAccessibleByPipetteError( @@ -998,11 +1048,15 @@ def get_child_gripper_offsets( return None else: return LabwareMovementOffsetData( - pickUpOffset=cast( - LabwareOffsetVector, parsed_offsets[offset_key].pickUpOffset + pickUpOffset=LabwareOffsetVector.model_construct( + x=parsed_offsets[offset_key].pickUpOffset.x, + y=parsed_offsets[offset_key].pickUpOffset.y, + z=parsed_offsets[offset_key].pickUpOffset.z, ), - dropOffset=cast( - LabwareOffsetVector, parsed_offsets[offset_key].dropOffset + dropOffset=LabwareOffsetVector.model_construct( + x=parsed_offsets[offset_key].dropOffset.x, + y=parsed_offsets[offset_key].dropOffset.y, + z=parsed_offsets[offset_key].dropOffset.z, ), ) diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index ebf503c51fb..ce75473265e 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -35,6 +35,7 @@ AbsorbanceReaderMeasureMode, ) from opentrons.types import DeckSlotName, MountType, StagingSlotName +from .update_types import AbsorbanceReaderStateUpdate from ..errors import ModuleNotConnectedError from ..types import ( @@ -63,7 +64,6 @@ heater_shaker, temperature_module, thermocycler, - absorbance_reader, ) from ..actions import ( Action, @@ -296,40 +296,10 @@ def _handle_command(self, command: Command) -> None: ): self._handle_thermocycler_module_commands(command) - if isinstance( - command.result, - ( - absorbance_reader.InitializeResult, - absorbance_reader.ReadAbsorbanceResult, - ), - ): - self._handle_absorbance_reader_commands(command) - def _handle_state_update(self, state_update: update_types.StateUpdate) -> None: - if state_update.absorbance_reader_lid != update_types.NO_CHANGE: - module_id = state_update.absorbance_reader_lid.module_id - is_lid_on = state_update.absorbance_reader_lid.is_lid_on - - # Get current values: - absorbance_reader_substate = self._state.substate_by_module_id[module_id] - assert isinstance( - absorbance_reader_substate, AbsorbanceReaderSubState - ), f"{module_id} is not an absorbance plate reader." - configured = absorbance_reader_substate.configured - measure_mode = absorbance_reader_substate.measure_mode - configured_wavelengths = absorbance_reader_substate.configured_wavelengths - reference_wavelength = absorbance_reader_substate.reference_wavelength - data = absorbance_reader_substate.data - - self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( - module_id=AbsorbanceReaderId(module_id), - configured=configured, - measured=True, - is_lid_on=is_lid_on, - measure_mode=measure_mode, - configured_wavelengths=configured_wavelengths, - reference_wavelength=reference_wavelength, - data=data, + if state_update.absorbance_reader_state_update != update_types.NO_CHANGE: + self._handle_absorbance_reader_commands( + state_update.absorbance_reader_state_update ) def _add_module_substate( @@ -589,47 +559,58 @@ def _handle_thermocycler_module_commands( ) def _handle_absorbance_reader_commands( - self, - command: Union[ - absorbance_reader.Initialize, - absorbance_reader.ReadAbsorbance, - ], + self, absorbance_reader_state_update: AbsorbanceReaderStateUpdate ) -> None: - module_id = command.params.moduleId + # Get current values: + module_id = absorbance_reader_state_update.module_id absorbance_reader_substate = self._state.substate_by_module_id[module_id] assert isinstance( absorbance_reader_substate, AbsorbanceReaderSubState ), f"{module_id} is not an absorbance plate reader." - - # Get current values + is_lid_on = absorbance_reader_substate.is_lid_on + measured = True configured = absorbance_reader_substate.configured measure_mode = absorbance_reader_substate.measure_mode configured_wavelengths = absorbance_reader_substate.configured_wavelengths reference_wavelength = absorbance_reader_substate.reference_wavelength - is_lid_on = absorbance_reader_substate.is_lid_on - - if isinstance(command.result, absorbance_reader.InitializeResult): - self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( - module_id=AbsorbanceReaderId(module_id), - configured=True, - measured=False, - is_lid_on=is_lid_on, - measure_mode=AbsorbanceReaderMeasureMode(command.params.measureMode), - configured_wavelengths=command.params.sampleWavelengths, - reference_wavelength=command.params.referenceWavelength, - data=None, + data = absorbance_reader_substate.data + if ( + absorbance_reader_state_update.absorbance_reader_lid + != update_types.NO_CHANGE + ): + is_lid_on = absorbance_reader_state_update.absorbance_reader_lid.is_lid_on + elif ( + absorbance_reader_state_update.initialize_absorbance_reader_update + != update_types.NO_CHANGE + ): + configured = True + measured = False + is_lid_on = is_lid_on + measure_mode = AbsorbanceReaderMeasureMode( + absorbance_reader_state_update.initialize_absorbance_reader_update.measure_mode ) - elif isinstance(command.result, absorbance_reader.ReadAbsorbanceResult): - self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( - module_id=AbsorbanceReaderId(module_id), - configured=configured, - measured=True, - is_lid_on=is_lid_on, - measure_mode=measure_mode, - configured_wavelengths=configured_wavelengths, - reference_wavelength=reference_wavelength, - data=command.result.data, + configured_wavelengths = ( + absorbance_reader_state_update.initialize_absorbance_reader_update.sample_wave_lengths ) + reference_wavelength = ( + absorbance_reader_state_update.initialize_absorbance_reader_update.reference_wave_length + ) + data = None + elif ( + absorbance_reader_state_update.absorbance_reader_data + != update_types.NO_CHANGE + ): + data = absorbance_reader_state_update.absorbance_reader_data.read_result + self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( + module_id=AbsorbanceReaderId(module_id), + configured=configured, + measured=measured, + is_lid_on=is_lid_on, + measure_mode=measure_mode, + configured_wavelengths=configured_wavelengths, + reference_wavelength=reference_wavelength, + data=data, + ) class ModuleView: @@ -654,7 +635,7 @@ def get(self, module_id: str) -> LoadedModule: DeckSlotLocation(slotName=slot_name) if slot_name is not None else None ) - return LoadedModule.construct( + return LoadedModule.model_construct( id=module_id, location=location, model=attached_module.definition.model, diff --git a/api/src/opentrons/protocol_engine/state/state.py b/api/src/opentrons/protocol_engine/state/state.py index 58e977cc2f4..5ff12b739f3 100644 --- a/api/src/opentrons/protocol_engine/state/state.py +++ b/api/src/opentrons/protocol_engine/state/state.py @@ -143,7 +143,7 @@ def get_summary(self) -> StateSummary: """Get protocol run data.""" error = self._commands.get_error() # TODO maybe add summary here for AA - return StateSummary.construct( + return StateSummary.model_construct( status=self._commands.get_status(), errors=[] if error is None else [error], pipettes=self._pipettes.get_all(), diff --git a/api/src/opentrons/protocol_engine/state/state_summary.py b/api/src/opentrons/protocol_engine/state/state_summary.py index d6b18613071..64f8e2b2737 100644 --- a/api/src/opentrons/protocol_engine/state/state_summary.py +++ b/api/src/opentrons/protocol_engine/state/state_summary.py @@ -28,8 +28,8 @@ class StateSummary(BaseModel): pipettes: List[LoadedPipette] modules: List[LoadedModule] labwareOffsets: List[LabwareOffset] - startedAt: Optional[datetime] - completedAt: Optional[datetime] + startedAt: Optional[datetime] = None + completedAt: Optional[datetime] = None liquids: List[Liquid] = Field(default_factory=list) wells: List[WellInfoSummary] = Field(default_factory=list) files: List[str] = Field(default_factory=list) diff --git a/api/src/opentrons/protocol_engine/state/update_types.py b/api/src/opentrons/protocol_engine/state/update_types.py index 25b7802976c..9f44fcfee11 100644 --- a/api/src/opentrons/protocol_engine/state/update_types.py +++ b/api/src/opentrons/protocol_engine/state/update_types.py @@ -11,9 +11,11 @@ from opentrons.protocol_engine.types import ( DeckPoint, LabwareLocation, + OnLabwareLocation, TipGeometry, AspiratedFluid, LiquidClassRecord, + ABSMeasureMode, ) from opentrons.types import MountType from opentrons_shared_data.labware.labware_definition import LabwareDefinition @@ -120,6 +122,40 @@ class LoadedLabwareUpdate: definition: LabwareDefinition +@dataclasses.dataclass +class LoadedLidStackUpdate: + """An update that loads a new lid stack.""" + + stack_id: str + """The unique ID of the Lid Stack Object.""" + + stack_object_definition: LabwareDefinition + "The System-only Labware Definition of the Lid Stack Object" + + stack_location: LabwareLocation + "The initial location of the Lid Stack Object." + + labware_ids: typing.List[str] + """The unique IDs of the new lids.""" + + new_locations_by_id: typing.Dict[str, OnLabwareLocation] + """Each lid's initial location keyed by Labware ID.""" + + definition: LabwareDefinition + "The Labware Definition of the Lid Labware(s) loaded." + + +@dataclasses.dataclass +class LabwareLidUpdate: + """An update that identifies a lid on a given parent labware.""" + + parent_labware_id: str + """The unique ID of the parent labware.""" + + lid_id: str + """The unique IDs of the new lids.""" + + @dataclasses.dataclass class LoadPipetteUpdate: """An update that loads a new pipette. @@ -249,10 +285,37 @@ class PipetteEmptyFluidUpdate: class AbsorbanceReaderLidUpdate: """An update to an absorbance reader's lid location.""" - module_id: str is_lid_on: bool +@dataclasses.dataclass +class AbsorbanceReaderDataUpdate: + """An update to an absorbance reader's lid location.""" + + read_result: typing.Dict[int, typing.Dict[str, float]] + + +@dataclasses.dataclass(frozen=True) +class AbsorbanceReaderInitializeUpdate: + """An update to an absorbance reader's initialization.""" + + measure_mode: ABSMeasureMode + sample_wave_lengths: typing.List[int] + reference_wave_length: typing.Optional[int] + + +@dataclasses.dataclass +class AbsorbanceReaderStateUpdate: + """An update to the absorbance reader module state.""" + + module_id: str + absorbance_reader_lid: AbsorbanceReaderLidUpdate | NoChangeType = NO_CHANGE + absorbance_reader_data: AbsorbanceReaderDataUpdate | NoChangeType = NO_CHANGE + initialize_absorbance_reader_update: AbsorbanceReaderInitializeUpdate | NoChangeType = ( + NO_CHANGE + ) + + @dataclasses.dataclass class LiquidClassLoadedUpdate: """The state update from loading a liquid class.""" @@ -301,6 +364,10 @@ class StateUpdate: loaded_labware: LoadedLabwareUpdate | NoChangeType = NO_CHANGE + loaded_lid_stack: LoadedLidStackUpdate | NoChangeType = NO_CHANGE + + labware_lid: LabwareLidUpdate | NoChangeType = NO_CHANGE + tips_used: TipsUsedUpdate | NoChangeType = NO_CHANGE liquid_loaded: LiquidLoadedUpdate | NoChangeType = NO_CHANGE @@ -309,7 +376,9 @@ class StateUpdate: liquid_operated: LiquidOperatedUpdate | NoChangeType = NO_CHANGE - absorbance_reader_lid: AbsorbanceReaderLidUpdate | NoChangeType = NO_CHANGE + absorbance_reader_state_update: AbsorbanceReaderStateUpdate | NoChangeType = ( + NO_CHANGE + ) liquid_class_loaded: LiquidClassLoadedUpdate | NoChangeType = NO_CHANGE @@ -442,6 +511,38 @@ def set_loaded_labware( ) return self + def set_loaded_lid_stack( + self: Self, + stack_id: str, + stack_object_definition: LabwareDefinition, + stack_location: LabwareLocation, + labware_definition: LabwareDefinition, + labware_ids: typing.List[str], + locations: typing.Dict[str, OnLabwareLocation], + ) -> Self: + """Add a new lid stack to state. See `LoadedLidStackUpdate`.""" + self.loaded_lid_stack = LoadedLidStackUpdate( + stack_id=stack_id, + stack_object_definition=stack_object_definition, + stack_location=stack_location, + definition=labware_definition, + labware_ids=labware_ids, + new_locations_by_id=locations, + ) + return self + + def set_lid( + self: Self, + parent_labware_id: str, + lid_id: str, + ) -> Self: + """Update the labware parent of a loaded or moved lid. See `LabwareLidUpdate`.""" + self.labware_lid = LabwareLidUpdate( + parent_labware_id=parent_labware_id, + lid_id=lid_id, + ) + return self + def set_load_pipette( self: Self, pipette_id: str, @@ -573,8 +674,40 @@ def set_fluid_empty(self: Self, pipette_id: str) -> Self: def set_absorbance_reader_lid(self: Self, module_id: str, is_lid_on: bool) -> Self: """Update an absorbance reader's lid location. See `AbsorbanceReaderLidUpdate`.""" - self.absorbance_reader_lid = AbsorbanceReaderLidUpdate( - module_id=module_id, is_lid_on=is_lid_on + assert self.absorbance_reader_state_update == NO_CHANGE + self.absorbance_reader_state_update = AbsorbanceReaderStateUpdate( + module_id=module_id, + absorbance_reader_lid=AbsorbanceReaderLidUpdate(is_lid_on=is_lid_on), + ) + return self + + def set_absorbance_reader_data( + self, module_id: str, read_result: typing.Dict[int, typing.Dict[str, float]] + ) -> Self: + """Update an absorbance reader's read data. See `AbsorbanceReaderReadDataUpdate`.""" + assert self.absorbance_reader_state_update == NO_CHANGE + self.absorbance_reader_state_update = AbsorbanceReaderStateUpdate( + module_id=module_id, + absorbance_reader_data=AbsorbanceReaderDataUpdate(read_result=read_result), + ) + return self + + def initialize_absorbance_reader( + self, + module_id: str, + measure_mode: ABSMeasureMode, + sample_wave_lengths: typing.List[int], + reference_wave_length: typing.Optional[int], + ) -> Self: + """Initialize absorbance reader.""" + assert self.absorbance_reader_state_update == NO_CHANGE + self.absorbance_reader_state_update = AbsorbanceReaderStateUpdate( + module_id=module_id, + initialize_absorbance_reader_update=AbsorbanceReaderInitializeUpdate( + measure_mode=measure_mode, + sample_wave_lengths=sample_wave_lengths, + reference_wave_length=reference_wave_length, + ), ) return self diff --git a/api/src/opentrons/protocol_engine/types.py b/api/src/opentrons/protocol_engine/types.py index 11f1972e105..9d596adbaa8 100644 --- a/api/src/opentrons/protocol_engine/types.py +++ b/api/src/opentrons/protocol_engine/types.py @@ -1,30 +1,30 @@ """Public protocol engine value types and models.""" from __future__ import annotations -import re from datetime import datetime from enum import Enum from dataclasses import dataclass from pathlib import Path +from typing import ( + Any, + Dict, + FrozenSet, + List, + Mapping, + NamedTuple, + Optional, + Tuple, + Union, +) + from pydantic import ( + ConfigDict, BaseModel, Field, + RootModel, StrictBool, StrictFloat, StrictInt, StrictStr, - validator, - Extra, -) -from typing import ( - Optional, - Union, - List, - Dict, - Any, - NamedTuple, - Tuple, - FrozenSet, - Mapping, ) from typing_extensions import Literal, TypeGuard @@ -554,7 +554,7 @@ class ModuleDimensions(BaseModel): bareOverallHeight: float overLabwareHeight: float - lidHeight: Optional[float] + lidHeight: Optional[float] = None class Vec3f(BaseModel): @@ -709,8 +709,8 @@ class LoadedModule(BaseModel): id: str model: ModuleModel - location: Optional[DeckSlotLocation] - serialNumber: Optional[str] + location: Optional[DeckSlotLocation] = None + serialNumber: Optional[str] = None class LabwareOffsetLocation(BaseModel): @@ -804,6 +804,10 @@ class LoadedLabware(BaseModel): location: LabwareLocation = Field( ..., description="The labware's current location." ) + lid_id: Optional[str] = Field( + None, + description=("Labware ID of a Lid currently loaded on top of the labware."), + ) offsetId: Optional[str] = Field( None, description=( @@ -819,17 +823,10 @@ class LoadedLabware(BaseModel): ) -class HexColor(BaseModel): +class HexColor(RootModel[str]): """Hex color representation.""" - __root__: str - - @validator("__root__") - def _color_is_a_valid_hex(cls, v: str) -> str: - match = re.search(r"^#(?:[0-9a-fA-F]{3,4}){1,2}$", v) - if not match: - raise ValueError("Color is not a valid hex color.") - return v + root: str = Field(pattern=r"^#(?:[0-9a-fA-F]{3,4}){1,2}$") EmptyLiquidId = Literal["EMPTY"] @@ -842,7 +839,7 @@ class Liquid(BaseModel): id: str displayName: str description: str - displayColor: Optional[HexColor] + displayColor: Optional[HexColor] = None class LiquidClassRecord(ByTipTypeSetting, frozen=True): @@ -885,7 +882,7 @@ def dict_to_tuple(d: dict[str, Any]) -> tuple[tuple[str, Any], ...]: for field_name, value in d.items() ) - return hash(dict_to_tuple(self.dict())) + return hash(dict_to_tuple(self.model_dump())) class LiquidClassRecordWithId(LiquidClassRecord, frozen=True): @@ -1051,12 +1048,12 @@ class QuadrantNozzleLayoutConfiguration(BaseModel): ) frontRightNozzle: str = Field( ..., - regex=NOZZLE_NAME_REGEX, + pattern=NOZZLE_NAME_REGEX, description="The front right nozzle in your configuration.", ) backLeftNozzle: str = Field( ..., - regex=NOZZLE_NAME_REGEX, + pattern=NOZZLE_NAME_REGEX, description="The back left nozzle in your configuration.", ) @@ -1186,11 +1183,7 @@ class CustomCommandAnnotation(BaseCommandAnnotation): """Annotates a group of atomic commands in some manner that Opentrons software does not anticipate or originate.""" annotationType: Literal["custom"] = "custom" - - class Config: - """Config to allow extra, non-defined properties.""" - - extra = Extra.allow + model_config = ConfigDict(extra="allow") CommandAnnotation = Union[SecondOrderCommandAnnotation, CustomCommandAnnotation] diff --git a/api/src/opentrons/protocol_reader/extract_labware_definitions.py b/api/src/opentrons/protocol_reader/extract_labware_definitions.py index 2ecb64a8a39..88d7e256a07 100644 --- a/api/src/opentrons/protocol_reader/extract_labware_definitions.py +++ b/api/src/opentrons/protocol_reader/extract_labware_definitions.py @@ -41,7 +41,10 @@ async def extract_labware_definitions( async def _extract_from_labware_file(path: Path) -> LabwareDefinition: - return await anyio.to_thread.run_sync(LabwareDefinition.parse_file, path) + def _do_parse() -> LabwareDefinition: + return LabwareDefinition.model_validate_json(path.read_bytes()) + + return await anyio.to_thread.run_sync(_do_parse) async def _extract_from_json_protocol_file(path: Path) -> List[LabwareDefinition]: @@ -52,7 +55,7 @@ def extract_sync(path: Path) -> List[LabwareDefinition]: # which require this labwareDefinitions key. unvalidated_definitions = json_contents["labwareDefinitions"].values() validated_definitions = [ - LabwareDefinition.parse_obj(u) for u in unvalidated_definitions + LabwareDefinition.model_validate(u) for u in unvalidated_definitions ] return validated_definitions diff --git a/api/src/opentrons/protocol_reader/file_format_validator.py b/api/src/opentrons/protocol_reader/file_format_validator.py index df119ac3ffa..17969fc70fe 100644 --- a/api/src/opentrons/protocol_reader/file_format_validator.py +++ b/api/src/opentrons/protocol_reader/file_format_validator.py @@ -60,7 +60,7 @@ async def validate(files: Iterable[IdentifiedFile]) -> None: async def _validate_labware_definition(info: IdentifiedLabwareDefinition) -> None: def validate_sync() -> None: try: - LabwareDefinition.parse_obj(info.unvalidated_json) + LabwareDefinition.model_validate(info.unvalidated_json) except PydanticValidationError as e: raise FileFormatValidationError( message=f"{info.original_file.name} could not be read as a labware definition.", @@ -133,17 +133,17 @@ async def _validate_json_protocol(info: IdentifiedJsonMain) -> None: def validate_sync() -> None: if info.schema_version == 8: try: - JsonProtocolV8.parse_obj(info.unvalidated_json) + JsonProtocolV8.model_validate(info.unvalidated_json) except PydanticValidationError as pve: _handle_v8_json_protocol_validation_error(info, pve) else: try: if info.schema_version == 7: - JsonProtocolV7.parse_obj(info.unvalidated_json) + JsonProtocolV7.model_validate(info.unvalidated_json) elif info.schema_version == 6: - JsonProtocolV6.parse_obj(info.unvalidated_json) + JsonProtocolV6.model_validate(info.unvalidated_json) else: - JsonProtocolUpToV5.parse_obj(info.unvalidated_json) + JsonProtocolUpToV5.model_validate(info.unvalidated_json) except PydanticValidationError as e: raise FileFormatValidationError._generic_json_failure(info, e) from e diff --git a/api/src/opentrons/protocol_runner/json_file_reader.py b/api/src/opentrons/protocol_runner/json_file_reader.py index 488c28d273b..f318be1db5d 100644 --- a/api/src/opentrons/protocol_runner/json_file_reader.py +++ b/api/src/opentrons/protocol_runner/json_file_reader.py @@ -30,11 +30,17 @@ def read( }, ) if protocol_source.config.schema_version == 6: - return ProtocolSchemaV6.parse_file(protocol_source.main_file) + return ProtocolSchemaV6.model_validate_json( + protocol_source.main_file.read_bytes() + ) elif protocol_source.config.schema_version == 7: - return ProtocolSchemaV7.parse_file(protocol_source.main_file) + return ProtocolSchemaV7.model_validate_json( + protocol_source.main_file.read_bytes() + ) elif protocol_source.config.schema_version == 8: - return ProtocolSchemaV8.parse_file(protocol_source.main_file) + return ProtocolSchemaV8.model_validate_json( + protocol_source.main_file.read_bytes() + ) else: raise ProtocolFilesInvalidError( message=f"{name} is a JSON protocol v{protocol_source.config.schema_version} which this robot cannot execute", diff --git a/api/src/opentrons/protocol_runner/json_translator.py b/api/src/opentrons/protocol_runner/json_translator.py index 767bf058730..f20bb3464d8 100644 --- a/api/src/opentrons/protocol_runner/json_translator.py +++ b/api/src/opentrons/protocol_runner/json_translator.py @@ -1,6 +1,7 @@ """Translation of JSON protocol commands into ProtocolEngine commands.""" -from typing import cast, List, Union, Iterator -from pydantic import parse_obj_as, ValidationError as PydanticValidationError + +from typing import List, Union, Iterator +from pydantic import ValidationError as PydanticValidationError, TypeAdapter from opentrons_shared_data.pipette.types import PipetteNameType from opentrons_shared_data.protocol.models import ( @@ -10,6 +11,8 @@ protocol_schema_v7, ProtocolSchemaV8, protocol_schema_v8, + Location, + # CommandSchemaId, ) from opentrons_shared_data import command as command_schema from opentrons_shared_data.errors.exceptions import InvalidProtocolData, PythonException @@ -31,6 +34,15 @@ class CommandTranslatorError(Exception): pass +# Each time a TypeAdapter is instantiated, it will construct a new validator and +# serializer. To improve performance, TypeAdapters are instantiated once. +# See https://docs.pydantic.dev/latest/concepts/performance/#typeadapter-instantiated-once +LabwareLocationAdapter: TypeAdapter[LabwareLocation] = TypeAdapter(LabwareLocation) +CommandAnnotationAdapter: TypeAdapter[CommandAnnotation] = TypeAdapter( + CommandAnnotation +) + + def _translate_labware_command( protocol: ProtocolSchemaV6, command: protocol_schema_v6.Command, @@ -41,6 +53,8 @@ def _translate_labware_command( assert labware_id is not None definition_id = protocol.labware[labware_id].definitionId assert definition_id is not None + + location = command.params.location labware_command = pe_commands.LoadLabwareCreate( params=pe_commands.LoadLabwareParams( labwareId=command.params.labwareId, @@ -48,10 +62,8 @@ def _translate_labware_command( version=protocol.labwareDefinitions[definition_id].version, namespace=protocol.labwareDefinitions[definition_id].namespace, loadName=protocol.labwareDefinitions[definition_id].parameters.loadName, - location=parse_obj_as( - # https://github.com/samuelcolvin/pydantic/issues/1847 - LabwareLocation, # type: ignore[arg-type] - command.params.location, + location=LabwareLocationAdapter.validate_python( + location.model_dump() if isinstance(location, Location) else location ), ), key=command.key, @@ -70,6 +82,7 @@ def _translate_v7_labware_command( assert command.params.namespace is not None assert command.params.loadName is not None + location = command.params.location labware_command = pe_commands.LoadLabwareCreate( params=pe_commands.LoadLabwareParams( labwareId=command.params.labwareId, @@ -77,10 +90,8 @@ def _translate_v7_labware_command( version=command.params.version, namespace=command.params.namespace, loadName=command.params.loadName, - location=parse_obj_as( - # https://github.com/samuelcolvin/pydantic/issues/1847 - LabwareLocation, # type: ignore[arg-type] - command.params.location, + location=LabwareLocationAdapter.validate_python( + location.model_dump() if isinstance(location, Location) else location ), ), key=command.key, @@ -98,10 +109,14 @@ def _translate_module_command( # load module command must contain module_id. modules cannot be None. assert module_id is not None assert modules is not None + + location = command.params.location translated_obj = pe_commands.LoadModuleCreate( params=pe_commands.LoadModuleParams( model=ModuleModel(modules[module_id].model), - location=DeckSlotLocation.parse_obj(command.params.location), + location=DeckSlotLocation.model_validate( + location.model_dump() if isinstance(location, Location) else location + ), moduleId=command.params.moduleId, ), key=command.key, @@ -117,10 +132,13 @@ def _translate_v7_module_command( # load module command must contain module_id. modules cannot be None. assert module_id is not None assert command.params.model is not None + location = command.params.location translated_obj = pe_commands.LoadModuleCreate( params=pe_commands.LoadModuleParams( model=ModuleModel(command.params.model), - location=DeckSlotLocation.parse_obj(command.params.location), + location=DeckSlotLocation.model_validate( + location.model_dump() if isinstance(location, Location) else location + ), moduleId=command.params.moduleId, ), key=command.key, @@ -171,9 +189,9 @@ def _translate_simple_command( protocol_schema_v6.Command, protocol_schema_v7.Command, protocol_schema_v8.Command, - ] + ], ) -> pe_commands.CommandCreate: - dict_command = command.dict(exclude_none=True) + dict_command = command.model_dump(exclude_none=True) # map deprecated `delay` commands to `waitForResume` / `waitForDuration` if dict_command["commandType"] == "delay": @@ -182,15 +200,7 @@ def _translate_simple_command( else: dict_command["commandType"] = "waitForDuration" - translated_obj = cast( - pe_commands.CommandCreate, - parse_obj_as( - # https://github.com/samuelcolvin/pydantic/issues/1847 - pe_commands.CommandCreate, # type: ignore[arg-type] - dict_command, - ), - ) - return translated_obj + return pe_commands.CommandCreateAdapter.validate_python(dict_command) class JsonTranslator: @@ -207,7 +217,7 @@ def translate_liquids( id=liquid_id, displayName=liquid.displayName, description=liquid.description, - displayColor=HexColor(__root__=liquid.displayColor) + displayColor=HexColor(liquid.displayColor) if liquid.displayColor is not None else None, ) @@ -294,9 +304,8 @@ def translate_command_annotations( return [] else: command_annotations: List[CommandAnnotation] = [ - parse_obj_as( - CommandAnnotation, # type: ignore[arg-type] - command_annotation.dict(), + CommandAnnotationAdapter.validate_python( + command_annotation.model_dump(), ) for command_annotation in protocol.commandAnnotations ] diff --git a/api/src/opentrons/protocol_runner/legacy_command_mapper.py b/api/src/opentrons/protocol_runner/legacy_command_mapper.py index 27b1c7ea331..f7d50e539d8 100644 --- a/api/src/opentrons/protocol_runner/legacy_command_mapper.py +++ b/api/src/opentrons/protocol_runner/legacy_command_mapper.py @@ -177,11 +177,13 @@ def map_command( # noqa: C901 completed_command: pe_commands.Command if command_error is None: if isinstance(running_command, pe_commands.PickUpTip): - completed_command = running_command.copy( + completed_command = running_command.model_copy( update={ - "result": pe_commands.PickUpTipResult.construct( + "result": pe_commands.PickUpTipResult.model_construct( tipVolume=command["payload"]["location"].max_volume, # type: ignore[typeddict-item] - tipLength=command["payload"]["instrument"].hw_pipette["tip_length"], # type: ignore[typeddict-item] + tipLength=command["payload"]["instrument"].hw_pipette[ # type: ignore[typeddict-item] + "tip_length" + ], position=pe_types.DeckPoint(x=0, y=0, z=0), ), "status": pe_commands.CommandStatus.SUCCEEDED, @@ -190,9 +192,9 @@ def map_command( # noqa: C901 } ) elif isinstance(running_command, pe_commands.DropTip): - completed_command = running_command.copy( + completed_command = running_command.model_copy( update={ - "result": pe_commands.DropTipResult.construct( + "result": pe_commands.DropTipResult.model_construct( position=pe_types.DeckPoint(x=0, y=0, z=0) ), "status": pe_commands.CommandStatus.SUCCEEDED, @@ -201,9 +203,9 @@ def map_command( # noqa: C901 } ) elif isinstance(running_command, pe_commands.Aspirate): - completed_command = running_command.copy( + completed_command = running_command.model_copy( update={ - # Don't .construct() result, because we want to validate + # Don't .model_construct() result, because we want to validate # volume. "result": pe_commands.AspirateResult( volume=running_command.params.volume, @@ -215,9 +217,9 @@ def map_command( # noqa: C901 } ) elif isinstance(running_command, pe_commands.Dispense): - completed_command = running_command.copy( + completed_command = running_command.model_copy( update={ - # Don't .construct() result, because we want to validate + # Don't .model_construct() result, because we want to validate # volume. "result": pe_commands.DispenseResult( volume=running_command.params.volume, @@ -229,9 +231,9 @@ def map_command( # noqa: C901 } ) elif isinstance(running_command, pe_commands.BlowOut): - completed_command = running_command.copy( + completed_command = running_command.model_copy( update={ - "result": pe_commands.BlowOutResult.construct( + "result": pe_commands.BlowOutResult.model_construct( position=pe_types.DeckPoint(x=0, y=0, z=0) ), "status": pe_commands.CommandStatus.SUCCEEDED, @@ -240,18 +242,18 @@ def map_command( # noqa: C901 } ) elif isinstance(running_command, pe_commands.Comment): - completed_command = running_command.copy( + completed_command = running_command.model_copy( update={ - "result": pe_commands.CommentResult.construct(), + "result": pe_commands.CommentResult.model_construct(), "status": pe_commands.CommandStatus.SUCCEEDED, "completedAt": now, "notes": [], } ) elif isinstance(running_command, pe_commands.Custom): - completed_command = running_command.copy( + completed_command = running_command.model_copy( update={ - "result": pe_commands.CustomResult.construct(), + "result": pe_commands.CustomResult.model_construct(), "status": pe_commands.CommandStatus.SUCCEEDED, "completedAt": now, "notes": [], @@ -261,7 +263,7 @@ def map_command( # noqa: C901 # TODO(mm, 2024-06-13): This looks potentially wrong. # We're creating a `SUCCEEDED` command that does not have a `result`, # which is not normally possible. - completed_command = running_command.copy( + completed_command = running_command.model_copy( update={ "status": pe_commands.CommandStatus.SUCCEEDED, "completedAt": now, @@ -331,51 +333,51 @@ def _build_initial_command( elif command["name"] == legacy_command_types.BLOW_OUT: return self._build_blow_out(command=command, command_id=command_id, now=now) elif command["name"] == legacy_command_types.PAUSE: - wait_for_resume_running = pe_commands.WaitForResume.construct( + wait_for_resume_running = pe_commands.WaitForResume.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - params=pe_commands.WaitForResumeParams.construct( + params=pe_commands.WaitForResumeParams.model_construct( message=command["payload"]["userMessage"], ), ) wait_for_resume_create: pe_commands.CommandCreate = ( - pe_commands.WaitForResumeCreate.construct( + pe_commands.WaitForResumeCreate.model_construct( key=wait_for_resume_running.key, params=wait_for_resume_running.params, ) ) return wait_for_resume_create, wait_for_resume_running elif command["name"] == legacy_command_types.COMMENT: - comment_running = pe_commands.Comment.construct( + comment_running = pe_commands.Comment.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - params=pe_commands.CommentParams.construct( + params=pe_commands.CommentParams.model_construct( message=command["payload"]["text"], ), ) - comment_create = pe_commands.CommentCreate.construct( + comment_create = pe_commands.CommentCreate.model_construct( key=comment_running.key, params=comment_running.params ) return comment_create, comment_running else: - custom_running = pe_commands.Custom.construct( + custom_running = pe_commands.Custom.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - params=LegacyCommandParams.construct( + params=LegacyCommandParams.model_construct( legacyCommandType=command["name"], legacyCommandText=command["payload"]["text"], ), ) - custom_create = pe_commands.CustomCreate.construct( + custom_create = pe_commands.CustomCreate.model_construct( key=custom_running.key, params=custom_running.params, ) @@ -396,19 +398,19 @@ def _build_drop_tip( labware_id = self._labware_id_by_slot[slot] pipette_id = self._pipette_id_by_mount[mount] - running = pe_commands.DropTip.construct( + running = pe_commands.DropTip.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - params=pe_commands.DropTipParams.construct( + params=pe_commands.DropTipParams.model_construct( pipetteId=pipette_id, labwareId=labware_id, wellName=well_name, ), ) - create = pe_commands.DropTipCreate.construct( + create = pe_commands.DropTipCreate.model_construct( key=running.key, params=running.params, ) @@ -430,19 +432,19 @@ def _build_pick_up_tip( labware_id = self._labware_id_by_slot[slot] pipette_id = self._pipette_id_by_mount[mount] - running = pe_commands.PickUpTip.construct( + running = pe_commands.PickUpTip.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - params=pe_commands.PickUpTipParams.construct( + params=pe_commands.PickUpTipParams.model_construct( pipetteId=pipette_id, labwareId=labware_id, wellName=well_name, ), ) - create = pe_commands.PickUpTipCreate.construct( + create = pe_commands.PickUpTipCreate.model_construct( key=running.key, params=running.params ) return create, running @@ -482,31 +484,31 @@ def _build_liquid_handling( # TODO(mm, 2024-03-22): I don't think this has been true since # https://github.com/Opentrons/opentrons/pull/14211. Can we just use # aspirate and dispense commands now? - move_to_well_running = pe_commands.MoveToWell.construct( + move_to_well_running = pe_commands.MoveToWell.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - params=pe_commands.MoveToWellParams.construct( + params=pe_commands.MoveToWellParams.model_construct( pipetteId=pipette_id, labwareId=labware_id, wellName=well_name, ), ) - move_to_well_create = pe_commands.MoveToWellCreate.construct( + move_to_well_create = pe_commands.MoveToWellCreate.model_construct( key=move_to_well_running.key, params=move_to_well_running.params ) return move_to_well_create, move_to_well_running elif command["name"] == legacy_command_types.ASPIRATE: flow_rate = command["payload"]["rate"] * pipette.flow_rate.aspirate - aspirate_running = pe_commands.Aspirate.construct( + aspirate_running = pe_commands.Aspirate.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - # Don't .construct() params, because we want to validate + # Don't .model_construct() params, because we want to validate # volume and flowRate. params=pe_commands.AspirateParams( pipetteId=pipette_id, @@ -516,19 +518,19 @@ def _build_liquid_handling( flowRate=flow_rate, ), ) - aspirate_create = pe_commands.AspirateCreate.construct( + aspirate_create = pe_commands.AspirateCreate.model_construct( key=aspirate_running.key, params=aspirate_running.params ) return aspirate_create, aspirate_running else: flow_rate = command["payload"]["rate"] * pipette.flow_rate.dispense - dispense_running = pe_commands.Dispense.construct( + dispense_running = pe_commands.Dispense.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - # Don't .construct params, because we want to validate + # Don't .model_construct params, because we want to validate # volume and flowRate. params=pe_commands.DispenseParams( pipetteId=pipette_id, @@ -538,24 +540,24 @@ def _build_liquid_handling( flowRate=flow_rate, ), ) - dispense_create = pe_commands.DispenseCreate.construct( + dispense_create = pe_commands.DispenseCreate.model_construct( key=dispense_running.key, params=dispense_running.params ) return dispense_create, dispense_running else: - running = pe_commands.Custom.construct( + running = pe_commands.Custom.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - params=LegacyCommandParams.construct( + params=LegacyCommandParams.model_construct( legacyCommandType=command["name"], legacyCommandText=command["payload"]["text"], ), ) - create = pe_commands.CustomCreate.construct( + create = pe_commands.CustomCreate.model_construct( key=running.key, params=running.params ) return create, running @@ -584,13 +586,13 @@ def _build_blow_out( well_name = well.well_name pipette_id = self._pipette_id_by_mount[mount] - blow_out_running = pe_commands.BlowOut.construct( + blow_out_running = pe_commands.BlowOut.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - # Don't .construct() params, because we want to validate flowRate. + # Don't .model_construct() params, because we want to validate flowRate. params=pe_commands.BlowOutParams( pipetteId=pipette_id, labwareId=labware_id, @@ -598,7 +600,7 @@ def _build_blow_out( flowRate=flow_rate, ), ) - blow_out_create = pe_commands.BlowOutCreate.construct( + blow_out_create = pe_commands.BlowOutCreate.model_construct( key=blow_out_running.key, params=blow_out_running.params ) return blow_out_create, blow_out_running @@ -606,18 +608,18 @@ def _build_blow_out( # TODO:(jr, 15.08.2022): blow_out commands with no specified labware get filtered # into custom. Refactor this in followup legacy command mapping else: - custom_running = pe_commands.Custom.construct( + custom_running = pe_commands.Custom.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.RUNNING, createdAt=now, startedAt=now, - params=LegacyCommandParams.construct( + params=LegacyCommandParams.model_construct( legacyCommandType=command["name"], legacyCommandText=command["payload"]["text"], ), ) - custom_create = pe_commands.CustomCreate.construct( + custom_create = pe_commands.CustomCreate.model_construct( key=custom_running.key, params=custom_running.params ) return custom_create, custom_running @@ -631,23 +633,23 @@ def _map_labware_load( slot = labware_load_info.deck_slot location: pe_types.LabwareLocation if labware_load_info.on_module: - location = pe_types.ModuleLocation.construct( + location = pe_types.ModuleLocation.model_construct( moduleId=self._module_id_by_slot[slot] ) else: - location = pe_types.DeckSlotLocation.construct(slotName=slot) + location = pe_types.DeckSlotLocation.model_construct(slotName=slot) command_id = f"commands.LOAD_LABWARE-{count}" labware_id = f"labware-{count}" - succeeded_command = pe_commands.LoadLabware.construct( + succeeded_command = pe_commands.LoadLabware.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.SUCCEEDED, createdAt=now, startedAt=now, completedAt=now, - params=pe_commands.LoadLabwareParams.construct( + params=pe_commands.LoadLabwareParams.model_construct( location=location, loadName=labware_load_info.labware_load_name, namespace=labware_load_info.labware_namespace, @@ -655,9 +657,9 @@ def _map_labware_load( displayName=labware_load_info.labware_display_name, ), notes=[], - result=pe_commands.LoadLabwareResult.construct( + result=pe_commands.LoadLabwareResult.model_construct( labwareId=labware_id, - definition=LabwareDefinition.parse_obj( + definition=LabwareDefinition.model_validate( labware_load_info.labware_definition ), offsetId=labware_load_info.offset_id, @@ -666,7 +668,7 @@ def _map_labware_load( queue_action = pe_actions.QueueCommandAction( command_id=succeeded_command.id, created_at=succeeded_command.createdAt, - request=pe_commands.LoadLabwareCreate.construct( + request=pe_commands.LoadLabwareCreate.model_construct( key=succeeded_command.key, params=succeeded_command.params ), request_hash=None, @@ -714,19 +716,19 @@ def _map_instrument_load( pipette_id = f"pipette-{count}" mount = MountType(str(instrument_load_info.mount).lower()) - succeeded_command = pe_commands.LoadPipette.construct( + succeeded_command = pe_commands.LoadPipette.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.SUCCEEDED, createdAt=now, startedAt=now, completedAt=now, - params=pe_commands.LoadPipetteParams.construct( + params=pe_commands.LoadPipetteParams.model_construct( pipetteName=PipetteNameType(instrument_load_info.instrument_load_name), mount=mount, ), notes=[], - result=pe_commands.LoadPipetteResult.construct(pipetteId=pipette_id), + result=pe_commands.LoadPipetteResult.model_construct(pipetteId=pipette_id), ) serial = instrument_load_info.pipette_dict.get("pipette_id", None) or "" state_update = StateUpdate() @@ -749,7 +751,7 @@ def _map_instrument_load( queue_action = pe_actions.QueueCommandAction( command_id=succeeded_command.id, created_at=succeeded_command.createdAt, - request=pe_commands.LoadPipetteCreate.construct( + request=pe_commands.LoadPipetteCreate.model_construct( key=succeeded_command.key, params=succeeded_command.params ), request_hash=None, @@ -791,14 +793,14 @@ def _map_module_load( loaded_model ) or self._module_data_provider.get_definition(loaded_model) - succeeded_command = pe_commands.LoadModule.construct( + succeeded_command = pe_commands.LoadModule.model_construct( id=command_id, key=command_id, status=pe_commands.CommandStatus.SUCCEEDED, createdAt=now, startedAt=now, completedAt=now, - params=pe_commands.LoadModuleParams.construct( + params=pe_commands.LoadModuleParams.model_construct( model=requested_model, location=pe_types.DeckSlotLocation( slotName=module_load_info.deck_slot, @@ -806,7 +808,7 @@ def _map_module_load( moduleId=module_id, ), notes=[], - result=pe_commands.LoadModuleResult.construct( + result=pe_commands.LoadModuleResult.model_construct( moduleId=module_id, serialNumber=module_load_info.module_serial, definition=loaded_definition, @@ -816,7 +818,7 @@ def _map_module_load( queue_action = pe_actions.QueueCommandAction( command_id=succeeded_command.id, created_at=succeeded_command.createdAt, - request=pe_commands.LoadModuleCreate.construct( + request=pe_commands.LoadModuleCreate.model_construct( key=succeeded_command.key, params=succeeded_command.params ), request_hash=None, diff --git a/api/src/opentrons/protocol_runner/python_protocol_wrappers.py b/api/src/opentrons/protocol_runner/python_protocol_wrappers.py index f20012f1dfe..ce063013878 100644 --- a/api/src/opentrons/protocol_runner/python_protocol_wrappers.py +++ b/api/src/opentrons/protocol_runner/python_protocol_wrappers.py @@ -66,7 +66,7 @@ def read( namespace=lw.namespace, load_name=lw.parameters.loadName, version=lw.version, - ): cast(LabwareDefinitionTypedDict, lw.dict(exclude_none=True)) + ): cast(LabwareDefinitionTypedDict, lw.model_dump(exclude_none=True)) for lw in labware_definitions } data_file_paths = [ diff --git a/api/src/opentrons/protocols/labware.py b/api/src/opentrons/protocols/labware.py index 2fcffaaf2d4..d3159ee5d9f 100644 --- a/api/src/opentrons/protocols/labware.py +++ b/api/src/opentrons/protocols/labware.py @@ -3,7 +3,6 @@ import logging import json import os - from pathlib import Path from typing import Any, AnyStr, Dict, Optional, Union, List @@ -139,14 +138,24 @@ def verify_definition( :raises jsonschema.ValidationError: If the definition is not valid. :returns: The parsed definition """ - schema_body = load_shared_data("labware/schemas/2.json").decode("utf-8") - labware_schema_v2 = json.loads(schema_body) + schemata_by_version = { + 2: json.loads(load_shared_data("labware/schemas/2.json").decode("utf-8")), + 3: json.loads(load_shared_data("labware/schemas/3.json").decode("utf-8")), + } if isinstance(contents, dict): to_return = contents else: to_return = json.loads(contents) - jsonschema.validate(to_return, labware_schema_v2) + try: + schema_version = to_return["schemaVersion"] + schema = schemata_by_version[schema_version] + except KeyError: + raise RuntimeError( + f'Invalid or unknown labware schema version {to_return.get("schemaVersion", None)}' + ) + jsonschema.validate(to_return, schema) + # we can type ignore this because if it passes the jsonschema it has # the correct structure return to_return # type: ignore[return-value] @@ -201,7 +210,6 @@ def _get_labware_definition_from_bundle( def _get_standard_labware_definition( load_name: str, namespace: Optional[str] = None, version: Optional[int] = None ) -> LabwareDefinition: - if version is None: checked_version = 1 else: diff --git a/api/src/opentrons/protocols/models/json_protocol.py b/api/src/opentrons/protocols/models/json_protocol.py index 979d0192f62..ef2fec8823d 100644 --- a/api/src/opentrons/protocols/models/json_protocol.py +++ b/api/src/opentrons/protocols/models/json_protocol.py @@ -9,7 +9,7 @@ from typing import Any, Dict, List, Optional, Union -from pydantic import BaseModel, Extra, Field +from pydantic import ConfigDict, BaseModel, Field from typing_extensions import Literal from opentrons_shared_data.labware.labware_definition import LabwareDefinition @@ -75,8 +75,7 @@ class Metadata(BaseModel): Optional metadata about the protocol """ - class Config: - extra = Extra.allow + model_config = ConfigDict(extra="allow") protocolName: Optional[str] = Field( None, description="A short, human-readable name for the protocol" @@ -574,8 +573,7 @@ class Pipettes(BaseModel): Fields describing an individual pipette """ - class Config: - extra = Extra.allow + model_config = ConfigDict(extra="allow") mount: Literal["left", "right"] = Field( ..., description="Where the pipette is mounted" @@ -592,8 +590,7 @@ class Labware(BaseModel): Fields describing a single labware on the deck """ - class Config: - extra = Extra.allow + model_config = ConfigDict(extra="allow") slot: str = Field( ..., @@ -616,8 +613,7 @@ class Modules(BaseModel): Fields describing a single module on the deck """ - class Config: - extra = Extra.allow + model_config = ConfigDict(extra="allow") slot: str = Field( ..., diff --git a/api/src/opentrons/simulate.py b/api/src/opentrons/simulate.py index e565bab83e0..bed24c68731 100644 --- a/api/src/opentrons/simulate.py +++ b/api/src/opentrons/simulate.py @@ -829,7 +829,9 @@ def _create_live_context_pe( # Non-async would use call_soon_threadsafe(), which makes the waiting harder. async def add_all_extra_labware() -> None: for labware_definition_dict in extra_labware.values(): - labware_definition = LabwareDefinition.parse_obj(labware_definition_dict) + labware_definition = LabwareDefinition.model_validate( + labware_definition_dict + ) pe.add_labware_definition(labware_definition) # Add extra_labware to ProtocolEngine, being careful not to modify ProtocolEngine from this diff --git a/api/src/opentrons/types.py b/api/src/opentrons/types.py index 1f73d63c8c6..09e138513c1 100644 --- a/api/src/opentrons/types.py +++ b/api/src/opentrons/types.py @@ -160,7 +160,7 @@ def __iter__(self) -> Iterator[Union[Point, LabwareLike]]: point, labware = location some_function_taking_both(*location) """ - return iter((self._point, self._labware)) # type: ignore [arg-type] + return iter((self._point, self._labware)) def __eq__(self, other: object) -> bool: return ( diff --git a/api/tests/opentrons/calibration_storage/test_deck_attitude.py b/api/tests/opentrons/calibration_storage/test_deck_attitude.py index bbb832651d1..bce3ae02809 100644 --- a/api/tests/opentrons/calibration_storage/test_deck_attitude.py +++ b/api/tests/opentrons/calibration_storage/test_deck_attitude.py @@ -57,7 +57,7 @@ def test_save_ot2_deck_attitude(ot_config_tempdir: Any) -> None: "pip1", "mytiprack", ) - assert get_robot_deck_attitude() != {} + assert get_robot_deck_attitude() is not None def test_save_ot3_deck_attitude(ot_config_tempdir: Any) -> None: diff --git a/api/tests/opentrons/calibration_storage/test_file_operators.py b/api/tests/opentrons/calibration_storage/test_file_operators.py index 5a95f225fe3..ec25a2279c1 100644 --- a/api/tests/opentrons/calibration_storage/test_file_operators.py +++ b/api/tests/opentrons/calibration_storage/test_file_operators.py @@ -84,7 +84,7 @@ def test_deserialize_pydantic_model_valid() -> None: serialized = b'{"integer_field": 123, "! aliased field !": "abc"}' assert io.deserialize_pydantic_model( serialized, DummyModel - ) == DummyModel.construct(integer_field=123, aliased_field="abc") + ) == DummyModel.model_construct(integer_field=123, aliased_field="abc") def test_deserialize_pydantic_model_invalid_as_json() -> None: diff --git a/api/tests/opentrons/calibration_storage/test_tip_length_ot2.py b/api/tests/opentrons/calibration_storage/test_tip_length_ot2.py index df503241d75..51096866b5d 100644 --- a/api/tests/opentrons/calibration_storage/test_tip_length_ot2.py +++ b/api/tests/opentrons/calibration_storage/test_tip_length_ot2.py @@ -46,7 +46,7 @@ def starting_calibration_data( "tipLength": 27, "lastModified": inside_data.lastModified.isoformat(), "source": inside_data.source, - "status": inside_data.status.dict(), + "status": inside_data.status.model_dump(), "uri": "dummy_namespace/minimal_labware_def/1", } } diff --git a/api/tests/opentrons/conftest.py b/api/tests/opentrons/conftest.py index 7be480cfe0b..20b8d3a4502 100755 --- a/api/tests/opentrons/conftest.py +++ b/api/tests/opentrons/conftest.py @@ -608,6 +608,7 @@ def minimal_labware_def() -> LabwareDefinition: "displayCategory": "other", "displayVolumeUnits": "mL", }, + "allowedRoles": ["labware"], "cornerOffsetFromSlot": {"x": 10, "y": 10, "z": 5}, "parameters": { "isTiprack": False, diff --git a/api/tests/opentrons/drivers/flex_stacker/__init__.py b/api/tests/opentrons/drivers/flex_stacker/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/api/tests/opentrons/drivers/flex_stacker/test_driver.py b/api/tests/opentrons/drivers/flex_stacker/test_driver.py new file mode 100644 index 00000000000..aea2492cf9e --- /dev/null +++ b/api/tests/opentrons/drivers/flex_stacker/test_driver.py @@ -0,0 +1,257 @@ +import pytest +from mock import AsyncMock +from opentrons.drivers.asyncio.communication.serial_connection import ( + AsyncResponseSerialConnection, +) +from opentrons.drivers.flex_stacker.driver import FlexStackerDriver +from opentrons.drivers.flex_stacker import types + + +@pytest.fixture +def connection() -> AsyncMock: + return AsyncMock(spec=AsyncResponseSerialConnection) + + +@pytest.fixture +def subject(connection: AsyncMock) -> FlexStackerDriver: + connection.send_command.return_value = "" + return FlexStackerDriver(connection) + + +async def test_get_device_info( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should send a get device info command""" + connection.send_command.return_value = ( + "M115 FW:0.0.1 HW:Opentrons-flex-stacker-a1 SerialNo:STCA120230605001" + ) + response = await subject.get_device_info() + assert response == types.StackerInfo( + fw="0.0.1", + hw=types.HardwareRevision.EVT, + sn="STCA120230605001", + ) + + device_info = types.GCODE.DEVICE_INFO.build_command() + reset_reason = types.GCODE.GET_RESET_REASON.build_command() + connection.send_command.assert_any_call(device_info) + connection.send_command.assert_called_with(reset_reason) + connection.reset_mock() + + # Test invalid response + connection.send_command.return_value = "M115 FW:0.0.1 SerialNo:STCA120230605001" + + # This should raise ValueError + with pytest.raises(ValueError): + response = await subject.get_device_info() + + device_info = types.GCODE.DEVICE_INFO.build_command() + reset_reason = types.GCODE.GET_RESET_REASON.build_command() + connection.send_command.assert_any_call(device_info) + connection.send_command.assert_called_with(reset_reason) + + +async def test_stop_motors(subject: FlexStackerDriver, connection: AsyncMock) -> None: + """It should send a stop motors command""" + connection.send_command.return_value = "M0" + response = await subject.stop_motors() + assert response + + stop_motors = types.GCODE.STOP_MOTORS.build_command() + connection.send_command.assert_any_call(stop_motors) + connection.reset_mock() + + # This should raise ValueError + with pytest.raises(ValueError): + await subject.get_device_info() + + +async def test_set_serial_number( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should send a set serial number command""" + connection.send_command.return_value = "M996" + + serial_number = "Something" + response = await subject.set_serial_number(serial_number) + assert response + + set_serial_number = types.GCODE.SET_SERIAL_NUMBER.build_command().add_element( + serial_number + ) + connection.send_command.assert_any_call(set_serial_number) + connection.reset_mock() + + # Test invalid response + connection.send_command.return_value = "M9nn" + with pytest.raises(ValueError): + response = await subject.set_serial_number(serial_number) + + set_serial_number = types.GCODE.SET_SERIAL_NUMBER.build_command().add_element( + serial_number + ) + connection.send_command.assert_any_call(set_serial_number) + connection.reset_mock() + + +async def test_get_limit_switch( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should send a get limit switch command and return the boolean of one.""" + connection.send_command.return_value = "M119 XE:1 XR:0 ZE:0 ZR:1 LR:1" + response = await subject.get_limit_switch( + types.StackerAxis.X, types.Direction.EXTENT + ) + assert response + + limit_switch_status = types.GCODE.GET_LIMIT_SWITCH.build_command() + connection.send_command.assert_any_call(limit_switch_status) + connection.reset_mock() + + +async def test_get_limit_switches_status( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should send a get limit switch status and return LimitSwitchStatus.""" + connection.send_command.return_value = "M119 XE:1 XR:0 ZE:0 ZR:1 LR:1" + response = await subject.get_limit_switches_status() + assert response == types.LimitSwitchStatus( + XE=True, + XR=False, + ZE=False, + ZR=True, + LR=True, + ) + + limit_switch_status = types.GCODE.GET_LIMIT_SWITCH.build_command() + connection.send_command.assert_any_call(limit_switch_status) + connection.reset_mock() + + # Test invalid response + connection.send_command.return_value = "M119 XE:b XR:0 ZE:a ZR:1 LR:n" + with pytest.raises(ValueError): + response = await subject.get_limit_switches_status() + + limit_switch_status = types.GCODE.GET_LIMIT_SWITCH.build_command() + connection.send_command.assert_any_call(limit_switch_status) + + +async def test_get_platform_sensor( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should send a get platform sensor command return status of specified sensor.""" + connection.send_command.return_value = "M121 E:1 R:1" + response = await subject.get_platform_sensor(types.Direction.EXTENT) + assert response + + platform_sensor = types.GCODE.GET_PLATFORM_SENSOR.build_command() + connection.send_command.assert_any_call(platform_sensor) + connection.reset_mock() + + +async def test_get_platform_status( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """it should send a get platform sensors status.""" + connection.send_command.return_value = "M121 E:0 R:1" + response = await subject.get_platform_status() + assert response == types.PlatformStatus( + E=False, + R=True, + ) + + platform_status = types.GCODE.GET_PLATFORM_SENSOR.build_command() + connection.send_command.assert_any_call(platform_status) + connection.reset_mock() + + # Test invalid response + connection.send_command.return_value = "M121 E:0 R:1 something" + with pytest.raises(ValueError): + response = await subject.get_platform_status() + + platform_status = types.GCODE.GET_PLATFORM_SENSOR.build_command() + connection.send_command.assert_any_call(platform_status) + + +async def test_get_hopper_door_closed( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should send a get door closed command.""" + connection.send_command.return_value = "M122 D:1" + response = await subject.get_hopper_door_closed() + assert response + + door_closed = types.GCODE.GET_DOOR_SWITCH.build_command() + connection.send_command.assert_any_call(door_closed) + connection.reset_mock() + + # Test door open + connection.send_command.return_value = "M122 D:0" + response = await subject.get_hopper_door_closed() + assert not response + + door_closed = types.GCODE.GET_DOOR_SWITCH.build_command() + connection.send_command.assert_any_call(door_closed) + connection.reset_mock() + + # Test invalid response + connection.send_command.return_value = "M122 78gybhjk" + + with pytest.raises(ValueError): + response = await subject.get_hopper_door_closed() + + door_closed = types.GCODE.GET_DOOR_SWITCH.build_command() + connection.send_command.assert_any_call(door_closed) + connection.reset_mock() + + +async def test_move_in_mm(subject: FlexStackerDriver, connection: AsyncMock) -> None: + """It should send a move to command""" + connection.send_command.return_value = "G0" + response = await subject.move_in_mm(types.StackerAxis.X, 10) + assert response + + move_to = types.GCODE.MOVE_TO.build_command().add_float("X", 10) + connection.send_command.assert_any_call(move_to) + connection.reset_mock() + + +async def test_move_to_switch( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should send a move to switch command""" + connection.send_command.return_value = "G5" + axis = types.StackerAxis.X + direction = types.Direction.EXTENT + response = await subject.move_to_limit_switch(axis, direction) + assert response + + move_to = types.GCODE.MOVE_TO_SWITCH.build_command().add_int( + axis.name, direction.value + ) + connection.send_command.assert_any_call(move_to) + connection.reset_mock() + + +async def test_home_axis(subject: FlexStackerDriver, connection: AsyncMock) -> None: + """It should send a home axis command""" + connection.send_command.return_value = "G28" + axis = types.StackerAxis.X + direction = types.Direction.EXTENT + response = await subject.home_axis(axis, direction) + assert response + + move_to = types.GCODE.HOME_AXIS.build_command().add_int(axis.name, direction.value) + connection.send_command.assert_any_call(move_to) + connection.reset_mock() + + +async def test_set_led(subject: FlexStackerDriver, connection: AsyncMock) -> None: + """It should send a set led command""" + connection.send_command.return_value = "M200" + response = await subject.set_led(1, types.LEDColor.RED) + assert response + + set_led = types.GCODE.SET_LED.build_command().add_float("P", 1).add_int("C", 1) + connection.send_command.assert_any_call(set_led) + connection.reset_mock() diff --git a/api/tests/opentrons/hardware_control/instruments/test_instrument_calibration.py b/api/tests/opentrons/hardware_control/instruments/test_instrument_calibration.py index 6f9ad72c460..fd746ed9743 100644 --- a/api/tests/opentrons/hardware_control/instruments/test_instrument_calibration.py +++ b/api/tests/opentrons/hardware_control/instruments/test_instrument_calibration.py @@ -55,10 +55,10 @@ def tip_rack_dict() -> LabwareDefDict: @pytest.fixture def tip_rack_model() -> LabwareDefinition: """Get a tip rack Pydantic model definition value object.""" - return LabwareDefinition.construct( # type: ignore[call-arg] + return LabwareDefinition.model_construct( # type: ignore[call-arg] namespace="test", version=1, - parameters=Parameters.construct( # type: ignore[call-arg] + parameters=Parameters.model_construct( # type: ignore[call-arg] loadName="cool-labware", tipOverlap=None, # add a None value to validate serialization to dictionary ), diff --git a/api/tests/opentrons/hardware_control/instruments/test_nozzle_manager.py b/api/tests/opentrons/hardware_control/instruments/test_nozzle_manager.py index ba1f10aaaef..066cdbc3caf 100644 --- a/api/tests/opentrons/hardware_control/instruments/test_nozzle_manager.py +++ b/api/tests/opentrons/hardware_control/instruments/test_nozzle_manager.py @@ -10,6 +10,7 @@ PipetteModelType, PipetteChannelType, PipetteVersionType, + PipetteOEMType, ) from opentrons_shared_data.pipette.pipette_definition import ( PipetteConfigurations, @@ -261,7 +262,10 @@ def test_single_pipettes_always_full( pipette_details: Tuple[PipetteModelType, PipetteVersionType], ) -> None: config = load_definition( - pipette_details[0], PipetteChannelType.SINGLE_CHANNEL, pipette_details[1] + pipette_details[0], + PipetteChannelType.SINGLE_CHANNEL, + pipette_details[1], + PipetteOEMType.OT, ) subject = nozzle_manager.NozzleConfigurationManager.build_from_config( config, ValidNozzleMaps(maps=A1) @@ -289,7 +293,10 @@ def test_single_pipette_map_entries( pipette_details: Tuple[PipetteModelType, PipetteVersionType], ) -> None: config = load_definition( - pipette_details[0], PipetteChannelType.SINGLE_CHANNEL, pipette_details[1] + pipette_details[0], + PipetteChannelType.SINGLE_CHANNEL, + pipette_details[1], + PipetteOEMType.OT, ) subject = nozzle_manager.NozzleConfigurationManager.build_from_config( config, ValidNozzleMaps(maps=A1) @@ -326,7 +333,10 @@ def test_single_pipette_map_geometry( pipette_details: Tuple[PipetteModelType, PipetteVersionType], ) -> None: config = load_definition( - pipette_details[0], PipetteChannelType.SINGLE_CHANNEL, pipette_details[1] + pipette_details[0], + PipetteChannelType.SINGLE_CHANNEL, + pipette_details[1], + PipetteOEMType.OT, ) subject = nozzle_manager.NozzleConfigurationManager.build_from_config( config, ValidNozzleMaps(maps=A1) @@ -359,7 +369,10 @@ def test_multi_config_identification( pipette_details: Tuple[PipetteModelType, PipetteVersionType], ) -> None: config = load_definition( - pipette_details[0], PipetteChannelType.EIGHT_CHANNEL, pipette_details[1] + pipette_details[0], + PipetteChannelType.EIGHT_CHANNEL, + pipette_details[1], + PipetteOEMType.OT, ) subject = nozzle_manager.NozzleConfigurationManager.build_from_config( config, @@ -419,7 +432,10 @@ def test_multi_config_map_entries( pipette_details: Tuple[PipetteModelType, PipetteVersionType], ) -> None: config = load_definition( - pipette_details[0], PipetteChannelType.EIGHT_CHANNEL, pipette_details[1] + pipette_details[0], + PipetteChannelType.EIGHT_CHANNEL, + pipette_details[1], + PipetteOEMType.OT, ) subject = nozzle_manager.NozzleConfigurationManager.build_from_config( config, @@ -485,7 +501,10 @@ def test_multi_config_geometry( pipette_details: Tuple[PipetteModelType, PipetteVersionType], ) -> None: config = load_definition( - pipette_details[0], PipetteChannelType.EIGHT_CHANNEL, pipette_details[1] + pipette_details[0], + PipetteChannelType.EIGHT_CHANNEL, + pipette_details[1], + PipetteOEMType.OT, ) subject = nozzle_manager.NozzleConfigurationManager.build_from_config( config, @@ -536,7 +555,10 @@ def test_96_config_identification( pipette_details: Tuple[PipetteModelType, PipetteVersionType], ) -> None: config = load_definition( - pipette_details[0], PipetteChannelType.NINETY_SIX_CHANNEL, pipette_details[1] + pipette_details[0], + PipetteChannelType.NINETY_SIX_CHANNEL, + pipette_details[1], + PipetteOEMType.OT, ) subject = nozzle_manager.NozzleConfigurationManager.build_from_config( config, @@ -651,7 +673,10 @@ def test_96_config_map_entries( pipette_details: Tuple[PipetteModelType, PipetteVersionType], ) -> None: config = load_definition( - pipette_details[0], PipetteChannelType.NINETY_SIX_CHANNEL, pipette_details[1] + pipette_details[0], + PipetteChannelType.NINETY_SIX_CHANNEL, + pipette_details[1], + PipetteOEMType.OT, ) subject = nozzle_manager.NozzleConfigurationManager.build_from_config( config, @@ -988,7 +1013,10 @@ def test_96_config_geometry( pipette_details: Tuple[PipetteModelType, PipetteVersionType], ) -> None: config = load_definition( - pipette_details[0], PipetteChannelType.NINETY_SIX_CHANNEL, pipette_details[1] + pipette_details[0], + PipetteChannelType.NINETY_SIX_CHANNEL, + pipette_details[1], + PipetteOEMType.OT, ) subject = nozzle_manager.NozzleConfigurationManager.build_from_config( config, diff --git a/api/tests/opentrons/hardware_control/test_gripper.py b/api/tests/opentrons/hardware_control/test_gripper.py index f084a11df89..fdce4f27d3d 100644 --- a/api/tests/opentrons/hardware_control/test_gripper.py +++ b/api/tests/opentrons/hardware_control/test_gripper.py @@ -104,8 +104,13 @@ def test_reload_instrument_cal_ot3_conf_changed( "fakeid123", jaw_max_offset=15, ) - new_conf = fake_gripper_conf.copy( - update={"grip_force_profile": {"default_grip_force": 1}} + new_conf = fake_gripper_conf.model_copy( + update={ + "grip_force_profile": fake_gripper_conf.grip_force_profile.model_copy( + update={"default_grip_force": 1} + ) + }, + deep=True, ) assert new_conf != old_gripper.config diff --git a/api/tests/opentrons/hardware_control/test_ot3_api.py b/api/tests/opentrons/hardware_control/test_ot3_api.py index a0775d48e19..200549108db 100644 --- a/api/tests/opentrons/hardware_control/test_ot3_api.py +++ b/api/tests/opentrons/hardware_control/test_ot3_api.py @@ -82,6 +82,7 @@ PipetteChannelType, PipetteVersionType, LiquidClasses, + PipetteOEMType, ) from opentrons_shared_data.pipette import ( load_data as load_pipette_data, @@ -381,6 +382,7 @@ class PipetteLoadConfig(TypedDict): channels: Literal[1, 8, 96] version: Tuple[Literal[1, 2, 3], Literal[0, 1, 2, 3, 4, 5, 6]] model: PipetteModel + oem_type: PipetteOEMType class GripperLoadConfig(TypedDict): @@ -402,8 +404,24 @@ class GripperLoadConfig(TypedDict): ( ( [ - (OT3Mount.RIGHT, {"channels": 8, "version": (3, 3), "model": "p50"}), - (OT3Mount.LEFT, {"channels": 1, "version": (3, 3), "model": "p1000"}), + ( + OT3Mount.RIGHT, + { + "channels": 8, + "version": (3, 3), + "model": "p50", + "oem_type": PipetteOEMType.OT, + }, + ), + ( + OT3Mount.LEFT, + { + "channels": 1, + "version": (3, 3), + "model": "p1000", + "oem_type": PipetteOEMType.OT, + }, + ), ], GantryLoad.LOW_THROUGHPUT, ), @@ -413,34 +431,88 @@ class GripperLoadConfig(TypedDict): GantryLoad.LOW_THROUGHPUT, ), ( - [(OT3Mount.LEFT, {"channels": 8, "version": (3, 3), "model": "p1000"})], + [ + ( + OT3Mount.LEFT, + { + "channels": 8, + "version": (3, 3), + "model": "p1000", + "oem_type": "ot", + }, + ) + ], GantryLoad.LOW_THROUGHPUT, ), ( - [(OT3Mount.RIGHT, {"channels": 8, "version": (3, 3), "model": "p1000"})], + [ + ( + OT3Mount.RIGHT, + { + "channels": 8, + "version": (3, 3), + "model": "p1000", + "oem_type": "ot", + }, + ) + ], GantryLoad.LOW_THROUGHPUT, ), ( - [(OT3Mount.LEFT, {"channels": 96, "model": "p1000", "version": (3, 3)})], + [ + ( + OT3Mount.LEFT, + { + "channels": 96, + "model": "p1000", + "version": (3, 3), + "oem_type": "ot", + }, + ) + ], GantryLoad.HIGH_THROUGHPUT, ), ( [ - (OT3Mount.LEFT, {"channels": 1, "version": (3, 3), "model": "p1000"}), + ( + OT3Mount.LEFT, + { + "channels": 1, + "version": (3, 3), + "model": "p1000", + "oem_type": "ot", + }, + ), (OT3Mount.GRIPPER, {"model": GripperModel.v1, "id": "g12345"}), ], GantryLoad.LOW_THROUGHPUT, ), ( [ - (OT3Mount.RIGHT, {"channels": 8, "version": (3, 3), "model": "p1000"}), + ( + OT3Mount.RIGHT, + { + "channels": 8, + "version": (3, 3), + "model": "p1000", + "oem_type": "ot", + }, + ), (OT3Mount.GRIPPER, {"model": GripperModel.v1, "id": "g12345"}), ], GantryLoad.LOW_THROUGHPUT, ), ( [ - (OT3Mount.LEFT, {"channels": 96, "model": "p1000", "version": (3, 3)}), + ( + OT3Mount.LEFT, + { + "channels": 96, + "model": "p1000", + "version": (3, 3), + "oem_type": "ot", + }, + ), (OT3Mount.GRIPPER, {"model": GripperModel.v1, "id": "g12345"}), ], GantryLoad.HIGH_THROUGHPUT, @@ -463,6 +535,7 @@ async def test_gantry_load_transform( PipetteModelType(pair[1]["model"]), PipetteChannelType(pair[1]["channels"]), PipetteVersionType(*pair[1]["version"]), + PipetteOEMType(pair[1]["oem_type"]), ) instr_data = AttachedPipette(config=pipette_config, id="fakepip") await ot3_hardware.cache_pipette(pair[0], instr_data, None) @@ -557,9 +630,30 @@ def mock_verify_tip_presence( load_pipette_configs = [ - {OT3Mount.LEFT: {"channels": 1, "version": (3, 3), "model": "p1000"}}, - {OT3Mount.RIGHT: {"channels": 8, "version": (3, 3), "model": "p50"}}, - {OT3Mount.LEFT: {"channels": 96, "model": "p1000", "version": (3, 3)}}, + { + OT3Mount.LEFT: { + "channels": 1, + "version": (3, 3), + "model": "p1000", + "oem_type": PipetteOEMType.OT, + } + }, + { + OT3Mount.RIGHT: { + "channels": 8, + "version": (3, 3), + "model": "p50", + "oem_type": PipetteOEMType.OT, + } + }, + { + OT3Mount.LEFT: { + "channels": 96, + "model": "p1000", + "version": (3, 3), + "oem_type": PipetteOEMType.OT, + } + }, ] @@ -573,6 +667,7 @@ async def prepare_for_mock_blowout( PipetteModelType(configs["model"]), PipetteChannelType(configs["channels"]), PipetteVersionType(*configs["version"]), + PipetteOEMType(configs["oem_type"]), ) instr_data = AttachedPipette(config=pipette_config, id="fakepip") await ot3_hardware.cache_pipette(mount, instr_data, None) @@ -804,7 +899,10 @@ async def test_liquid_probe( ) -> None: instr_data = AttachedPipette( config=load_pipette_data.load_definition( - PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4) + PipetteModelType("p1000"), + PipetteChannelType(1), + PipetteVersionType(3, 4), + PipetteOEMType.OT, ), id="fakepip", ) @@ -895,7 +993,10 @@ async def test_liquid_probe_plunger_moves( # when approaching its max z distance instr_data = AttachedPipette( config=load_pipette_data.load_definition( - PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4) + PipetteModelType("p1000"), + PipetteChannelType(1), + PipetteVersionType(3, 4), + PipetteOEMType.OT, ), id="fakepip", ) @@ -1002,7 +1103,10 @@ async def test_liquid_probe_mount_moves( """Verify move targets for one singular liquid pass probe.""" instr_data = AttachedPipette( config=load_pipette_data.load_definition( - PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4) + PipetteModelType("p1000"), + PipetteChannelType(1), + PipetteVersionType(3, 4), + PipetteOEMType.OT, ), id="fakepip", ) @@ -1064,7 +1168,10 @@ async def test_multi_liquid_probe( ) -> None: instr_data = AttachedPipette( config=load_pipette_data.load_definition( - PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4) + PipetteModelType("p1000"), + PipetteChannelType(1), + PipetteVersionType(3, 4), + PipetteOEMType.OT, ), id="fakepip", ) @@ -1131,7 +1238,10 @@ async def test_liquid_not_found( ) -> None: instr_data = AttachedPipette( config=load_pipette_data.load_definition( - PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4) + PipetteModelType("p1000"), + PipetteChannelType(1), + PipetteVersionType(3, 4), + PipetteOEMType.OT, ), id="fakepip", ) @@ -1599,7 +1709,10 @@ async def test_home_plunger( mount = OT3Mount.LEFT instr_data = AttachedPipette( config=load_pipette_data.load_definition( - PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4) + PipetteModelType("p1000"), + PipetteChannelType(1), + PipetteVersionType(3, 4), + PipetteOEMType.OT, ), id="fakepip", ) @@ -1621,6 +1734,7 @@ async def test_prepare_for_aspirate( PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4), + PipetteOEMType.OT, ), id="fakepip", ) @@ -1655,6 +1769,7 @@ async def test_plunger_ready_to_aspirate_after_dispense( PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4), + PipetteOEMType.OT, ), id="fakepip", ) @@ -1680,7 +1795,10 @@ async def test_move_to_plunger_bottom( mount = OT3Mount.LEFT instr_data = AttachedPipette( config=load_pipette_data.load_definition( - PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4) + PipetteModelType("p1000"), + PipetteChannelType(1), + PipetteVersionType(3, 4), + PipetteOEMType.OT, ), id="fakepip", ) @@ -2130,6 +2248,7 @@ async def test_home_axis( PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 3), + PipetteOEMType.OT, ) instr_data = AttachedPipette(config=pipette_config, id="fakepip") await ot3_hardware.cache_pipette(Axis.to_ot3_mount(axis), instr_data, None) diff --git a/api/tests/opentrons/hardware_control/test_pipette.py b/api/tests/opentrons/hardware_control/test_pipette.py index 25ac7b0298a..610fcc2a022 100644 --- a/api/tests/opentrons/hardware_control/test_pipette.py +++ b/api/tests/opentrons/hardware_control/test_pipette.py @@ -73,7 +73,10 @@ def _create_pipette( ) -> ot3_pipette.Pipette: return ot3_pipette.Pipette( load_pipette_data.load_definition( - model.pipette_type, model.pipette_channels, model.pipette_version + model.pipette_type, + model.pipette_channels, + model.pipette_version, + model.oem_type, ), calibration, id, diff --git a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py index 352dcb35c58..73f39006299 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py @@ -1,4 +1,5 @@ """Test for the ProtocolEngine-based instrument API core.""" + from typing import cast, Optional from opentrons_shared_data.errors.exceptions import PipetteLiquidNotFoundError @@ -99,7 +100,7 @@ def subject( ) -> InstrumentCore: """Get a InstrumentCore test subject with its dependencies mocked out.""" decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( - LoadedPipette.construct(mount=MountType.LEFT) # type: ignore[call-arg] + LoadedPipette.model_construct(mount=MountType.LEFT) # type: ignore[call-arg] ) decoy.when(mock_engine_client.state.pipettes.get_flow_rates("abc123")).then_return( @@ -130,7 +131,7 @@ def test_get_pipette_name( ) -> None: """It should get the pipette's load name.""" decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( - LoadedPipette.construct(pipetteName=PipetteNameType.P300_SINGLE) # type: ignore[call-arg] + LoadedPipette.model_construct(pipetteName=PipetteNameType.P300_SINGLE) # type: ignore[call-arg] ) result = subject.get_pipette_name() @@ -143,7 +144,7 @@ def test_get_mount( ) -> None: """It should get the pipette's mount.""" decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( - LoadedPipette.construct(mount=MountType.LEFT) # type: ignore[call-arg] + LoadedPipette.model_construct(mount=MountType.LEFT) # type: ignore[call-arg] ) result = subject.get_mount() @@ -161,7 +162,7 @@ def test_get_hardware_state( pipette_dict = cast(PipetteDict, {"display_name": "Cool Pipette", "has_tip": True}) decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( - LoadedPipette.construct(mount=MountType.LEFT) # type: ignore[call-arg] + LoadedPipette.model_construct(mount=MountType.LEFT) # type: ignore[call-arg] ) decoy.when(mock_sync_hardware.get_attached_instrument(Mount.LEFT)).then_return( pipette_dict @@ -530,7 +531,7 @@ def test_aspirate_from_well( pipette_id="abc123", labware_id="123abc", well_name="my cool well", - well_location=WellLocation( + well_location=LiquidHandlingWellLocation( origin=WellOrigin.TOP, offset=WellOffset(x=3, y=2, z=1) ), ), @@ -828,7 +829,7 @@ def test_dispense_to_well( pipette_id="abc123", labware_id="123abc", well_name="my cool well", - well_location=WellLocation( + well_location=LiquidHandlingWellLocation( origin=WellOrigin.TOP, offset=WellOffset(x=3, y=2, z=1) ), ), @@ -1438,7 +1439,7 @@ def test_detect_liquid_presence( ) ) ).then_return( - cmd.TryLiquidProbeResult.construct( + cmd.TryLiquidProbeResult.model_construct( z_position=returned_from_engine, position=object(), # type: ignore[arg-type] ) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py b/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py index 6f4458f87ff..beca8fe99d1 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py @@ -35,7 +35,7 @@ @pytest.fixture def labware_definition() -> LabwareDefinition: """Get a LabwareDefinition value object to use in tests.""" - return LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + return LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] @pytest.fixture @@ -59,10 +59,10 @@ def subject(mock_engine_client: EngineClient) -> LabwareCore: @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] namespace="hello", version=42, - parameters=LabwareDefinitionParameters.construct(loadName="world"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="world"), # type: ignore[call-arg] ordering=[], ) ], @@ -76,14 +76,14 @@ def test_get_load_params(subject: LabwareCore) -> None: @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] namespace="hello", version=42, - parameters=LabwareDefinitionParameters.construct(loadName="world"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="world"), # type: ignore[call-arg] ordering=[], - metadata=LabwareDefinitionMetadata.construct( + metadata=LabwareDefinitionMetadata.model_construct( # type: ignore[call-arg] displayName="what a cool labware" - ), # type: ignore[call-arg] + ), ) ], ) @@ -130,10 +130,10 @@ def test_set_calibration_succeeds_in_ok_location( @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] namespace="hello", version=42, - parameters=LabwareDefinitionParameters.construct(loadName="world"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="world"), # type: ignore[call-arg] ordering=[], ) ], @@ -164,9 +164,9 @@ def test_set_calibration_fails_in_bad_location( @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] namespace="hello", - parameters=LabwareDefinitionParameters.construct(loadName="world"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="world"), # type: ignore[call-arg] ordering=[], allowedRoles=[], stackingOffsetWithLabware={}, @@ -208,9 +208,9 @@ def test_get_user_display_name(decoy: Decoy, mock_engine_client: EngineClient) - @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[], - metadata=LabwareDefinitionMetadata.construct( # type: ignore[call-arg] + metadata=LabwareDefinitionMetadata.model_construct( # type: ignore[call-arg] displayName="Cool Display Name" ), ) @@ -226,8 +226,10 @@ def test_get_display_name(subject: LabwareCore) -> None: @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] - parameters=LabwareDefinitionParameters.construct(loadName="load-name"), # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct( # type: ignore[call-arg] + loadName="load-name" + ), ), ], ) @@ -254,9 +256,9 @@ def test_get_name_display_name(decoy: Decoy, mock_engine_client: EngineClient) - @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[], - parameters=LabwareDefinitionParameters.construct(isTiprack=True), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(isTiprack=True), # type: ignore[call-arg] ) ], ) @@ -271,13 +273,13 @@ def test_is_tip_rack(subject: LabwareCore) -> None: argnames=["labware_definition", "expected_result"], argvalues=[ ( - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[], allowedRoles=[LabwareRole.adapter] ), True, ), ( - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[], allowedRoles=[LabwareRole.labware] ), False, @@ -294,7 +296,7 @@ def test_is_adapter(expected_result: bool, subject: LabwareCore) -> None: @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[["A1", "B1"], ["A2", "B2"]], ) ], @@ -354,9 +356,9 @@ def test_get_next_tip( @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[], - parameters=LabwareDefinitionParameters.construct(isTiprack=True), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(isTiprack=True), # type: ignore[call-arg] ) ], ) @@ -371,10 +373,10 @@ def test_reset_tips( @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[], - parameters=LabwareDefinitionParameters.construct(isTiprack=False), # type: ignore[call-arg] - metadata=LabwareDefinitionMetadata.construct( # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(isTiprack=False), # type: ignore[call-arg] + metadata=LabwareDefinitionMetadata.model_construct( # type: ignore[call-arg] displayName="Cool Display Name" ), ) @@ -430,9 +432,9 @@ def test_get_calibrated_offset( @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[], - parameters=LabwareDefinitionParameters.construct(quirks=["quirk"]), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(quirks=["quirk"]), # type: ignore[call-arg] ) ], ) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_module_core.py b/api/tests/opentrons/protocol_api/core/engine/test_module_core.py index f18a672afb8..a1310999d72 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_module_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_module_core.py @@ -1,4 +1,5 @@ """Tests for opentrons.protocol_api.core.engine.ModuleCore.""" + import pytest import inspect from decoy import Decoy @@ -107,7 +108,7 @@ def test_get_display_name( decoy: Decoy, subject: ModuleCore, mock_engine_client: EngineClient ) -> None: """It should return the module display name.""" - module_definition = ModuleDefinition.construct( # type: ignore[call-arg] + module_definition = ModuleDefinition.model_construct( # type: ignore[call-arg] displayName="abra kadabra", ) decoy.when(mock_engine_client.state.modules.get_definition("1234")).then_return( diff --git a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py index 1cf6bc57049..2889a47cea9 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py @@ -1,4 +1,5 @@ """Test for the ProtocolEngine-based protocol API core.""" + import inspect from typing import Optional, Type, cast, Tuple @@ -179,7 +180,7 @@ def subject( decoy.when( mock_engine_client.state.labware.get_definition("fixed-trash-123") ).then_return( - LabwareDefinition.construct(ordering=[["A1"]]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[["A1"]]) # type: ignore[call-arg] ) return ProtocolCore( @@ -358,13 +359,13 @@ def test_load_labware( ).then_return( commands.LoadLabwareResult( labwareId="abc123", - definition=LabwareDefinition.construct(), # type: ignore[call-arg] + definition=LabwareDefinition.model_construct(), # type: ignore[call-arg] offsetId=None, ) ) decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) result = subject.load_labware( @@ -394,7 +395,7 @@ def test_load_labware( slot_name=DeckSlotName.SLOT_5, ) ).then_return( - LoadedLabware.construct(id="abc123") # type: ignore[call-arg] + LoadedLabware.model_construct(id="abc123") # type: ignore[call-arg] ) assert subject.get_slot_item(DeckSlotName.SLOT_5) is result @@ -432,13 +433,13 @@ def test_load_labware_on_staging_slot( ).then_return( commands.LoadLabwareResult( labwareId="abc123", - definition=LabwareDefinition.construct(), # type: ignore[call-arg] + definition=LabwareDefinition.model_construct(), # type: ignore[call-arg] offsetId=None, ) ) decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) result = subject.load_labware( @@ -468,7 +469,7 @@ def test_load_labware_on_staging_slot( slot_name=StagingSlotName.SLOT_B4, ) ).then_return( - LoadedLabware.construct(id="abc123") # type: ignore[call-arg] + LoadedLabware.model_construct(id="abc123") # type: ignore[call-arg] ) assert subject.get_slot_item(StagingSlotName.SLOT_B4) is result @@ -509,13 +510,13 @@ def test_load_labware_on_labware( ).then_return( commands.LoadLabwareResult( labwareId="abc123", - definition=LabwareDefinition.construct(), # type: ignore[call-arg] + definition=LabwareDefinition.model_construct(), # type: ignore[call-arg] offsetId=None, ) ) decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) decoy.when( @@ -579,13 +580,13 @@ def test_load_labware_off_deck( ).then_return( commands.LoadLabwareResult( labwareId="abc123", - definition=LabwareDefinition.construct(), # type: ignore[call-arg] + definition=LabwareDefinition.model_construct(), # type: ignore[call-arg] offsetId=None, ) ) decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) result = subject.load_labware( @@ -642,13 +643,13 @@ def test_load_adapter( ).then_return( commands.LoadLabwareResult( labwareId="abc123", - definition=LabwareDefinition.construct(), # type: ignore[call-arg] + definition=LabwareDefinition.model_construct(), # type: ignore[call-arg] offsetId=None, ) ) decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) result = subject.load_adapter( @@ -677,7 +678,7 @@ def test_load_adapter( slot_name=DeckSlotName.SLOT_5, ) ).then_return( - LoadedLabware.construct(id="abc123") # type: ignore[call-arg] + LoadedLabware.model_construct(id="abc123") # type: ignore[call-arg] ) assert subject.get_slot_item(DeckSlotName.SLOT_5) is result @@ -714,13 +715,13 @@ def test_load_adapter_on_staging_slot( ).then_return( commands.LoadLabwareResult( labwareId="abc123", - definition=LabwareDefinition.construct(), # type: ignore[call-arg] + definition=LabwareDefinition.model_construct(), # type: ignore[call-arg] offsetId=None, ) ) decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) result = subject.load_adapter( @@ -749,12 +750,160 @@ def test_load_adapter_on_staging_slot( slot_name=StagingSlotName.SLOT_B4, ) ).then_return( - LoadedLabware.construct(id="abc123") # type: ignore[call-arg] + LoadedLabware.model_construct(id="abc123") # type: ignore[call-arg] ) assert subject.get_slot_item(StagingSlotName.SLOT_B4) is result +def test_load_lid( + decoy: Decoy, + mock_engine_client: EngineClient, + subject: ProtocolCore, +) -> None: + """It should issue a LoadLid command.""" + mock_labware_core = decoy.mock(cls=LabwareCore) + decoy.when(mock_labware_core.labware_id).then_return("labware-id") + decoy.when( + mock_engine_client.state.labware.find_custom_labware_load_params() + ).then_return([EngineLabwareLoadParams("hello", "world", 654)]) + + decoy.when( + load_labware_params.resolve( + "some_labware", + "a_namespace", + 456, + [EngineLabwareLoadParams("hello", "world", 654)], + ) + ).then_return(("some_namespace", 9001)) + + decoy.when( + mock_engine_client.execute_command_without_recovery( + cmd.LoadLidParams( + location=OnLabwareLocation(labwareId="labware-id"), + loadName="some_labware", + namespace="some_namespace", + version=9001, + ) + ) + ).then_return( + commands.LoadLidResult( + labwareId="abc123", + definition=LabwareDefinition.model_construct(ordering=[]), # type: ignore[call-arg] + ) + ) + + decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] + ) + + result = subject.load_lid( + load_name="some_labware", + location=mock_labware_core, + namespace="a_namespace", + version=456, + ) + + assert isinstance(result, LabwareCore) + assert result.labware_id == "abc123" + assert subject.get_labware_cores() == [result] + + decoy.verify( + deck_conflict.check( + engine_state=mock_engine_client.state, + existing_labware_ids=[], + existing_module_ids=[], + existing_disposal_locations=[], + new_labware_id="abc123", + ) + ) + + decoy.when( + mock_engine_client.state.geometry.get_slot_item( + slot_name=DeckSlotName.SLOT_5, + ) + ).then_return( + LoadedLabware.model_construct(id="abc123") # type: ignore[call-arg] + ) + + assert subject.get_slot_item(DeckSlotName.SLOT_5) is result + + +def test_load_lid_stack( + decoy: Decoy, + mock_engine_client: EngineClient, + subject: ProtocolCore, +) -> None: + """It should issue a LoadLidStack command.""" + decoy.when( + mock_engine_client.state.labware.find_custom_labware_load_params() + ).then_return([EngineLabwareLoadParams("hello", "world", 654)]) + + decoy.when( + load_labware_params.resolve( + "some_labware", + "a_namespace", + 456, + [EngineLabwareLoadParams("hello", "world", 654)], + ) + ).then_return(("some_namespace", 9001)) + + decoy.when( + mock_engine_client.execute_command_without_recovery( + cmd.LoadLidStackParams( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_5), + loadName="some_labware", + namespace="some_namespace", + version=9001, + quantity=5, + ) + ) + ).then_return( + commands.LoadLidStackResult( + stackLabwareId="abc123", + labwareIds=["1", "2", "3", "4", "5"], + definition=LabwareDefinition.model_construct(), # type: ignore[call-arg] + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_5), + ) + ) + + decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] + ) + + result = subject.load_lid_stack( + load_name="some_labware", + location=DeckSlotName.SLOT_5, + namespace="a_namespace", + version=456, + quantity=5, + ) + + assert isinstance(result, LabwareCore) + assert result.labware_id == "abc123" + assert subject.get_labware_cores() == [result] + + decoy.verify( + deck_conflict.check( + engine_state=mock_engine_client.state, + existing_labware_ids=[], + existing_module_ids=[], + existing_disposal_locations=[], + new_labware_id="abc123", + ) + ) + + decoy.when( + mock_engine_client.state.geometry.get_slot_item( + slot_name=DeckSlotName.SLOT_5, + ) + ).then_return( + LoadedLabware.model_construct(id="abc123") # type: ignore[call-arg] + ) + + assert subject.get_slot_item(DeckSlotName.SLOT_5) is result + + def test_load_trash_bin( decoy: Decoy, mock_engine_client: EngineClient, @@ -860,7 +1009,7 @@ def test_move_labware( decoy.when( mock_engine_client.state.labware.get_definition("labware-id") ).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) labware = LabwareCore(labware_id="labware-id", engine_client=mock_engine_client) subject.move_labware( @@ -903,7 +1052,7 @@ def test_move_labware_on_staging_slot( decoy.when( mock_engine_client.state.labware.get_definition("labware-id") ).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) labware = LabwareCore(labware_id="labware-id", engine_client=mock_engine_client) subject.move_labware( @@ -944,7 +1093,7 @@ def test_move_labware_on_non_connected_module( decoy.when( mock_engine_client.state.labware.get_definition("labware-id") ).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) labware = LabwareCore(labware_id="labware-id", engine_client=mock_engine_client) non_connected_module_core = NonConnectedModuleCore( @@ -990,7 +1139,7 @@ def test_move_labware_off_deck( decoy.when( mock_engine_client.state.labware.get_definition("labware-id") ).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) labware = LabwareCore(labware_id="labware-id", engine_client=mock_engine_client) @@ -1056,13 +1205,13 @@ def test_load_labware_on_module( ).then_return( commands.LoadLabwareResult( labwareId="abc123", - definition=LabwareDefinition.construct(), # type: ignore[call-arg] + definition=LabwareDefinition.model_construct(), # type: ignore[call-arg] offsetId=None, ) ) decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) module_core = ModuleCore( @@ -1133,13 +1282,13 @@ def test_load_labware_on_non_connected_module( ).then_return( commands.LoadLabwareResult( labwareId="abc123", - definition=LabwareDefinition.construct(), # type: ignore[call-arg] + definition=LabwareDefinition.model_construct(), # type: ignore[call-arg] offsetId=None, ) ) decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( - LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + LabwareDefinition.model_construct(ordering=[]) # type: ignore[call-arg] ) non_connected_module_core = NonConnectedModuleCore( @@ -1185,7 +1334,7 @@ def test_add_labware_definition( """It should add a labware definition to the engine.""" decoy.when( mock_engine_client.add_labware_definition( - definition=LabwareDefinition.parse_obj(minimal_labware_def) + definition=LabwareDefinition.model_validate(minimal_labware_def) ) ).then_return(LabwareUri("hello/world/123")) @@ -1261,7 +1410,7 @@ def test_load_module( robot_type: RobotType, ) -> None: """It should issue a load module engine command.""" - definition = ModuleDefinition.construct() # type: ignore[call-arg] + definition = ModuleDefinition.model_construct() # type: ignore[call-arg] mock_hw_mod_1 = decoy.mock(cls=AbstractModule) mock_hw_mod_2 = decoy.mock(cls=AbstractModule) @@ -1315,7 +1464,7 @@ def test_load_module( slot_name=slot_name, ) ).then_return( - LoadedModule.construct(id="abc123") # type: ignore[call-arg] + LoadedModule.model_construct(id="abc123") # type: ignore[call-arg] ) decoy.when(mock_engine_client.state.labware.get_id_by_module("abc123")).then_raise( LabwareNotLoadedOnModuleError("oh no") @@ -1333,7 +1482,7 @@ def test_load_mag_block( subject: ProtocolCore, ) -> None: """It should issue a load module engine command.""" - definition = ModuleDefinition.construct() # type: ignore[call-arg] + definition = ModuleDefinition.model_construct() # type: ignore[call-arg] decoy.when(mock_engine_client.state.config.robot_type).then_return("OT-3 Standard") @@ -1378,7 +1527,7 @@ def test_load_mag_block( slot_name=DeckSlotName.SLOT_1, ) ).then_return( - LoadedModule.construct(id="abc123") # type: ignore[call-arg] + LoadedModule.model_construct(id="abc123") # type: ignore[call-arg] ) decoy.when(mock_engine_client.state.labware.get_id_by_module("abc123")).then_raise( LabwareNotLoadedOnModuleError("oh no") @@ -1413,7 +1562,7 @@ def test_load_module_thermocycler_with_no_location( expected_slot: DeckSlotName, ) -> None: """It should issue a load module engine command with location at 7.""" - definition = ModuleDefinition.construct() # type: ignore[call-arg] + definition = ModuleDefinition.model_construct() # type: ignore[call-arg] mock_hw_mod = decoy.mock(cls=AbstractModule) decoy.when(mock_hw_mod.device_info).then_return({"serial": "xyz789"}) @@ -1670,11 +1819,11 @@ def test_add_liquid( subject: ProtocolCore, ) -> None: """It should return the created liquid.""" - liquid = PE_Liquid.construct( + liquid = PE_Liquid.model_construct( id="water-id", displayName="water", description="water desc", - displayColor=HexColor(__root__="#fff"), + displayColor=HexColor("#fff"), ) expected_result = Liquid( diff --git a/api/tests/opentrons/protocol_api/core/engine/test_well_core.py b/api/tests/opentrons/protocol_api/core/engine/test_well_core.py index 31b562f7e81..6e1912f0aec 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_well_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_well_core.py @@ -1,4 +1,5 @@ """Test for the ProtocolEngine-based well API core.""" + import inspect import pytest @@ -49,7 +50,7 @@ def api_version() -> APIVersion: @pytest.fixture def well_definition() -> WellDefinition: """Get a partial WellDefinition value object.""" - return WellDefinition.construct() # type: ignore[call-arg] + return WellDefinition.model_construct() # type: ignore[call-arg] @pytest.fixture @@ -93,7 +94,7 @@ def test_display_name( @pytest.mark.parametrize( "well_definition", - [WellDefinition.construct(totalLiquidVolume=101)], # type: ignore[call-arg] + [WellDefinition.model_construct(totalLiquidVolume=101)], # type: ignore[call-arg] ) def test_max_volume(subject: WellCore) -> None: """It should have a max volume.""" @@ -192,7 +193,7 @@ def test_load_liquid( @pytest.mark.parametrize( "well_definition", - [WellDefinition.construct(diameter=123.4)], # type: ignore[call-arg] + [WellDefinition.model_construct(diameter=123.4)], # type: ignore[call-arg] ) def test_diameter(subject: WellCore) -> None: """It should get the diameter.""" @@ -201,7 +202,7 @@ def test_diameter(subject: WellCore) -> None: @pytest.mark.parametrize( "well_definition", - [WellDefinition.construct(xDimension=567.8)], # type: ignore[call-arg] + [WellDefinition.model_construct(xDimension=567.8)], # type: ignore[call-arg] ) def test_length(subject: WellCore) -> None: """It should get the length.""" @@ -210,7 +211,7 @@ def test_length(subject: WellCore) -> None: @pytest.mark.parametrize( "well_definition", - [WellDefinition.construct(yDimension=987.6)], # type: ignore[call-arg] + [WellDefinition.model_construct(yDimension=987.6)], # type: ignore[call-arg] ) def test_width(subject: WellCore) -> None: """It should get the width.""" @@ -219,7 +220,7 @@ def test_width(subject: WellCore) -> None: @pytest.mark.parametrize( "well_definition", - [WellDefinition.construct(depth=42.0)], # type: ignore[call-arg] + [WellDefinition.model_construct(depth=42.0)], # type: ignore[call-arg] ) def test_depth(subject: WellCore) -> None: """It should get the depth.""" diff --git a/api/tests/opentrons/protocol_api/test_liquid_class_properties.py b/api/tests/opentrons/protocol_api/test_liquid_class_properties.py index f335cb385bc..94e6dd49205 100644 --- a/api/tests/opentrons/protocol_api/test_liquid_class_properties.py +++ b/api/tests/opentrons/protocol_api/test_liquid_class_properties.py @@ -17,7 +17,7 @@ def test_build_aspirate_settings() -> None: """It should convert the shared data aspirate settings to the PAPI type.""" fixture_data = load_shared_data("liquid-class/fixtures/1/fixture_glycerol50.json") - liquid_class_model = LiquidClassSchemaV1.parse_raw(fixture_data) + liquid_class_model = LiquidClassSchemaV1.model_validate_json(fixture_data) aspirate_data = liquid_class_model.byPipette[0].byTipType[0].aspirate aspirate_properties = build_aspirate_properties(aspirate_data) @@ -61,7 +61,7 @@ def test_build_aspirate_settings() -> None: def test_build_single_dispense_settings() -> None: """It should convert the shared data single dispense settings to the PAPI type.""" fixture_data = load_shared_data("liquid-class/fixtures/1/fixture_glycerol50.json") - liquid_class_model = LiquidClassSchemaV1.parse_raw(fixture_data) + liquid_class_model = LiquidClassSchemaV1.model_validate_json(fixture_data) single_dispense_data = liquid_class_model.byPipette[0].byTipType[0].singleDispense single_dispense_properties = build_single_dispense_properties(single_dispense_data) @@ -118,7 +118,7 @@ def test_build_single_dispense_settings() -> None: def test_build_multi_dispense_settings() -> None: """It should convert the shared data multi dispense settings to the PAPI type.""" fixture_data = load_shared_data("liquid-class/fixtures/1/fixture_glycerol50.json") - liquid_class_model = LiquidClassSchemaV1.parse_raw(fixture_data) + liquid_class_model = LiquidClassSchemaV1.model_validate_json(fixture_data) multi_dispense_data = liquid_class_model.byPipette[0].byTipType[0].multiDispense assert multi_dispense_data is not None diff --git a/api/tests/opentrons/protocol_api/test_protocol_context.py b/api/tests/opentrons/protocol_api/test_protocol_context.py index e804ac9dd11..80728b7820c 100644 --- a/api/tests/opentrons/protocol_api/test_protocol_context.py +++ b/api/tests/opentrons/protocol_api/test_protocol_context.py @@ -742,6 +742,115 @@ def test_load_labware_on_adapter( decoy.verify(mock_core_map.add(mock_labware_core, result), times=1) +@pytest.mark.parametrize("api_version", [APIVersion(2, 23)]) +def test_load_labware_with_lid( + decoy: Decoy, + mock_core: ProtocolCore, + mock_core_map: LoadedCoreMap, + api_version: APIVersion, + subject: ProtocolContext, +) -> None: + """It should create a labware with a lid on it using its execution core.""" + mock_labware_core = decoy.mock(cls=LabwareCore) + mock_lid_core = decoy.mock(cls=LabwareCore) + + decoy.when(mock_validation.ensure_lowercase_name("UPPERCASE_LABWARE")).then_return( + "lowercase_labware" + ) + + decoy.when(mock_validation.ensure_lowercase_name("UPPERCASE_LID")).then_return( + "lowercase_lid" + ) + decoy.when(mock_core.robot_type).then_return("OT-3 Standard") + decoy.when( + mock_validation.ensure_and_convert_deck_slot(42, api_version, "OT-3 Standard") + ).then_return(DeckSlotName.SLOT_C1) + + decoy.when( + mock_core.load_labware( + load_name="lowercase_labware", + location=DeckSlotName.SLOT_C1, + label="some_display_name", + namespace="some_namespace", + version=1337, + ) + ).then_return(mock_labware_core) + decoy.when(mock_lid_core.get_well_columns()).then_return([]) + + decoy.when( + mock_core.load_lid( + load_name="lowercase_lid", + location=mock_labware_core, + namespace="some_namespace", + version=None, + ) + ).then_return(mock_lid_core) + + decoy.when(mock_labware_core.get_name()).then_return("Full Name") + decoy.when(mock_labware_core.get_display_name()).then_return("Display Name") + decoy.when(mock_labware_core.get_well_columns()).then_return([]) + + result = subject.load_labware( + load_name="UPPERCASE_LABWARE", + location=42, + label="some_display_name", + namespace="some_namespace", + version=1337, + lid="UPPERCASE_LID", + ) + + assert isinstance(result, Labware) + assert result.name == "Full Name" + + decoy.verify(mock_core_map.add(mock_labware_core, result), times=1) + + +@pytest.mark.parametrize("api_version", [APIVersion(2, 23)]) +def test_load_lid_stack( + decoy: Decoy, + mock_core: ProtocolCore, + mock_core_map: LoadedCoreMap, + api_version: APIVersion, + subject: ProtocolContext, +) -> None: + """It should create a labware with a lid on it using its execution core.""" + mock_lid_core = decoy.mock(cls=LabwareCore) + + decoy.when(mock_validation.ensure_lowercase_name("UPPERCASE_LID")).then_return( + "lowercase_lid" + ) + + decoy.when(mock_core.robot_type).then_return("OT-3 Standard") + decoy.when( + mock_validation.ensure_and_convert_deck_slot(42, api_version, "OT-3 Standard") + ).then_return(DeckSlotName.SLOT_C1) + + decoy.when( + mock_core.load_lid_stack( + load_name="lowercase_lid", + location=DeckSlotName.SLOT_C1, + quantity=5, + namespace="some_namespace", + version=1337, + ) + ).then_return(mock_lid_core) + + decoy.when(mock_lid_core.get_name()).then_return("STACK_OBJECT") + decoy.when(mock_lid_core.get_display_name()).then_return("") + decoy.when(mock_lid_core.get_well_columns()).then_return([]) + + result = subject.load_lid_stack( + load_name="UPPERCASE_LID", + location=42, + quantity=5, + namespace="some_namespace", + version=1337, + ) + + assert isinstance(result, Labware) + assert result.name == "STACK_OBJECT" + + def test_loaded_labware( decoy: Decoy, mock_core_map: LoadedCoreMap, diff --git a/api/tests/opentrons/protocol_api/test_validation.py b/api/tests/opentrons/protocol_api/test_validation.py index 342e197535b..ce12d1a8f53 100644 --- a/api/tests/opentrons/protocol_api/test_validation.py +++ b/api/tests/opentrons/protocol_api/test_validation.py @@ -1,4 +1,5 @@ """Tests for Protocol API input validation.""" + from typing import ContextManager, List, Type, Union, Optional, Dict, Sequence, Any from contextlib import nullcontext as do_not_raise @@ -223,7 +224,9 @@ def test_ensure_deck_slot_invalid( """It should raise an exception if given an invalid name.""" with pytest.raises(expected_error_type, match=expected_error_match): subject.ensure_and_convert_deck_slot( - input_value, input_api_version, input_robot_type # type: ignore[arg-type] + input_value, # type: ignore[arg-type] + input_api_version, + input_robot_type, ) @@ -243,23 +246,23 @@ def test_ensure_lowercase_name_invalid() -> None: ("definition", "expected_raise"), [ ( - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=[LabwareRole.labware], - parameters=LabwareDefinitionParameters.construct(loadName="Foo"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="Foo"), # type: ignore[call-arg] ), do_not_raise(), ), ( - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=[], - parameters=LabwareDefinitionParameters.construct(loadName="Foo"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="Foo"), # type: ignore[call-arg] ), do_not_raise(), ), ( - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=[LabwareRole.adapter], - parameters=LabwareDefinitionParameters.construct(loadName="Foo"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="Foo"), # type: ignore[call-arg] ), pytest.raises(subject.LabwareDefinitionIsNotLabwareError), ), @@ -277,23 +280,23 @@ def test_ensure_definition_is_labware( ("definition", "expected_raise"), [ ( - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=[LabwareRole.adapter], - parameters=LabwareDefinitionParameters.construct(loadName="Foo"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="Foo"), # type: ignore[call-arg] ), do_not_raise(), ), ( - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=[], - parameters=LabwareDefinitionParameters.construct(loadName="Foo"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="Foo"), # type: ignore[call-arg] ), pytest.raises(subject.LabwareDefinitionIsNotAdapterError), ), ( - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=[LabwareRole.labware], - parameters=LabwareDefinitionParameters.construct(loadName="Foo"), # type: ignore[call-arg] + parameters=LabwareDefinitionParameters.model_construct(loadName="Foo"), # type: ignore[call-arg] ), pytest.raises(subject.LabwareDefinitionIsNotAdapterError), ), @@ -547,7 +550,8 @@ def test_validate_with_wrong_location() -> None: """Should raise a LocationTypeError.""" with pytest.raises(subject.LocationTypeError): subject.validate_location( - location=42, last_location=None # type: ignore[arg-type] + location=42, # type: ignore[arg-type] + last_location=None, ) diff --git a/api/tests/opentrons/protocol_engine/clients/test_child_thread_transport.py b/api/tests/opentrons/protocol_engine/clients/test_child_thread_transport.py index 9cbd03c3ec8..700f11ff190 100644 --- a/api/tests/opentrons/protocol_engine/clients/test_child_thread_transport.py +++ b/api/tests/opentrons/protocol_engine/clients/test_child_thread_transport.py @@ -1,4 +1,5 @@ """Tests for am ChildThreadTransport.""" + import threading from asyncio import get_running_loop from datetime import datetime @@ -104,7 +105,7 @@ async def test_call_method( subject: ChildThreadTransport, ) -> None: """It should call a synchronous method in a thread-safe manner.""" - labware_def = LabwareDefinition.construct(namespace="hello") # type: ignore[call-arg] + labware_def = LabwareDefinition.model_construct(namespace="hello") # type: ignore[call-arg] labware_uri = LabwareUri("hello/world/123") calling_thread_id = None diff --git a/api/tests/opentrons/protocol_engine/clients/test_sync_client.py b/api/tests/opentrons/protocol_engine/clients/test_sync_client.py index 03d6912371c..628e23cc052 100644 --- a/api/tests/opentrons/protocol_engine/clients/test_sync_client.py +++ b/api/tests/opentrons/protocol_engine/clients/test_sync_client.py @@ -12,6 +12,7 @@ import pytest from decoy import Decoy + from opentrons_shared_data.labware.types import LabwareUri from opentrons_shared_data.labware.labware_definition import LabwareDefinition @@ -61,7 +62,7 @@ def test_execute_command_without_recovery( result_from_transport ) result_from_subject = subject.execute_command_without_recovery(params) - assert result_from_subject == result_from_transport + assert result_from_subject == result_from_transport # type: ignore[comparison-overlap] def test_add_labware_definition( @@ -70,7 +71,7 @@ def test_add_labware_definition( subject: SyncClient, ) -> None: """It should add a labware definition.""" - labware_definition = LabwareDefinition.construct(namespace="hello") # type: ignore[call-arg] + labware_definition = LabwareDefinition.model_construct(namespace="hello") # type: ignore[call-arg] expected_labware_uri = LabwareUri("hello/world/123") decoy.when( @@ -108,7 +109,7 @@ def test_add_liquid( subject: SyncClient, ) -> None: """It should add a liquid to engine state.""" - liquid = Liquid.construct(displayName="water") # type: ignore[call-arg] + liquid = Liquid.model_construct(displayName="water") # type: ignore[call-arg] decoy.when( transport.call_method( diff --git a/api/tests/opentrons/protocol_engine/commands/absorbance_reader/__init__.py b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/__init__.py new file mode 100644 index 00000000000..ebb91ede166 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/__init__.py @@ -0,0 +1 @@ +"""Tests for absorbance reader commands.""" diff --git a/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_close_lid.py b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_close_lid.py new file mode 100644 index 00000000000..c40a825d9c6 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_close_lid.py @@ -0,0 +1,221 @@ +"""Test absorbance reader initilize command.""" +import pytest +from decoy import Decoy + +from opentrons.drivers.types import ( + AbsorbanceReaderLidStatus, +) +from opentrons.hardware_control.modules import AbsorbanceReader +from opentrons.protocol_engine import ModuleModel, DeckSlotLocation +from opentrons.protocol_engine.errors import CannotPerformModuleAction + +from opentrons.protocol_engine.execution import EquipmentHandler, LabwareMovementHandler +from opentrons.protocol_engine.state import update_types +from opentrons.protocol_engine.state.state import StateView +from opentrons.protocol_engine.state.module_substates import ( + AbsorbanceReaderSubState, + AbsorbanceReaderId, +) +from opentrons.protocol_engine.commands.command import SuccessData +from opentrons.protocol_engine.commands.absorbance_reader import ( + CloseLidResult, + CloseLidParams, +) +from opentrons.protocol_engine.commands.absorbance_reader.close_lid import ( + CloseLidImpl, +) +from opentrons.protocol_engine.types import ( + LabwareMovementOffsetData, + LabwareOffsetVector, +) +from opentrons.types import DeckSlotName +from opentrons_shared_data.labware.labware_definition import ( + LabwareDefinition, + Parameters, +) + + +@pytest.fixture +def absorbance_def() -> LabwareDefinition: + """Get a tip rack Pydantic model definition value object.""" + return LabwareDefinition.model_construct( # type: ignore[call-arg] + namespace="test", + version=1, + parameters=Parameters.model_construct( # type: ignore[call-arg] + loadName="cool-labware", + tipOverlap=None, # add a None value to validate serialization to dictionary + ), + ) + + +@pytest.fixture +def subject( + state_view: StateView, + equipment: EquipmentHandler, + labware_movement: LabwareMovementHandler, +) -> CloseLidImpl: + """Subject fixture.""" + return CloseLidImpl( + state_view=state_view, equipment=equipment, labware_movement=labware_movement + ) + + +@pytest.mark.parametrize( + "hardware_lid_status", + (AbsorbanceReaderLidStatus.ON, AbsorbanceReaderLidStatus.OFF), +) +async def test_absorbance_reader_close_lid_implementation( + decoy: Decoy, + subject: CloseLidImpl, + state_view: StateView, + equipment: EquipmentHandler, + hardware_lid_status: AbsorbanceReaderLidStatus, + absorbance_def: LabwareDefinition, +) -> None: + """It should validate, find hardware module if not virtualized, and close lid.""" + params = CloseLidParams( + moduleId="unverified-module-id", + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + verified_module_id = AbsorbanceReaderId("module-id") + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when(await absorbance_module_hw.get_current_lid_status()).then_return( + hardware_lid_status + ) + decoy.when(state_view.modules.get_requested_model(params.moduleId)).then_return( + ModuleModel.ABSORBANCE_READER_V1 + ) + + decoy.when(state_view.labware.get_absorbance_reader_lid_definition()).then_return() + + decoy.when(state_view.modules.get_location(params.moduleId)).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_D3) + ) + decoy.when( + state_view.modules.ensure_and_convert_module_fixture_location( + DeckSlotName.SLOT_D3, ModuleModel.ABSORBANCE_READER_V1 + ) + ).then_return("absorbanceReaderV1D3") + + decoy.when(state_view.labware.get_absorbance_reader_lid_definition()).then_return( + absorbance_def + ) + decoy.when( + state_view.labware.get_child_gripper_offsets( + labware_definition=absorbance_def, + slot_name=None, + ) + ).then_return( + LabwareMovementOffsetData( + pickUpOffset=LabwareOffsetVector(x=0, y=0, z=0), + dropOffset=LabwareOffsetVector(x=0, y=0, z=0), + ) + ) + + result = await subject.execute(params=params) + + assert result == SuccessData( + public=CloseLidResult(), + state_update=update_types.StateUpdate( + absorbance_reader_state_update=update_types.AbsorbanceReaderStateUpdate( + module_id="module-id", + absorbance_reader_lid=update_types.AbsorbanceReaderLidUpdate( + is_lid_on=True + ), + ), + ), + ) + + +async def test_close_lid_raises_no_module( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + subject: CloseLidImpl, +) -> None: + """Should raise an error that the hardware module not found.""" + params = CloseLidParams( + moduleId="unverified-module-id", + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + verified_module_id = AbsorbanceReaderId("module-id") + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + decoy.when(state_view.config.use_virtual_modules).then_return(False) + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return(None) + with pytest.raises(CannotPerformModuleAction): + await subject.execute(params=params) + + +async def test_close_lid_raises_no_gripper_offset( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + subject: CloseLidImpl, + absorbance_def: LabwareDefinition, +) -> None: + """Should raise an error that gripper offset not found.""" + params = CloseLidParams( + moduleId="unverified-module-id", + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + verified_module_id = AbsorbanceReaderId("module-id") + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when(await absorbance_module_hw.get_current_lid_status()).then_return( + AbsorbanceReaderLidStatus.OFF + ) + decoy.when(state_view.modules.get_requested_model(params.moduleId)).then_return( + ModuleModel.ABSORBANCE_READER_V1 + ) + + decoy.when(state_view.labware.get_absorbance_reader_lid_definition()).then_return() + + decoy.when(state_view.modules.get_location(params.moduleId)).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_D3) + ) + decoy.when( + state_view.modules.ensure_and_convert_module_fixture_location( + DeckSlotName.SLOT_D3, ModuleModel.ABSORBANCE_READER_V1 + ) + ).then_return("absorbanceReaderV1D3") + + decoy.when(state_view.labware.get_absorbance_reader_lid_definition()).then_return( + absorbance_def + ) + decoy.when( + state_view.labware.get_child_gripper_offsets( + labware_definition=absorbance_def, + slot_name=None, + ) + ).then_return(None) + with pytest.raises(ValueError): + await subject.execute(params=params) diff --git a/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_initialize.py b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_initialize.py new file mode 100644 index 00000000000..efdd8908583 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_initialize.py @@ -0,0 +1,238 @@ +"""Test absorbance reader initilize command.""" +import pytest +from decoy import Decoy +from typing import List + +from opentrons.drivers.types import ABSMeasurementMode +from opentrons.hardware_control.modules import AbsorbanceReader +from opentrons.protocol_engine.errors import InvalidWavelengthError + +from opentrons.protocol_engine.execution import EquipmentHandler +from opentrons.protocol_engine.state import update_types +from opentrons.protocol_engine.state.state import StateView +from opentrons.protocol_engine.state.module_substates import ( + AbsorbanceReaderSubState, + AbsorbanceReaderId, +) +from opentrons.protocol_engine.commands.command import SuccessData +from opentrons.protocol_engine.commands.absorbance_reader import ( + InitializeParams, + InitializeResult, +) +from opentrons.protocol_engine.commands.absorbance_reader.initialize import ( + InitializeImpl, +) + + +@pytest.fixture +def subject( + state_view: StateView, + equipment: EquipmentHandler, +) -> InitializeImpl: + """Subject command implementation to test.""" + return InitializeImpl(state_view=state_view, equipment=equipment) + + +@pytest.mark.parametrize( + "input_sample_wave_length, input_measure_mode", [([1, 2], "multi"), ([1], "single")] +) +async def test_absorbance_reader_implementation( + decoy: Decoy, + input_sample_wave_length: List[int], + input_measure_mode: str, + subject: InitializeImpl, + state_view: StateView, + equipment: EquipmentHandler, +) -> None: + """It should validate, find hardware module if not virtualized, and disengage.""" + params = InitializeParams( + moduleId="unverified-module-id", + measureMode=input_measure_mode, # type: ignore[arg-type] + sampleWavelengths=input_sample_wave_length, + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + verified_module_id = AbsorbanceReaderId("module-id") + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when((absorbance_module_hw.supported_wavelengths)).then_return([1, 2]) + + result = await subject.execute(params=params) + + decoy.verify( + await absorbance_module_hw.set_sample_wavelength( + ABSMeasurementMode(params.measureMode), + params.sampleWavelengths, + reference_wavelength=params.referenceWavelength, + ), + times=1, + ) + assert result == SuccessData( + public=InitializeResult(), + state_update=update_types.StateUpdate( + absorbance_reader_state_update=update_types.AbsorbanceReaderStateUpdate( + module_id="module-id", + initialize_absorbance_reader_update=update_types.AbsorbanceReaderInitializeUpdate( + measure_mode=input_measure_mode, # type: ignore[arg-type] + sample_wave_lengths=input_sample_wave_length, + reference_wave_length=None, + ), + ) + ), + ) + + +@pytest.mark.parametrize( + "input_sample_wave_length, input_measure_mode", + [([1, 2, 3], "multi"), ([3], "single")], +) +async def test_initialize_raises_invalid_wave_length( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + subject: InitializeImpl, + input_sample_wave_length: List[int], + input_measure_mode: str, +) -> None: + """Should raise an InvalidWavelengthError error.""" + params = InitializeParams( + moduleId="unverified-module-id", + measureMode=input_measure_mode, # type: ignore[arg-type] + sampleWavelengths=input_sample_wave_length, + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + verified_module_id = AbsorbanceReaderId("module-id") + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when((absorbance_module_hw.supported_wavelengths)).then_return([1, 2]) + + with pytest.raises(InvalidWavelengthError): + await subject.execute(params=params) + + +@pytest.mark.parametrize( + "input_sample_wave_length, input_measure_mode", + [([], "multi"), ([], "single")], +) +async def test_initialize_raises_measure_mode_not_matching( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + subject: InitializeImpl, + input_sample_wave_length: List[int], + input_measure_mode: str, +) -> None: + """Should raise an error that the measure mode does not match sample wave.""" + params = InitializeParams( + moduleId="unverified-module-id", + measureMode=input_measure_mode, # type: ignore[arg-type] + sampleWavelengths=input_sample_wave_length, + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + verified_module_id = AbsorbanceReaderId("module-id") + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when((absorbance_module_hw.supported_wavelengths)).then_return([1, 2]) + + with pytest.raises(ValueError): + await subject.execute(params=params) + + +async def test_initialize_single_raises_reference_wave_length_not_matching( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + subject: InitializeImpl, +) -> None: + """Should raise an error that the measure mode does not match sample wave.""" + params = InitializeParams( + moduleId="unverified-module-id", + measureMode="single", + sampleWavelengths=[1], + referenceWavelength=3, + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + verified_module_id = AbsorbanceReaderId("module-id") + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when((absorbance_module_hw.supported_wavelengths)).then_return([1, 2]) + + with pytest.raises(InvalidWavelengthError): + await subject.execute(params=params) + + +async def test_initialize_multi_raises_no_reference_wave_length( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + subject: InitializeImpl, +) -> None: + """Should raise an error that the measure mode does not match sample wave.""" + params = InitializeParams( + moduleId="unverified-module-id", + measureMode="multi", + sampleWavelengths=[1, 2], + referenceWavelength=3, + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + verified_module_id = AbsorbanceReaderId("module-id") + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when((absorbance_module_hw.supported_wavelengths)).then_return([1, 2]) + + with pytest.raises(ValueError): + await subject.execute(params=params) diff --git a/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_open_lid.py b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_open_lid.py new file mode 100644 index 00000000000..bc555a9bb18 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_open_lid.py @@ -0,0 +1,222 @@ +"""Test absorbance reader initilize command.""" +import pytest +from decoy import Decoy + +from opentrons.drivers.types import ( + AbsorbanceReaderLidStatus, +) +from opentrons.hardware_control.modules import AbsorbanceReader +from opentrons.protocol_engine import ModuleModel, DeckSlotLocation +from opentrons.protocol_engine.errors import CannotPerformModuleAction + +from opentrons.protocol_engine.execution import EquipmentHandler, LabwareMovementHandler +from opentrons.protocol_engine.state import update_types +from opentrons.protocol_engine.state.state import StateView +from opentrons.protocol_engine.state.module_substates import ( + AbsorbanceReaderSubState, + AbsorbanceReaderId, +) +from opentrons.protocol_engine.commands.command import SuccessData +from opentrons.protocol_engine.commands.absorbance_reader import ( + OpenLidResult, + OpenLidParams, +) +from opentrons.protocol_engine.commands.absorbance_reader.open_lid import ( + OpenLidImpl, +) +from opentrons.protocol_engine.types import ( + LabwareMovementOffsetData, + LabwareOffsetVector, +) +from opentrons.types import DeckSlotName +from opentrons_shared_data.labware.labware_definition import ( + LabwareDefinition, + Parameters, +) + + +@pytest.fixture +def absorbance_def() -> LabwareDefinition: + """Get a tip rack Pydantic model definition value object.""" + return LabwareDefinition.model_construct( # type: ignore[call-arg] + namespace="test", + version=1, + parameters=Parameters.model_construct( # type: ignore[call-arg] + loadName="cool-labware", + tipOverlap=None, # add a None value to validate serialization to dictionary + ), + ) + + +@pytest.fixture +def subject( + state_view: StateView, + equipment: EquipmentHandler, + labware_movement: LabwareMovementHandler, +) -> OpenLidImpl: + """Command implementation subject for testing.""" + return OpenLidImpl( + state_view=state_view, equipment=equipment, labware_movement=labware_movement + ) + + +@pytest.mark.parametrize( + "hardware_lid_status", + (AbsorbanceReaderLidStatus.ON, AbsorbanceReaderLidStatus.OFF), +) +async def test_absorbance_reader_implementation( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + labware_movement: LabwareMovementHandler, + hardware_lid_status: AbsorbanceReaderLidStatus, + absorbance_def: LabwareDefinition, + subject: OpenLidImpl, +) -> None: + """It should validate, find hardware module if not virtualized, and disengage.""" + params = OpenLidParams( + moduleId="unverified-module-id", + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + verified_module_id = AbsorbanceReaderId("module-id") + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when(await absorbance_module_hw.get_current_lid_status()).then_return( + hardware_lid_status + ) + decoy.when(state_view.modules.get_requested_model(params.moduleId)).then_return( + ModuleModel.ABSORBANCE_READER_V1 + ) + + decoy.when(state_view.labware.get_absorbance_reader_lid_definition()).then_return() + + decoy.when(state_view.modules.get_location(params.moduleId)).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_D3) + ) + decoy.when( + state_view.modules.ensure_and_convert_module_fixture_location( + DeckSlotName.SLOT_D3, ModuleModel.ABSORBANCE_READER_V1 + ) + ).then_return("absorbanceReaderV1D3") + + decoy.when(state_view.labware.get_absorbance_reader_lid_definition()).then_return( + absorbance_def + ) + decoy.when( + state_view.labware.get_child_gripper_offsets( + labware_definition=absorbance_def, + slot_name=None, + ) + ).then_return( + LabwareMovementOffsetData( + pickUpOffset=LabwareOffsetVector(x=0, y=0, z=0), + dropOffset=LabwareOffsetVector(x=0, y=0, z=0), + ) + ) + + result = await subject.execute(params=params) + + assert result == SuccessData( + public=OpenLidResult(), + state_update=update_types.StateUpdate( + absorbance_reader_state_update=update_types.AbsorbanceReaderStateUpdate( + module_id="module-id", + absorbance_reader_lid=update_types.AbsorbanceReaderLidUpdate( + is_lid_on=False + ), + ), + ), + ) + + +async def test_open_lid_raises_no_module( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + subject: OpenLidImpl, +) -> None: + """Should raise an error that the hardware module not found.""" + params = OpenLidParams( + moduleId="unverified-module-id", + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + verified_module_id = AbsorbanceReaderId("module-id") + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + decoy.when(state_view.config.use_virtual_modules).then_return(False) + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return(None) + with pytest.raises(CannotPerformModuleAction): + await subject.execute(params=params) + + +async def test_open_lid_raises_no_gripper_offset( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + subject: OpenLidImpl, + absorbance_def: LabwareDefinition, +) -> None: + """Should raise an error that gripper offset not found.""" + params = OpenLidParams( + moduleId="unverified-module-id", + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + verified_module_id = AbsorbanceReaderId("module-id") + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when(await absorbance_module_hw.get_current_lid_status()).then_return( + AbsorbanceReaderLidStatus.OFF + ) + decoy.when(state_view.modules.get_requested_model(params.moduleId)).then_return( + ModuleModel.ABSORBANCE_READER_V1 + ) + + decoy.when(state_view.labware.get_absorbance_reader_lid_definition()).then_return() + + decoy.when(state_view.modules.get_location(params.moduleId)).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_D3) + ) + decoy.when( + state_view.modules.ensure_and_convert_module_fixture_location( + DeckSlotName.SLOT_D3, ModuleModel.ABSORBANCE_READER_V1 + ) + ).then_return("absorbanceReaderV1D3") + + decoy.when(state_view.labware.get_absorbance_reader_lid_definition()).then_return( + absorbance_def + ) + decoy.when( + state_view.labware.get_child_gripper_offsets( + labware_definition=absorbance_def, + slot_name=None, + ) + ).then_return(None) + with pytest.raises(ValueError): + await subject.execute(params=params) diff --git a/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_read.py b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_read.py new file mode 100644 index 00000000000..6ba7619f219 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/absorbance_reader/test_read.py @@ -0,0 +1,176 @@ +"""Test absorbance reader initilize command.""" +import pytest +from decoy import Decoy + +from opentrons.drivers.types import ABSMeasurementMode, ABSMeasurementConfig +from opentrons.hardware_control.modules import AbsorbanceReader +from opentrons.protocol_engine.errors import ( + CannotPerformModuleAction, + StorageLimitReachedError, +) + +from opentrons.protocol_engine.execution import EquipmentHandler +from opentrons.protocol_engine.resources import FileProvider +from opentrons.protocol_engine.state import update_types +from opentrons.protocol_engine.state.state import StateView +from opentrons.protocol_engine.state.module_substates import ( + AbsorbanceReaderSubState, + AbsorbanceReaderId, +) +from opentrons.protocol_engine.commands.command import SuccessData +from opentrons.protocol_engine.commands.absorbance_reader import ( + ReadAbsorbanceResult, + ReadAbsorbanceParams, +) +from opentrons.protocol_engine.commands.absorbance_reader.read import ( + ReadAbsorbanceImpl, +) + + +async def test_absorbance_reader_implementation( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + file_provider: FileProvider, +) -> None: + """It should validate, find hardware module if not virtualized, and disengage.""" + subject = ReadAbsorbanceImpl( + state_view=state_view, equipment=equipment, file_provider=file_provider + ) + + params = ReadAbsorbanceParams( + moduleId="unverified-module-id", + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + verified_module_id = AbsorbanceReaderId("module-id") + asbsorbance_result = {1: {"A1": 1.2}} + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when(await absorbance_module_hw.start_measure()).then_return([[1.2, 1.3]]) + decoy.when(absorbance_module_hw._measurement_config).then_return( + ABSMeasurementConfig( + measure_mode=ABSMeasurementMode.SINGLE, + sample_wavelengths=[1, 2], + reference_wavelength=None, + ) + ) + decoy.when( + state_view.modules.convert_absorbance_reader_data_points([1.2, 1.3]) + ).then_return({"A1": 1.2}) + + result = await subject.execute(params=params) + + assert result == SuccessData( + public=ReadAbsorbanceResult( + data=asbsorbance_result, + fileIds=[], + ), + state_update=update_types.StateUpdate( + files_added=update_types.FilesAddedUpdate(file_ids=[]), + absorbance_reader_state_update=update_types.AbsorbanceReaderStateUpdate( + module_id="module-id", + absorbance_reader_data=update_types.AbsorbanceReaderDataUpdate( + read_result=asbsorbance_result + ), + ), + ), + ) + + +async def test_read_raises_cannot_preform_action( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + file_provider: FileProvider, +) -> None: + """It should raise CannotPerformModuleAction when not configured/lid is not on.""" + subject = ReadAbsorbanceImpl( + state_view=state_view, equipment=equipment, file_provider=file_provider + ) + + params = ReadAbsorbanceParams( + moduleId="unverified-module-id", + ) + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + + verified_module_id = AbsorbanceReaderId("module-id") + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + + decoy.when(mabsorbance_module_substate.configured).then_return(False) + + with pytest.raises(CannotPerformModuleAction): + await subject.execute(params=params) + + decoy.when(mabsorbance_module_substate.configured).then_return(True) + + decoy.when(mabsorbance_module_substate.is_lid_on).then_return(False) + + with pytest.raises(CannotPerformModuleAction): + await subject.execute(params=params) + + +async def test_read_raises_storage_limit( + decoy: Decoy, + state_view: StateView, + equipment: EquipmentHandler, + file_provider: FileProvider, +) -> None: + """It should raise StorageLimitReachedError when not configured/lid is not on.""" + subject = ReadAbsorbanceImpl( + state_view=state_view, equipment=equipment, file_provider=file_provider + ) + + params = ReadAbsorbanceParams(moduleId="unverified-module-id", fileName="test") + + mabsorbance_module_substate = decoy.mock(cls=AbsorbanceReaderSubState) + absorbance_module_hw = decoy.mock(cls=AbsorbanceReader) + + verified_module_id = AbsorbanceReaderId("module-id") + + decoy.when( + state_view.modules.get_absorbance_reader_substate("unverified-module-id") + ).then_return(mabsorbance_module_substate) + + decoy.when(mabsorbance_module_substate.module_id).then_return(verified_module_id) + + decoy.when(equipment.get_module_hardware_api(verified_module_id)).then_return( + absorbance_module_hw + ) + decoy.when(await absorbance_module_hw.start_measure()).then_return([[1.2, 1.3]]) + + decoy.when(absorbance_module_hw._measurement_config).then_return( + ABSMeasurementConfig( + measure_mode=ABSMeasurementMode.SINGLE, + sample_wavelengths=[1, 2], + reference_wavelength=None, + ) + ) + decoy.when(mabsorbance_module_substate.configured_wavelengths).then_return( + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + ) + + decoy.when(state_view.files.get_filecount()).then_return(390) + with pytest.raises(StorageLimitReachedError): + await subject.execute(params=params) diff --git a/api/tests/opentrons/protocol_engine/commands/conftest.py b/api/tests/opentrons/protocol_engine/commands/conftest.py index 1d27dea0536..cf2d36b092e 100644 --- a/api/tests/opentrons/protocol_engine/commands/conftest.py +++ b/api/tests/opentrons/protocol_engine/commands/conftest.py @@ -15,6 +15,7 @@ TipHandler, GantryMover, ) +from opentrons.protocol_engine.resources import FileProvider from opentrons.protocol_engine.resources.model_utils import ModelUtils from opentrons.protocol_engine.state.state import StateView @@ -83,3 +84,9 @@ def status_bar(decoy: Decoy) -> StatusBarHandler: def gantry_mover(decoy: Decoy) -> GantryMover: """Get a mocked out GantryMover.""" return decoy.mock(cls=GantryMover) + + +@pytest.fixture +def file_provider(decoy: Decoy) -> FileProvider: + """Get a mocked out StateView.""" + return decoy.mock(cls=FileProvider) diff --git a/api/tests/opentrons/protocol_engine/commands/test_air_gap_in_place.py b/api/tests/opentrons/protocol_engine/commands/test_air_gap_in_place.py index 5d66a845dcc..b9d110fd9c2 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_air_gap_in_place.py +++ b/api/tests/opentrons/protocol_engine/commands/test_air_gap_in_place.py @@ -265,7 +265,7 @@ async def test_overpressure_error( if isinstance(location, CurrentWell): assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], @@ -275,7 +275,7 @@ async def test_overpressure_error( ) else: assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/commands/test_aspirate.py b/api/tests/opentrons/protocol_engine/commands/test_aspirate.py index 8e50d1825ae..4a8adbcdc76 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_aspirate.py +++ b/api/tests/opentrons/protocol_engine/commands/test_aspirate.py @@ -411,7 +411,7 @@ async def test_overpressure_error( result = await subject.execute(params) assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], @@ -581,7 +581,7 @@ async def test_stall_during_final_movement( result = await subject.execute(params) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], @@ -639,7 +639,7 @@ async def test_stall_during_preparation( result = await subject.execute(params) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()] ), state_update=update_types.StateUpdate( @@ -715,7 +715,7 @@ async def test_overpressure_during_preparation( result = await subject.execute(params) assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/commands/test_aspirate_in_place.py b/api/tests/opentrons/protocol_engine/commands/test_aspirate_in_place.py index 48dba2e0c3e..5a7ca3ee940 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_aspirate_in_place.py +++ b/api/tests/opentrons/protocol_engine/commands/test_aspirate_in_place.py @@ -304,7 +304,7 @@ async def test_overpressure_error( if isinstance(location, CurrentWell): assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], @@ -323,7 +323,7 @@ async def test_overpressure_error( ) else: assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/commands/test_blow_out.py b/api/tests/opentrons/protocol_engine/commands/test_blow_out.py index c06b62ace97..7549141be5b 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_blow_out.py +++ b/api/tests/opentrons/protocol_engine/commands/test_blow_out.py @@ -158,7 +158,7 @@ async def test_overpressure_error( result = await subject.execute(data) assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], @@ -233,7 +233,7 @@ async def test_stall_error( result = await subject.execute(data) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/commands/test_blow_out_in_place.py b/api/tests/opentrons/protocol_engine/commands/test_blow_out_in_place.py index 97e8e8c0851..50bee696c5a 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_blow_out_in_place.py +++ b/api/tests/opentrons/protocol_engine/commands/test_blow_out_in_place.py @@ -106,7 +106,7 @@ async def test_overpressure_error( result = await subject.execute(data) assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/commands/test_dispense.py b/api/tests/opentrons/protocol_engine/commands/test_dispense.py index e0e18307b69..5b60b61d4df 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_dispense.py +++ b/api/tests/opentrons/protocol_engine/commands/test_dispense.py @@ -119,7 +119,7 @@ async def test_dispense_implementation( labware_id="labware-id-abc123", well_name="A3", ), - new_deck_point=DeckPoint.construct(x=1, y=2, z=3), + new_deck_point=DeckPoint.model_construct(x=1, y=2, z=3), ), liquid_operated=update_types.LiquidOperatedUpdate( labware_id="labware-id-abc123", @@ -203,7 +203,7 @@ async def test_overpressure_error( result = await subject.execute(data) assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], @@ -216,7 +216,7 @@ async def test_overpressure_error( labware_id="labware-id", well_name="well-name", ), - new_deck_point=DeckPoint.construct(x=1, y=2, z=3), + new_deck_point=DeckPoint.model_construct(x=1, y=2, z=3), ), liquid_operated=update_types.LiquidOperatedUpdate( labware_id="labware-id", @@ -234,7 +234,7 @@ async def test_overpressure_error( labware_id="labware-id", well_name="well-name", ), - new_deck_point=DeckPoint.construct(x=1, y=2, z=3), + new_deck_point=DeckPoint.model_construct(x=1, y=2, z=3), ), ), ) @@ -288,7 +288,7 @@ async def test_stall_error( result = await subject.execute(data) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/commands/test_dispense_in_place.py b/api/tests/opentrons/protocol_engine/commands/test_dispense_in_place.py index bc39fba4a00..e9c715223de 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_dispense_in_place.py +++ b/api/tests/opentrons/protocol_engine/commands/test_dispense_in_place.py @@ -207,7 +207,7 @@ async def test_overpressure_error( if isinstance(location, CurrentWell): assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], @@ -226,7 +226,7 @@ async def test_overpressure_error( ) else: assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/commands/test_drop_tip.py b/api/tests/opentrons/protocol_engine/commands/test_drop_tip.py index 038ea12255b..430fa8dff32 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_drop_tip.py +++ b/api/tests/opentrons/protocol_engine/commands/test_drop_tip.py @@ -60,7 +60,7 @@ def mock_model_utils(decoy: Decoy) -> ModelUtils: def test_drop_tip_params_defaults() -> None: """A drop tip should use a `WellOrigin.DROP_TIP` by default.""" - default_params = DropTipParams.parse_obj( + default_params = DropTipParams.model_validate( {"pipetteId": "abc", "labwareId": "def", "wellName": "ghj"} ) @@ -71,7 +71,7 @@ def test_drop_tip_params_defaults() -> None: def test_drop_tip_params_default_origin() -> None: """A drop tip should drop a `WellOrigin.DROP_TIP` by default even if an offset is given.""" - default_params = DropTipParams.parse_obj( + default_params = DropTipParams.model_validate( { "pipetteId": "abc", "labwareId": "def", @@ -303,7 +303,7 @@ async def test_tip_attached_error( result = await subject.execute(params) assert result == DefinedErrorData( - public=TipPhysicallyAttachedError.construct( + public=TipPhysicallyAttachedError.model_construct( id="error-id", createdAt=datetime(year=1, month=2, day=3), wrappedErrors=[matchers.Anything()], @@ -396,7 +396,7 @@ async def test_stall_error( result = await subject.execute(params) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id="error-id", createdAt=datetime(year=1, month=2, day=3), wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/commands/test_drop_tip_in_place.py b/api/tests/opentrons/protocol_engine/commands/test_drop_tip_in_place.py index 5565ffea88c..8c4716cf380 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_drop_tip_in_place.py +++ b/api/tests/opentrons/protocol_engine/commands/test_drop_tip_in_place.py @@ -104,7 +104,7 @@ async def test_tip_attached_error( result = await subject.execute(params) assert result == DefinedErrorData( - public=TipPhysicallyAttachedError.construct( + public=TipPhysicallyAttachedError.model_construct( id="error-id", createdAt=datetime(year=1, month=2, day=3), wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/commands/test_liquid_probe.py b/api/tests/opentrons/protocol_engine/commands/test_liquid_probe.py index 34b979901aa..c9661512aaa 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_liquid_probe.py +++ b/api/tests/opentrons/protocol_engine/commands/test_liquid_probe.py @@ -350,7 +350,7 @@ async def test_liquid_not_found_error( ) if isinstance(subject, LiquidProbeImplementation): assert result == DefinedErrorData( - public=LiquidNotFoundError.construct( + public=LiquidNotFoundError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], @@ -726,7 +726,7 @@ async def test_liquid_probe_stall( result = await subject.execute(data) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=error_id, createdAt=timestamp, wrappedErrors=[matchers.Anything()] ), state_update=update_types.StateUpdate(pipette_location=update_types.CLEAR), diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_liquid_class.py b/api/tests/opentrons/protocol_engine/commands/test_load_liquid_class.py index 041a7b2f8ca..54de10f3bc2 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_load_liquid_class.py +++ b/api/tests/opentrons/protocol_engine/commands/test_load_liquid_class.py @@ -152,7 +152,7 @@ async def test_load_liquid_class_conflicting_definition_for_id( liquid_class_record ) - new_liquid_class_record = liquid_class_record.copy(deep=True) + new_liquid_class_record = liquid_class_record.model_copy(deep=True) new_liquid_class_record.aspirate.offset.x += 123 # make it different params = LoadLiquidClassParams( liquidClassId="liquid-class-1", liquidClassRecord=new_liquid_class_record diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_labware.py b/api/tests/opentrons/protocol_engine/commands/test_move_labware.py index 49e3c4f5471..2036bda558a 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_move_labware.py +++ b/api/tests/opentrons/protocol_engine/commands/test_move_labware.py @@ -1,4 +1,5 @@ """Test the ``moveLabware`` command.""" + from datetime import datetime import inspect from unittest.mock import sentinel @@ -6,13 +7,13 @@ import pytest from decoy import Decoy, matchers +from opentrons_shared_data.labware.labware_definition import Parameters, Dimensions from opentrons_shared_data.errors.exceptions import ( EnumeratedError, FailedGripperPickupError, LabwareDroppedError, StallOrCollisionDetectedError, ) -from opentrons_shared_data.labware.labware_definition import Parameters, Dimensions from opentrons_shared_data.gripper.constants import GRIPPER_PADDLE_WIDTH from opentrons.protocol_engine.state import update_types @@ -168,7 +169,7 @@ async def test_move_labware_implementation_on_labware( decoy.when( state_view.labware.get_definition(labware_id="my-cool-labware-id") ).then_return( - LabwareDefinition.construct(namespace="spacename") # type: ignore[call-arg] + LabwareDefinition.model_construct(namespace="spacename") # type: ignore[call-arg] ) decoy.when( state_view.geometry.ensure_location_not_occupied( @@ -189,7 +190,7 @@ async def test_move_labware_implementation_on_labware( "my-even-cooler-labware-id" ), state_view.labware.raise_if_labware_cannot_be_stacked( - LabwareDefinition.construct(namespace="spacename"), # type: ignore[call-arg] + LabwareDefinition.model_construct(namespace="spacename"), # type: ignore[call-arg] "my-even-cooler-labware-id", ), ) @@ -314,7 +315,7 @@ async def test_gripper_error( labware_namespace = "labware-namespace" labware_load_name = "load-name" labware_definition_uri = "opentrons-test/load-name/1" - labware_def = LabwareDefinition.construct( # type: ignore[call-arg] + labware_def = LabwareDefinition.model_construct( # type: ignore[call-arg] namespace=labware_namespace, ) original_location = DeckSlotLocation(slotName=DeckSlotName.SLOT_A1) @@ -324,7 +325,7 @@ async def test_gripper_error( # Common MoveLabwareImplementation boilerplate: decoy.when(state_view.labware.get_definition(labware_id=labware_id)).then_return( - LabwareDefinition.construct(namespace=labware_namespace) # type: ignore[call-arg] + LabwareDefinition.model_construct(namespace=labware_namespace) # type: ignore[call-arg] ) decoy.when(state_view.labware.get(labware_id=labware_id)).then_return( LoadedLabware( @@ -374,7 +375,7 @@ async def test_gripper_error( result = await subject.execute(params) assert result == DefinedErrorData( - public=GripperMovementError.construct( + public=GripperMovementError.model_construct( id=error_id, createdAt=error_created_at, errorCode=underlying_exception.code.value.code, @@ -462,7 +463,7 @@ async def test_gripper_move_to_waste_chute_implementation( pickUpOffset=LabwareOffsetVector(x=1, y=2, z=3), dropOffset=None, ) - labware_def = LabwareDefinition.construct( # type: ignore[call-arg] + labware_def = LabwareDefinition.model_construct( # type: ignore[call-arg] namespace="my-cool-namespace", dimensions=Dimensions( yDimension=labware_width, zDimension=labware_width, xDimension=labware_width @@ -670,8 +671,8 @@ async def test_move_labware_raises_when_moving_adapter_with_gripper( strategy=LabwareMovementStrategy.USING_GRIPPER, ) - definition = LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct(loadName="My cool adapter"), # type: ignore[call-arg] + definition = LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(loadName="My cool adapter"), # type: ignore[call-arg] ) decoy.when(state_view.labware.get(labware_id="my-cool-labware-id")).then_return( @@ -711,8 +712,8 @@ async def test_move_labware_raises_when_moving_labware_with_gripper_incompatible strategy=LabwareMovementStrategy.USING_GRIPPER, ) - definition = LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct(loadName="My cool labware"), # type: ignore[call-arg] + definition = LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(loadName="My cool labware"), # type: ignore[call-arg] ) decoy.when(state_view.labware.get(labware_id="my-cool-labware-id")).then_return( @@ -761,7 +762,7 @@ async def test_move_labware_with_gripper_raises_on_ot2( decoy.when( state_view.labware.get_definition(labware_id="my-cool-labware-id") ).then_return( - LabwareDefinition.construct(namespace="spacename") # type: ignore[call-arg] + LabwareDefinition.model_construct(namespace="spacename") # type: ignore[call-arg] ) decoy.when(state_view.config).then_return( @@ -783,8 +784,10 @@ async def test_move_labware_raises_when_moving_fixed_trash_labware( strategy=LabwareMovementStrategy.USING_GRIPPER, ) - definition = LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct(loadName="My cool labware", quirks=["fixedTrash"]), # type: ignore[call-arg] + definition = LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct( # type: ignore[call-arg] + loadName="My cool labware", quirks=["fixedTrash"] + ), ) decoy.when(state_view.labware.get(labware_id="my-cool-labware-id")).then_return( diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_relative.py b/api/tests/opentrons/protocol_engine/commands/test_move_relative.py index 1e2d98ebf21..7a993c16d35 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_move_relative.py +++ b/api/tests/opentrons/protocol_engine/commands/test_move_relative.py @@ -85,7 +85,7 @@ async def test_move_relative_stalls( result = await subject.execute(data) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=test_id, createdAt=timestamp, wrappedErrors=[matchers.Anything()] ), state_update=update_types.StateUpdate(pipette_location=update_types.CLEAR), diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area.py b/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area.py index 9142f792252..0570d91c8bc 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area.py +++ b/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area.py @@ -209,7 +209,7 @@ async def test_move_to_addressable_area_implementation_handles_stalls( result = await subject.execute(data) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=test_id, createdAt=timestamp, wrappedErrors=[matchers.Anything()] ), state_update=update_types.StateUpdate( diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area_for_drop_tip.py b/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area_for_drop_tip.py index b6ee2097458..e90bb7271f7 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area_for_drop_tip.py +++ b/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area_for_drop_tip.py @@ -133,7 +133,7 @@ async def test_move_to_addressable_area_for_drop_tip_handles_stalls( result = await subject.execute(data) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=test_id, createdAt=timestamp, wrappedErrors=[matchers.Anything()] ), state_update=update_types.StateUpdate( diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_to_coordinates.py b/api/tests/opentrons/protocol_engine/commands/test_move_to_coordinates.py index 85afb189988..3c9fc10bb1c 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_move_to_coordinates.py +++ b/api/tests/opentrons/protocol_engine/commands/test_move_to_coordinates.py @@ -97,7 +97,7 @@ async def test_move_to_coordinates_stall( result = await subject.execute(params=params) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=test_id, createdAt=timestamp, wrappedErrors=[matchers.Anything()] ), state_update=update_types.StateUpdate(pipette_location=update_types.CLEAR), diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_to_well.py b/api/tests/opentrons/protocol_engine/commands/test_move_to_well.py index db91abd5a41..56a2691bbee 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_move_to_well.py +++ b/api/tests/opentrons/protocol_engine/commands/test_move_to_well.py @@ -158,7 +158,7 @@ async def test_move_to_well_stall_defined_error( result = await subject.execute(data) assert isinstance(result, DefinedErrorData) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()] ), state_update=update_types.StateUpdate(pipette_location=update_types.CLEAR), diff --git a/api/tests/opentrons/protocol_engine/commands/test_pick_up_tip.py b/api/tests/opentrons/protocol_engine/commands/test_pick_up_tip.py index 07170e08288..d4c53ea5992 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_pick_up_tip.py +++ b/api/tests/opentrons/protocol_engine/commands/test_pick_up_tip.py @@ -167,7 +167,7 @@ async def test_tip_physically_missing_error( ) assert result == DefinedErrorData( - public=TipPhysicallyMissingError.construct( + public=TipPhysicallyMissingError.model_construct( id=error_id, createdAt=error_created_at, wrappedErrors=[matchers.Anything()] ), state_update=update_types.StateUpdate( @@ -255,7 +255,7 @@ async def test_stall_error( ) assert result == DefinedErrorData( - public=StallOrCollisionError.construct( + public=StallOrCollisionError.model_construct( id=error_id, createdAt=error_created_at, wrappedErrors=[matchers.Anything()] ), state_update=update_types.StateUpdate( diff --git a/api/tests/opentrons/protocol_engine/commands/test_prepare_to_aspirate.py b/api/tests/opentrons/protocol_engine/commands/test_prepare_to_aspirate.py index f9eded1ffa0..5e77529f646 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_prepare_to_aspirate.py +++ b/api/tests/opentrons/protocol_engine/commands/test_prepare_to_aspirate.py @@ -91,7 +91,7 @@ async def test_overpressure_error( result = await subject.execute(data) assert result == DefinedErrorData( - public=OverpressureError.construct( + public=OverpressureError.model_construct( id=error_id, createdAt=error_timestamp, wrappedErrors=[matchers.Anything()], diff --git a/api/tests/opentrons/protocol_engine/conftest.py b/api/tests/opentrons/protocol_engine/conftest.py index 76c5d754f3e..48ce28e7a98 100644 --- a/api/tests/opentrons/protocol_engine/conftest.py +++ b/api/tests/opentrons/protocol_engine/conftest.py @@ -78,7 +78,7 @@ def ot3_standard_deck_def() -> DeckDefinitionV5: @pytest.fixture(scope="session") def ot2_fixed_trash_def() -> LabwareDefinition: """Get the definition of the OT-2 standard fixed trash.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( load_definition("opentrons_1_trash_1100ml_fixed", 1) ) @@ -86,7 +86,7 @@ def ot2_fixed_trash_def() -> LabwareDefinition: @pytest.fixture(scope="session") def ot2_short_fixed_trash_def() -> LabwareDefinition: """Get the definition of the OT-2 short fixed trash.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( load_definition("opentrons_1_trash_850ml_fixed", 1) ) @@ -94,7 +94,7 @@ def ot2_short_fixed_trash_def() -> LabwareDefinition: @pytest.fixture(scope="session") def ot3_fixed_trash_def() -> LabwareDefinition: """Get the definition of the OT-3 fixed trash.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( load_definition("opentrons_1_trash_3200ml_fixed", 1) ) @@ -102,7 +102,7 @@ def ot3_fixed_trash_def() -> LabwareDefinition: @pytest.fixture(scope="session") def ot3_absorbance_reader_lid() -> LabwareDefinition: """Get the definition of the OT-3 plate reader lid.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( load_definition("opentrons_flex_lid_absorbance_plate_reader_module", 1) ) @@ -110,7 +110,7 @@ def ot3_absorbance_reader_lid() -> LabwareDefinition: @pytest.fixture(scope="session") def well_plate_def() -> LabwareDefinition: """Get the definition of a 96 well plate.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( load_definition("corning_96_wellplate_360ul_flat", 2) ) @@ -118,7 +118,7 @@ def well_plate_def() -> LabwareDefinition: @pytest.fixture(scope="session") def flex_50uL_tiprack() -> LabwareDefinition: """Get the definition of a Flex 50uL tiprack.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( load_definition("opentrons_flex_96_filtertiprack_50ul", 1) ) @@ -126,7 +126,7 @@ def flex_50uL_tiprack() -> LabwareDefinition: @pytest.fixture(scope="session") def adapter_plate_def() -> LabwareDefinition: """Get the definition of a h/s adapter plate.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( load_definition("opentrons_universal_flat_adapter", 1) ) @@ -134,25 +134,31 @@ def adapter_plate_def() -> LabwareDefinition: @pytest.fixture(scope="session") def reservoir_def() -> LabwareDefinition: """Get the definition of single-row reservoir.""" - return LabwareDefinition.parse_obj(load_definition("nest_12_reservoir_15ml", 1)) + return LabwareDefinition.model_validate( + load_definition("nest_12_reservoir_15ml", 1) + ) @pytest.fixture(scope="session") def tip_rack_def() -> LabwareDefinition: """Get the definition of Opentrons 300 uL tip rack.""" - return LabwareDefinition.parse_obj(load_definition("opentrons_96_tiprack_300ul", 1)) + return LabwareDefinition.model_validate( + load_definition("opentrons_96_tiprack_300ul", 1) + ) @pytest.fixture(scope="session") def adapter_def() -> LabwareDefinition: """Get the definition of Opentrons 96 PCR adapter.""" - return LabwareDefinition.parse_obj(load_definition("opentrons_96_pcr_adapter", 1)) + return LabwareDefinition.model_validate( + load_definition("opentrons_96_pcr_adapter", 1) + ) @pytest.fixture(scope="session") def falcon_tuberack_def() -> LabwareDefinition: """Get the definition of the 6-well Falcon tuberack.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( load_definition("opentrons_6_tuberack_falcon_50ml_conical", 1) ) @@ -160,7 +166,7 @@ def falcon_tuberack_def() -> LabwareDefinition: @pytest.fixture(scope="session") def magdeck_well_plate_def() -> LabwareDefinition: """Get the definition of a well place compatible with magdeck.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( load_definition("nest_96_wellplate_100ul_pcr_full_skirt", 1) ) @@ -169,63 +175,63 @@ def magdeck_well_plate_def() -> LabwareDefinition: def tempdeck_v1_def() -> ModuleDefinition: """Get the definition of a V1 tempdeck.""" definition = load_shared_data("module/definitions/3/temperatureModuleV1.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture(scope="session") def tempdeck_v2_def() -> ModuleDefinition: """Get the definition of a V2 tempdeck.""" definition = load_shared_data("module/definitions/3/temperatureModuleV2.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture(scope="session") def magdeck_v1_def() -> ModuleDefinition: """Get the definition of a V1 magdeck.""" definition = load_shared_data("module/definitions/3/magneticModuleV1.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture(scope="session") def magdeck_v2_def() -> ModuleDefinition: """Get the definition of a V2 magdeck.""" definition = load_shared_data("module/definitions/3/magneticModuleV2.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture(scope="session") def thermocycler_v1_def() -> ModuleDefinition: """Get the definition of a V2 thermocycler.""" definition = load_shared_data("module/definitions/3/thermocyclerModuleV1.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture(scope="session") def thermocycler_v2_def() -> ModuleDefinition: """Get the definition of a V2 thermocycler.""" definition = load_shared_data("module/definitions/3/thermocyclerModuleV2.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture(scope="session") def heater_shaker_v1_def() -> ModuleDefinition: """Get the definition of a V1 heater-shaker.""" definition = load_shared_data("module/definitions/3/heaterShakerModuleV1.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture(scope="session") def mag_block_v1_def() -> ModuleDefinition: """Get the definition of a V1 Mag Block.""" definition = load_shared_data("module/definitions/3/magneticBlockV1.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture(scope="session") def abs_reader_v1_def() -> ModuleDefinition: """Get the definition of a V1 absorbance plate reader.""" definition = load_shared_data("module/definitions/3/absorbanceReaderV1.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture(scope="session") diff --git a/api/tests/opentrons/protocol_engine/errors/test_error_occurrence.py b/api/tests/opentrons/protocol_engine/errors/test_error_occurrence.py index a2feb8261f7..531c2decc98 100644 --- a/api/tests/opentrons/protocol_engine/errors/test_error_occurrence.py +++ b/api/tests/opentrons/protocol_engine/errors/test_error_occurrence.py @@ -1,4 +1,5 @@ """Test ErrorOccurrence module.""" + import datetime from typing import List @@ -11,7 +12,7 @@ def test_error_occurrence_schema() -> None: This is explicitly tested because we are overriding the schema due to a default value for errorCode. """ - required_items: List[str] = ErrorOccurrence.schema()["definitions"][ + required_items: List[str] = ErrorOccurrence.model_json_schema()["$defs"][ "ErrorOccurrence" ]["required"] assert "errorCode" in required_items @@ -24,7 +25,7 @@ def test_parse_error_occurrence() -> None: """ input = '{"id": "abcdefg","errorType": "a bad one","createdAt": "2023-06-12 15:08:54.730451","detail": "This is a bad error"}' - result = ErrorOccurrence.parse_raw(input) + result = ErrorOccurrence.model_validate_json(input) expected = ErrorOccurrence( id="abcdefg", diff --git a/api/tests/opentrons/protocol_engine/execution/test_command_executor.py b/api/tests/opentrons/protocol_engine/execution/test_command_executor.py index eb84ceb018b..d838eaded87 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_command_executor.py +++ b/api/tests/opentrons/protocol_engine/execution/test_command_executor.py @@ -1,11 +1,12 @@ """Smoke tests for the CommandExecutor class.""" + import asyncio from datetime import datetime -from typing import Any, Optional, Type, Union, cast +from typing import Optional, Type, cast, Any, Union import pytest from decoy import Decoy, matchers -from pydantic import BaseModel +from pydantic import BaseModel, PrivateAttr from opentrons.hardware_control import HardwareControlAPI, OT2HardwareControlAPI @@ -13,6 +14,7 @@ from opentrons.protocol_engine.error_recovery_policy import ( ErrorRecoveryPolicy, ErrorRecoveryType, + never_recover, ) from opentrons.protocol_engine.errors.error_occurrence import ErrorOccurrence from opentrons.protocol_engine.errors.exceptions import ( @@ -253,6 +255,12 @@ async def test_execute( TestCommandImplCls = decoy.mock(func=_TestCommandImpl) command_impl = decoy.mock(cls=_TestCommandImpl) + # Note: private attrs (which are attrs that start with _) are instantiated via deep + # copy from a provided default in the model, so if + # _TestCommand()._ImplementationCls != _TestCommand._ImplementationCls.default if + # we provide a default. Therefore, provide a default factory, so we can always have + # the same object. + class _TestCommand( BaseCommand[_TestCommandParams, _TestCommandResult, ErrorOccurrence] ): @@ -260,14 +268,16 @@ class _TestCommand( params: _TestCommandParams result: Optional[_TestCommandResult] - _ImplementationCls: Type[_TestCommandImpl] = TestCommandImplCls + _ImplementationCls: Type[_TestCommandImpl] = PrivateAttr( + default_factory=lambda: TestCommandImplCls + ) command_params = _TestCommandParams() command_result = SuccessData(public=_TestCommandResult()) queued_command = cast( Command, - _TestCommand( + _TestCommand.model_construct( # type: ignore[call-arg] id="command-id", key="command-key", createdAt=datetime(year=2021, month=1, day=1), @@ -278,7 +288,7 @@ class _TestCommand( running_command = cast( Command, - _TestCommand( + _TestCommand.model_construct( # type: ignore[call-arg] id="command-id", key="command-key", createdAt=datetime(year=2021, month=1, day=1), @@ -299,7 +309,7 @@ class _TestCommand( expected_completed_command = cast( Command, - _TestCommand( + _TestCommand.model_construct( id="command-id", key="command-key", createdAt=datetime(year=2021, month=1, day=1), @@ -327,7 +337,6 @@ class _TestCommand( state_store.commands.get(command_id="command-id") ).then_return(running_command) ) - decoy.when( queued_command._ImplementationCls( state_view=state_store, @@ -358,6 +367,10 @@ class _TestCommand( datetime(year=2023, month=3, day=3), ) + decoy.when(state_store.commands.get_error_recovery_policy()).then_return( + never_recover + ) + await subject.execute("command-id") decoy.verify( @@ -421,13 +434,15 @@ class _TestCommand( params: _TestCommandParams result: Optional[_TestCommandResult] - _ImplementationCls: Type[_TestCommandImpl] = TestCommandImplCls + _ImplementationCls: Type[_TestCommandImpl] = PrivateAttr( + default_factory=lambda: TestCommandImplCls + ) command_params = _TestCommandParams() queued_command = cast( Command, - _TestCommand( + _TestCommand.model_construct( # type: ignore[call-arg] id="command-id", key="command-key", createdAt=datetime(year=2021, month=1, day=1), @@ -438,7 +453,7 @@ class _TestCommand( running_command = cast( Command, - _TestCommand( + _TestCommand.model_construct( # type: ignore[call-arg] id="command-id", key="command-key", createdAt=datetime(year=2021, month=1, day=1), @@ -556,7 +571,9 @@ class _TestCommand( params: _TestCommandParams result: Optional[_TestCommandResult] - _ImplementationCls: Type[_TestCommandImpl] = TestCommandImplCls + _ImplementationCls: Type[_TestCommandImpl] = PrivateAttr( + default_factory=lambda: TestCommandImplCls + ) command_params = _TestCommandParams() command_id = "command-id" @@ -569,7 +586,7 @@ class _TestCommand( ) queued_command = cast( Command, - _TestCommand( + _TestCommand.model_construct( # type: ignore[call-arg] id=command_id, key="command-key", createdAt=created_at, @@ -579,7 +596,7 @@ class _TestCommand( ) running_command = cast( Command, - _TestCommand( + _TestCommand.model_construct( # type: ignore[call-arg] id=command_id, key="command-key", createdAt=created_at, diff --git a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py index 39208184754..29117a894b5 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py @@ -1,4 +1,5 @@ """Test equipment command execution side effects.""" + import pytest from _pytest.fixtures import SubRequest import inspect @@ -648,7 +649,7 @@ async def test_load_pipette( decoy.when(state_store.config.use_virtual_pipettes).then_return(False) decoy.when(model_utils.generate_id()).then_return("unique-id") decoy.when(state_store.pipettes.get_by_mount(MountType.RIGHT)).then_return( - LoadedPipette.construct(pipetteName=PipetteNameType.P300_MULTI) # type: ignore[call-arg] + LoadedPipette.model_construct(pipetteName=PipetteNameType.P300_MULTI) # type: ignore[call-arg] ) decoy.when(hardware_api.get_attached_instrument(mount=HwMount.LEFT)).then_return( pipette_dict diff --git a/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py b/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py index 4e9a10fdfaa..23f701db80b 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py @@ -1,4 +1,5 @@ """Pipetting execution handler.""" + import pytest from decoy import Decoy, matchers @@ -51,7 +52,7 @@ def mock_labware_data_provider(decoy: Decoy) -> LabwareDataProvider: @pytest.fixture def tip_rack_definition() -> LabwareDefinition: """Get a tip rack defintion value object.""" - return LabwareDefinition.construct(namespace="test", version=42) # type: ignore[call-arg] + return LabwareDefinition.model_construct(namespace="test", version=42) # type: ignore[call-arg] MOCK_MAP = NozzleMap.build( diff --git a/api/tests/opentrons/protocol_engine/resources/test_labware_data_provider.py b/api/tests/opentrons/protocol_engine/resources/test_labware_data_provider.py index 92718c70d89..a666e7a697d 100644 --- a/api/tests/opentrons/protocol_engine/resources/test_labware_data_provider.py +++ b/api/tests/opentrons/protocol_engine/resources/test_labware_data_provider.py @@ -22,7 +22,7 @@ async def test_labware_data_gets_standard_definition() -> None: version=1, ) - assert result == LabwareDefinition.parse_obj(expected) + assert result == LabwareDefinition.model_validate(expected) async def test_labware_hash_match() -> None: @@ -38,9 +38,9 @@ async def test_labware_hash_match() -> None: version=1, ) - labware_model = LabwareDefinition.parse_obj(labware_dict) + labware_model = LabwareDefinition.model_validate(labware_dict) labware_model_dict = cast( - LabwareDefDict, labware_model.dict(exclude_none=True, exclude_unset=True) + LabwareDefDict, labware_model.model_dump(exclude_none=True, exclude_unset=True) ) assert hash_labware_def(labware_dict) == hash_labware_def(labware_model_dict) diff --git a/api/tests/opentrons/protocol_engine/resources/test_labware_validation.py b/api/tests/opentrons/protocol_engine/resources/test_labware_validation.py index 663aec7337f..fbe9d6c21a4 100644 --- a/api/tests/opentrons/protocol_engine/resources/test_labware_validation.py +++ b/api/tests/opentrons/protocol_engine/resources/test_labware_validation.py @@ -14,9 +14,18 @@ @pytest.mark.parametrize( ("definition", "expected_result"), [ - (LabwareDefinition.construct(allowedRoles=[LabwareRole.labware]), True), # type: ignore[call-arg] - (LabwareDefinition.construct(allowedRoles=[]), True), # type: ignore[call-arg] - (LabwareDefinition.construct(allowedRoles=[LabwareRole.adapter]), False), # type: ignore[call-arg] + ( + LabwareDefinition.model_construct(allowedRoles=[LabwareRole.labware]), # type: ignore[call-arg] + True, + ), + ( + LabwareDefinition.model_construct(allowedRoles=[]), # type: ignore[call-arg] + True, + ), + ( + LabwareDefinition.model_construct(allowedRoles=[LabwareRole.adapter]), # type: ignore[call-arg] + False, + ), ], ) def test_validate_definition_is_labware( @@ -29,9 +38,18 @@ def test_validate_definition_is_labware( @pytest.mark.parametrize( ("definition", "expected_result"), [ - (LabwareDefinition.construct(allowedRoles=[LabwareRole.adapter]), True), # type: ignore[call-arg] - (LabwareDefinition.construct(allowedRoles=[]), False), # type: ignore[call-arg] - (LabwareDefinition.construct(allowedRoles=[LabwareRole.labware]), False), # type: ignore[call-arg] + ( + LabwareDefinition.model_construct(allowedRoles=[LabwareRole.adapter]), # type: ignore[call-arg] + True, + ), + ( + LabwareDefinition.model_construct(allowedRoles=[]), # type: ignore[call-arg] + False, + ), + ( + LabwareDefinition.model_construct(allowedRoles=[LabwareRole.labware]), # type: ignore[call-arg] + False, + ), ], ) def test_validate_definition_is_adapter( @@ -44,9 +62,22 @@ def test_validate_definition_is_adapter( @pytest.mark.parametrize( ("definition", "expected_result"), [ - (LabwareDefinition.construct(stackingOffsetWithLabware={"labware123": OverlapOffset(x=4, y=5, z=6)}), True), # type: ignore[call-arg] - (LabwareDefinition.construct(stackingOffsetWithLabware={"labwareXYZ": OverlapOffset(x=4, y=5, z=6)}), False), # type: ignore[call-arg] - (LabwareDefinition.construct(stackingOffsetWithLabware={}), False), # type: ignore[call-arg] + ( + LabwareDefinition.model_construct( # type: ignore[call-arg] + stackingOffsetWithLabware={"labware123": OverlapOffset(x=4, y=5, z=6)} + ), + True, + ), + ( + LabwareDefinition.model_construct( # type: ignore[call-arg] + stackingOffsetWithLabware={"labwareXYZ": OverlapOffset(x=4, y=5, z=6)} + ), + False, + ), + ( + LabwareDefinition.model_construct(stackingOffsetWithLabware={}), # type: ignore[call-arg] + False, + ), ], ) def test_validate_labware_can_be_stacked( @@ -62,9 +93,24 @@ def test_validate_labware_can_be_stacked( @pytest.mark.parametrize( ("definition", "expected_result"), [ - (LabwareDefinition.construct(parameters=Parameters.construct(quirks=None)), True), # type: ignore[call-arg] - (LabwareDefinition.construct(parameters=Parameters.construct(quirks=["foo"])), True), # type: ignore[call-arg] - (LabwareDefinition.construct(parameters=Parameters.construct(quirks=["gripperIncompatible"])), False), # type: ignore[call-arg] + ( + LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(quirks=None) # type: ignore[call-arg] + ), + True, + ), + ( + LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(quirks=["foo"]) # type: ignore[call-arg] + ), + True, + ), + ( + LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(quirks=["gripperIncompatible"]) # type: ignore[call-arg] + ), + False, + ), ], ) def test_validate_gripper_compatible( diff --git a/api/tests/opentrons/protocol_engine/state/command_fixtures.py b/api/tests/opentrons/protocol_engine/state/command_fixtures.py index 5ac522095f2..31f06858b53 100644 --- a/api/tests/opentrons/protocol_engine/state/command_fixtures.py +++ b/api/tests/opentrons/protocol_engine/state/command_fixtures.py @@ -1,4 +1,5 @@ """Command factories to use in tests as data fixtures.""" + from datetime import datetime from pydantic import BaseModel from typing import Optional, cast, Dict @@ -21,6 +22,12 @@ ) +class FixtureModel(BaseModel): + """Fixture Model.""" + + ... + + def create_queued_command( command_id: str = "command-id", command_key: str = "command-key", @@ -29,6 +36,10 @@ def create_queued_command( params: Optional[BaseModel] = None, ) -> cmd.Command: """Given command data, build a pending command model.""" + + class DummyParams(BaseModel): + pass + return cast( cmd.Command, cmd.BaseCommand( @@ -37,7 +48,7 @@ def create_queued_command( commandType=command_type, createdAt=datetime(year=2021, month=1, day=1), status=cmd.CommandStatus.QUEUED, - params=params or BaseModel(), + params=params or DummyParams(), intent=intent, ), ) @@ -59,7 +70,7 @@ def create_running_command( createdAt=created_at, commandType=command_type, status=cmd.CommandStatus.RUNNING, - params=params or BaseModel(), + params=params or FixtureModel(), ), ) @@ -84,7 +95,7 @@ def create_failed_command( completedAt=completed_at, commandType=command_type, status=cmd.CommandStatus.FAILED, - params=params or BaseModel(), + params=params or FixtureModel(), error=error, intent=intent, ), @@ -108,8 +119,8 @@ def create_succeeded_command( createdAt=created_at, commandType=command_type, status=cmd.CommandStatus.SUCCEEDED, - params=params or BaseModel(), - result=result or BaseModel(), + params=params or FixtureModel(), + result=result or FixtureModel(), ), ) @@ -193,7 +204,7 @@ def create_load_module_command( moduleId=module_id, model=model, serialNumber=None, - definition=ModuleDefinition.construct(), # type: ignore[call-arg] + definition=ModuleDefinition.model_construct(), # type: ignore[call-arg] ) return cmd.LoadModule( diff --git a/api/tests/opentrons/protocol_engine/state/test_addressable_area_store_old.py b/api/tests/opentrons/protocol_engine/state/test_addressable_area_store_old.py index 1bbccf96d42..b04237c702d 100644 --- a/api/tests/opentrons/protocol_engine/state/test_addressable_area_store_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_addressable_area_store_old.py @@ -45,7 +45,7 @@ def _make_deck_config() -> DeckConfigurationType: def _dummy_command() -> Command: """Return a placeholder command.""" - return Comment.construct() # type: ignore[call-arg] + return Comment.model_construct() # type: ignore[call-arg] @pytest.fixture diff --git a/api/tests/opentrons/protocol_engine/state/test_command_history.py b/api/tests/opentrons/protocol_engine/state/test_command_history.py index 14eaa2a42f3..fabf17e26d1 100644 --- a/api/tests/opentrons/protocol_engine/state/test_command_history.py +++ b/api/tests/opentrons/protocol_engine/state/test_command_history.py @@ -202,13 +202,13 @@ def test_set_fixit_running_command_id(command_history: CommandHistory) -> None: """It should set the ID of the currently running fixit command.""" command_entry = create_queued_command() command_history.append_queued_command(command_entry) - running_command = command_entry.copy( + running_command = command_entry.model_copy( update={ "status": CommandStatus.RUNNING, } ) command_history.set_command_running(running_command) - finished_command = command_entry.copy( + finished_command = command_entry.model_copy( update={ "status": CommandStatus.SUCCEEDED, } @@ -218,7 +218,7 @@ def test_set_fixit_running_command_id(command_history: CommandHistory) -> None: command_id="fixit-id", intent=CommandIntent.FIXIT ) command_history.append_queued_command(fixit_command_entry) - fixit_running_command = fixit_command_entry.copy( + fixit_running_command = fixit_command_entry.model_copy( update={ "status": CommandStatus.RUNNING, } diff --git a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py index b145458649d..fda32a56ce0 100644 --- a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py @@ -1,4 +1,5 @@ """Test state getters for retrieving geometry views of state.""" + import inspect import json from datetime import datetime @@ -257,7 +258,7 @@ def addressable_area_view( @pytest.fixture def nice_labware_definition() -> LabwareDefinition: """Load a nice labware def that won't blow up your terminal.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( json.loads( load_shared_data("labware/fixtures/2/fixture_12_trough_v2.json").decode( "utf-8" @@ -269,7 +270,7 @@ def nice_labware_definition() -> LabwareDefinition: @pytest.fixture def nice_adapter_definition() -> LabwareDefinition: """Load a friendly adapter definition.""" - return LabwareDefinition.parse_obj( + return LabwareDefinition.model_validate( json.loads( load_shared_data( "labware/definitions/2/opentrons_aluminum_flat_bottom_plate/1.json" @@ -849,8 +850,8 @@ def test_get_all_obstacle_highest_z_with_modules( subject: GeometryView, ) -> None: """It should get the highest Z including modules.""" - module_1 = LoadedModule.construct(id="module-id-1") # type: ignore[call-arg] - module_2 = LoadedModule.construct(id="module-id-2") # type: ignore[call-arg] + module_1 = LoadedModule.model_construct(id="module-id-1") # type: ignore[call-arg] + module_2 = LoadedModule.model_construct(id="module-id-2") # type: ignore[call-arg] decoy.when(mock_labware_view.get_all()).then_return([]) decoy.when(mock_addressable_area_view.get_all()).then_return([]) @@ -939,7 +940,7 @@ def test_get_highest_z_in_slot_with_single_module( ) -> None: """It should get the highest Z in slot with just a single module.""" # Case: Slot has a module that doesn't have any labware on it. Highest z is equal to module height. - module_in_slot = LoadedModule.construct( + module_in_slot = LoadedModule.model_construct( id="only-module", model=ModuleModel.THERMOCYCLER_MODULE_V2, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_4), @@ -1094,7 +1095,7 @@ def test_get_highest_z_in_slot_with_labware_stack_on_module( location=ModuleLocation(moduleId="module-id"), offsetId="offset-id2", ) - module_on_slot = LoadedModule.construct( + module_on_slot = LoadedModule.model_construct( id="module-id", model=ModuleModel.THERMOCYCLER_MODULE_V2, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_4), @@ -1982,7 +1983,7 @@ def test_get_relative_well_location( assert result == WellLocation( origin=WellOrigin.TOP, - offset=WellOffset.construct( + offset=WellOffset.model_construct( x=cast(float, pytest.approx(7)), y=cast(float, pytest.approx(8)), z=cast(float, pytest.approx(9)), @@ -2007,7 +2008,7 @@ def test_get_relative_liquid_handling_well_location( assert result == LiquidHandlingWellLocation( origin=WellOrigin.MENISCUS, - offset=WellOffset.construct( + offset=WellOffset.model_construct( x=0.0, y=0.0, z=cast(float, pytest.approx(-2)), @@ -2457,8 +2458,8 @@ def test_get_slot_item( subject: GeometryView, ) -> None: """It should get items in certain slots.""" - labware = LoadedLabware.construct(id="cool-labware") # type: ignore[call-arg] - module = LoadedModule.construct(id="cool-module") # type: ignore[call-arg] + labware = LoadedLabware.model_construct(id="cool-labware") # type: ignore[call-arg] + module = LoadedModule.model_construct(id="cool-module") # type: ignore[call-arg] decoy.when(mock_labware_view.get_by_slot(DeckSlotName.SLOT_1)).then_return(None) decoy.when(mock_labware_view.get_by_slot(DeckSlotName.SLOT_2)).then_return(labware) @@ -2485,7 +2486,7 @@ def test_get_slot_item_that_is_overflowed_module( subject: GeometryView, ) -> None: """It should return the module that occupies the slot, even if not loaded on it.""" - module = LoadedModule.construct(id="cool-module") # type: ignore[call-arg] + module = LoadedModule.model_construct(id="cool-module") # type: ignore[call-arg] decoy.when(mock_labware_view.get_by_slot(DeckSlotName.SLOT_3)).then_return(None) decoy.when(mock_module_view.get_by_slot(DeckSlotName.SLOT_3)).then_return(None) decoy.when( @@ -2901,19 +2902,19 @@ def test_check_gripper_labware_tip_collision( ) ) - definition = LabwareDefinition.construct( # type: ignore[call-arg] + definition = LabwareDefinition.model_construct( # type: ignore[call-arg] namespace="hello", - dimensions=LabwareDimensions.construct( + dimensions=LabwareDimensions.model_construct( yDimension=1, zDimension=2, xDimension=3 ), version=1, - parameters=LabwareDefinitionParameters.construct( + parameters=LabwareDefinitionParameters.model_construct( format="96Standard", loadName="labware-id", isTiprack=True, isMagneticModuleCompatible=False, ), - cornerOffsetFromSlot=CornerOffsetFromSlot.construct(x=1, y=2, z=3), + cornerOffsetFromSlot=CornerOffsetFromSlot.model_construct(x=1, y=2, z=3), ordering=[], ) diff --git a/api/tests/opentrons/protocol_engine/state/test_labware_view_old.py b/api/tests/opentrons/protocol_engine/state/test_labware_view_old.py index 0b6886040c6..ac92d5e5eaf 100644 --- a/api/tests/opentrons/protocol_engine/state/test_labware_view_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_labware_view_old.py @@ -261,13 +261,13 @@ def test_find_custom_labware_params( namespace: Optional[str], version: Optional[int] ) -> None: """It should find the missing (if any) load labware parameters.""" - labware_def = LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct(loadName="hello"), # type: ignore[call-arg] + labware_def = LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(loadName="hello"), # type: ignore[call-arg] namespace="world", version=123, ) - standard_def = LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct(loadName="goodbye"), # type: ignore[call-arg] + standard_def = LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(loadName="goodbye"), # type: ignore[call-arg] namespace="opentrons", version=456, ) @@ -551,12 +551,12 @@ def test_validate_liquid_allowed_raises_incompatible_labware() -> None: ), }, definitions_by_uri={ - "some-tiprack-uri": LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct(isTiprack=True), # type: ignore[call-arg] + "some-tiprack-uri": LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(isTiprack=True), # type: ignore[call-arg] wells={}, ), - "some-adapter-uri": LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct(isTiprack=False), # type: ignore[call-arg] + "some-adapter-uri": LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(isTiprack=False), # type: ignore[call-arg] allowedRoles=[LabwareRole.adapter], wells={}, ), @@ -598,8 +598,8 @@ def test_get_tip_length_gets_length_from_definition( def test_get_tip_drop_z_offset() -> None: """It should get a tip drop z offset by scaling the tip length.""" - tip_rack_def = LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct( # type: ignore[call-arg] + tip_rack_def = LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct( # type: ignore[call-arg] tipLength=100, ) ) @@ -693,7 +693,7 @@ def test_get_labware_overlap_offsets() -> None: """It should get the labware overlap offsets.""" subject = get_labware_view() result = subject.get_labware_overlap_offsets( - definition=LabwareDefinition.construct( # type: ignore[call-arg] + definition=LabwareDefinition.model_construct( # type: ignore[call-arg] stackingOffsetWithLabware={ "bottom-labware-name": SharedDataOverlapOffset(x=1, y=2, z=3) } @@ -779,7 +779,7 @@ def test_get_module_overlap_offsets( deck_definition=spec_deck_definition, ) result = subject.get_module_overlap_offsets( - definition=LabwareDefinition.construct( # type: ignore[call-arg] + definition=LabwareDefinition.model_construct( # type: ignore[call-arg] stackingOffsetWithModule=stacking_offset_with_module ), module_model=module_model, @@ -1131,13 +1131,13 @@ def test_raise_if_labware_in_location( def test_get_by_slot() -> None: """It should get the labware in a given slot.""" - labware_1 = LoadedLabware.construct( # type: ignore[call-arg] + labware_1 = LoadedLabware.model_construct( # type: ignore[call-arg] id="1", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1) ) - labware_2 = LoadedLabware.construct( # type: ignore[call-arg] + labware_2 = LoadedLabware.model_construct( # type: ignore[call-arg] id="2", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_2) ) - labware_3 = LoadedLabware.construct( # type: ignore[call-arg] + labware_3 = LoadedLabware.model_construct( # type: ignore[call-arg] id="3", location=ModuleLocation(moduleId="cool-module") ) @@ -1183,7 +1183,7 @@ def test_get_edge_path_type( offsetId=None, ) - labware_def = LabwareDefinition.construct( # type: ignore[call-arg] + labware_def = LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[["abc", "def"], ["ghi", "jkl"], ["mno", "pqr"]] ) @@ -1307,10 +1307,8 @@ def test_raise_if_labware_cannot_be_stacked_is_adapter() -> None: errors.LabwareCannotBeStackedError, match="defined as an adapter" ): subject.raise_if_labware_cannot_be_stacked( - top_labware_definition=LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct( # type: ignore[call-arg] - loadName="name" - ), + top_labware_definition=LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(loadName="name"), # type: ignore[call-arg] allowedRoles=[LabwareRole.adapter], ), bottom_labware_id="labware-id", @@ -1334,10 +1332,8 @@ def test_raise_if_labware_cannot_be_stacked_not_validated() -> None: errors.LabwareCannotBeStackedError, match="loaded onto labware test" ): subject.raise_if_labware_cannot_be_stacked( - top_labware_definition=LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct( # type: ignore[call-arg] - loadName="name" - ), + top_labware_definition=LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(loadName="name"), # type: ignore[call-arg] stackingOffsetWithLabware={}, ), bottom_labware_id="labware-id", @@ -1356,7 +1352,7 @@ def test_raise_if_labware_cannot_be_stacked_on_module_not_adapter() -> None: ) }, definitions_by_uri={ - "def-uri": LabwareDefinition.construct( # type: ignore[call-arg] + "def-uri": LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=[LabwareRole.labware] ) }, @@ -1364,10 +1360,8 @@ def test_raise_if_labware_cannot_be_stacked_on_module_not_adapter() -> None: with pytest.raises(errors.LabwareCannotBeStackedError, match="module"): subject.raise_if_labware_cannot_be_stacked( - top_labware_definition=LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct( # type: ignore[call-arg] - loadName="name" - ), + top_labware_definition=LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(loadName="name"), # type: ignore[call-arg] stackingOffsetWithLabware={ "test": SharedDataOverlapOffset(x=0, y=0, z=0) }, @@ -1394,10 +1388,10 @@ def test_raise_if_labware_cannot_be_stacked_on_labware_on_adapter() -> None: ), }, definitions_by_uri={ - "def-uri-1": LabwareDefinition.construct( # type: ignore[call-arg] + "def-uri-1": LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=[LabwareRole.labware] ), - "def-uri-2": LabwareDefinition.construct( # type: ignore[call-arg] + "def-uri-2": LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=[LabwareRole.adapter] ), }, @@ -1407,10 +1401,8 @@ def test_raise_if_labware_cannot_be_stacked_on_labware_on_adapter() -> None: errors.LabwareCannotBeStackedError, match="cannot be loaded to stack" ): subject.raise_if_labware_cannot_be_stacked( - top_labware_definition=LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct( # type: ignore[call-arg] - loadName="name" - ), + top_labware_definition=LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct(loadName="name"), # type: ignore[call-arg] stackingOffsetWithLabware={ "test": SharedDataOverlapOffset(x=0, y=0, z=0) }, @@ -1422,25 +1414,25 @@ def test_raise_if_labware_cannot_be_stacked_on_labware_on_adapter() -> None: @pytest.mark.parametrize( argnames=[ "allowed_roles", - "stacking_quirks", + "stack_limit", "exception", ], argvalues=[ [ [LabwareRole.labware], - [], + 1, pytest.raises(errors.LabwareCannotBeStackedError), ], [ [LabwareRole.lid], - ["stackingMaxFive"], + 5, does_not_raise(), ], ], ) def test_labware_stacking_height_passes_or_raises( allowed_roles: List[LabwareRole], - stacking_quirks: List[str], + stack_limit: int, exception: ContextManager[None], ) -> None: """It should raise if the labware is stacked too high, and pass if the labware definition allowed this.""" @@ -1472,25 +1464,24 @@ def test_labware_stacking_height_passes_or_raises( ), }, definitions_by_uri={ - "def-uri-1": LabwareDefinition.construct( # type: ignore[call-arg] + "def-uri-1": LabwareDefinition.model_construct( # type: ignore[call-arg] allowedRoles=allowed_roles, - parameters=Parameters.construct( + parameters=Parameters.model_construct( format="irregular", - quirks=stacking_quirks, isTiprack=False, loadName="name", isMagneticModuleCompatible=False, ), + stackLimit=stack_limit, ) }, ) with exception: subject.raise_if_labware_cannot_be_stacked( - top_labware_definition=LabwareDefinition.construct( # type: ignore[call-arg] - parameters=Parameters.construct( + top_labware_definition=LabwareDefinition.model_construct( # type: ignore[call-arg] + parameters=Parameters.model_construct( format="irregular", - quirks=stacking_quirks, isTiprack=False, loadName="name", isMagneticModuleCompatible=False, @@ -1498,6 +1489,7 @@ def test_labware_stacking_height_passes_or_raises( stackingOffsetWithLabware={ "test": SharedDataOverlapOffset(x=0, y=0, z=0) }, + stackLimit=stack_limit, ), bottom_labware_id="labware-id4", ) @@ -1554,7 +1546,7 @@ def test_get_labware_gripper_offsets_default_no_slots( ) }, definitions_by_uri={ - "some-labware-uri": LabwareDefinition.construct( # type: ignore[call-arg] + "some-labware-uri": LabwareDefinition.model_construct( # type: ignore[call-arg] gripperOffsets={ "default": GripperOffsets( pickUpOffset=OffsetVector(x=1, y=2, z=3), @@ -1618,7 +1610,7 @@ def test_calculates_well_bounding_box( labware_to_check: str, well_bbox: Dimensions ) -> None: """It should be able to calculate well bounding boxes.""" - definition = LabwareDefinition.parse_obj(load_definition(labware_to_check, 1)) + definition = LabwareDefinition.model_validate(load_definition(labware_to_check, 1)) subject = get_labware_view() assert subject.get_well_bbox(definition).x == pytest.approx(well_bbox.x) assert subject.get_well_bbox(definition).y == pytest.approx(well_bbox.y) diff --git a/api/tests/opentrons/protocol_engine/state/test_liquid_class_store_old.py b/api/tests/opentrons/protocol_engine/state/test_liquid_class_store_old.py index 57397ec61cb..9d910d9495a 100644 --- a/api/tests/opentrons/protocol_engine/state/test_liquid_class_store_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_liquid_class_store_old.py @@ -39,7 +39,7 @@ def test_handles_add_liquid_class( subject.handle_action( actions.SucceedCommandAction( - command=LoadLiquidClass.construct(), # type: ignore[call-arg] + command=LoadLiquidClass.model_construct(), # type: ignore[call-arg] state_update=update_types.StateUpdate( liquid_class_loaded=update_types.LiquidClassLoadedUpdate( liquid_class_id="liquid-class-id", diff --git a/api/tests/opentrons/protocol_engine/state/test_module_store_old.py b/api/tests/opentrons/protocol_engine/state/test_module_store_old.py index e4ab52ebaf8..4767ecad16b 100644 --- a/api/tests/opentrons/protocol_engine/state/test_module_store_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_module_store_old.py @@ -202,7 +202,7 @@ def test_load_module( ) -> None: """It should handle a successful LoadModule command.""" action = actions.SucceedCommandAction( - command=commands.LoadModule.construct( # type: ignore[call-arg] + command=commands.LoadModule.model_construct( # type: ignore[call-arg] params=commands.LoadModuleParams( model=params_model, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), @@ -265,7 +265,7 @@ def test_load_thermocycler_in_thermocycler_slot( ) -> None: """It should update additional slots for thermocycler module.""" action = actions.SucceedCommandAction( - command=commands.LoadModule.construct( # type: ignore[call-arg] + command=commands.LoadModule.model_construct( # type: ignore[call-arg] params=commands.LoadModuleParams( model=ModuleModel.THERMOCYCLER_MODULE_V2, location=DeckSlotLocation(slotName=tc_slot), @@ -389,7 +389,7 @@ def test_add_module_action( def test_handle_hs_temperature_commands(heater_shaker_v1_def: ModuleDefinition) -> None: """It should update `plate_target_temperature` correctly.""" - load_module_cmd = commands.LoadModule.construct( # type: ignore[call-arg] + load_module_cmd = commands.LoadModule.model_construct( # type: ignore[call-arg] params=commands.LoadModuleParams( model=ModuleModel.HEATER_SHAKER_MODULE_V1, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), @@ -401,11 +401,11 @@ def test_handle_hs_temperature_commands(heater_shaker_v1_def: ModuleDefinition) definition=heater_shaker_v1_def, ), ) - set_temp_cmd = hs_commands.SetTargetTemperature.construct( # type: ignore[call-arg] + set_temp_cmd = hs_commands.SetTargetTemperature.model_construct( # type: ignore[call-arg] params=hs_commands.SetTargetTemperatureParams(moduleId="module-id", celsius=42), result=hs_commands.SetTargetTemperatureResult(), ) - deactivate_cmd = hs_commands.DeactivateHeater.construct( # type: ignore[call-arg] + deactivate_cmd = hs_commands.DeactivateHeater.model_construct( # type: ignore[call-arg] params=hs_commands.DeactivateHeaterParams(moduleId="module-id"), result=hs_commands.DeactivateHeaterResult(), ) @@ -437,7 +437,7 @@ def test_handle_hs_temperature_commands(heater_shaker_v1_def: ModuleDefinition) def test_handle_hs_shake_commands(heater_shaker_v1_def: ModuleDefinition) -> None: """It should update heater-shaker's `is_plate_shaking` correctly.""" - load_module_cmd = commands.LoadModule.construct( # type: ignore[call-arg] + load_module_cmd = commands.LoadModule.model_construct( # type: ignore[call-arg] params=commands.LoadModuleParams( model=ModuleModel.HEATER_SHAKER_MODULE_V1, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), @@ -449,11 +449,11 @@ def test_handle_hs_shake_commands(heater_shaker_v1_def: ModuleDefinition) -> Non definition=heater_shaker_v1_def, ), ) - set_shake_cmd = hs_commands.SetAndWaitForShakeSpeed.construct( # type: ignore[call-arg] + set_shake_cmd = hs_commands.SetAndWaitForShakeSpeed.model_construct( # type: ignore[call-arg] params=hs_commands.SetAndWaitForShakeSpeedParams(moduleId="module-id", rpm=111), result=hs_commands.SetAndWaitForShakeSpeedResult(pipetteRetracted=False), ) - deactivate_cmd = hs_commands.DeactivateShaker.construct( # type: ignore[call-arg] + deactivate_cmd = hs_commands.DeactivateShaker.model_construct( # type: ignore[call-arg] params=hs_commands.DeactivateShakerParams(moduleId="module-id"), result=hs_commands.DeactivateShakerResult(), ) @@ -487,7 +487,7 @@ def test_handle_hs_labware_latch_commands( heater_shaker_v1_def: ModuleDefinition, ) -> None: """It should update heater-shaker's `is_labware_latch_closed` correctly.""" - load_module_cmd = commands.LoadModule.construct( # type: ignore[call-arg] + load_module_cmd = commands.LoadModule.model_construct( # type: ignore[call-arg] params=commands.LoadModuleParams( model=ModuleModel.HEATER_SHAKER_MODULE_V1, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), @@ -499,11 +499,11 @@ def test_handle_hs_labware_latch_commands( definition=heater_shaker_v1_def, ), ) - close_latch_cmd = hs_commands.CloseLabwareLatch.construct( # type: ignore[call-arg] + close_latch_cmd = hs_commands.CloseLabwareLatch.model_construct( # type: ignore[call-arg] params=hs_commands.CloseLabwareLatchParams(moduleId="module-id"), result=hs_commands.CloseLabwareLatchResult(), ) - open_latch_cmd = hs_commands.OpenLabwareLatch.construct( # type: ignore[call-arg] + open_latch_cmd = hs_commands.OpenLabwareLatch.model_construct( # type: ignore[call-arg] params=hs_commands.OpenLabwareLatchParams(moduleId="module-id"), result=hs_commands.OpenLabwareLatchResult(pipetteRetracted=False), ) @@ -546,7 +546,7 @@ def test_handle_tempdeck_temperature_commands( tempdeck_v2_def: ModuleDefinition, ) -> None: """It should update Tempdeck's `plate_target_temperature` correctly.""" - load_module_cmd = commands.LoadModule.construct( # type: ignore[call-arg] + load_module_cmd = commands.LoadModule.model_construct( # type: ignore[call-arg] params=commands.LoadModuleParams( model=ModuleModel.TEMPERATURE_MODULE_V2, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), @@ -558,13 +558,13 @@ def test_handle_tempdeck_temperature_commands( definition=tempdeck_v2_def, ), ) - set_temp_cmd = temp_commands.SetTargetTemperature.construct( # type: ignore[call-arg] + set_temp_cmd = temp_commands.SetTargetTemperature.model_construct( # type: ignore[call-arg] params=temp_commands.SetTargetTemperatureParams( moduleId="module-id", celsius=42.4 ), result=temp_commands.SetTargetTemperatureResult(targetTemperature=42), ) - deactivate_cmd = temp_commands.DeactivateTemperature.construct( # type: ignore[call-arg] + deactivate_cmd = temp_commands.DeactivateTemperature.model_construct( # type: ignore[call-arg] params=temp_commands.DeactivateTemperatureParams(moduleId="module-id"), result=temp_commands.DeactivateTemperatureResult(), ) @@ -592,7 +592,7 @@ def test_handle_thermocycler_temperature_commands( thermocycler_v1_def: ModuleDefinition, ) -> None: """It should update thermocycler's temperature statuses correctly.""" - load_module_cmd = commands.LoadModule.construct( # type: ignore[call-arg] + load_module_cmd = commands.LoadModule.model_construct( # type: ignore[call-arg] params=commands.LoadModuleParams( model=ModuleModel.THERMOCYCLER_MODULE_V1, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), @@ -604,23 +604,23 @@ def test_handle_thermocycler_temperature_commands( definition=thermocycler_v1_def, ), ) - set_block_temp_cmd = tc_commands.SetTargetBlockTemperature.construct( # type: ignore[call-arg] + set_block_temp_cmd = tc_commands.SetTargetBlockTemperature.model_construct( # type: ignore[call-arg] params=tc_commands.SetTargetBlockTemperatureParams( moduleId="module-id", celsius=42.4 ), result=tc_commands.SetTargetBlockTemperatureResult(targetBlockTemperature=42.4), ) - deactivate_block_cmd = tc_commands.DeactivateBlock.construct( # type: ignore[call-arg] + deactivate_block_cmd = tc_commands.DeactivateBlock.model_construct( # type: ignore[call-arg] params=tc_commands.DeactivateBlockParams(moduleId="module-id"), result=tc_commands.DeactivateBlockResult(), ) - set_lid_temp_cmd = tc_commands.SetTargetLidTemperature.construct( # type: ignore[call-arg] + set_lid_temp_cmd = tc_commands.SetTargetLidTemperature.model_construct( # type: ignore[call-arg] params=tc_commands.SetTargetLidTemperatureParams( moduleId="module-id", celsius=35.3 ), result=tc_commands.SetTargetLidTemperatureResult(targetLidTemperature=35.3), ) - deactivate_lid_cmd = tc_commands.DeactivateLid.construct( # type: ignore[call-arg] + deactivate_lid_cmd = tc_commands.DeactivateLid.model_construct( # type: ignore[call-arg] params=tc_commands.DeactivateLidParams(moduleId="module-id"), result=tc_commands.DeactivateLidResult(), ) @@ -672,7 +672,7 @@ def test_handle_thermocycler_lid_commands( thermocycler_v1_def: ModuleDefinition, ) -> None: """It should update thermocycler's lid status after executing lid commands.""" - load_module_cmd = commands.LoadModule.construct( # type: ignore[call-arg] + load_module_cmd = commands.LoadModule.model_construct( # type: ignore[call-arg] params=commands.LoadModuleParams( model=ModuleModel.THERMOCYCLER_MODULE_V1, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), @@ -685,11 +685,11 @@ def test_handle_thermocycler_lid_commands( ), ) - open_lid_cmd = tc_commands.OpenLid.construct( # type: ignore[call-arg] + open_lid_cmd = tc_commands.OpenLid.model_construct( # type: ignore[call-arg] params=tc_commands.OpenLidParams(moduleId="module-id"), result=tc_commands.OpenLidResult(), ) - close_lid_cmd = tc_commands.CloseLid.construct( # type: ignore[call-arg] + close_lid_cmd = tc_commands.CloseLid.model_construct( # type: ignore[call-arg] params=tc_commands.CloseLidParams(moduleId="module-id"), result=tc_commands.CloseLidResult(), ) diff --git a/api/tests/opentrons/protocol_engine/state/test_module_view_old.py b/api/tests/opentrons/protocol_engine/state/test_module_view_old.py index 3902eedc76f..65e1a467977 100644 --- a/api/tests/opentrons/protocol_engine/state/test_module_view_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_module_view_old.py @@ -149,7 +149,7 @@ def get_sample_parent_module_view( ) -> ModuleView: """Get a ModuleView with attached modules including a requested matching module.""" definition = load_shared_data("module/definitions/2/magneticModuleV1.json") - magdeck_def = ModuleDefinition.parse_raw(definition) + magdeck_def = ModuleDefinition.model_validate_json(definition) return make_module_view( slot_by_module_id={ @@ -1735,13 +1735,13 @@ def test_get_by_slot() -> None: hardware_by_module_id={ "1": HardwareModule( serial_number="serial-number-1", - definition=ModuleDefinition.construct( # type: ignore[call-arg] + definition=ModuleDefinition.model_construct( # type: ignore[call-arg] model=ModuleModel.TEMPERATURE_MODULE_V1 ), ), "2": HardwareModule( serial_number="serial-number-2", - definition=ModuleDefinition.construct( # type: ignore[call-arg] + definition=ModuleDefinition.model_construct( # type: ignore[call-arg] model=ModuleModel.TEMPERATURE_MODULE_V2 ), ), @@ -1773,13 +1773,13 @@ def test_get_by_slot_prefers_later() -> None: hardware_by_module_id={ "1": HardwareModule( serial_number="serial-number-1", - definition=ModuleDefinition.construct( # type: ignore[call-arg] + definition=ModuleDefinition.model_construct( # type: ignore[call-arg] model=ModuleModel.TEMPERATURE_MODULE_V1 ), ), "1-again": HardwareModule( serial_number="serial-number-1-again", - definition=ModuleDefinition.construct( # type: ignore[call-arg] + definition=ModuleDefinition.model_construct( # type: ignore[call-arg] model=ModuleModel.TEMPERATURE_MODULE_V1 ), ), diff --git a/api/tests/opentrons/protocol_engine/state/test_pipette_store_old.py b/api/tests/opentrons/protocol_engine/state/test_pipette_store_old.py index b88844bb53d..9e4db725415 100644 --- a/api/tests/opentrons/protocol_engine/state/test_pipette_store_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_pipette_store_old.py @@ -770,8 +770,8 @@ def test_add_pipette_config( available_sensors: pipette_definition.AvailableSensorDefinition, ) -> None: """It should update state from any pipette config private result.""" - command = cmd.LoadPipette.construct( # type: ignore[call-arg] - params=cmd.LoadPipetteParams.construct( + command = cmd.LoadPipette.model_construct( + params=cmd.LoadPipetteParams.model_construct( # type: ignore[call-arg] mount=MountType.LEFT, pipetteName="p300_single" # type: ignore[arg-type] ), result=cmd.LoadPipetteResult(pipetteId="pipette-id"), diff --git a/api/tests/opentrons/protocol_engine/state/test_tip_state.py b/api/tests/opentrons/protocol_engine/state/test_tip_state.py index 7a958a37e5f..7246a5f4cb2 100644 --- a/api/tests/opentrons/protocol_engine/state/test_tip_state.py +++ b/api/tests/opentrons/protocol_engine/state/test_tip_state.py @@ -32,7 +32,7 @@ get_default_nozzle_map, ) -_tip_rack_parameters = LabwareParameters.construct(isTiprack=True) # type: ignore[call-arg] +_tip_rack_parameters = LabwareParameters.model_construct(isTiprack=True) # type: ignore[call-arg] @pytest.fixture @@ -50,7 +50,7 @@ def subject() -> TipStore: @pytest.fixture def labware_definition() -> LabwareDefinition: """Get a labware definition value object.""" - return LabwareDefinition.construct( # type: ignore[call-arg] + return LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[ ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], @@ -90,14 +90,12 @@ def load_labware_action( def _dummy_command() -> commands.Command: """Return a placeholder command.""" - return commands.Comment.construct() # type: ignore[call-arg] + return commands.Comment.model_construct() # type: ignore[call-arg] @pytest.mark.parametrize( "labware_definition", - [ - LabwareDefinition.construct(ordering=[], parameters=_tip_rack_parameters) # type: ignore[call-arg] - ], + [LabwareDefinition.model_construct(ordering=[], parameters=_tip_rack_parameters)], # type: ignore[call-arg] ) def test_get_next_tip_returns_none( load_labware_action: actions.SucceedCommandAction, @@ -594,7 +592,6 @@ def test_get_next_tip_with_1_channel_followed_by_8_channel( command=_dummy_command(), ) ) - config_update_2 = update_types.PipetteConfigUpdate( pipette_id="pipette-id2", serial_number="pipette-serial2", @@ -929,9 +926,9 @@ def test_handle_pipette_config_action( @pytest.mark.parametrize( "labware_definition", [ - LabwareDefinition.construct( # type: ignore[call-arg] + LabwareDefinition.model_construct( # type: ignore[call-arg] ordering=[["A1"]], - parameters=LabwareParameters.construct(isTiprack=False), # type: ignore[call-arg] + parameters=LabwareParameters.model_construct(isTiprack=False), # type: ignore[call-arg] ) ], ) diff --git a/api/tests/opentrons/protocol_engine/state/test_update_types.py b/api/tests/opentrons/protocol_engine/state/test_update_types.py index 741df813e19..325f2611f37 100644 --- a/api/tests/opentrons/protocol_engine/state/test_update_types.py +++ b/api/tests/opentrons/protocol_engine/state/test_update_types.py @@ -1,14 +1,16 @@ """Unit tests for the utilities in `update_types`.""" - - +from opentrons.protocol_engine import DeckSlotLocation, ModuleLocation from opentrons.protocol_engine.state import update_types +from opentrons.types import DeckSlotName def test_append() -> None: """Test `StateUpdate.append()`.""" state_update = update_types.StateUpdate( - absorbance_reader_lid=update_types.AbsorbanceReaderLidUpdate( - module_id="module_id", is_lid_on=True + labware_location=update_types.LabwareLocationUpdate( + labware_id="test-123", + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + offset_id=None, ) ) @@ -17,22 +19,28 @@ def test_append() -> None: update_types.StateUpdate(pipette_location=update_types.CLEAR) ) assert result is state_update - assert state_update.absorbance_reader_lid == update_types.AbsorbanceReaderLidUpdate( - module_id="module_id", is_lid_on=True + assert state_update.labware_location == update_types.LabwareLocationUpdate( + labware_id="test-123", + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + offset_id=None, ) assert state_update.pipette_location == update_types.CLEAR # Populating a field that's already been populated should overwrite it. result = state_update.append( update_types.StateUpdate( - absorbance_reader_lid=update_types.AbsorbanceReaderLidUpdate( - module_id="module_id", is_lid_on=False + labware_location=update_types.LabwareLocationUpdate( + labware_id="test-123", + new_location=ModuleLocation(moduleId="module-123"), + offset_id=None, ) ) ) assert result is state_update - assert state_update.absorbance_reader_lid == update_types.AbsorbanceReaderLidUpdate( - module_id="module_id", is_lid_on=False + assert state_update.labware_location == update_types.LabwareLocationUpdate( + labware_id="test-123", + new_location=ModuleLocation(moduleId="module-123"), + offset_id=None, ) assert state_update.pipette_location == update_types.CLEAR @@ -44,14 +52,18 @@ def test_reduce() -> None: # It should union all the set fields together. assert update_types.StateUpdate.reduce( update_types.StateUpdate( - absorbance_reader_lid=update_types.AbsorbanceReaderLidUpdate( - module_id="module_id", is_lid_on=True + labware_location=update_types.LabwareLocationUpdate( + labware_id="test-123", + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + offset_id=None, ) ), update_types.StateUpdate(pipette_location=update_types.CLEAR), ) == update_types.StateUpdate( - absorbance_reader_lid=update_types.AbsorbanceReaderLidUpdate( - module_id="module_id", is_lid_on=True + labware_location=update_types.LabwareLocationUpdate( + labware_id="test-123", + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + offset_id=None, ), pipette_location=update_types.CLEAR, ) @@ -59,17 +71,23 @@ def test_reduce() -> None: # When one field appears multiple times, the last write wins. assert update_types.StateUpdate.reduce( update_types.StateUpdate( - absorbance_reader_lid=update_types.AbsorbanceReaderLidUpdate( - module_id="module_id", is_lid_on=True + labware_location=update_types.LabwareLocationUpdate( + labware_id="test-123", + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + offset_id=None, ) ), update_types.StateUpdate( - absorbance_reader_lid=update_types.AbsorbanceReaderLidUpdate( - module_id="module_id", is_lid_on=False + labware_location=update_types.LabwareLocationUpdate( + labware_id="test-123", + new_location=ModuleLocation(moduleId="module-123"), + offset_id=None, ) ), ) == update_types.StateUpdate( - absorbance_reader_lid=update_types.AbsorbanceReaderLidUpdate( - module_id="module_id", is_lid_on=False + labware_location=update_types.LabwareLocationUpdate( + labware_id="test-123", + new_location=ModuleLocation(moduleId="module-123"), + offset_id=None, ) ) diff --git a/api/tests/opentrons/protocol_engine/test_protocol_engine.py b/api/tests/opentrons/protocol_engine/test_protocol_engine.py index cd6ffeb99cb..95289d681b8 100644 --- a/api/tests/opentrons/protocol_engine/test_protocol_engine.py +++ b/api/tests/opentrons/protocol_engine/test_protocol_engine.py @@ -1,4 +1,5 @@ """Tests for the ProtocolEngine class.""" + import inspect from datetime import datetime from typing import Any @@ -803,9 +804,9 @@ async def test_finish_with_estop_error_will_not_drop_tip_and_home( ) -> None: """It should be able to tell the engine it's finished because of an error and will not drop tip and home.""" error = ProtocolCommandFailedError( - original_error=ErrorOccurrence.construct( # type: ignore[call-arg] + original_error=ErrorOccurrence.model_construct( # type: ignore[call-arg] wrappedErrors=[ - ErrorOccurrence.construct(errorCode="3008") # type: ignore[call-arg] + ErrorOccurrence.model_construct(errorCode="3008") # type: ignore[call-arg] ] ) ) diff --git a/api/tests/opentrons/protocol_engine/test_types.py b/api/tests/opentrons/protocol_engine/test_types.py index ccf6b91de7f..d48c67ee61e 100644 --- a/api/tests/opentrons/protocol_engine/test_types.py +++ b/api/tests/opentrons/protocol_engine/test_types.py @@ -9,10 +9,14 @@ def test_hex_validation(hex_color: str) -> None: """Should allow creating a HexColor.""" # make sure noting is raised when instantiating this class - assert HexColor(__root__=hex_color) + assert HexColor(hex_color) + assert HexColor.model_validate_json(f'"{hex_color}"') -def test_handles_invalid_hex() -> None: +@pytest.mark.parametrize("invalid_hex_color", ["true", "null", "#123456789"]) +def test_handles_invalid_hex(invalid_hex_color: str) -> None: """Should raise a validation error.""" with pytest.raises(ValidationError): - HexColor(__root__="#123456789") + HexColor(invalid_hex_color) + with pytest.raises(ValidationError): + HexColor.model_validate_json(f'"{invalid_hex_color}"') diff --git a/api/tests/opentrons/protocol_runner/smoke_tests/conftest.py b/api/tests/opentrons/protocol_runner/smoke_tests/conftest.py index 5a758922e59..ade6ed4dae8 100644 --- a/api/tests/opentrons/protocol_runner/smoke_tests/conftest.py +++ b/api/tests/opentrons/protocol_runner/smoke_tests/conftest.py @@ -17,7 +17,7 @@ def tempdeck_v1_def() -> ModuleDefinition: """Get the definition of a V1 tempdeck.""" definition = load_shared_data("module/definitions/3/temperatureModuleV1.json") - return ModuleDefinition.parse_raw(definition) + return ModuleDefinition.model_validate_json(definition) @pytest.fixture() diff --git a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_command_mapper.py b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_command_mapper.py index a652d76eac3..0cc542c4971 100644 --- a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_command_mapper.py +++ b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_command_mapper.py @@ -159,7 +159,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: assert len(commands_result) == 32 - assert commands_result[0] == commands.Home.construct( + assert commands_result[0] == commands.Home.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -170,7 +170,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.HomeResult(), ) - assert commands_result[1] == commands.LoadLabware.construct( + assert commands_result[1] == commands.LoadLabware.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -186,7 +186,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=tiprack_1_result_captor, ) - assert commands_result[2] == commands.LoadLabware.construct( + assert commands_result[2] == commands.LoadLabware.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -202,7 +202,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=tiprack_2_result_captor, ) - assert commands_result[3] == commands.LoadModule.construct( + assert commands_result[3] == commands.LoadModule.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -217,7 +217,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=module_1_result_captor, ) - assert commands_result[4] == commands.LoadLabware.construct( + assert commands_result[4] == commands.LoadLabware.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -233,7 +233,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=well_plate_1_result_captor, ) - assert commands_result[5] == commands.LoadLabware.construct( + assert commands_result[5] == commands.LoadLabware.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -250,7 +250,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: result=module_plate_1_result_captor, ) - assert commands_result[6] == commands.LoadPipette.construct( + assert commands_result[6] == commands.LoadPipette.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -264,7 +264,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: result=pipette_left_result_captor, ) - assert commands_result[7] == commands.LoadPipette.construct( + assert commands_result[7] == commands.LoadPipette.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -278,16 +278,14 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: result=pipette_right_result_captor, ) - # TODO(mc, 2021-11-11): not sure why I have to dict-access these properties - # might be a bug in Decoy, might be something weird that Pydantic does - tiprack_1_id = tiprack_1_result_captor.value["labwareId"] - tiprack_2_id = tiprack_2_result_captor.value["labwareId"] - well_plate_1_id = well_plate_1_result_captor.value["labwareId"] - module_plate_1_id = module_plate_1_result_captor.value["labwareId"] - pipette_left_id = pipette_left_result_captor.value["pipetteId"] - pipette_right_id = pipette_right_result_captor.value["pipetteId"] + tiprack_1_id = tiprack_1_result_captor.value.labwareId + tiprack_2_id = tiprack_2_result_captor.value.labwareId + well_plate_1_id = well_plate_1_result_captor.value.labwareId + module_plate_1_id = module_plate_1_result_captor.value.labwareId + pipette_left_id = pipette_left_result_captor.value.pipetteId + pipette_right_id = pipette_right_result_captor.value.pipetteId - assert commands_result[8] == commands.PickUpTip.construct( + assert commands_result[8] == commands.PickUpTip.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -304,7 +302,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: tipVolume=300.0, tipLength=51.83, position=DeckPoint(x=0, y=0, z=0) ), ) - assert commands_result[9] == commands.PickUpTip.construct( + assert commands_result[9] == commands.PickUpTip.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -322,7 +320,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: ), ) - assert commands_result[10] == commands.DropTip.construct( + assert commands_result[10] == commands.DropTip.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -338,7 +336,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: result=commands.DropTipResult(position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[11] == commands.PickUpTip.construct( + assert commands_result[11] == commands.PickUpTip.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -355,7 +353,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: tipVolume=300.0, tipLength=51.83, position=DeckPoint(x=0, y=0, z=0) ), ) - assert commands_result[12] == commands.Aspirate.construct( + assert commands_result[12] == commands.Aspirate.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -372,7 +370,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.AspirateResult(volume=40, position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[13] == commands.Dispense.construct( + assert commands_result[13] == commands.Dispense.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -389,7 +387,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.DispenseResult(volume=35, position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[14] == commands.Aspirate.construct( + assert commands_result[14] == commands.Aspirate.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -406,7 +404,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.AspirateResult(volume=40, position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[15] == commands.Dispense.construct( + assert commands_result[15] == commands.Dispense.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -423,7 +421,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.DispenseResult(volume=35, position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[16] == commands.BlowOut.construct( + assert commands_result[16] == commands.BlowOut.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -439,7 +437,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.BlowOutResult(position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[17] == commands.Aspirate.construct( + assert commands_result[17] == commands.Aspirate.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -456,7 +454,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.AspirateResult(volume=50, position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[18] == commands.Dispense.construct( + assert commands_result[18] == commands.Dispense.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -473,7 +471,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.DispenseResult(volume=50, position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[19] == commands.BlowOut.construct( + assert commands_result[19] == commands.BlowOut.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -489,7 +487,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.BlowOutResult(position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[20] == commands.Aspirate.construct( + assert commands_result[20] == commands.Aspirate.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -506,7 +504,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.AspirateResult(volume=300, position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[21] == commands.Dispense.construct( + assert commands_result[21] == commands.Dispense.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -523,7 +521,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.DispenseResult(volume=300, position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[22] == commands.BlowOut.construct( + assert commands_result[22] == commands.BlowOut.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -540,7 +538,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: result=commands.BlowOutResult(position=DeckPoint(x=0, y=0, z=0)), ) # TODO:(jr, 15.08.2022): this should map to move_to when move_to is mapped in a followup ticket RSS-62 - assert commands_result[23] == commands.Custom.construct( + assert commands_result[23] == commands.Custom.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -556,7 +554,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: ) # TODO:(jr, 15.08.2022): aspirate commands with no labware get filtered # into custom. Refactor this in followup legacy command mapping - assert commands_result[24] == commands.Custom.construct( + assert commands_result[24] == commands.Custom.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -572,7 +570,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: ) # TODO:(jr, 15.08.2022): dispense commands with no labware get filtered # into custom. Refactor this in followup legacy command mapping - assert commands_result[25] == commands.Custom.construct( + assert commands_result[25] == commands.Custom.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -588,7 +586,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: ) # TODO:(jr, 15.08.2022): blow_out commands with no labware get filtered # into custom. Refactor this in followup legacy command mapping - assert commands_result[26] == commands.Custom.construct( + assert commands_result[26] == commands.Custom.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -602,7 +600,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.CustomResult(), ) - assert commands_result[27] == commands.Aspirate.construct( + assert commands_result[27] == commands.Aspirate.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -619,7 +617,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.AspirateResult(volume=50, position=DeckPoint(x=0, y=0, z=0)), ) - assert commands_result[28] == commands.Dispense.construct( + assert commands_result[28] == commands.Dispense.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -638,7 +636,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: ) # TODO:(jr, 15.08.2022): aspirate commands with no labware get filtered # into custom. Refactor this in followup legacy command mapping - assert commands_result[29] == commands.Custom.construct( + assert commands_result[29] == commands.Custom.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -654,7 +652,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: ) # TODO:(jr, 15.08.2022): dispense commands with no labware get filtered # into custom. Refactor this in followup legacy command mapping - assert commands_result[30] == commands.Custom.construct( + assert commands_result[30] == commands.Custom.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -668,7 +666,7 @@ async def test_big_protocol_commands(big_protocol_file: Path) -> None: notes=[], result=commands.CustomResult(), ) - assert commands_result[31] == commands.DropTip.construct( + assert commands_result[31] == commands.DropTip.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -814,7 +812,7 @@ def run(protocol): ) result_commands = await simulate_and_get_commands(path) [initial_home, comment] = result_commands - assert comment == commands.Comment.construct( + assert comment == commands.Comment.model_construct( status=commands.CommandStatus.SUCCEEDED, params=commands.CommentParams(message="oy."), notes=[], diff --git a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_custom_labware.py b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_custom_labware.py index 7ed54b17ebe..dcc95593c38 100644 --- a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_custom_labware.py +++ b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_custom_labware.py @@ -58,7 +58,7 @@ async def test_legacy_custom_labware(custom_labware_protocol_files: List[Path]) ) result = await subject.run(deck_configuration=[], protocol_source=protocol_source) - expected_labware = LoadedLabware.construct( + expected_labware = LoadedLabware.model_construct( id=matchers.Anything(), location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), loadName="fixture_96_plate", diff --git a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_module_commands.py b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_module_commands.py index de14413a7ab..5650312b5f6 100644 --- a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_module_commands.py +++ b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_module_commands.py @@ -75,7 +75,7 @@ async def test_runner_with_modules_in_legacy_python( thermocycler_result_captor = matchers.Captor() heater_shaker_result_captor = matchers.Captor() - assert commands_result[0] == commands.Home.construct( + assert commands_result[0] == commands.Home.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -86,7 +86,7 @@ async def test_runner_with_modules_in_legacy_python( notes=[], result=commands.HomeResult(), ) - assert commands_result[1] == commands.LoadLabware.construct( + assert commands_result[1] == commands.LoadLabware.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -98,7 +98,7 @@ async def test_runner_with_modules_in_legacy_python( result=matchers.Anything(), ) - assert commands_result[2] == commands.LoadModule.construct( + assert commands_result[2] == commands.LoadModule.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -110,7 +110,7 @@ async def test_runner_with_modules_in_legacy_python( result=temp_module_result_captor, ) - assert commands_result[3] == commands.LoadModule.construct( + assert commands_result[3] == commands.LoadModule.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -122,7 +122,7 @@ async def test_runner_with_modules_in_legacy_python( result=mag_module_result_captor, ) - assert commands_result[4] == commands.LoadModule.construct( + assert commands_result[4] == commands.LoadModule.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -134,7 +134,7 @@ async def test_runner_with_modules_in_legacy_python( result=thermocycler_result_captor, ) - assert commands_result[5] == commands.LoadModule.construct( + assert commands_result[5] == commands.LoadModule.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -146,12 +146,9 @@ async def test_runner_with_modules_in_legacy_python( result=heater_shaker_result_captor, ) - assert temp_module_result_captor.value["model"] == ModuleModel.TEMPERATURE_MODULE_V1 - assert mag_module_result_captor.value["model"] == ModuleModel.MAGNETIC_MODULE_V1 + assert temp_module_result_captor.value.model == ModuleModel.TEMPERATURE_MODULE_V1 + assert mag_module_result_captor.value.model == ModuleModel.MAGNETIC_MODULE_V1 + assert thermocycler_result_captor.value.model == ModuleModel.THERMOCYCLER_MODULE_V1 assert ( - thermocycler_result_captor.value["model"] == ModuleModel.THERMOCYCLER_MODULE_V1 - ) - assert ( - heater_shaker_result_captor.value["model"] - == ModuleModel.HEATER_SHAKER_MODULE_V1 + heater_shaker_result_captor.value.model == ModuleModel.HEATER_SHAKER_MODULE_V1 ) diff --git a/api/tests/opentrons/protocol_runner/smoke_tests/test_protocol_runner.py b/api/tests/opentrons/protocol_runner/smoke_tests/test_protocol_runner.py index 1a8da30bd76..5db66e55eb2 100644 --- a/api/tests/opentrons/protocol_runner/smoke_tests/test_protocol_runner.py +++ b/api/tests/opentrons/protocol_runner/smoke_tests/test_protocol_runner.py @@ -58,13 +58,13 @@ async def test_runner_with_python( pipette_id_captor = matchers.Captor() labware_id_captor = matchers.Captor() - expected_pipette = LoadedPipette.construct( + expected_pipette = LoadedPipette.model_construct( id=pipette_id_captor, pipetteName=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, ) - expected_labware = LoadedLabware.construct( + expected_labware = LoadedLabware.model_construct( id=labware_id_captor, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), loadName="opentrons_96_tiprack_300ul", @@ -75,7 +75,7 @@ async def test_runner_with_python( offsetId=None, ) - expected_module = LoadedModule.construct( + expected_module = LoadedModule.model_construct( id=matchers.IsA(str), model=ModuleModel.TEMPERATURE_MODULE_V1, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), @@ -86,7 +86,7 @@ async def test_runner_with_python( assert expected_labware in labware_result assert expected_module in modules_result - expected_command = commands.PickUpTip.construct( + expected_command = commands.PickUpTip.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -148,7 +148,7 @@ async def test_runner_with_json(json_protocol_file: Path) -> None: assert expected_pipette in pipettes_result assert expected_labware in labware_result - expected_command = commands.PickUpTip.construct( + expected_command = commands.PickUpTip.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -196,13 +196,13 @@ async def test_runner_with_legacy_python(legacy_python_protocol_file: Path) -> N pipette_id_captor = matchers.Captor() labware_id_captor = matchers.Captor() - expected_pipette = LoadedPipette.construct( + expected_pipette = LoadedPipette.model_construct( id=pipette_id_captor, pipetteName=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, ) - expected_labware = LoadedLabware.construct( + expected_labware = LoadedLabware.model_construct( id=labware_id_captor, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), loadName="opentrons_96_tiprack_300ul", @@ -215,7 +215,7 @@ async def test_runner_with_legacy_python(legacy_python_protocol_file: Path) -> N assert expected_pipette in pipettes_result assert expected_labware in labware_result - expected_command = commands.PickUpTip.construct( + expected_command = commands.PickUpTip.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -260,13 +260,13 @@ async def test_runner_with_legacy_json(legacy_json_protocol_file: Path) -> None: pipette_id_captor = matchers.Captor() labware_id_captor = matchers.Captor() - expected_pipette = LoadedPipette.construct( + expected_pipette = LoadedPipette.model_construct( id=pipette_id_captor, pipetteName=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, ) - expected_labware = LoadedLabware.construct( + expected_labware = LoadedLabware.model_construct( id=labware_id_captor, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), loadName="opentrons_96_tiprack_300ul", @@ -280,7 +280,7 @@ async def test_runner_with_legacy_json(legacy_json_protocol_file: Path) -> None: assert expected_pipette in pipettes_result assert expected_labware in labware_result - expected_command = commands.PickUpTip.construct( + expected_command = commands.PickUpTip.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, @@ -327,13 +327,13 @@ async def test_runner_with_python_and_run_time_parameters( tiprack_id_captor = matchers.Captor() reservoir_id_captor = matchers.Captor() - expected_pipette = LoadedPipette.construct( + expected_pipette = LoadedPipette.model_construct( id=pipette_id_captor, pipetteName=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, ) - expected_tiprack = LoadedLabware.construct( + expected_tiprack = LoadedLabware.model_construct( id=tiprack_id_captor, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), loadName="opentrons_96_tiprack_300ul", @@ -344,7 +344,7 @@ async def test_runner_with_python_and_run_time_parameters( offsetId=None, ) - expected_reservoir = LoadedLabware.construct( + expected_reservoir = LoadedLabware.model_construct( id=reservoir_id_captor, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_2), loadName="nest_1_reservoir_195ml", @@ -361,14 +361,14 @@ async def test_runner_with_python_and_run_time_parameters( assert result.state_summary.status == EngineStatus.SUCCEEDED - expected_command = commands.Aspirate.construct( + expected_command = commands.Aspirate.model_construct( id=matchers.IsA(str), key=matchers.IsA(str), status=commands.CommandStatus.SUCCEEDED, createdAt=matchers.IsA(datetime), startedAt=matchers.IsA(datetime), completedAt=matchers.IsA(datetime), - params=commands.AspirateParams.construct( + params=commands.AspirateParams.model_construct( labwareId=reservoir_id_captor.value, wellName=matchers.IsA(str), wellLocation=matchers.Anything(), diff --git a/api/tests/opentrons/protocol_runner/test_json_translator.py b/api/tests/opentrons/protocol_runner/test_json_translator.py index e2735e4cdbc..b48c18f95c9 100644 --- a/api/tests/opentrons/protocol_runner/test_json_translator.py +++ b/api/tests/opentrons/protocol_runner/test_json_translator.py @@ -1,4 +1,5 @@ """Tests for the JSON JsonTranslator interface.""" + import pytest from typing import Dict, List @@ -193,7 +194,7 @@ wellName="A1", ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="dropTip", params={ "pipetteId": "pipette-id-1", @@ -230,7 +231,7 @@ wellName="A1", ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="pickUpTip", params={ "pipetteId": "pipette-id-1", @@ -272,7 +273,7 @@ ), ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="touchTip", params={ "pipetteId": "pipette-id-1", @@ -307,7 +308,7 @@ pipetteId="pipette-id-1", mount="left", pipetteName="p10_single" ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="loadPipette", params={ "pipetteId": "pipette-id-1", @@ -339,7 +340,7 @@ location=Location(slotName="3"), ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="loadModule", params={ "moduleId": "module-id-1", @@ -374,7 +375,7 @@ displayName="Trash", ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="loadLabware", params={ "labwareId": "labware-id-2", @@ -423,7 +424,7 @@ flowRate=1.23, ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="blowout", params={ "pipetteId": "pipette-id-1", @@ -458,7 +459,7 @@ commandType="delay", params=protocol_schema_v7.Params(waitForResume=True, message="hello world"), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="delay", params={"waitForResume": True, "message": "hello world"}, ), @@ -475,7 +476,7 @@ commandType="delay", params=protocol_schema_v7.Params(seconds=12.34, message="hello world"), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="delay", params={"seconds": 12.34, "message": "hello world"}, ), @@ -495,7 +496,7 @@ commandType="waitForResume", params=protocol_schema_v7.Params(message="hello world"), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="waitForResume", params={"message": "hello world"}, ), @@ -512,7 +513,7 @@ commandType="waitForDuration", params=protocol_schema_v7.Params(seconds=12.34, message="hello world"), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="waitForDuration", params={"seconds": 12.34, "message": "hello world"}, ), @@ -542,7 +543,7 @@ forceDirect=True, ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="moveToCoordinates", params={ "pipetteId": "pipette-id-1", @@ -595,7 +596,7 @@ ], ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="thermocycler/runProfile", params={ "moduleId": "module-id-2", @@ -646,7 +647,7 @@ volumeByWell={"A1": 32, "B2": 50}, ), ), - protocol_schema_v8.Command( + protocol_schema_v8.Command.model_construct( commandType="loadLiquid", key=None, params={ @@ -873,6 +874,6 @@ def test_load_liquid( id="liquid-id-555", displayName="water", description="water description", - displayColor=HexColor(__root__="#F00"), + displayColor=HexColor("#F00"), ) ] diff --git a/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py b/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py index 42c589ba7d3..a91066c01f8 100644 --- a/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py +++ b/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py @@ -117,7 +117,7 @@ def test_map_after_command() -> None: assert result == [ pe_actions.SucceedCommandAction( - command=pe_commands.Comment.construct( + command=pe_commands.Comment.model_construct( id="command.COMMENT-0", key="command.COMMENT-0", status=pe_commands.CommandStatus.SUCCEEDED, @@ -240,7 +240,7 @@ def test_command_stack() -> None: command_id="command.COMMENT-1", started_at=matchers.IsA(datetime) ), pe_actions.SucceedCommandAction( - command=pe_commands.Comment.construct( + command=pe_commands.Comment.model_construct( id="command.COMMENT-0", key="command.COMMENT-0", status=pe_commands.CommandStatus.SUCCEEDED, @@ -302,7 +302,7 @@ def test_map_labware_load(minimal_labware_def: LabwareDefinition) -> None: started_at=matchers.IsA(datetime), ) expected_succeed = pe_actions.SucceedCommandAction( - command=pe_commands.LoadLabware.construct( + command=pe_commands.LoadLabware.model_construct( id=expected_id_and_key, key=expected_id_and_key, params=expected_params, @@ -310,7 +310,7 @@ def test_map_labware_load(minimal_labware_def: LabwareDefinition) -> None: createdAt=matchers.IsA(datetime), startedAt=matchers.IsA(datetime), completedAt=matchers.IsA(datetime), - result=pe_commands.LoadLabwareResult.construct( + result=pe_commands.LoadLabwareResult.model_construct( labwareId=matchers.IsA(str), # Trusting that the exact fields within in the labware definition # get passed through correctly. @@ -352,7 +352,7 @@ def test_map_instrument_load(decoy: Decoy) -> None: ).then_return(pipette_config) expected_id_and_key = "commands.LOAD_PIPETTE-0" - expected_params = pe_commands.LoadPipetteParams.construct( + expected_params = pe_commands.LoadPipetteParams.model_construct( pipetteName=PipetteNameType.P1000_SINGLE_GEN2, mount=MountType.LEFT ) expected_queue = pe_actions.QueueCommandAction( @@ -367,7 +367,7 @@ def test_map_instrument_load(decoy: Decoy) -> None: command_id=expected_id_and_key, started_at=matchers.IsA(datetime) ) expected_succeed = pe_actions.SucceedCommandAction( - command=pe_commands.LoadPipette.construct( + command=pe_commands.LoadPipette.model_construct( id=expected_id_and_key, key=expected_id_and_key, status=pe_commands.CommandStatus.SUCCEEDED, @@ -410,7 +410,7 @@ def test_map_module_load( module_data_provider: ModuleDataProvider, ) -> None: """It should correctly map a module load.""" - test_definition = ModuleDefinition.parse_obj(minimal_module_def) + test_definition = ModuleDefinition.model_validate(minimal_module_def) input = LegacyModuleLoadInfo( requested_model=TemperatureModuleModel.TEMPERATURE_V1, loaded_model=TemperatureModuleModel.TEMPERATURE_V2, @@ -423,7 +423,7 @@ def test_map_module_load( ).then_return(test_definition) expected_id_and_key = "commands.LOAD_MODULE-0" - expected_params = pe_commands.LoadModuleParams.construct( + expected_params = pe_commands.LoadModuleParams.model_construct( model=ModuleModel.TEMPERATURE_MODULE_V1, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), moduleId=matchers.IsA(str), @@ -440,7 +440,7 @@ def test_map_module_load( command_id=expected_id_and_key, started_at=matchers.IsA(datetime) ) expected_succeed = pe_actions.SucceedCommandAction( - command=pe_commands.LoadModule.construct( + command=pe_commands.LoadModule.model_construct( id=expected_id_and_key, key=expected_id_and_key, status=pe_commands.CommandStatus.SUCCEEDED, @@ -448,7 +448,7 @@ def test_map_module_load( startedAt=matchers.IsA(datetime), completedAt=matchers.IsA(datetime), params=expected_params, - result=pe_commands.LoadModuleResult.construct( + result=pe_commands.LoadModuleResult.model_construct( moduleId=matchers.IsA(str), serialNumber="module-serial", definition=test_definition, @@ -481,7 +481,7 @@ def test_map_module_labware_load(minimal_labware_def: LabwareDefinition) -> None ) expected_id_and_key = "commands.LOAD_LABWARE-0" - expected_params = pe_commands.LoadLabwareParams.construct( + expected_params = pe_commands.LoadLabwareParams.model_construct( location=ModuleLocation(moduleId="module-123"), namespace="some_namespace", loadName="some_load_name", @@ -503,7 +503,7 @@ def test_map_module_labware_load(minimal_labware_def: LabwareDefinition) -> None started_at=matchers.IsA(datetime), ) expected_succeed = pe_actions.SucceedCommandAction( - command=pe_commands.LoadLabware.construct( + command=pe_commands.LoadLabware.model_construct( id=expected_id_and_key, key=expected_id_and_key, params=expected_params, @@ -511,7 +511,7 @@ def test_map_module_labware_load(minimal_labware_def: LabwareDefinition) -> None createdAt=matchers.IsA(datetime), startedAt=matchers.IsA(datetime), completedAt=matchers.IsA(datetime), - result=pe_commands.LoadLabwareResult.construct( + result=pe_commands.LoadLabwareResult.model_construct( labwareId=matchers.IsA(str), # Trusting that the exact fields within in the labware definition # get passed through correctly. @@ -578,7 +578,7 @@ def test_map_pause() -> None: started_at=matchers.IsA(datetime), ), pe_actions.SucceedCommandAction( - command=pe_commands.WaitForResume.construct( + command=pe_commands.WaitForResume.model_construct( id="command.PAUSE-0", key="command.PAUSE-0", status=pe_commands.CommandStatus.SUCCEEDED, diff --git a/api/tests/opentrons/protocol_runner/test_protocol_runner.py b/api/tests/opentrons/protocol_runner/test_protocol_runner.py index 15e0192175e..2080ec69587 100644 --- a/api/tests/opentrons/protocol_runner/test_protocol_runner.py +++ b/api/tests/opentrons/protocol_runner/test_protocol_runner.py @@ -361,7 +361,7 @@ async def test_run_json_runner_stop_requested_stops_enqueuing( json_translator: JsonTranslator, ) -> None: """It should run a protocol to completion.""" - labware_definition = LabwareDefinition.construct() # type: ignore[call-arg] + labware_definition = LabwareDefinition.model_construct() # type: ignore[call-arg] json_protocol_source = ProtocolSource( directory=Path("/dev/null"), main_file=Path("/dev/null/abc.json"), @@ -388,7 +388,7 @@ async def test_run_json_runner_stop_requested_stops_enqueuing( Liquid(id="water-id", displayName="water", description="water desc") ] - json_protocol = ProtocolSchemaV6.construct() # type: ignore[call-arg] + json_protocol = ProtocolSchemaV6.model_construct() # type: ignore[call-arg] decoy.when( await protocol_reader.extract_labware_definitions(json_protocol_source) @@ -401,7 +401,7 @@ async def test_run_json_runner_stop_requested_stops_enqueuing( pe_commands.HomeCreate(params=pe_commands.HomeParams()), ) ).then_return( - pe_commands.Home.construct(status=pe_commands.CommandStatus.SUCCEEDED) # type: ignore[call-arg] + pe_commands.Home.model_construct(status=pe_commands.CommandStatus.SUCCEEDED) # type: ignore[call-arg] ) decoy.when( await protocol_engine.add_and_execute_command_wait_for_recovery( @@ -410,7 +410,7 @@ async def test_run_json_runner_stop_requested_stops_enqueuing( ), ) ).then_return( - pe_commands.WaitForDuration.construct( # type: ignore[call-arg] + pe_commands.WaitForDuration.model_construct( # type: ignore[call-arg] id="protocol-command-id", error=pe_errors.ErrorOccurrence.from_failed( id="some-id", @@ -452,8 +452,8 @@ async def test_run_json_runner_stop_requested_stops_enqueuing( @pytest.mark.parametrize( "schema_version, json_protocol", [ - (6, ProtocolSchemaV6.construct()), # type: ignore[call-arg] - (7, ProtocolSchemaV7.construct()), # type: ignore[call-arg] + (6, ProtocolSchemaV6.model_construct()), # type: ignore[call-arg] + (7, ProtocolSchemaV7.model_construct()), # type: ignore[call-arg] ], ) async def test_load_json_runner( @@ -467,7 +467,7 @@ async def test_load_json_runner( json_protocol: Union[ProtocolSchemaV6, ProtocolSchemaV7], ) -> None: """It should load a JSON protocol file.""" - labware_definition = LabwareDefinition.construct() # type: ignore[call-arg] + labware_definition = LabwareDefinition.model_construct() # type: ignore[call-arg] json_protocol_source = ProtocolSource( directory=Path("/dev/null"), @@ -528,7 +528,7 @@ async def test_load_json_runner( ), ) ).then_return( - pe_commands.WaitForResume.construct( # type: ignore[call-arg] + pe_commands.WaitForResume.model_construct( # type: ignore[call-arg] id="command-id-1", status=CommandStatus.SUCCEEDED, error=None, @@ -541,7 +541,7 @@ async def test_load_json_runner( ), ) ).then_return( - pe_commands.WaitForResume.construct( # type: ignore[call-arg] + pe_commands.WaitForResume.model_construct( # type: ignore[call-arg] id="command-id-2", status=CommandStatus.SUCCEEDED, error=None, @@ -556,7 +556,7 @@ async def test_load_json_runner( ), ) ).then_return( - pe_commands.WaitForResume.construct( # type: ignore[call-arg] + pe_commands.WaitForResume.model_construct( # type: ignore[call-arg] id="command-id-3", status=CommandStatus.SUCCEEDED, error=None, @@ -601,7 +601,7 @@ async def test_load_legacy_python( python_runner_subject: PythonAndLegacyRunner, ) -> None: """It should load a legacy context-based Python protocol.""" - labware_definition = LabwareDefinition.construct() # type: ignore[call-arg] + labware_definition = LabwareDefinition.model_construct() # type: ignore[call-arg] legacy_protocol_source = ProtocolSource( directory=Path("/dev/null"), @@ -752,7 +752,7 @@ async def test_load_legacy_json( python_runner_subject: PythonAndLegacyRunner, ) -> None: """It should load a legacy context-based JSON protocol.""" - labware_definition = LabwareDefinition.construct() # type: ignore[call-arg] + labware_definition = LabwareDefinition.model_construct() # type: ignore[call-arg] legacy_protocol_source = ProtocolSource( directory=Path("/dev/null"), diff --git a/api/tests/opentrons/protocol_runner/test_run_orchestrator.py b/api/tests/opentrons/protocol_runner/test_run_orchestrator.py index c2cea3e0e7e..b7281953f22 100644 --- a/api/tests/opentrons/protocol_runner/test_run_orchestrator.py +++ b/api/tests/opentrons/protocol_runner/test_run_orchestrator.py @@ -256,11 +256,11 @@ async def test_add_command_and_wait_for_interval( verify_calls: int, ) -> None: """Should add a command a wait for it to complete.""" - load_command = pe_commands.HomeCreate.construct( - params=pe_commands.HomeParams.construct() + load_command = pe_commands.HomeCreate.model_construct( + params=pe_commands.HomeParams.model_construct() ) added_command = pe_commands.Home( - params=pe_commands.HomeParams.construct(), + params=pe_commands.HomeParams.model_construct(), id="test-123", createdAt=datetime(year=2024, month=1, day=1), key="123", diff --git a/api/tests/opentrons/protocols/models/test_json_protocol.py b/api/tests/opentrons/protocols/models/test_json_protocol.py index 696524ac84a..afb2770f21a 100644 --- a/api/tests/opentrons/protocols/models/test_json_protocol.py +++ b/api/tests/opentrons/protocols/models/test_json_protocol.py @@ -25,7 +25,7 @@ def test_json_protocol_model( ) # Create the model - d = json_protocol.Model.parse_obj(fx) + d = json_protocol.Model.model_validate(fx) # Compare the dict created by pydantic to the loaded json - assert d.dict(exclude_unset=True, by_alias=True) == fx + assert d.model_dump(exclude_unset=True, by_alias=True) == fx diff --git a/api/tests/opentrons/test_execute.py b/api/tests/opentrons/test_execute.py index b9f791f4253..1e72a3757bf 100644 --- a/api/tests/opentrons/test_execute.py +++ b/api/tests/opentrons/test_execute.py @@ -131,6 +131,7 @@ def test_execute_function_apiv2( converted_model_v15.pipette_type, converted_model_v15.pipette_channels, converted_model_v15.pipette_version, + converted_model_v15.oem_type, ), "id": "testid", } @@ -139,6 +140,7 @@ def test_execute_function_apiv2( converted_model_v1.pipette_type, converted_model_v1.pipette_channels, converted_model_v1.pipette_version, + converted_model_v1.oem_type, ), "id": "testid2", } @@ -177,6 +179,7 @@ def emit_runlog(entry: Any) -> None: converted_model_v15.pipette_type, converted_model_v15.pipette_channels, converted_model_v15.pipette_version, + converted_model_v15.oem_type, ), "id": "testid", } @@ -215,6 +218,7 @@ def emit_runlog(entry: Any) -> None: converted_model_v15.pipette_type, converted_model_v15.pipette_channels, converted_model_v15.pipette_version, + converted_model_v15.oem_type, ), "id": "testid", } @@ -253,6 +257,7 @@ def emit_runlog(entry: Any) -> None: converted_model_v15.pipette_type, converted_model_v15.pipette_channels, converted_model_v15.pipette_version, + converted_model_v15.oem_type, ), "id": "testid", } @@ -292,6 +297,7 @@ def emit_runlog(entry: Any) -> None: converted_model_v15.pipette_type, converted_model_v15.pipette_channels, converted_model_v15.pipette_version, + converted_model_v15.oem_type, ), "id": "testid", } diff --git a/app/src/App/Navbar.tsx b/app/src/App/Navbar.tsx index 1d7711563ae..90e62b608ae 100644 --- a/app/src/App/Navbar.tsx +++ b/app/src/App/Navbar.tsx @@ -25,6 +25,7 @@ import logoSvgThree from '/app/assets/images/logo_nav_three.svg' import { NAV_BAR_WIDTH } from './constants' +import type { MouseEvent } from 'react' import type { RouteProps } from './types' const SALESFORCE_HELP_LINK = 'https://support.opentrons.com/s/' @@ -161,7 +162,7 @@ export function Navbar({ routes }: { routes: RouteProps[] }): JSX.Element { ) => { + onClick={(e: MouseEvent) => { e.preventDefault() debouncedNavigate('/app-settings') }} diff --git a/app/src/App/OnDeviceDisplayApp.tsx b/app/src/App/OnDeviceDisplayApp.tsx index 6e8c78449f0..5337965fc52 100644 --- a/app/src/App/OnDeviceDisplayApp.tsx +++ b/app/src/App/OnDeviceDisplayApp.tsx @@ -9,7 +9,6 @@ import { COLORS, OVERFLOW_AUTO, POSITION_RELATIVE, - useIdle, useScrolling, } from '@opentrons/components' import { ApiHostProvider } from '@opentrons/react-api-client' @@ -52,7 +51,7 @@ import { updateConfigValue, } from '/app/redux/config' import { updateBrightness } from '/app/redux/shell' -import { SLEEP_NEVER_MS } from '/app/local-resources/config' +import { useScreenIdle, SLEEP_NEVER_MS } from '/app/local-resources/dom-utils' import { useProtocolReceiptToast, useSoftwareUpdatePoll } from './hooks' import { ODDTopLevelRedirects } from './ODDTopLevelRedirects' import { ReactQueryDevtools } from '/app/App/tools' @@ -166,7 +165,7 @@ export const OnDeviceDisplayApp = (): JSX.Element => { initialState: false, } const dispatch = useDispatch() - const isIdle = useIdle(sleepTime, options) + const isIdle = useScreenIdle(sleepTime, options) useEffect(() => { if (isIdle) { diff --git a/app/src/App/__mocks__/portal.tsx b/app/src/App/__mocks__/portal.tsx index f80b1deb44e..498f3220f65 100644 --- a/app/src/App/__mocks__/portal.tsx +++ b/app/src/App/__mocks__/portal.tsx @@ -1,8 +1,8 @@ // mock portal for enzyme tests -import type * as React from 'react' +import type { ReactNode } from 'react' interface Props { - children: React.ReactNode + children: ReactNode } // replace Portal with a pass-through React.Fragment diff --git a/app/src/App/__tests__/hooks.test.tsx b/app/src/App/__tests__/hooks.test.tsx index 5b3f315049b..2423414c748 100644 --- a/app/src/App/__tests__/hooks.test.tsx +++ b/app/src/App/__tests__/hooks.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, beforeEach, afterEach, expect, it } from 'vitest' import { renderHook } from '@testing-library/react' import { createStore } from 'redux' @@ -9,11 +8,12 @@ import { i18n } from '/app/i18n' import { checkShellUpdate } from '/app/redux/shell' import { useSoftwareUpdatePoll } from '../hooks' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' describe('useSoftwareUpdatePoll', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> let store: Store beforeEach(() => { vi.useFakeTimers() diff --git a/app/src/App/index.tsx b/app/src/App/index.tsx index f0ba1de0304..0ffcf0dd751 100644 --- a/app/src/App/index.tsx +++ b/app/src/App/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useSelector } from 'react-redux' import { Flex, POSITION_FIXED, DIRECTION_ROW } from '@opentrons/components' @@ -9,7 +8,9 @@ import { DesktopApp } from './DesktopApp' import { OnDeviceDisplayApp } from './OnDeviceDisplayApp' import { TopPortalRoot } from './portal' -const stopEvent = (event: React.MouseEvent): void => { +import type { MouseEvent } from 'react' + +const stopEvent = (event: MouseEvent): void => { event.preventDefault() } diff --git a/app/src/App/types.ts b/app/src/App/types.ts index 87d8f77d4a1..c6a0822260d 100644 --- a/app/src/App/types.ts +++ b/app/src/App/types.ts @@ -1,11 +1,11 @@ -import type * as React from 'react' +import type { FC } from 'react' export interface RouteProps { /** * the component rendered by a route match * drop developed components into slots held by placeholder div components */ - Component: React.FC + Component: FC /** * a route/page name to render in the nav bar */ diff --git a/app/src/LocalizationProvider.tsx b/app/src/LocalizationProvider.tsx index df2bbc8bc40..3c8fcf9feab 100644 --- a/app/src/LocalizationProvider.tsx +++ b/app/src/LocalizationProvider.tsx @@ -7,10 +7,10 @@ import { i18n, i18nCb, i18nConfig } from '/app/i18n' import { getAppLanguage } from '/app/redux/config' import { useIsOEMMode } from '/app/resources/robot-settings/hooks' -import type * as React from 'react' +import type { ReactNode } from 'react' export interface LocalizationProviderProps { - children?: React.ReactNode + children?: ReactNode } export const BRANDED_RESOURCE = 'branded' diff --git a/app/src/__testing-utils__/renderWithProviders.tsx b/app/src/__testing-utils__/renderWithProviders.tsx index 11e3ba16d9b..4c3115281f5 100644 --- a/app/src/__testing-utils__/renderWithProviders.tsx +++ b/app/src/__testing-utils__/renderWithProviders.tsx @@ -1,6 +1,5 @@ // render using targetted component using @testing-library/react // with wrapping providers for i18next and redux -import type * as React from 'react' import { QueryClient, QueryClientProvider } from 'react-query' import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' @@ -8,16 +7,22 @@ import { vi } from 'vitest' import { render } from '@testing-library/react' import { createStore } from 'redux' +import type { + ComponentProps, + ComponentType, + PropsWithChildren, + ReactElement, +} from 'react' import type { PreloadedState, Store } from 'redux' import type { RenderOptions, RenderResult } from '@testing-library/react' export interface RenderWithProvidersOptions extends RenderOptions { initialState?: State - i18nInstance: React.ComponentProps['i18n'] + i18nInstance: ComponentProps['i18n'] } export function renderWithProviders( - Component: React.ReactElement, + Component: ReactElement, options?: RenderWithProvidersOptions ): [RenderResult, Store] { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions @@ -32,7 +37,7 @@ export function renderWithProviders( const queryClient = new QueryClient() - const ProviderWrapper: React.ComponentType> = ({ + const ProviderWrapper: ComponentType> = ({ children, }) => { const BaseWrapper = ( diff --git a/app/src/atoms/InlineNotification/__tests__/InlineNotification.test.tsx b/app/src/atoms/InlineNotification/__tests__/InlineNotification.test.tsx index 0e91433e7b2..bb5ba0669b9 100644 --- a/app/src/atoms/InlineNotification/__tests__/InlineNotification.test.tsx +++ b/app/src/atoms/InlineNotification/__tests__/InlineNotification.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { screen, fireEvent } from '@testing-library/react' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { InlineNotification } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('InlineNotification', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/InlineNotification/index.tsx b/app/src/atoms/InlineNotification/index.tsx index 5b5bf21aafa..cf413b652cc 100644 --- a/app/src/atoms/InlineNotification/index.tsx +++ b/app/src/atoms/InlineNotification/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { ALIGN_CENTER, @@ -19,6 +18,7 @@ import { Link, } from '@opentrons/components' +import type { MouseEventHandler } from 'react' import type { IconProps, StyleProps } from '@opentrons/components' type InlineNotificationType = 'alert' | 'error' | 'neutral' | 'success' @@ -32,9 +32,9 @@ export interface InlineNotificationProps extends StyleProps { /** Optional dynamic width based on contents */ hug?: boolean /** optional handler to show close button/clear alert */ - onCloseClick?: (() => void) | React.MouseEventHandler + onCloseClick?: (() => void) | MouseEventHandler linkText?: string - onLinkClick?: (() => void) | React.MouseEventHandler + onLinkClick?: (() => void) | MouseEventHandler } const INLINE_NOTIFICATION_PROPS_BY_TYPE: Record< diff --git a/app/src/atoms/InstrumentContainer/__tests__/InstrumentContainer.test.tsx b/app/src/atoms/InstrumentContainer/__tests__/InstrumentContainer.test.tsx index e5fa872ab54..318175558fe 100644 --- a/app/src/atoms/InstrumentContainer/__tests__/InstrumentContainer.test.tsx +++ b/app/src/atoms/InstrumentContainer/__tests__/InstrumentContainer.test.tsx @@ -1,15 +1,16 @@ -import type * as React from 'react' import { describe, it } from 'vitest' import { screen } from '@testing-library/react' import { renderWithProviders } from '/app/__testing-utils__' import { InstrumentContainer } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('InstrumentContainer', () => { - let props: React.ComponentProps + let props: ComponentProps it('renders an instrument display name', () => { props = { diff --git a/app/src/atoms/Link/__tests__/ExternalLink.test.tsx b/app/src/atoms/Link/__tests__/ExternalLink.test.tsx index f58ad595169..863a10e886e 100644 --- a/app/src/atoms/Link/__tests__/ExternalLink.test.tsx +++ b/app/src/atoms/Link/__tests__/ExternalLink.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -6,14 +5,16 @@ import { COLORS } from '@opentrons/components' import { renderWithProviders } from '/app/__testing-utils__' import { ExternalLink } from '../ExternalLink' +import type { ComponentProps } from 'react' + const TEST_URL = 'https://opentrons.com' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('ExternalLink', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/ProgressBar/__tests__/ProgressBar.test.tsx b/app/src/atoms/ProgressBar/__tests__/ProgressBar.test.tsx index 6d5b3d3fa40..557a234e969 100644 --- a/app/src/atoms/ProgressBar/__tests__/ProgressBar.test.tsx +++ b/app/src/atoms/ProgressBar/__tests__/ProgressBar.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen } from '@testing-library/react' @@ -7,12 +6,14 @@ import { COLORS } from '@opentrons/components' import { renderWithProviders } from '/app/__testing-utils__' import { ProgressBar } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders() } describe('ProgressBar', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/ProgressBar/index.tsx b/app/src/atoms/ProgressBar/index.tsx index 5852dadf2b5..bd598c0105b 100644 --- a/app/src/atoms/ProgressBar/index.tsx +++ b/app/src/atoms/ProgressBar/index.tsx @@ -1,7 +1,7 @@ -import type * as React from 'react' import { css } from 'styled-components' import { COLORS, Box } from '@opentrons/components' +import type { ReactNode } from 'react' import type { FlattenSimpleInterpolation } from 'styled-components' interface ProgressBarProps { @@ -12,7 +12,7 @@ interface ProgressBarProps { /** extra styles to be filled progress element */ innerStyles?: FlattenSimpleInterpolation /** extra elements to be rendered within container */ - children?: React.ReactNode + children?: ReactNode } export function ProgressBar({ diff --git a/app/src/atoms/SelectField/index.tsx b/app/src/atoms/SelectField/index.tsx index 50deed28266..a51ed7a9ecd 100644 --- a/app/src/atoms/SelectField/index.tsx +++ b/app/src/atoms/SelectField/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import find from 'lodash/find' import { Select } from './Select' import { @@ -11,6 +10,7 @@ import { } from '@opentrons/components' import { css } from 'styled-components' +import type { ReactNode } from 'react' import type { SelectProps, SelectOption } from './Select' import type { ActionMeta, MultiValue, SingleValue } from 'react-select' @@ -32,9 +32,9 @@ export interface SelectFieldProps { /** render function for the option label passed to react-select */ formatOptionLabel?: SelectProps['formatOptionLabel'] /** optional title */ - title?: React.ReactNode + title?: ReactNode /** optional caption. hidden when `error` is given */ - caption?: React.ReactNode + caption?: ReactNode /** if included, use error style and display error instead of caption */ error?: string | null /** change handler called with (name, value, actionMeta) */ diff --git a/app/src/atoms/Skeleton/__tests__/Skeleton.test.tsx b/app/src/atoms/Skeleton/__tests__/Skeleton.test.tsx index b03bd72e98d..471506eb864 100644 --- a/app/src/atoms/Skeleton/__tests__/Skeleton.test.tsx +++ b/app/src/atoms/Skeleton/__tests__/Skeleton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen } from '@testing-library/react' @@ -6,7 +5,9 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { Skeleton } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/atoms/Slideout/__tests__/Slideout.test.tsx b/app/src/atoms/Slideout/__tests__/Slideout.test.tsx index 8e3301ad374..cca0cb02929 100644 --- a/app/src/atoms/Slideout/__tests__/Slideout.test.tsx +++ b/app/src/atoms/Slideout/__tests__/Slideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen, fireEvent } from '@testing-library/react' @@ -6,14 +5,16 @@ import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { Slideout } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('Slideout', () => { - let props: React.ComponentProps + let props: ComponentProps const mockOnClick = vi.fn() beforeEach(() => { props = { diff --git a/app/src/atoms/Slideout/index.tsx b/app/src/atoms/Slideout/index.tsx index 53a6888efa0..7260da7c342 100644 --- a/app/src/atoms/Slideout/index.tsx +++ b/app/src/atoms/Slideout/index.tsx @@ -22,17 +22,19 @@ import { import { Divider } from '../structure' +import type { ReactElement, ReactNode } from 'react' + export interface MultiSlideoutSpecs { currentStep: number maxSteps: number } export interface SlideoutProps { - title: string | React.ReactElement - children: React.ReactNode + title: string | ReactElement + children: ReactNode onCloseClick: () => void // isExpanded is for collapse and expand animation isExpanded?: boolean - footer?: React.ReactNode + footer?: ReactNode multiSlideoutSpecs?: MultiSlideoutSpecs } diff --git a/app/src/atoms/SoftwareKeyboard/AlphanumericKeyboard/index.tsx b/app/src/atoms/SoftwareKeyboard/AlphanumericKeyboard/index.tsx index 3b3bb3ab48c..d536b18b30c 100644 --- a/app/src/atoms/SoftwareKeyboard/AlphanumericKeyboard/index.tsx +++ b/app/src/atoms/SoftwareKeyboard/AlphanumericKeyboard/index.tsx @@ -7,6 +7,8 @@ import { layoutCandidates, customDisplay, } from '../constants' + +import type { MutableRefObject } from 'react' import type { KeyboardReactInterface } from 'react-simple-keyboard' import '../index.css' @@ -15,7 +17,7 @@ import './index.css' // TODO (kk:04/05/2024) add debug to make debugging easy interface AlphanumericKeyboardProps { onChange: (input: string) => void - keyboardRef: React.MutableRefObject + keyboardRef: MutableRefObject debug?: boolean } diff --git a/app/src/atoms/SoftwareKeyboard/IndividualKey/index.tsx b/app/src/atoms/SoftwareKeyboard/IndividualKey/index.tsx index 1cc2668d788..23ed71f9851 100644 --- a/app/src/atoms/SoftwareKeyboard/IndividualKey/index.tsx +++ b/app/src/atoms/SoftwareKeyboard/IndividualKey/index.tsx @@ -1,6 +1,8 @@ -import type * as React from 'react' import { KeyboardReact as Keyboard } from 'react-simple-keyboard' + +import type { MutableRefObject } from 'react' import type { KeyboardReactInterface } from 'react-simple-keyboard' + import '../index.css' import './index.css' @@ -11,7 +13,7 @@ const customDisplay = { // TODO (kk:04/05/2024) add debug to make debugging easy interface IndividualKeyProps { onChange: (input: string) => void - keyboardRef: React.MutableRefObject + keyboardRef: MutableRefObject keyText: string debug?: boolean } diff --git a/app/src/atoms/SoftwareKeyboard/NumericalKeyboard/index.tsx b/app/src/atoms/SoftwareKeyboard/NumericalKeyboard/index.tsx index 4d3959eb9c3..16180ecbbdb 100644 --- a/app/src/atoms/SoftwareKeyboard/NumericalKeyboard/index.tsx +++ b/app/src/atoms/SoftwareKeyboard/NumericalKeyboard/index.tsx @@ -1,15 +1,16 @@ -import type * as React from 'react' import { KeyboardReact as Keyboard } from 'react-simple-keyboard' import { numericalKeyboardLayout, numericalCustom } from '../constants' +import type { MutableRefObject } from 'react' import type { KeyboardReactInterface } from 'react-simple-keyboard' + import '../index.css' import './index.css' // Note (kk:04/05/2024) add debug to make debugging easy interface NumericalKeyboardProps { onChange: (input: string) => void - keyboardRef: React.MutableRefObject + keyboardRef: MutableRefObject isDecimal?: boolean hasHyphen?: boolean debug?: boolean diff --git a/app/src/atoms/StatusLabel/__tests__/StatusLabel.test.tsx b/app/src/atoms/StatusLabel/__tests__/StatusLabel.test.tsx index 568326f0065..48a7753cab5 100644 --- a/app/src/atoms/StatusLabel/__tests__/StatusLabel.test.tsx +++ b/app/src/atoms/StatusLabel/__tests__/StatusLabel.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen } from '@testing-library/react' @@ -6,12 +5,14 @@ import { C_SKY_BLUE, COLORS } from '@opentrons/components' import { StatusLabel } from '..' import { renderWithProviders } from '/app/__testing-utils__' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('StatusLabel', () => { - let props: React.ComponentProps + let props: ComponentProps it('renders an engaged status label with a blue background and text', () => { props = { diff --git a/app/src/atoms/StepMeter/__tests__/StepMeter.test.tsx b/app/src/atoms/StepMeter/__tests__/StepMeter.test.tsx index 90f027b0f7a..dcd98b06159 100644 --- a/app/src/atoms/StepMeter/__tests__/StepMeter.test.tsx +++ b/app/src/atoms/StepMeter/__tests__/StepMeter.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen } from '@testing-library/react' @@ -6,14 +5,16 @@ import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { StepMeter } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('StepMeter', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/buttons/BackButton.tsx b/app/src/atoms/buttons/BackButton.tsx index 29657e1f1b2..2819c0eb48e 100644 --- a/app/src/atoms/buttons/BackButton.tsx +++ b/app/src/atoms/buttons/BackButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router-dom' @@ -11,11 +10,13 @@ import { TYPOGRAPHY, } from '@opentrons/components' +import type { HTMLProps } from 'react' + // TODO(bh, 2022-12-7): finish styling when designs finalized export function BackButton({ onClick, children, -}: React.HTMLProps): JSX.Element { +}: HTMLProps): JSX.Element { const navigate = useNavigate() const { t } = useTranslation('shared') diff --git a/app/src/atoms/buttons/FloatingActionButton.tsx b/app/src/atoms/buttons/FloatingActionButton.tsx index b7e870eab16..6088a5675b4 100644 --- a/app/src/atoms/buttons/FloatingActionButton.tsx +++ b/app/src/atoms/buttons/FloatingActionButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { @@ -15,9 +14,10 @@ import { StyledText, } from '@opentrons/components' +import type { ComponentProps } from 'react' import type { IconName } from '@opentrons/components' -interface FloatingActionButtonProps extends React.ComponentProps { +interface FloatingActionButtonProps extends ComponentProps { buttonText: string disabled?: boolean iconName?: IconName diff --git a/app/src/atoms/buttons/IconButton.tsx b/app/src/atoms/buttons/IconButton.tsx index ee754472ff1..43c935d462f 100644 --- a/app/src/atoms/buttons/IconButton.tsx +++ b/app/src/atoms/buttons/IconButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { BORDERS, @@ -10,8 +9,10 @@ import { } from '@opentrons/components' import { ODD_FOCUS_VISIBLE } from './constants' -interface IconButtonProps extends React.ComponentProps { - iconName: React.ComponentProps['name'] +import type { ComponentProps } from 'react' + +interface IconButtonProps extends ComponentProps { + iconName: ComponentProps['name'] hasBackground?: boolean } diff --git a/app/src/atoms/buttons/MediumButton.tsx b/app/src/atoms/buttons/MediumButton.tsx index d784029696a..7439cb39a46 100644 --- a/app/src/atoms/buttons/MediumButton.tsx +++ b/app/src/atoms/buttons/MediumButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { ALIGN_CENTER, @@ -16,6 +15,7 @@ import { } from '@opentrons/components' import { ODD_FOCUS_VISIBLE } from './constants' +import type { MouseEventHandler, ReactNode } from 'react' import type { IconName, StyleProps } from '@opentrons/components' import type { ButtonCategory } from './SmallButton' @@ -28,12 +28,12 @@ type MediumButtonTypes = | 'tertiaryLowLight' interface MediumButtonProps extends StyleProps { - buttonText: React.ReactNode + buttonText: ReactNode buttonType?: MediumButtonTypes disabled?: boolean iconName?: IconName buttonCategory?: ButtonCategory - onClick: React.MouseEventHandler + onClick: MouseEventHandler } export function MediumButton(props: MediumButtonProps): JSX.Element { diff --git a/app/src/atoms/buttons/SmallButton.tsx b/app/src/atoms/buttons/SmallButton.tsx index e659d52fd58..7ad8c3d1a99 100644 --- a/app/src/atoms/buttons/SmallButton.tsx +++ b/app/src/atoms/buttons/SmallButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { ALIGN_CENTER, @@ -15,6 +14,8 @@ import { TYPOGRAPHY, } from '@opentrons/components' import { ODD_FOCUS_VISIBLE } from './constants' + +import type { MouseEventHandler, ReactNode } from 'react' import type { IconName, StyleProps } from '@opentrons/components' export type SmallButtonTypes = @@ -28,9 +29,9 @@ export type ButtonCategory = 'default' | 'rounded' export type IconPlacement = 'startIcon' | 'endIcon' interface SmallButtonProps extends StyleProps { - onClick: React.MouseEventHandler + onClick: MouseEventHandler buttonType?: SmallButtonTypes - buttonText: React.ReactNode + buttonText: ReactNode iconPlacement?: IconPlacement | null iconName?: IconName | null buttonCategory?: ButtonCategory // if not specified, it will be 'default' diff --git a/app/src/atoms/buttons/SubmitPrimaryButton.tsx b/app/src/atoms/buttons/SubmitPrimaryButton.tsx index cdbf3442a65..cc53717bab0 100644 --- a/app/src/atoms/buttons/SubmitPrimaryButton.tsx +++ b/app/src/atoms/buttons/SubmitPrimaryButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { SPACING, @@ -8,10 +7,12 @@ import { styleProps, } from '@opentrons/components' +import type { MouseEvent } from 'react' + interface SubmitPrimaryButtonProps { form: string value: string - onClick?: (event: React.MouseEvent) => unknown + onClick?: (event: MouseEvent) => unknown disabled?: boolean } export const SubmitPrimaryButton = ( diff --git a/app/src/atoms/buttons/TextOnlyButton.tsx b/app/src/atoms/buttons/TextOnlyButton.tsx index de3bbc969ab..0acdaf058ed 100644 --- a/app/src/atoms/buttons/TextOnlyButton.tsx +++ b/app/src/atoms/buttons/TextOnlyButton.tsx @@ -1,7 +1,8 @@ -import type * as React from 'react' +import { css } from 'styled-components' import { Btn, StyledText, COLORS, RESPONSIVENESS } from '@opentrons/components' + +import type { ReactNode } from 'react' import type { StyleProps } from '@opentrons/components' -import { css } from 'styled-components' const GO_BACK_BUTTON_STYLE = css` color: ${COLORS.grey50}; @@ -26,7 +27,7 @@ const GO_BACK_BUTTON_DISABLED_STYLE = css` interface TextOnlyButtonProps extends StyleProps { onClick: () => void - buttonText: React.ReactNode + buttonText: ReactNode disabled?: boolean } diff --git a/app/src/atoms/buttons/ToggleButton.tsx b/app/src/atoms/buttons/ToggleButton.tsx index b814f45da1d..42efbde32fb 100644 --- a/app/src/atoms/buttons/ToggleButton.tsx +++ b/app/src/atoms/buttons/ToggleButton.tsx @@ -1,8 +1,8 @@ -import type * as React from 'react' import { css } from 'styled-components' -import { Btn, Icon, COLORS, SIZE_1, SIZE_2 } from '@opentrons/components' +import { Btn, COLORS, Icon } from '@opentrons/components' +import type { MouseEvent } from 'react' import type { StyleProps } from '@opentrons/components' const TOGGLE_DISABLED_STYLES = css` @@ -42,7 +42,7 @@ interface ToggleButtonProps extends StyleProps { toggledOn: boolean disabled?: boolean | null id?: string - onClick?: (e: React.MouseEvent) => unknown + onClick?: (e: MouseEvent) => unknown } export const ToggleButton = (props: ToggleButtonProps): JSX.Element => { @@ -55,12 +55,12 @@ export const ToggleButton = (props: ToggleButtonProps): JSX.Element => { role="switch" aria-label={label} aria-checked={toggledOn} - size={size ?? SIZE_2} + size={size ?? '2rem'} css={props.toggledOn ? TOGGLE_ENABLED_STYLES : TOGGLE_DISABLED_STYLES} {...buttonProps} > {/* TODO(bh, 2022-10-05): implement small and large sizes from design system */} - + ) } diff --git a/app/src/atoms/buttons/__tests__/BackButton.test.tsx b/app/src/atoms/buttons/__tests__/BackButton.test.tsx index 510abd0ee7d..67a65d107da 100644 --- a/app/src/atoms/buttons/__tests__/BackButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/BackButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -9,7 +8,9 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { BackButton } from '..' -const render = (props?: React.HTMLProps) => { +import type { HTMLProps } from 'react' + +const render = (props?: HTMLProps) => { return renderWithProviders( ) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('FloatingActionButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/buttons/__tests__/MediumButton.test.tsx b/app/src/atoms/buttons/__tests__/MediumButton.test.tsx index 988248413d9..1ce59db9217 100644 --- a/app/src/atoms/buttons/__tests__/MediumButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/MediumButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, vi, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -7,12 +6,14 @@ import { renderWithProviders } from '/app/__testing-utils__' import { MediumButton } from '../MediumButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('MediumButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onClick: vi.fn(), diff --git a/app/src/atoms/buttons/__tests__/QuaternaryButton.test.tsx b/app/src/atoms/buttons/__tests__/QuaternaryButton.test.tsx index 4e10831c73c..7fd27eb874c 100644 --- a/app/src/atoms/buttons/__tests__/QuaternaryButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/QuaternaryButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, beforeEach, vi } from 'vitest' import { screen } from '@testing-library/react' @@ -7,6 +6,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { QuaternaryButton } from '..' +import type { ComponentProps } from 'react' + vi.mock('styled-components', async () => { const actual = await vi.importActual( 'styled-components/dist/styled-components.browser.esm.js' @@ -14,12 +15,12 @@ vi.mock('styled-components', async () => { return actual }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('QuaternaryButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/buttons/__tests__/SmallButton.test.tsx b/app/src/atoms/buttons/__tests__/SmallButton.test.tsx index 283f21daf4e..84341d3b39b 100644 --- a/app/src/atoms/buttons/__tests__/SmallButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/SmallButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { fireEvent, screen } from '@testing-library/react' @@ -7,12 +6,14 @@ import { COLORS, BORDERS } from '@opentrons/components' import { SmallButton } from '../SmallButton' import { renderWithProviders } from '/app/__testing-utils__' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('SmallButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/buttons/__tests__/SubmitPrimaryButton.test.tsx b/app/src/atoms/buttons/__tests__/SubmitPrimaryButton.test.tsx index a62ba9c4a95..6af258d9d3f 100644 --- a/app/src/atoms/buttons/__tests__/SubmitPrimaryButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/SubmitPrimaryButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { fireEvent, screen } from '@testing-library/react' @@ -6,15 +5,16 @@ import { COLORS, SPACING, TYPOGRAPHY, BORDERS } from '@opentrons/components' import { renderWithProviders } from '/app/__testing-utils__' import { SubmitPrimaryButton } from '..' +import type { ComponentProps } from 'react' const mockOnClick = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('SubmitPrimaryButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/buttons/__tests__/TertiaryButton.test.tsx b/app/src/atoms/buttons/__tests__/TertiaryButton.test.tsx index 4a3f95369c8..30b15c5bea2 100644 --- a/app/src/atoms/buttons/__tests__/TertiaryButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/TertiaryButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' import { renderWithProviders } from '/app/__testing-utils__' @@ -7,12 +6,14 @@ import { COLORS, SPACING, TYPOGRAPHY, BORDERS } from '@opentrons/components' import { TertiaryButton } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('TertiaryButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/buttons/__tests__/ToggleButton.test.tsx b/app/src/atoms/buttons/__tests__/ToggleButton.test.tsx index 3f61d43c5d0..29991d4ae0f 100644 --- a/app/src/atoms/buttons/__tests__/ToggleButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/ToggleButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import { screen, fireEvent } from '@testing-library/react' import { COLORS, SIZE_2 } from '@opentrons/components' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { ToggleButton } from '..' +import type { ComponentProps } from 'react' + const mockOnClick = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('ToggleButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/structure/Divider.tsx b/app/src/atoms/structure/Divider.tsx index db55ad84f44..a253f27dce4 100644 --- a/app/src/atoms/structure/Divider.tsx +++ b/app/src/atoms/structure/Divider.tsx @@ -1,7 +1,7 @@ -import type * as React from 'react' import { Box, COLORS, SPACING } from '@opentrons/components' +import type { ComponentProps } from 'react' -type Props = React.ComponentProps +type Props = ComponentProps export function Divider(props: Props): JSX.Element { const { marginY } = props diff --git a/app/src/atoms/structure/Line.tsx b/app/src/atoms/structure/Line.tsx index ecbbecc24cd..8eb456233f6 100644 --- a/app/src/atoms/structure/Line.tsx +++ b/app/src/atoms/structure/Line.tsx @@ -1,7 +1,7 @@ -import type * as React from 'react' import { Box, BORDERS } from '@opentrons/components' +import type { ComponentProps } from 'react' -type Props = React.ComponentProps +type Props = ComponentProps export function Line(props: Props): JSX.Element { return diff --git a/app/src/atoms/structure/__tests__/Divider.test.tsx b/app/src/atoms/structure/__tests__/Divider.test.tsx index 27460be938d..0aa40edb9d4 100644 --- a/app/src/atoms/structure/__tests__/Divider.test.tsx +++ b/app/src/atoms/structure/__tests__/Divider.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen } from '@testing-library/react' @@ -6,12 +5,14 @@ import { SPACING, COLORS } from '@opentrons/components' import { renderWithProviders } from '/app/__testing-utils__' import { Divider } from '../index' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('Divider', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/atoms/structure/__tests__/Line.test.tsx b/app/src/atoms/structure/__tests__/Line.test.tsx index d9a9caefba2..c4e3e267565 100644 --- a/app/src/atoms/structure/__tests__/Line.test.tsx +++ b/app/src/atoms/structure/__tests__/Line.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen } from '@testing-library/react' @@ -6,12 +5,14 @@ import { SPACING, COLORS } from '@opentrons/components' import { Line } from '../index' import { renderWithProviders } from '/app/__testing-utils__' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('Line', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/local-resources/config/constants.ts b/app/src/local-resources/config/constants.ts deleted file mode 100644 index 1c7b0e2727d..00000000000 --- a/app/src/local-resources/config/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const SLEEP_NEVER_MS = 604800000 diff --git a/app/src/local-resources/config/index.ts b/app/src/local-resources/config/index.ts deleted file mode 100644 index f87cf0102a1..00000000000 --- a/app/src/local-resources/config/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './constants' diff --git a/app/src/local-resources/dom-utils/constants.ts b/app/src/local-resources/dom-utils/constants.ts new file mode 100644 index 00000000000..f48e8566837 --- /dev/null +++ b/app/src/local-resources/dom-utils/constants.ts @@ -0,0 +1,2 @@ +// See RQA-3813 and associated PR. We are stuck using this hardcoded number to mean "never" or migrate the on-filesystem value. +export const SLEEP_NEVER_MS = 604800000 diff --git a/components/src/hooks/__tests__/useIdle.test.ts b/app/src/local-resources/dom-utils/hooks/__tests__/useScreenIdle.test.ts similarity index 62% rename from components/src/hooks/__tests__/useIdle.test.ts rename to app/src/local-resources/dom-utils/hooks/__tests__/useScreenIdle.test.ts index 8063c317325..e449b0cd82e 100644 --- a/components/src/hooks/__tests__/useIdle.test.ts +++ b/app/src/local-resources/dom-utils/hooks/__tests__/useScreenIdle.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import { renderHook } from '@testing-library/react' -import { useIdle } from '../useIdle' +import { useScreenIdle } from '../useScreenIdle' +import { SLEEP_NEVER_MS } from '/app/local-resources/dom-utils' const MOCK_EVENTS: Array = [ 'mousedown', @@ -20,19 +21,19 @@ describe('useIdle', () => { it('should return the default initialState', () => { const mockTime = 1000 - const { result } = renderHook(() => useIdle(mockTime)) + const { result } = renderHook(() => useScreenIdle(mockTime)) expect(result.current).toBe(true) }) it('should return the given initialState', () => { const mockTime = 1000 - const { result } = renderHook(() => useIdle(mockTime, MOCK_OPTIONS)) + const { result } = renderHook(() => useScreenIdle(mockTime, MOCK_OPTIONS)) expect(result.current).toBe(false) }) it('should return true after 1000ms', () => { const mockTime = 1000 - const { result } = renderHook(() => useIdle(mockTime, MOCK_OPTIONS)) + const { result } = renderHook(() => useScreenIdle(mockTime, MOCK_OPTIONS)) expect(result.current).toBe(false) setTimeout(() => { expect(result.current).toBe(true) @@ -41,7 +42,7 @@ describe('useIdle', () => { it('should return true after 180,000ms - 3min', () => { const mockTime = 60 * 1000 * 3 - const { result } = renderHook(() => useIdle(mockTime, MOCK_OPTIONS)) + const { result } = renderHook(() => useScreenIdle(mockTime, MOCK_OPTIONS)) expect(result.current).toBe(false) setTimeout(() => { expect(result.current).toBe(true) @@ -50,7 +51,7 @@ describe('useIdle', () => { it('should return true after 180,0000ms - 30min', () => { const mockTime = 60 * 1000 * 30 - const { result } = renderHook(() => useIdle(mockTime, MOCK_OPTIONS)) + const { result } = renderHook(() => useScreenIdle(mockTime, MOCK_OPTIONS)) expect(result.current).toBe(false) setTimeout(() => { expect(result.current).toBe(true) @@ -59,10 +60,19 @@ describe('useIdle', () => { it('should return true after 3,600,000ms - 1 hour', () => { const mockTime = 60 * 1000 * 60 - const { result } = renderHook(() => useIdle(mockTime, MOCK_OPTIONS)) + const { result } = renderHook(() => useScreenIdle(mockTime, MOCK_OPTIONS)) expect(result.current).toBe(false) setTimeout(() => { expect(result.current).toBe(true) }, 3600001) }) + + it(`should always return false if the idle time is exactly ${SLEEP_NEVER_MS}`, () => { + const mockTime = SLEEP_NEVER_MS + const { result } = renderHook(() => useScreenIdle(mockTime, MOCK_OPTIONS)) + expect(result.current).toBe(false) + setTimeout(() => { + expect(result.current).toBe(false) + }, 604800001) + }) }) diff --git a/app/src/local-resources/dom-utils/hooks/index.ts b/app/src/local-resources/dom-utils/hooks/index.ts index 2098c90e0c3..97edf1a5b1d 100644 --- a/app/src/local-resources/dom-utils/hooks/index.ts +++ b/app/src/local-resources/dom-utils/hooks/index.ts @@ -1 +1,2 @@ export * from './useScrollPosition' +export * from './useScreenIdle' diff --git a/components/src/hooks/useIdle.ts b/app/src/local-resources/dom-utils/hooks/useScreenIdle.ts similarity index 82% rename from components/src/hooks/useIdle.ts rename to app/src/local-resources/dom-utils/hooks/useScreenIdle.ts index 7fea9f832ca..d36c6cfb326 100644 --- a/components/src/hooks/useIdle.ts +++ b/app/src/local-resources/dom-utils/hooks/useScreenIdle.ts @@ -1,4 +1,5 @@ import { useState, useEffect, useRef } from 'react' +import { SLEEP_NEVER_MS } from '/app/local-resources/dom-utils' const USER_EVENTS: Array = [ 'click', @@ -29,7 +30,7 @@ const DEFAULT_OPTIONS = { * @param {object} options (events that the app need to check, initialState: initial state true => idle) * @returns {boolean} */ -export function useIdle( +export function useScreenIdle( idleTime: number, options?: Partial<{ events: Array @@ -48,9 +49,12 @@ export function useIdle( window.clearTimeout(idleTimer.current) } - idleTimer.current = window.setTimeout(() => { - setIdle(true) - }, idleTime) + // See RQA-3813 and associated PR. + if (idleTime !== SLEEP_NEVER_MS) { + idleTimer.current = window.setTimeout(() => { + setIdle(true) + }, idleTime) + } } events.forEach(event => { diff --git a/app/src/local-resources/dom-utils/index.ts b/app/src/local-resources/dom-utils/index.ts index fc78d35129c..907d7e254c1 100644 --- a/app/src/local-resources/dom-utils/index.ts +++ b/app/src/local-resources/dom-utils/index.ts @@ -1 +1,2 @@ export * from './hooks' +export * from './constants' diff --git a/app/src/molecules/BackgroundOverlay/__tests__/BackgroundOverlay.test.tsx b/app/src/molecules/BackgroundOverlay/__tests__/BackgroundOverlay.test.tsx index e09b3c11765..882c4a644b4 100644 --- a/app/src/molecules/BackgroundOverlay/__tests__/BackgroundOverlay.test.tsx +++ b/app/src/molecules/BackgroundOverlay/__tests__/BackgroundOverlay.test.tsx @@ -1,15 +1,16 @@ -import type * as React from 'react' import { describe, it, expect, vi } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '/app/__testing-utils__' import { BackgroundOverlay } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('BackgroundOverlay', () => { - let props: React.ComponentProps + let props: ComponentProps it('renders background overlay', () => { props = { onClick: vi.fn() } render(props) diff --git a/app/src/molecules/BackgroundOverlay/index.tsx b/app/src/molecules/BackgroundOverlay/index.tsx index 3d6c6d976c6..c0a711ffa91 100644 --- a/app/src/molecules/BackgroundOverlay/index.tsx +++ b/app/src/molecules/BackgroundOverlay/index.tsx @@ -1,8 +1,9 @@ -import type * as React from 'react' import { css } from 'styled-components' import { COLORS, Flex, POSITION_FIXED } from '@opentrons/components' +import type { ComponentProps, MouseEventHandler } from 'react' + const BACKGROUND_OVERLAY_STYLE = css` position: ${POSITION_FIXED}; inset: 0; @@ -10,10 +11,9 @@ const BACKGROUND_OVERLAY_STYLE = css` background-color: ${COLORS.black90}${COLORS.opacity60HexCode}; ` -export interface BackgroundOverlayProps - extends React.ComponentProps { +export interface BackgroundOverlayProps extends ComponentProps { // onClick handler so when you click anywhere in the overlay, the modal/menu closes - onClick: React.MouseEventHandler + onClick: MouseEventHandler } export function BackgroundOverlay(props: BackgroundOverlayProps): JSX.Element { diff --git a/app/src/molecules/CardButton/__tests__/CardButton.test.tsx b/app/src/molecules/CardButton/__tests__/CardButton.test.tsx index 820dfbdc4e9..177d61dfd2d 100644 --- a/app/src/molecules/CardButton/__tests__/CardButton.test.tsx +++ b/app/src/molecules/CardButton/__tests__/CardButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -7,6 +6,8 @@ import { COLORS } from '@opentrons/components' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { CardButton } from '..' + +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const mockNavigate = vi.fn() @@ -19,7 +20,7 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -31,7 +32,7 @@ const render = (props: React.ComponentProps) => { } describe('CardButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/Command/CommandText.tsx b/app/src/molecules/Command/CommandText.tsx index e690115a88b..a2d872af5a8 100644 --- a/app/src/molecules/Command/CommandText.tsx +++ b/app/src/molecules/Command/CommandText.tsx @@ -1,5 +1,5 @@ -import type * as React from 'react' import { pick } from 'lodash' +import { css } from 'styled-components' import { ALIGN_CENTER, @@ -13,6 +13,7 @@ import { import { useCommandTextString } from '/app/local-resources/commands' +import type { ComponentProps } from 'react' import type { LabwareDefinition2, RobotType, @@ -26,13 +27,13 @@ import type { } from '/app/local-resources/commands' interface LegacySTProps { - as?: React.ComponentProps['as'] + as?: ComponentProps['as'] modernStyledTextDefaults?: false } interface ModernSTProps { - desktopStyle?: React.ComponentProps['desktopStyle'] - oddStyle?: React.ComponentProps['oddStyle'] + desktopStyle?: ComponentProps['desktopStyle'] + oddStyle?: ComponentProps['oddStyle'] modernStyledTextDefaults: true } @@ -174,21 +175,10 @@ function ThermocyclerRunProfile( >
    {shouldPropagateTextLimit(propagateTextLimit, isOnDevice) ? ( -
  • - {stepTexts[0]} -
  • +
  • {stepTexts[0]}
  • ) : ( stepTexts.map((step: string, index: number) => ( -
  • +
  • {' '} {step}
  • @@ -252,11 +242,7 @@ function ThermocyclerRunExtendedProfile( >
      {shouldPropagateTextLimit(propagateTextLimit, isOnDevice) ? ( -
    • +
    • {profileElementTexts[0].kind === 'step' ? profileElementTexts[0].stepText : profileElementTexts[0].cycleText} @@ -264,30 +250,18 @@ function ThermocyclerRunExtendedProfile( ) : ( profileElementTexts.map((element, index: number) => element.kind === 'step' ? ( -
    • +
    • {' '} {element.stepText}
    • ) : ( -
    • +
    • {element.cycleText}
        {element.stepTexts.map( ({ stepText }, stepIndex: number) => (
      • {' '} @@ -305,3 +279,7 @@ function ThermocyclerRunExtendedProfile( ) } + +const LIST_STYLE = css` + margin-left: ${SPACING.spacing4}; +` diff --git a/app/src/molecules/FileUpload/__tests__/FileUpload.test.tsx b/app/src/molecules/FileUpload/__tests__/FileUpload.test.tsx index cd5b5adfd82..9f3c22db269 100644 --- a/app/src/molecules/FileUpload/__tests__/FileUpload.test.tsx +++ b/app/src/molecules/FileUpload/__tests__/FileUpload.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { beforeEach, describe, expect, it, vi } from 'vitest' import { screen } from '@testing-library/react' @@ -7,7 +6,9 @@ import { i18n } from '/app/i18n' import { FileUpload } from '..' import testFile from './test-file.png' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -16,7 +17,7 @@ const render = (props: React.ComponentProps) => { const handleClick = vi.fn() describe('FileUpload', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { const file = new File([testFile], 'a-file-to-test.png') diff --git a/app/src/molecules/GenericWizardTile/__tests__/GenericWizardTile.test.tsx b/app/src/molecules/GenericWizardTile/__tests__/GenericWizardTile.test.tsx index 1f53800ff6d..ee1d680d4d2 100644 --- a/app/src/molecules/GenericWizardTile/__tests__/GenericWizardTile.test.tsx +++ b/app/src/molecules/GenericWizardTile/__tests__/GenericWizardTile.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, vi, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -7,16 +6,18 @@ import { renderWithProviders } from '/app/__testing-utils__' import { getIsOnDevice } from '/app/redux/config' import { GenericWizardTile } from '..' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('GenericWizardTile', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/GenericWizardTile/index.tsx b/app/src/molecules/GenericWizardTile/index.tsx index 24883a6ffea..3948daa292a 100644 --- a/app/src/molecules/GenericWizardTile/index.tsx +++ b/app/src/molecules/GenericWizardTile/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useSelector } from 'react-redux' import styled, { css } from 'styled-components' import { useTranslation } from 'react-i18next' @@ -26,6 +25,8 @@ import { getIsOnDevice } from '/app/redux/config' import { NeedHelpLink } from '/app/molecules/OT2CalibrationNeedHelpLink' import { SmallButton, TextOnlyButton } from '/app/atoms/buttons' +import type { ReactNode } from 'react' + const ALIGN_BUTTONS = css` align-items: ${ALIGN_FLEX_END}; @@ -59,13 +60,13 @@ const TILE_CONTAINER_STYLE = css` } ` export interface GenericWizardTileProps { - rightHandBody: React.ReactNode - bodyText: React.ReactNode - header: string | React.ReactNode + rightHandBody: ReactNode + bodyText: ReactNode + header: string | ReactNode getHelp?: string back?: () => void proceed?: () => void - proceedButtonText?: React.ReactNode + proceedButtonText?: ReactNode proceedIsDisabled?: boolean proceedButton?: JSX.Element backIsDisabled?: boolean diff --git a/app/src/molecules/InProgressModal/InProgressModal.tsx b/app/src/molecules/InProgressModal/InProgressModal.tsx index c6fefe761a2..82693b34429 100644 --- a/app/src/molecules/InProgressModal/InProgressModal.tsx +++ b/app/src/molecules/InProgressModal/InProgressModal.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { ALIGN_CENTER, @@ -13,9 +12,11 @@ import { TYPOGRAPHY, } from '@opentrons/components' +import type { ReactNode } from 'react' + interface Props { // optional override of the spinner - alternativeSpinner?: React.ReactNode + alternativeSpinner?: ReactNode description?: string body?: string children?: JSX.Element diff --git a/app/src/molecules/InProgressModal/__tests__/InProgressModal.test.tsx b/app/src/molecules/InProgressModal/__tests__/InProgressModal.test.tsx index f670fa221c3..db7ac2294cf 100644 --- a/app/src/molecules/InProgressModal/__tests__/InProgressModal.test.tsx +++ b/app/src/molecules/InProgressModal/__tests__/InProgressModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach, vi } from 'vitest' import { i18n } from '/app/i18n' @@ -6,15 +5,17 @@ import { getIsOnDevice } from '/app/redux/config' import { renderWithProviders } from '/app/__testing-utils__' import { InProgressModal } from '../InProgressModal' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('InProgressModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(getIsOnDevice).mockReturnValue(false) }) diff --git a/app/src/molecules/InfoMessage/__tests__/InfoMessage.test.tsx b/app/src/molecules/InfoMessage/__tests__/InfoMessage.test.tsx index 5ff6948976f..378e1eff503 100644 --- a/app/src/molecules/InfoMessage/__tests__/InfoMessage.test.tsx +++ b/app/src/molecules/InfoMessage/__tests__/InfoMessage.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { describe, it, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { screen } from '@testing-library/react' import { i18n } from '/app/i18n' import { InfoMessage } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('InfoMessage', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/InstrumentCard/index.tsx b/app/src/molecules/InstrumentCard/index.tsx index edcee546c32..2cd838a08bd 100644 --- a/app/src/molecules/InstrumentCard/index.tsx +++ b/app/src/molecules/InstrumentCard/index.tsx @@ -1,5 +1,3 @@ -import type * as React from 'react' - import { ALIGN_CENTER, ALIGN_FLEX_START, @@ -22,6 +20,7 @@ import flexGripper from '/app/assets/images/flex_gripper.png' import { MenuOverlay } from './MenuOverlay' +import type { ReactNode } from 'react' import type { InstrumentDiagramProps, StyleProps } from '@opentrons/components' import type { MenuOverlayItemProps } from './MenuOverlay' @@ -33,7 +32,7 @@ interface InstrumentCardProps extends StyleProps { instrumentDiagramProps?: InstrumentDiagramProps // special casing the gripper at least for now isGripperAttached?: boolean - banner?: React.ReactNode + banner?: ReactNode isEstopNotDisengaged: boolean } diff --git a/app/src/molecules/InterventionModal/InterventionContent/index.tsx b/app/src/molecules/InterventionModal/InterventionContent/index.tsx index 8d2bbba9c8c..e9b156cf0e6 100644 --- a/app/src/molecules/InterventionModal/InterventionContent/index.tsx +++ b/app/src/molecules/InterventionModal/InterventionContent/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { Flex, StyledText, @@ -7,15 +6,17 @@ import { RESPONSIVENESS, } from '@opentrons/components' import { InlineNotification } from '/app/atoms/InlineNotification' - import { InterventionInfo } from './InterventionInfo' + +import type { ComponentProps } from 'react' + export type { InterventionInfoProps } from './InterventionInfo' export { InterventionInfo } export interface InterventionContentProps { headline: string - infoProps: React.ComponentProps - notificationProps?: React.ComponentProps + infoProps: ComponentProps + notificationProps?: ComponentProps } export function InterventionContent({ diff --git a/app/src/molecules/InterventionModal/OneColumn.tsx b/app/src/molecules/InterventionModal/OneColumn.tsx index 35a37dd10f9..8fca9f26ff3 100644 --- a/app/src/molecules/InterventionModal/OneColumn.tsx +++ b/app/src/molecules/InterventionModal/OneColumn.tsx @@ -1,14 +1,14 @@ -import type * as React from 'react' - import { Flex, DIRECTION_COLUMN, JUSTIFY_SPACE_BETWEEN, } from '@opentrons/components' + +import type { ReactNode } from 'react' import type { StyleProps } from '@opentrons/components' export interface OneColumnProps extends StyleProps { - children: React.ReactNode + children: ReactNode } export function OneColumn({ diff --git a/app/src/molecules/InterventionModal/OneColumnOrTwoColumn.tsx b/app/src/molecules/InterventionModal/OneColumnOrTwoColumn.tsx index db25d343be5..0a02f3397ac 100644 --- a/app/src/molecules/InterventionModal/OneColumnOrTwoColumn.tsx +++ b/app/src/molecules/InterventionModal/OneColumnOrTwoColumn.tsx @@ -1,5 +1,3 @@ -import type * as React from 'react' - import { css } from 'styled-components' import { Flex, @@ -9,11 +7,13 @@ import { WRAP, RESPONSIVENESS, } from '@opentrons/components' -import type { StyleProps } from '@opentrons/components' import { TWO_COLUMN_ELEMENT_MIN_WIDTH } from './constants' +import type { ReactNode } from 'react' +import type { StyleProps } from '@opentrons/components' + export interface OneColumnOrTwoColumnProps extends StyleProps { - children: [React.ReactNode, React.ReactNode] + children: [ReactNode, ReactNode] } export function OneColumnOrTwoColumn({ diff --git a/app/src/molecules/InterventionModal/TwoColumn.tsx b/app/src/molecules/InterventionModal/TwoColumn.tsx index fc9072232be..600386ec60f 100644 --- a/app/src/molecules/InterventionModal/TwoColumn.tsx +++ b/app/src/molecules/InterventionModal/TwoColumn.tsx @@ -1,11 +1,11 @@ -import type * as React from 'react' - import { Flex, Box, DIRECTION_ROW, SPACING, WRAP } from '@opentrons/components' import type { StyleProps } from '@opentrons/components' import { TWO_COLUMN_ELEMENT_MIN_WIDTH } from './constants' +import type { ReactNode } from 'react' + export interface TwoColumnProps extends StyleProps { - children: [React.ReactNode, React.ReactNode] + children: [ReactNode, ReactNode] } export function TwoColumn({ diff --git a/app/src/molecules/InterventionModal/__tests__/InterventionModal.test.tsx b/app/src/molecules/InterventionModal/__tests__/InterventionModal.test.tsx index a063bee13bc..bdbe4c95e70 100644 --- a/app/src/molecules/InterventionModal/__tests__/InterventionModal.test.tsx +++ b/app/src/molecules/InterventionModal/__tests__/InterventionModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import { when } from 'vitest-when' import '@testing-library/jest-dom/vitest' @@ -12,6 +11,7 @@ import { getIsOnDevice } from '/app/redux/config' import { InterventionModal } from '../' +import type { ComponentProps } from 'react' import type { ModalType } from '../' import type { State } from '/app/redux/types' @@ -23,7 +23,7 @@ const MOCK_STATE: State = { }, } as any -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, initialState: MOCK_STATE, @@ -31,7 +31,7 @@ const render = (props: React.ComponentProps) => { } describe('InterventionModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/InterventionModal/__tests__/ModalContentOneColSimpleButtons.test.tsx b/app/src/molecules/InterventionModal/__tests__/ModalContentOneColSimpleButtons.test.tsx index b68e8a379a0..bb25d211619 100644 --- a/app/src/molecules/InterventionModal/__tests__/ModalContentOneColSimpleButtons.test.tsx +++ b/app/src/molecules/InterventionModal/__tests__/ModalContentOneColSimpleButtons.test.tsx @@ -1,9 +1,10 @@ -import type * as React from 'react' import { vi, describe, it, expect } from 'vitest' import { render, screen, fireEvent } from '@testing-library/react' import { ModalContentOneColSimpleButtons } from '../ModalContentOneColSimpleButtons' +import type { ChangeEventHandler } from 'react' + /* eslint-disable testing-library/no-node-access */ const inputElForButtonFromButtonText = (text: string): HTMLInputElement => ((screen.getByText(text)?.parentElement?.parentElement @@ -88,7 +89,7 @@ describe('InterventionModal', () => { firstButton={{ label: 'first button', value: 'first', - onChange: onChange as React.ChangeEventHandler, + onChange: onChange as ChangeEventHandler, }} secondButton={{ label: 'second button', value: 'second' }} furtherButtons={[{ label: 'third button', value: 'third' }]} diff --git a/app/src/molecules/InterventionModal/index.tsx b/app/src/molecules/InterventionModal/index.tsx index 679d3b3d1f8..3e4801d4922 100644 --- a/app/src/molecules/InterventionModal/index.tsx +++ b/app/src/molecules/InterventionModal/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useSelector } from 'react-redux' import { css } from 'styled-components' @@ -32,6 +31,7 @@ import { DescriptionContent } from './DescriptionContent' import { DeckMapContent } from './DeckMapContent' import { CategorizedStepContent } from './CategorizedStepContent' +import type { MouseEvent, ReactNode } from 'react' import type { FlattenSimpleInterpolation } from 'styled-components' import type { IconName } from '@opentrons/components' @@ -116,9 +116,9 @@ const ERROR_COLOR = COLORS.red50 export interface InterventionModalProps { /** Optional modal title heading. Aligned to the left. */ - titleHeading?: React.ReactNode + titleHeading?: ReactNode /** Optional modal heading right of the icon. Aligned right if titleHeading is supplied, otherwise aligned left. **/ - iconHeading?: React.ReactNode + iconHeading?: ReactNode /** Optional onClick for the icon heading and icon. */ iconHeadingOnClick?: () => void /** overall style hint */ @@ -128,7 +128,7 @@ export interface InterventionModalProps { /* Optional icon size override. */ iconSize?: string /** modal contents */ - children: React.ReactNode + children: ReactNode } export function InterventionModal({ @@ -160,7 +160,7 @@ export function InterventionModal({ {...modalStyle} flexDirection={DIRECTION_COLUMN} border={border} - onClick={(e: React.MouseEvent) => { + onClick={(e: MouseEvent) => { e.stopPropagation() }} > diff --git a/app/src/molecules/InterventionModal/story-utils/StandIn.tsx b/app/src/molecules/InterventionModal/story-utils/StandIn.tsx index 04aa5690e7a..56153551df3 100644 --- a/app/src/molecules/InterventionModal/story-utils/StandIn.tsx +++ b/app/src/molecules/InterventionModal/story-utils/StandIn.tsx @@ -1,10 +1,10 @@ -import type * as React from 'react' import { Box, BORDERS } from '@opentrons/components' +import type { ReactNode } from 'react' export function StandInContent({ children, }: { - children?: React.ReactNode + children?: ReactNode }): JSX.Element { return ( 0) setCurrentStepSize(stepSizes[i - 1]) } - const handleStepSelect = ( - event: React.MouseEvent - ): void => { + const handleStepSelect = (event: MouseEvent): void => { setCurrentStepSize(Number(event.currentTarget.value) as StepSize) event.currentTarget.blur() } diff --git a/app/src/molecules/MiniCard/__tests__/MiniCard.test.tsx b/app/src/molecules/MiniCard/__tests__/MiniCard.test.tsx index fcc76f38505..0e26b805f16 100644 --- a/app/src/molecules/MiniCard/__tests__/MiniCard.test.tsx +++ b/app/src/molecules/MiniCard/__tests__/MiniCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { fireEvent, screen } from '@testing-library/react' @@ -6,12 +5,14 @@ import { COLORS, SPACING, BORDERS, CURSOR_POINTER } from '@opentrons/components' import { renderWithProviders } from '/app/__testing-utils__' import { MiniCard } from '../' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('MiniCard', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/MiniCard/index.tsx b/app/src/molecules/MiniCard/index.tsx index b65ccbbb59d..d95c42e149f 100644 --- a/app/src/molecules/MiniCard/index.tsx +++ b/app/src/molecules/MiniCard/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { BORDERS, @@ -8,12 +7,13 @@ import { SPACING, } from '@opentrons/components' +import type { ReactNode } from 'react' import type { StyleProps } from '@opentrons/components' interface MiniCardProps extends StyleProps { onClick: () => void isSelected: boolean - children: React.ReactNode + children: ReactNode isError?: boolean isWarning?: boolean } diff --git a/app/src/molecules/ModuleIcon/__tests__/ModuleIcon.test.tsx b/app/src/molecules/ModuleIcon/__tests__/ModuleIcon.test.tsx index 73c44639e51..6e20f8997fa 100644 --- a/app/src/molecules/ModuleIcon/__tests__/ModuleIcon.test.tsx +++ b/app/src/molecules/ModuleIcon/__tests__/ModuleIcon.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { COLORS, SPACING } from '@opentrons/components' import { describe, it, expect, vi, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -6,6 +5,7 @@ import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '/app/__testing-utils__' import { ModuleIcon } from '../' +import type { ComponentProps } from 'react' import type { AttachedModule } from '/app/redux/modules/types' import type * as OpentronsComponents from '@opentrons/components' @@ -17,7 +17,7 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders()[0] } @@ -46,7 +46,7 @@ const mockHeaterShakerModule = { } as AttachedModule describe('ModuleIcon', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/ModuleInfo/__tests__/ModuleInfo.test.tsx b/app/src/molecules/ModuleInfo/__tests__/ModuleInfo.test.tsx index 1d732faeb18..de5eef75577 100644 --- a/app/src/molecules/ModuleInfo/__tests__/ModuleInfo.test.tsx +++ b/app/src/molecules/ModuleInfo/__tests__/ModuleInfo.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -7,11 +6,13 @@ import { when } from 'vitest-when' import { i18n } from '/app/i18n' import { ModuleInfo } from '../ModuleInfo' import { useRunHasStarted } from '/app/resources/runs' + +import type { ComponentProps } from 'react' import type { ModuleModel, ModuleType } from '@opentrons/shared-data' vi.mock('/app/resources/runs') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -26,7 +27,7 @@ const mockTCModule = { const MOCK_RUN_ID = '1' describe('ModuleInfo', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { moduleModel: mockTCModule.model, diff --git a/app/src/molecules/NavTab/__tests__/NavTab.test.tsx b/app/src/molecules/NavTab/__tests__/NavTab.test.tsx index 176c76b60cc..e6a2c9a504f 100644 --- a/app/src/molecules/NavTab/__tests__/NavTab.test.tsx +++ b/app/src/molecules/NavTab/__tests__/NavTab.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, beforeEach } from 'vitest' @@ -7,7 +6,9 @@ import { SPACING, COLORS, TYPOGRAPHY, BORDERS } from '@opentrons/components' import { renderWithProviders } from '/app/__testing-utils__' import { NavTab } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders( @@ -16,7 +17,7 @@ const render = (props: React.ComponentProps) => { } describe('NavTab', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/NavTab/index.tsx b/app/src/molecules/NavTab/index.tsx index e170da56e43..6cdf6cb0e6b 100644 --- a/app/src/molecules/NavTab/index.tsx +++ b/app/src/molecules/NavTab/index.tsx @@ -3,6 +3,8 @@ import { NavLink } from 'react-router-dom' import { BORDERS, COLORS, SPACING, TYPOGRAPHY } from '@opentrons/components' +import type { ComponentProps } from 'react' + export const TAB_BORDER_STYLE = css` border-bottom-style: ${BORDERS.styleSolid}; border-bottom-width: 2px; @@ -15,7 +17,7 @@ interface NavTabProps { disabled?: boolean } -const StyledNavLink = styled(NavLink)>` +const StyledNavLink = styled(NavLink)>` padding: 0 ${SPACING.spacing4} ${SPACING.spacing8}; ${TYPOGRAPHY.labelSemiBold} color: ${COLORS.grey50}; diff --git a/app/src/molecules/ODDBackButton/__tests__/ODDBackButton.test.tsx b/app/src/molecules/ODDBackButton/__tests__/ODDBackButton.test.tsx index 2b520279cf8..5b487b2e7dc 100644 --- a/app/src/molecules/ODDBackButton/__tests__/ODDBackButton.test.tsx +++ b/app/src/molecules/ODDBackButton/__tests__/ODDBackButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, vi, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -6,12 +5,14 @@ import { COLORS } from '@opentrons/components' import { ODDBackButton } from '..' import { renderWithProviders } from '/app/__testing-utils__' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('ODDBackButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/ODDBackButton/index.tsx b/app/src/molecules/ODDBackButton/index.tsx index 396feaa5e19..0390dc21284 100644 --- a/app/src/molecules/ODDBackButton/index.tsx +++ b/app/src/molecules/ODDBackButton/index.tsx @@ -1,5 +1,3 @@ -import type * as React from 'react' - import { ALIGN_CENTER, Btn, @@ -11,8 +9,10 @@ import { TYPOGRAPHY, } from '@opentrons/components' +import type { HTMLProps } from 'react' + export function ODDBackButton( - props: React.HTMLProps + props: HTMLProps ): JSX.Element { const { onClick, label } = props diff --git a/app/src/molecules/OT2CalibrationNeedHelpLink/NeedHelpLink.tsx b/app/src/molecules/OT2CalibrationNeedHelpLink/NeedHelpLink.tsx index a87a7808827..6dd9a5f8d86 100644 --- a/app/src/molecules/OT2CalibrationNeedHelpLink/NeedHelpLink.tsx +++ b/app/src/molecules/OT2CalibrationNeedHelpLink/NeedHelpLink.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { Flex, @@ -11,9 +10,11 @@ import { SPACING, } from '@opentrons/components' +import type { ComponentProps } from 'react' + const SUPPORT_PAGE_URL = 'https://support.opentrons.com/s/ot2-calibration' -interface NeedHelpLinkProps extends React.ComponentProps { +interface NeedHelpLinkProps extends ComponentProps { href?: string } diff --git a/app/src/molecules/OddModal/OddModal.tsx b/app/src/molecules/OddModal/OddModal.tsx index 9b32974000c..e95aaa1d9a4 100644 --- a/app/src/molecules/OddModal/OddModal.tsx +++ b/app/src/molecules/OddModal/OddModal.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { ALIGN_CENTER, BORDERS, @@ -11,14 +10,15 @@ import { import { BackgroundOverlay } from '../BackgroundOverlay' import { OddModalHeader } from './OddModalHeader' +import type { MouseEvent, MouseEventHandler, ReactNode } from 'react' import type { StyleProps } from '@opentrons/components' import type { OddModalHeaderBaseProps, ModalSize } from './types' interface OddModalProps extends StyleProps { /** clicking anywhere outside of the modal closes it */ - onOutsideClick?: React.MouseEventHandler + onOutsideClick?: MouseEventHandler /** modal content */ - children: React.ReactNode + children: ReactNode /** for small, medium, or large modal sizes, medium by default */ modalSize?: ModalSize /** see OddModalHeader component for more details */ @@ -66,7 +66,7 @@ export function OddModal(props: OddModalProps): JSX.Element { margin={SPACING.spacing32} flexDirection={DIRECTION_COLUMN} aria-label={`modal_${modalSize}`} - onClick={(e: React.MouseEvent) => { + onClick={(e: MouseEvent) => { e.stopPropagation() }} > diff --git a/app/src/molecules/OddModal/__tests__/OddModal.test.tsx b/app/src/molecules/OddModal/__tests__/OddModal.test.tsx index d8c129a8b01..9d9097b4729 100644 --- a/app/src/molecules/OddModal/__tests__/OddModal.test.tsx +++ b/app/src/molecules/OddModal/__tests__/OddModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -7,14 +6,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { OddModalHeader } from '../OddModalHeader' import { OddModal } from '../OddModal' +import type { ComponentProps } from 'react' + vi.mock('../OddModalHeader') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('OddModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onOutsideClick: vi.fn(), diff --git a/app/src/molecules/OddModal/__tests__/OddModalHeader.test.tsx b/app/src/molecules/OddModal/__tests__/OddModalHeader.test.tsx index e824e49648c..94499d35abf 100644 --- a/app/src/molecules/OddModal/__tests__/OddModalHeader.test.tsx +++ b/app/src/molecules/OddModal/__tests__/OddModalHeader.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, vi, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -6,12 +5,14 @@ import { COLORS } from '@opentrons/components' import { renderWithProviders } from '/app/__testing-utils__' import { OddModalHeader } from '../OddModalHeader' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('OddModalHeader', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { title: 'title', diff --git a/app/src/molecules/OddModal/types.ts b/app/src/molecules/OddModal/types.ts index b0fa6d103ae..e4f07cc52ad 100644 --- a/app/src/molecules/OddModal/types.ts +++ b/app/src/molecules/OddModal/types.ts @@ -1,10 +1,11 @@ +import type { MouseEventHandler } from 'react' import type { IconName, StyleProps } from '@opentrons/components' export type ModalSize = 'small' | 'medium' | 'large' export interface OddModalHeaderBaseProps extends StyleProps { title: string | JSX.Element - onClick?: React.MouseEventHandler + onClick?: MouseEventHandler hasExitIcon?: boolean iconName?: IconName iconColor?: string diff --git a/app/src/molecules/OffsetVector/__tests__/OffsetVector.test.tsx b/app/src/molecules/OffsetVector/__tests__/OffsetVector.test.tsx index bb247c0175a..e3b4c87da6c 100644 --- a/app/src/molecules/OffsetVector/__tests__/OffsetVector.test.tsx +++ b/app/src/molecules/OffsetVector/__tests__/OffsetVector.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, beforeEach } from 'vitest' @@ -7,12 +6,14 @@ import { renderWithProviders } from '/app/__testing-utils__' import { OffsetVector } from '../' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('OffsetVector', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/OffsetVector/index.tsx b/app/src/molecules/OffsetVector/index.tsx index 155019e8074..af4d8c5dc68 100644 --- a/app/src/molecules/OffsetVector/index.tsx +++ b/app/src/molecules/OffsetVector/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { Flex, SPACING, @@ -6,13 +5,14 @@ import { LegacyStyledText, } from '@opentrons/components' +import type { ComponentProps } from 'react' import type { StyleProps } from '@opentrons/components' interface OffsetVectorProps extends StyleProps { x: number y: number z: number - as?: React.ComponentProps['as'] + as?: ComponentProps['as'] } export function OffsetVector(props: OffsetVectorProps): JSX.Element { diff --git a/app/src/molecules/SimpleWizardBody/SimpleWizardBodyContent.tsx b/app/src/molecules/SimpleWizardBody/SimpleWizardBodyContent.tsx index 16113e28c9a..1a179f1b987 100644 --- a/app/src/molecules/SimpleWizardBody/SimpleWizardBodyContent.tsx +++ b/app/src/molecules/SimpleWizardBody/SimpleWizardBodyContent.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useSelector } from 'react-redux' import { css } from 'styled-components' import { @@ -21,13 +20,15 @@ import SuccessIcon from '/app/assets/images/icon_success.png' import { getIsOnDevice } from '/app/redux/config' import { Skeleton } from '/app/atoms/Skeleton' + +import type { ReactNode } from 'react' import type { RobotType } from '@opentrons/shared-data' interface Props { iconColor: string header: string isSuccess: boolean - children?: React.ReactNode + children?: ReactNode subHeader?: string | JSX.Element isPending?: boolean robotType?: RobotType diff --git a/app/src/molecules/SimpleWizardBody/SimpleWizardInProgressBody.tsx b/app/src/molecules/SimpleWizardBody/SimpleWizardInProgressBody.tsx index 10882025dfc..92f65aa2cf2 100644 --- a/app/src/molecules/SimpleWizardBody/SimpleWizardInProgressBody.tsx +++ b/app/src/molecules/SimpleWizardBody/SimpleWizardInProgressBody.tsx @@ -1,9 +1,10 @@ -import type * as React from 'react' -import type { StyleProps } from '@opentrons/components' import { InProgressModal } from '../InProgressModal/InProgressModal' import { SimpleWizardBodyContainer } from './SimpleWizardBodyContainer' -export type SimpleWizardInProgressBodyProps = React.ComponentProps< +import type { ComponentProps } from 'react' +import type { StyleProps } from '@opentrons/components' + +export type SimpleWizardInProgressBodyProps = ComponentProps< typeof InProgressModal > & StyleProps diff --git a/app/src/molecules/SimpleWizardBody/__tests__/SimpleWizardBody.test.tsx b/app/src/molecules/SimpleWizardBody/__tests__/SimpleWizardBody.test.tsx index 9849e8fa03c..f21e14f0580 100644 --- a/app/src/molecules/SimpleWizardBody/__tests__/SimpleWizardBody.test.tsx +++ b/app/src/molecules/SimpleWizardBody/__tests__/SimpleWizardBody.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import { COLORS } from '@opentrons/components' @@ -7,14 +6,16 @@ import { Skeleton } from '/app/atoms/Skeleton' import { getIsOnDevice } from '/app/redux/config' import { SimpleWizardBody } from '..' +import type { ComponentProps } from 'react' + vi.mock('/app/atoms/Skeleton') vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('SimpleWizardBody', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { iconColor: COLORS.red60, diff --git a/app/src/molecules/SimpleWizardBody/index.tsx b/app/src/molecules/SimpleWizardBody/index.tsx index b554b71b90e..c49c49be2a8 100644 --- a/app/src/molecules/SimpleWizardBody/index.tsx +++ b/app/src/molecules/SimpleWizardBody/index.tsx @@ -1,8 +1,9 @@ -import type * as React from 'react' - import { SimpleWizardBodyContainer } from './SimpleWizardBodyContainer' import { SimpleWizardBodyContent } from './SimpleWizardBodyContent' import { SimpleWizardInProgressBody } from './SimpleWizardInProgressBody' + +import type { ComponentProps } from 'react' + export { SimpleWizardBodyContainer, SimpleWizardBodyContent, @@ -10,8 +11,8 @@ export { } export function SimpleWizardBody( - props: React.ComponentProps & - React.ComponentProps + props: ComponentProps & + ComponentProps ): JSX.Element { const { children, ...rest } = props return ( diff --git a/app/src/molecules/ToggleGroup/__tests__/useToggleGroup.test.tsx b/app/src/molecules/ToggleGroup/__tests__/useToggleGroup.test.tsx index c4829b79615..b90da347489 100644 --- a/app/src/molecules/ToggleGroup/__tests__/useToggleGroup.test.tsx +++ b/app/src/molecules/ToggleGroup/__tests__/useToggleGroup.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { Provider } from 'react-redux' import { createStore } from 'redux' import '@testing-library/jest-dom/vitest' @@ -7,6 +6,7 @@ import { renderHook, render, fireEvent, screen } from '@testing-library/react' import { useTrackEvent } from '/app/redux/analytics' import { useToggleGroup } from '../useToggleGroup' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' @@ -23,7 +23,7 @@ describe('useToggleGroup', () => { }) it('should return default selectedValue and toggle buttons', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} @@ -35,7 +35,7 @@ describe('useToggleGroup', () => { expect(result.current[0]).toBe('List View') }) it('should record an analytics event for list view', async () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} @@ -53,7 +53,7 @@ describe('useToggleGroup', () => { }) }) it('should record an analytics event for map view', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} diff --git a/app/src/molecules/UnorderedList/index.tsx b/app/src/molecules/UnorderedList/index.tsx index cf9937266a8..f48c3e685ba 100644 --- a/app/src/molecules/UnorderedList/index.tsx +++ b/app/src/molecules/UnorderedList/index.tsx @@ -1,9 +1,10 @@ -import type * as React from 'react' import { css } from 'styled-components' import { SPACING, LegacyStyledText } from '@opentrons/components' +import type { ReactNode } from 'react' + interface UnorderedListProps { - items: React.ReactNode[] + items: ReactNode[] } export function UnorderedList(props: UnorderedListProps): JSX.Element { const { items } = props diff --git a/app/src/molecules/UpdateBanner/__tests__/UpdateBanner.test.tsx b/app/src/molecules/UpdateBanner/__tests__/UpdateBanner.test.tsx index 52b074b37d8..1f8470efcd0 100644 --- a/app/src/molecules/UpdateBanner/__tests__/UpdateBanner.test.tsx +++ b/app/src/molecules/UpdateBanner/__tests__/UpdateBanner.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { when } from 'vitest-when' @@ -9,10 +8,12 @@ import { useIsEstopNotDisengaged } from '/app/resources/devices/hooks/useIsEstop import { UpdateBanner } from '..' import { renderWithProviders } from '/app/__testing-utils__' +import type { ComponentProps } from 'react' + vi.mock('/app/redux-resources/robots') vi.mock('/app/resources/devices/hooks/useIsEstopNotDisengaged') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, initialState: { robotsByName: 'test' }, @@ -20,7 +21,7 @@ const render = (props: React.ComponentProps) => { } describe('Module Update Banner', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/WizardHeader/__tests__/WizardHeader.test.tsx b/app/src/molecules/WizardHeader/__tests__/WizardHeader.test.tsx index 0e11447cac2..436e594dd59 100644 --- a/app/src/molecules/WizardHeader/__tests__/WizardHeader.test.tsx +++ b/app/src/molecules/WizardHeader/__tests__/WizardHeader.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { fireEvent, screen } from '@testing-library/react' @@ -8,17 +7,19 @@ import { StepMeter } from '/app/atoms/StepMeter' import { WizardHeader } from '..' import { renderWithProviders } from '/app/__testing-utils__' +import type { ComponentProps } from 'react' + vi.mock('/app/atoms/StepMeter') vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('WizardHeader', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/molecules/WizardRequiredEquipmentList/index.tsx b/app/src/molecules/WizardRequiredEquipmentList/index.tsx index f6f7457a71a..3a39d904639 100644 --- a/app/src/molecules/WizardRequiredEquipmentList/index.tsx +++ b/app/src/molecules/WizardRequiredEquipmentList/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { css } from 'styled-components' @@ -23,9 +22,10 @@ import { Divider } from '/app/atoms/structure' import { labwareImages } from '/app/local-resources/labware' import { equipmentImages } from './equipmentImages' +import type { ComponentProps } from 'react' import type { StyleProps } from '@opentrons/components' interface WizardRequiredEquipmentListProps extends StyleProps { - equipmentList: Array> + equipmentList: Array> footer?: string } export function WizardRequiredEquipmentList( diff --git a/app/src/molecules/modals/BottomButtonBar.tsx b/app/src/molecules/modals/BottomButtonBar.tsx index d5c202e943c..f7f78f067e4 100644 --- a/app/src/molecules/modals/BottomButtonBar.tsx +++ b/app/src/molecules/modals/BottomButtonBar.tsx @@ -1,18 +1,18 @@ // bottom button bar for modals // TODO(mc, 2018-08-18): maybe make this the default AlertModal behavior -import type * as React from 'react' import cx from 'classnames' import { OutlineButton } from '@opentrons/components' import styles from './styles.module.css' +import type { ReactNode } from 'react' import type { ButtonProps } from '@opentrons/components' type MaybeButtonProps = ButtonProps | null | undefined interface Props { buttons: MaybeButtonProps[] className?: string | null - description?: React.ReactNode | null + description?: ReactNode | null } export function BottomButtonBar(props: Props): JSX.Element { diff --git a/app/src/molecules/modals/ScrollableAlertModal.tsx b/app/src/molecules/modals/ScrollableAlertModal.tsx index c98846899b8..d8ebdc18543 100644 --- a/app/src/molecules/modals/ScrollableAlertModal.tsx +++ b/app/src/molecules/modals/ScrollableAlertModal.tsx @@ -1,12 +1,13 @@ // AlertModal with vertical scrolling -import type * as React from 'react' import omit from 'lodash/omit' import { AlertModal } from '@opentrons/components' import { BottomButtonBar } from './BottomButtonBar' import styles from './styles.module.css' -type Props = React.ComponentProps +import type { ComponentProps } from 'react' + +type Props = ComponentProps export function ScrollableAlertModal(props: Props): JSX.Element { return ( diff --git a/app/src/organisms/Desktop/AdvancedSettings/AdditionalCustomLabwareSourceFolder.tsx b/app/src/organisms/Desktop/AdvancedSettings/AdditionalCustomLabwareSourceFolder.tsx index 57708f2854d..75c0d411cff 100644 --- a/app/src/organisms/Desktop/AdvancedSettings/AdditionalCustomLabwareSourceFolder.tsx +++ b/app/src/organisms/Desktop/AdvancedSettings/AdditionalCustomLabwareSourceFolder.tsx @@ -8,10 +8,10 @@ import { Flex, Icon, JUSTIFY_SPACE_BETWEEN, + LegacyStyledText, Link, SPACING_AUTO, SPACING, - LegacyStyledText, TYPOGRAPHY, } from '@opentrons/components' diff --git a/app/src/organisms/Desktop/AdvancedSettings/OT2AdvancedSettings.tsx b/app/src/organisms/Desktop/AdvancedSettings/OT2AdvancedSettings.tsx index 7ab3ebb0bd0..3ff3313a840 100644 --- a/app/src/organisms/Desktop/AdvancedSettings/OT2AdvancedSettings.tsx +++ b/app/src/organisms/Desktop/AdvancedSettings/OT2AdvancedSettings.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useSelector, useDispatch } from 'react-redux' import { useTranslation } from 'react-i18next' import { css } from 'styled-components' @@ -17,6 +16,7 @@ import { } from '/app/redux/calibration' import { getUseTrashSurfaceForTipCal } from '/app/redux/config' +import type { ChangeEvent } from 'react' import type { Dispatch, State } from '/app/redux/types' const ALWAYS_BLOCK: 'always-block' = 'always-block' @@ -74,7 +74,7 @@ export function OT2AdvancedSettings(): JSX.Element { ? ALWAYS_BLOCK : ALWAYS_PROMPT } - onChange={(event: React.ChangeEvent) => { + onChange={(event: ChangeEvent) => { // you know this is a limited-selection field whose values are only // the elements of BlockSelection; i know this is a limited-selection // field whose values are only the elements of BlockSelection; but sadly, diff --git a/app/src/organisms/Desktop/AdvancedSettings/OverridePathToPython.tsx b/app/src/organisms/Desktop/AdvancedSettings/OverridePathToPython.tsx index d0e5b7d6d93..a87d739172f 100644 --- a/app/src/organisms/Desktop/AdvancedSettings/OverridePathToPython.tsx +++ b/app/src/organisms/Desktop/AdvancedSettings/OverridePathToPython.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { useSelector, useDispatch } from 'react-redux' @@ -27,6 +26,7 @@ import { ANALYTICS_CHANGE_PATH_TO_PYTHON_DIRECTORY, } from '/app/redux/analytics' +import type { MouseEventHandler } from 'react' import type { Dispatch } from '/app/redux/types' export function OverridePathToPython(): JSX.Element { @@ -35,7 +35,7 @@ export function OverridePathToPython(): JSX.Element { const dispatch = useDispatch() const trackEvent = useTrackEvent() - const handleClickPythonDirectoryChange: React.MouseEventHandler = _event => { + const handleClickPythonDirectoryChange: MouseEventHandler = _event => { dispatch(changePythonPathOverrideConfig()) trackEvent({ name: ANALYTICS_CHANGE_PATH_TO_PYTHON_DIRECTORY, diff --git a/app/src/organisms/Desktop/AdvancedSettings/UpdatedChannel.tsx b/app/src/organisms/Desktop/AdvancedSettings/UpdatedChannel.tsx index aca0348cb7b..ec261c75083 100644 --- a/app/src/organisms/Desktop/AdvancedSettings/UpdatedChannel.tsx +++ b/app/src/organisms/Desktop/AdvancedSettings/UpdatedChannel.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -19,6 +18,7 @@ import { updateConfigValue, } from '/app/redux/config' +import type { ComponentProps } from 'react' import type { SelectOption } from '/app/atoms/SelectField/Select' import type { Dispatch } from '/app/redux/types' @@ -31,7 +31,7 @@ export function UpdatedChannel(): JSX.Element { dispatch(updateConfigValue('update.channel', value)) } - const formatOptionLabel: React.ComponentProps< + const formatOptionLabel: ComponentProps< typeof SelectField >['formatOptionLabel'] = (option, index): JSX.Element => { const { label, value } = option diff --git a/app/src/organisms/Desktop/AppSettings/__tests__/ConnectRobotSlideout.test.tsx b/app/src/organisms/Desktop/AppSettings/__tests__/ConnectRobotSlideout.test.tsx index c92e1f495a0..4cddd3e1763 100644 --- a/app/src/organisms/Desktop/AppSettings/__tests__/ConnectRobotSlideout.test.tsx +++ b/app/src/organisms/Desktop/AppSettings/__tests__/ConnectRobotSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -8,17 +7,19 @@ import { getConfig } from '/app/redux/config' import { renderWithProviders } from '/app/__testing-utils__' import { ConnectRobotSlideout } from '../ConnectRobotSlideout' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/discovery') vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ConnectRobotSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(getScanning).mockReturnValue(true) @@ -54,7 +55,7 @@ describe('ConnectRobotSlideout', () => { checkIpAndHostname: vi.fn(), isExpanded: true, onCloseClick: vi.fn(), - } as React.ComponentProps + } as ComponentProps }) it('renders correct title, body, and footer for ConnectRobotSlideout', () => { diff --git a/app/src/organisms/Desktop/AppSettings/__tests__/PreviousVersionModal.test.tsx b/app/src/organisms/Desktop/AppSettings/__tests__/PreviousVersionModal.test.tsx index b4449623c05..59eff47aa2c 100644 --- a/app/src/organisms/Desktop/AppSettings/__tests__/PreviousVersionModal.test.tsx +++ b/app/src/organisms/Desktop/AppSettings/__tests__/PreviousVersionModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -10,12 +9,14 @@ import { PREVIOUS_RELEASES_URL, } from '../PreviousVersionModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } -const props: React.ComponentProps = { +const props: ComponentProps = { closeModal: vi.fn(), } diff --git a/app/src/organisms/Desktop/CalibrateDeck/__tests__/CalibrateDeck.test.tsx b/app/src/organisms/Desktop/CalibrateDeck/__tests__/CalibrateDeck.test.tsx index 3f90064c03c..13415c8e47c 100644 --- a/app/src/organisms/Desktop/CalibrateDeck/__tests__/CalibrateDeck.test.tsx +++ b/app/src/organisms/Desktop/CalibrateDeck/__tests__/CalibrateDeck.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, beforeEach, expect, it } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -14,6 +13,7 @@ import { CalibrationError, } from '/app/organisms/Desktop/CalibrationError' +import type { ComponentProps, ComponentType } from 'react' import type { DeckCalibrationStep } from '/app/redux/sessions/types' import type { DispatchRequestsType } from '/app/redux/robot-api' @@ -41,14 +41,14 @@ describe('CalibrateDeck', () => { ...mockDeckCalibrationSessionAttributes, } const render = ( - props: Partial> = {} + props: Partial> = {} ) => { const { showSpinner = false, isJogging = false, session = mockDeckCalSession, } = props - return renderWithProviders>( + return renderWithProviders>( { const actual = await importOriginal() @@ -35,16 +36,14 @@ interface CalibratePipetteOffsetSpec { describe('CalibratePipetteOffset', () => { let dispatchRequests: DispatchRequestsType const render = ( - props: Partial> = {} + props: Partial> = {} ) => { const { showSpinner = false, isJogging = false, session = mockPipOffsetCalSession, } = props - return renderWithProviders< - React.ComponentType - >( + return renderWithProviders>( { const onResponse = vi.fn() const render = () => { return renderWithProviders< - React.ComponentProps + ComponentProps >( { @@ -41,14 +41,14 @@ describe('CalibrateTipLength', () => { ...mockTipLengthCalibrationSessionAttributes, } const render = ( - props: Partial> = {} + props: Partial> = {} ) => { const { showSpinner = false, isJogging = false, session = mockTipLengthSession, } = props - return renderWithProviders>( + return renderWithProviders>( { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/CalibrationPanels/CompleteConfirmation.tsx b/app/src/organisms/Desktop/CalibrationPanels/CompleteConfirmation.tsx index cbd0e214cd1..3f6de1fed33 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/CompleteConfirmation.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/CompleteConfirmation.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { ALIGN_CENTER, @@ -16,11 +15,13 @@ import { TYPOGRAPHY, } from '@opentrons/components' +import type { MouseEventHandler, ReactNode } from 'react' + interface CompleteConfirmationProps { - proceed: React.MouseEventHandler + proceed: MouseEventHandler flowName?: string body?: string - visualAid?: React.ReactNode + visualAid?: ReactNode } export function CompleteConfirmation( diff --git a/app/src/organisms/Desktop/CalibrationPanels/Introduction/__tests__/Body.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/Introduction/__tests__/Body.test.tsx index c1300fb3218..26682dff0cc 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/Introduction/__tests__/Body.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/Introduction/__tests__/Body.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { it, describe } from 'vitest' import { screen } from '@testing-library/react' @@ -8,7 +7,9 @@ import * as Sessions from '/app/redux/sessions' import { i18n } from '/app/i18n' import { Body } from '../Body' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/Desktop/CalibrationPanels/Introduction/__tests__/Introduction.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/Introduction/__tests__/Introduction.test.tsx index a34460571ed..4005f6c996c 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/Introduction/__tests__/Introduction.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/Introduction/__tests__/Introduction.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -9,6 +8,8 @@ import { i18n } from '/app/i18n' import { Introduction } from '../' import { ChooseTipRack } from '../../ChooseTipRack' +import type { ComponentProps } from 'react' + vi.mock('../../ChooseTipRack') const mockCalInvalidationHandler = vi.fn() @@ -17,9 +18,7 @@ describe('Introduction', () => { const mockSendCommands = vi.fn() const mockCleanUpAndExit = vi.fn() - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { return renderWithProviders( ) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ChooseTipRack', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(Select).mockReturnValue(
        mock select
        ) diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/ChosenTipRackRender.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/ChosenTipRackRender.test.tsx index 5eb7fa1db8b..27bc9a7d233 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/ChosenTipRackRender.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/ChosenTipRackRender.test.tsx @@ -1,13 +1,14 @@ -import type * as React from 'react' import { it, describe, beforeEach } from 'vitest' import { screen } from '@testing-library/react' import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { ChosenTipRackRender } from '../ChosenTipRackRender' + +import type { ComponentProps } from 'react' import type { SelectOption } from '/app/atoms/SelectField/Select' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -19,7 +20,7 @@ const mockSelectValue = { } as SelectOption describe('ChosenTipRackRender', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { selectedValue: mockSelectValue, diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/CompleteConfirmation.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/CompleteConfirmation.test.tsx index 99dc73310d1..8dd9575a2c3 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/CompleteConfirmation.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/CompleteConfirmation.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -7,10 +6,12 @@ import { i18n } from '/app/i18n' import { CompleteConfirmation } from '../CompleteConfirmation' +import type { ComponentProps } from 'react' + describe('CompleteConfirmation', () => { const mockCleanUpAndExit = vi.fn() const render = ( - props: Partial> = {} + props: Partial> = {} ) => { const { proceed = mockCleanUpAndExit, flowName, body, visualAid } = props return renderWithProviders( diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/ConfirmCrashRecovery.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/ConfirmCrashRecovery.test.tsx index 53fb8559e55..11581f72c55 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/ConfirmCrashRecovery.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/ConfirmCrashRecovery.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -6,11 +5,13 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ConfirmCrashRecovery } from '../ConfirmCrashRecovery' +import type { ComponentProps } from 'react' + describe('ConfirmCrashRecovery', () => { const mockBack = vi.fn() const mockConfirm = vi.fn() const render = ( - props: Partial> = {} + props: Partial> = {} ) => { const { back = mockBack, confirm = mockConfirm } = props return renderWithProviders( diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/ConfirmExit.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/ConfirmExit.test.tsx index 086c122e8bf..c09bf0dcd84 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/ConfirmExit.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/ConfirmExit.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -7,12 +6,12 @@ import { i18n } from '/app/i18n' import { ConfirmExit } from '../ConfirmExit' +import type { ComponentProps } from 'react' + describe('ConfirmExit', () => { const mockBack = vi.fn() const mockExit = vi.fn() - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { const { heading, body } = props return renderWithProviders( { const mockSendCommands = vi.fn() const mockDeleteSession = vi.fn() - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { const { mount = 'left', isMulti = false, diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/MeasureNozzle.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/MeasureNozzle.test.tsx index d0de251b0ad..e95c612ec01 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/MeasureNozzle.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/MeasureNozzle.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -11,11 +10,13 @@ import { import * as Sessions from '/app/redux/sessions' import { MeasureNozzle } from '../MeasureNozzle' +import type { ComponentProps } from 'react' + describe('MeasureNozzle', () => { const mockSendCommands = vi.fn() const mockDeleteSession = vi.fn() const render = ( - props: Partial> = {} + props: Partial> = {} ) => { const { mount = 'left', diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/MeasureTip.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/MeasureTip.test.tsx index 70d8ab54a6b..6f37d74fca5 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/MeasureTip.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/MeasureTip.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -12,12 +11,12 @@ import * as Sessions from '/app/redux/sessions' import { MeasureTip } from '../MeasureTip' +import type { ComponentProps } from 'react' + describe('MeasureTip', () => { const mockSendCommands = vi.fn() const mockDeleteSession = vi.fn() - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { const { mount = 'left', isMulti = false, diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/SaveXYPoint.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/SaveXYPoint.test.tsx index 3d7dbda32a9..1965c0b1a14 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/SaveXYPoint.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/SaveXYPoint.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -9,12 +8,12 @@ import { mockDeckCalTipRack } from '/app/redux/sessions/__fixtures__' import * as Sessions from '/app/redux/sessions' import { SaveXYPoint } from '../SaveXYPoint' +import type { ComponentProps } from 'react' + describe('SaveXYPoint', () => { const mockSendCommands = vi.fn() const mockDeleteSession = vi.fn() - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { const { mount = 'left', isMulti = false, diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/SaveZPoint.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/SaveZPoint.test.tsx index 36f04c1ebb2..dab0a5ee2b4 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/SaveZPoint.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/SaveZPoint.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -12,13 +11,13 @@ import { import * as Sessions from '/app/redux/sessions' import { SaveZPoint } from '../SaveZPoint' +import type { ComponentProps } from 'react' + describe('SaveZPoint', () => { const mockSendCommands = vi.fn() const mockDeleteSession = vi.fn() - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { const { mount = 'left', isMulti = false, diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/TipConfirmation.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/TipConfirmation.test.tsx index f9eee22d78b..979db72ecb0 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/TipConfirmation.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/TipConfirmation.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -8,11 +7,13 @@ import { mockDeckCalTipRack } from '/app/redux/sessions/__fixtures__' import * as Sessions from '/app/redux/sessions' import { TipConfirmation } from '../TipConfirmation' +import type { ComponentProps } from 'react' + describe('TipConfirmation', () => { const mockSendCommands = vi.fn() const mockDeleteSession = vi.fn() const render = ( - props: Partial> = {} + props: Partial> = {} ) => { const { mount = 'left', diff --git a/app/src/organisms/Desktop/CalibrationPanels/__tests__/TipPickUp.test.tsx b/app/src/organisms/Desktop/CalibrationPanels/__tests__/TipPickUp.test.tsx index b6836cf96fb..6b8aac3fe88 100644 --- a/app/src/organisms/Desktop/CalibrationPanels/__tests__/TipPickUp.test.tsx +++ b/app/src/organisms/Desktop/CalibrationPanels/__tests__/TipPickUp.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -8,12 +7,12 @@ import { mockDeckCalTipRack } from '/app/redux/sessions/__fixtures__' import * as Sessions from '/app/redux/sessions' import { TipPickUp } from '../TipPickUp' +import type { ComponentProps } from 'react' + describe('TipPickUp', () => { const mockSendCommands = vi.fn() const mockDeleteSession = vi.fn() - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { const { mount = 'left', isMulti = false, diff --git a/app/src/organisms/Desktop/CalibrationStatusCard/__tests__/CalibrationStatusCard.test.tsx b/app/src/organisms/Desktop/CalibrationStatusCard/__tests__/CalibrationStatusCard.test.tsx index 400e73b3078..3a3e09c4005 100644 --- a/app/src/organisms/Desktop/CalibrationStatusCard/__tests__/CalibrationStatusCard.test.tsx +++ b/app/src/organisms/Desktop/CalibrationStatusCard/__tests__/CalibrationStatusCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -18,9 +17,11 @@ import { expectedTaskList, } from '../../Devices/hooks/__fixtures__/taskListFixtures' +import type { ComponentProps } from 'react' + vi.mock('../../Devices/hooks') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -38,7 +39,7 @@ describe('CalibrationStatusCard', () => { vi.mocked(useCalibrationTaskList).mockReturnValue(expectedTaskList) }) - const props: React.ComponentProps = { + const props: ComponentProps = { robotName: 'otie', setShowHowCalibrationWorksModal: mockSetShowHowCalibrationWorksModal, } diff --git a/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/CalibrationHealthCheckResults.test.tsx b/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/CalibrationHealthCheckResults.test.tsx index dbe7c8349a0..bb66e979624 100644 --- a/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/CalibrationHealthCheckResults.test.tsx +++ b/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/CalibrationHealthCheckResults.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { it, describe, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -8,8 +7,10 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { CalibrationHealthCheckResults } from '../CalibrationHealthCheckResults' +import type { ComponentProps } from 'react' + const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -17,7 +18,7 @@ const render = ( } describe('CalibrationHealthCheckResults', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { isCalibrationRecommended: false, diff --git a/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/CalibrationResult.test.tsx b/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/CalibrationResult.test.tsx index 70432556944..c4d6bd4e67d 100644 --- a/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/CalibrationResult.test.tsx +++ b/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/CalibrationResult.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -7,16 +6,18 @@ import { i18n } from '/app/i18n' import { RenderResult } from '../RenderResult' import { CalibrationResult } from '../CalibrationResult' +import type { ComponentProps } from 'react' + vi.mock('../RenderResult') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('PipetteCalibrationResult', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/RenderMountInformation.test.tsx b/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/RenderMountInformation.test.tsx index bae133b6522..3a5fc13d0c1 100644 --- a/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/RenderMountInformation.test.tsx +++ b/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/RenderMountInformation.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -10,6 +9,8 @@ import { LEFT, RIGHT } from '/app/redux/pipettes' import * as Fixtures from '/app/redux/sessions/__fixtures__' import { RenderMountInformation } from '../RenderMountInformation' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/shared-data', async importOriginal => { const actual = await importOriginal() return { @@ -20,14 +21,14 @@ vi.mock('@opentrons/shared-data', async importOriginal => { const mockSessionDetails = Fixtures.mockRobotCalibrationCheckSessionDetails -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('RenderMountInformation', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/RenderResult.test.tsx b/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/RenderResult.test.tsx index 90ed47fc126..7b60f864218 100644 --- a/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/RenderResult.test.tsx +++ b/app/src/organisms/Desktop/CheckCalibration/ResultsSummary/__tests__/RenderResult.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { it, describe, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -9,14 +8,16 @@ import { i18n } from '/app/i18n' import { RenderResult } from '../RenderResult' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('RenderResult', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/CheckCalibration/__tests__/CheckCalibration.test.tsx b/app/src/organisms/Desktop/CheckCalibration/__tests__/CheckCalibration.test.tsx index d5f5a9814d7..853716d3d46 100644 --- a/app/src/organisms/Desktop/CheckCalibration/__tests__/CheckCalibration.test.tsx +++ b/app/src/organisms/Desktop/CheckCalibration/__tests__/CheckCalibration.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { when } from 'vitest-when' import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' @@ -11,6 +10,8 @@ import * as Sessions from '/app/redux/sessions' import { mockCalibrationCheckSessionAttributes } from '/app/redux/sessions/__fixtures__' import { CheckCalibration } from '../index' + +import type { ComponentProps, ComponentType } from 'react' import type { RobotCalibrationCheckStep } from '/app/redux/sessions/types' vi.mock('/app/redux/calibration/selectors') @@ -36,14 +37,14 @@ describe('CheckCalibration', () => { } const render = ( - props: Partial> = {} + props: Partial> = {} ) => { const { showSpinner = false, isJogging = false, session = mockCalibrationCheckSession, } = props - return renderWithProviders>( + return renderWithProviders>( ) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/ChooseRobotSlideout/__tests__/ChooseRobotSlideout.test.tsx b/app/src/organisms/Desktop/ChooseRobotSlideout/__tests__/ChooseRobotSlideout.test.tsx index 998c82462bc..33f601165d2 100644 --- a/app/src/organisms/Desktop/ChooseRobotSlideout/__tests__/ChooseRobotSlideout.test.tsx +++ b/app/src/organisms/Desktop/ChooseRobotSlideout/__tests__/ChooseRobotSlideout.test.tsx @@ -1,6 +1,4 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' - import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' @@ -22,13 +20,15 @@ import { import { getNetworkInterfaces } from '/app/redux/networking' import { ChooseRobotSlideout } from '..' import { useNotifyDataReady } from '/app/resources/useNotifyDataReady' + +import type { ComponentProps } from 'react' import type { RunTimeParameter } from '@opentrons/shared-data' vi.mock('/app/redux/discovery') vi.mock('/app/redux/robot-update') vi.mock('/app/redux/networking') vi.mock('/app/resources/useNotifyDataReady') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/ChooseRobotSlideout/__tests__/FileCard.test.tsx b/app/src/organisms/Desktop/ChooseRobotSlideout/__tests__/FileCard.test.tsx index 9a151cd1704..9a150141526 100644 --- a/app/src/organisms/Desktop/ChooseRobotSlideout/__tests__/FileCard.test.tsx +++ b/app/src/organisms/Desktop/ChooseRobotSlideout/__tests__/FileCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect } from 'vitest' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' @@ -7,6 +6,7 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { FileCard } from '../FileCard' +import type { ComponentProps } from 'react' import type { CsvFileParameter } from '@opentrons/shared-data' vi.mock('/app/redux/discovery') @@ -15,7 +15,7 @@ vi.mock('/app/redux/networking') vi.mock('/app/resources/useNotifyDataReady') vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/ChooseRobotToRunProtocolSlideout/__tests__/ChooseRobotToRunProtocolSlideout.test.tsx b/app/src/organisms/Desktop/ChooseRobotToRunProtocolSlideout/__tests__/ChooseRobotToRunProtocolSlideout.test.tsx index 3c6416a5290..19e3d39c370 100644 --- a/app/src/organisms/Desktop/ChooseRobotToRunProtocolSlideout/__tests__/ChooseRobotToRunProtocolSlideout.test.tsx +++ b/app/src/organisms/Desktop/ChooseRobotToRunProtocolSlideout/__tests__/ChooseRobotToRunProtocolSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen, waitFor } from '@testing-library/react' @@ -32,6 +31,7 @@ import { ChooseRobotToRunProtocolSlideout } from '../' import { useNotifyDataReady } from '/app/resources/useNotifyDataReady' import { useCurrentRunId, useCloseCurrentRun } from '/app/resources/runs' +import type { ComponentProps } from 'react' import type { State } from '/app/redux/types' vi.mock('/app/organisms/Desktop/Devices/hooks') @@ -49,7 +49,7 @@ vi.mock('/app/resources/useNotifyDataReady') vi.mock('/app/resources/runs') const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/ConfirmPipette.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/ConfirmPipette.tsx index f756059d003..6f6585cefe4 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/ConfirmPipette.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/ConfirmPipette.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { @@ -13,6 +12,7 @@ import { CheckPipettesButton } from './CheckPipettesButton' import { SimpleWizardBody } from '/app/molecules/SimpleWizardBody' import { LevelPipette } from './LevelPipette' +import type { Dispatch, SetStateAction } from 'react' import type { PipetteNameSpecs, PipetteModelSpecs, @@ -36,11 +36,9 @@ export interface ConfirmPipetteProps { // wrongWantedPipette is referring to if the user attaches a pipette that is different // from wantedPipette and they want to use it anyway wrongWantedPipette: PipetteNameSpecs | null - setWrongWantedPipette: React.Dispatch< - React.SetStateAction - > + setWrongWantedPipette: Dispatch> confirmPipetteLevel: boolean - setConfirmPipetteLevel: React.Dispatch> + setConfirmPipetteLevel: Dispatch> tryAgain: () => void exit: () => void nextStep: () => void diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/InstructionStep.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/InstructionStep.tsx index 5b6338be6a5..94d617f2ea4 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/InstructionStep.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/InstructionStep.tsx @@ -1,14 +1,15 @@ -import type * as React from 'react' import { Box, Flex, JUSTIFY_SPACE_EVENLY, SPACING } from '@opentrons/components' import type { PipetteChannels, PipetteDisplayCategory, } from '@opentrons/shared-data' + +import type { ReactNode } from 'react' import type { Mount } from '@opentrons/components' import type { Diagram, Direction } from './types' interface Props { - children: React.ReactNode + children: ReactNode direction: Direction mount: Mount channels: PipetteChannels diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/PipetteSelection.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/PipetteSelection.tsx index c306f132154..f998887afbd 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/PipetteSelection.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/PipetteSelection.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { DIRECTION_COLUMN, @@ -10,7 +9,9 @@ import { import { OT3_PIPETTES } from '@opentrons/shared-data' import { PipetteSelect } from '/app/molecules/PipetteSelect' -export type PipetteSelectionProps = React.ComponentProps +import type { ComponentProps } from 'react' + +export type PipetteSelectionProps = ComponentProps export function PipetteSelection(props: PipetteSelectionProps): JSX.Element { const { t } = useTranslation('change_pipette') diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ChangePipette.test.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ChangePipette.test.tsx index 89112a484d4..6cedab5a47b 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ChangePipette.test.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ChangePipette.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -21,6 +20,7 @@ import { ExitModal } from '../ExitModal' import { ConfirmPipette } from '../ConfirmPipette' import { ChangePipette } from '..' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' import type { PipetteNameSpecs } from '@opentrons/shared-data' import type { AttachedPipette } from '/app/redux/pipettes/types' @@ -54,7 +54,7 @@ vi.mock('../ConfirmPipette') vi.mock('/app/resources/instruments') vi.mock('/app/assets/images') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -78,7 +78,7 @@ const mockAttachedPipettes = { } describe('ChangePipette', () => { - let props: React.ComponentProps + let props: ComponentProps let dispatchApiRequest: DispatchApiRequestType beforeEach(() => { diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/CheckPipettesButton.test.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/CheckPipettesButton.test.tsx index a5fa3a50bd6..ce6f7f2db25 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/CheckPipettesButton.test.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/CheckPipettesButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect, beforeEach } from 'vitest' @@ -8,16 +7,18 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { CheckPipettesButton } from '../CheckPipettesButton' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('CheckPipettesButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robotName: 'otie', diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ClearDeckModal.test.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ClearDeckModal.test.tsx index f4af4566141..85ae7a52495 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ClearDeckModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ClearDeckModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect, beforeEach } from 'vitest' @@ -6,13 +5,15 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ClearDeckModal } from '../ClearDeckModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ClearDeckModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onContinueClick: vi.fn(), diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ConfirmPipette.test.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ConfirmPipette.test.tsx index a328df38383..ebb06f3dc91 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ConfirmPipette.test.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ConfirmPipette.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' @@ -9,6 +8,7 @@ import { mockPipetteInfo } from '/app/redux/pipettes/__fixtures__' import { CheckPipettesButton } from '../CheckPipettesButton' import { ConfirmPipette } from '../ConfirmPipette' +import type { ComponentProps } from 'react' import type { PipetteModelSpecs, PipetteNameSpecs, @@ -25,7 +25,7 @@ vi.mock('../LevelPipette', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -87,7 +87,7 @@ const MOCK_WANTED_PIPETTE = { } as PipetteNameSpecs describe('ConfirmPipette', () => { - let props: React.ComponentProps + let props: ComponentProps it('Should detach a pipette successfully', () => { props = { diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ExitModal.test.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ExitModal.test.tsx index 29bf417071c..0b4155ebd09 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ExitModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/ExitModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect, beforeEach } from 'vitest' @@ -6,13 +5,15 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ExitModal } from '../ExitModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ExitModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { back: vi.fn(), diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/InstructionStep.test.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/InstructionStep.test.tsx index 80cdde63972..39e53564b68 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/InstructionStep.test.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/InstructionStep.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { it, describe, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -8,13 +7,15 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { InstructionStep } from '../InstructionStep' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('InstructionStep', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { children:
        children
        , diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/Instructions.test.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/Instructions.test.tsx index 024be58e798..4f01b748286 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/Instructions.test.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/Instructions.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -12,9 +11,11 @@ import { mockPipetteInfo } from '/app/redux/pipettes/__fixtures__' import { Instructions } from '../Instructions' import { CheckPipettesButton } from '../CheckPipettesButton' +import type { ComponentProps } from 'react' + vi.mock('../CheckPipettesButton') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -29,7 +30,7 @@ const MOCK_ACTUAL_PIPETTE = { } as PipetteModelSpecs describe('Instructions', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/LevelPipette.test.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/LevelPipette.test.tsx index 78c2e9f8d6d..3b74cf10ea1 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/LevelPipette.test.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/LevelPipette.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -6,9 +5,11 @@ import { LEFT } from '@opentrons/shared-data' import { nestedTextMatcher, renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { LevelPipette } from '../LevelPipette' + +import type { ComponentProps } from 'react' import type { PipetteNameSpecs } from '@opentrons/shared-data' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -57,7 +58,7 @@ const MOCK_WANTED_PIPETTE = { } as PipetteNameSpecs describe('LevelPipette', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/PipetteSelection.test.tsx b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/PipetteSelection.test.tsx index f3619e9930d..9f507dc8a36 100644 --- a/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/PipetteSelection.test.tsx +++ b/app/src/organisms/Desktop/Devices/ChangePipette/__tests__/PipetteSelection.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -7,15 +6,17 @@ import { i18n } from '/app/i18n' import { PipetteSelect } from '/app/molecules/PipetteSelect' import { PipetteSelection } from '../PipetteSelection' +import type { ComponentProps } from 'react' + vi.mock('/app/molecules/PipetteSelect') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('PipetteSelection', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { pipetteName: null, diff --git a/app/src/organisms/Desktop/Devices/ConfigurePipette/ConfigFormGroup.tsx b/app/src/organisms/Desktop/Devices/ConfigurePipette/ConfigFormGroup.tsx index 9c8a2c25acf..e006efe1c5c 100644 --- a/app/src/organisms/Desktop/Devices/ConfigurePipette/ConfigFormGroup.tsx +++ b/app/src/organisms/Desktop/Devices/ConfigurePipette/ConfigFormGroup.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { Controller } from 'react-hook-form' import { CheckboxField, @@ -12,11 +11,12 @@ import { } from '@opentrons/components' import styles from './styles.module.css' +import type { ReactNode } from 'react' import type { Control } from 'react-hook-form' import type { DisplayFieldProps, DisplayQuirkFieldProps } from './ConfigForm' export interface FormColumnProps { - children: React.ReactNode + children: ReactNode } export function FormColumn(props: FormColumnProps): JSX.Element { @@ -65,7 +65,7 @@ export function ConfigFormGroup(props: ConfigFormGroupProps): JSX.Element { export interface ConfigFormRowProps { label: string labelFor: string - children: React.ReactNode + children: ReactNode } const FIELD_ID_PREFIX = '__PipetteConfig__' diff --git a/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigFormResetButton.test.tsx b/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigFormResetButton.test.tsx index 4c2ec08c7d4..7e26987f573 100644 --- a/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigFormResetButton.test.tsx +++ b/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigFormResetButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, expect, describe, beforeEach } from 'vitest' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ConfigFormResetButton } from '../ConfigFormResetButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ConfigFormResetButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onClick: vi.fn(), diff --git a/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigFormSubmitButton.test.tsx b/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigFormSubmitButton.test.tsx index 3dbab681883..73db2ec1596 100644 --- a/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigFormSubmitButton.test.tsx +++ b/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigFormSubmitButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { it, expect, describe, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ConfigFormSubmitButton } from '../ConfigFormSubmitButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ConfigFormSubmitButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { disabled: false, diff --git a/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigurePipette.test.tsx b/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigurePipette.test.tsx index 2d7790bdd24..5f810b3b97c 100644 --- a/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigurePipette.test.tsx +++ b/app/src/organisms/Desktop/Devices/ConfigurePipette/__tests__/ConfigurePipette.test.tsx @@ -1,6 +1,6 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { vi, it, expect, describe, beforeEach } from 'vitest' +import { screen } from '@testing-library/react' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' @@ -9,14 +9,14 @@ import { ConfigurePipette } from '../../ConfigurePipette' import { mockPipetteSettingsFieldsMap } from '/app/redux/pipettes/__fixtures__' import { getConfig } from '/app/redux/config' +import type { ComponentProps } from 'react' import type { DispatchApiRequestType } from '/app/redux/robot-api' import type { State } from '/app/redux/types' -import { screen } from '@testing-library/react' vi.mock('/app/redux/robot-api') vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -26,7 +26,7 @@ const mockRobotName = 'mockRobotName' describe('ConfigurePipette', () => { let dispatchApiRequest: DispatchApiRequestType - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ErrorRecoveryBanner/__tests__/ErrorRecoveryBanner.test.tsx b/app/src/organisms/Desktop/Devices/ErrorRecoveryBanner/__tests__/ErrorRecoveryBanner.test.tsx index fc234a52629..58a79593fe6 100644 --- a/app/src/organisms/Desktop/Devices/ErrorRecoveryBanner/__tests__/ErrorRecoveryBanner.test.tsx +++ b/app/src/organisms/Desktop/Devices/ErrorRecoveryBanner/__tests__/ErrorRecoveryBanner.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -6,6 +5,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { useErrorRecoveryBanner, ErrorRecoveryBanner } from '..' +import type { ComponentProps } from 'react' + vi.mock('..', async importOriginal => { const actualReact = await importOriginal() return { @@ -14,7 +15,7 @@ vi.mock('..', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/Desktop/Devices/GripperCard/__tests__/AboutGripperSlideout.test.tsx b/app/src/organisms/Desktop/Devices/GripperCard/__tests__/AboutGripperSlideout.test.tsx index 9ad4381a40c..373ba5256af 100644 --- a/app/src/organisms/Desktop/Devices/GripperCard/__tests__/AboutGripperSlideout.test.tsx +++ b/app/src/organisms/Desktop/Devices/GripperCard/__tests__/AboutGripperSlideout.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { screen, fireEvent } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { AboutGripperSlideout } from '../AboutGripperSlideout' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('AboutGripperSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { serialNumber: '123', diff --git a/app/src/organisms/Desktop/Devices/GripperCard/__tests__/GripperCard.test.tsx b/app/src/organisms/Desktop/Devices/GripperCard/__tests__/GripperCard.test.tsx index ccdbc80c2b3..32538ba2cb5 100644 --- a/app/src/organisms/Desktop/Devices/GripperCard/__tests__/GripperCard.test.tsx +++ b/app/src/organisms/Desktop/Devices/GripperCard/__tests__/GripperCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -7,20 +6,22 @@ import { i18n } from '/app/i18n' import { GripperWizardFlows } from '/app/organisms/GripperWizardFlows' import { AboutGripperSlideout } from '../AboutGripperSlideout' import { GripperCard } from '../' + +import type { ComponentProps } from 'react' import type { GripperData } from '@opentrons/api-client' vi.mock('/app/organisms/GripperWizardFlows') vi.mock('../AboutGripperSlideout') vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('GripperCard', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { attachedGripper: { diff --git a/app/src/organisms/Desktop/Devices/HistoricalProtocolRunOverflowMenu.tsx b/app/src/organisms/Desktop/Devices/HistoricalProtocolRunOverflowMenu.tsx index 18dc44cb11b..b696d8285cb 100644 --- a/app/src/organisms/Desktop/Devices/HistoricalProtocolRunOverflowMenu.tsx +++ b/app/src/organisms/Desktop/Devices/HistoricalProtocolRunOverflowMenu.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { NavLink, useNavigate } from 'react-router-dom' @@ -38,6 +37,7 @@ import { useIsEstopNotDisengaged } from '/app/resources/devices' import { useTrackProtocolRunEvent } from '/app/redux-resources/analytics' import { useRobot } from '/app/redux-resources/robots' +import type { MouseEventHandler } from 'react' import type { Run } from '@opentrons/api-client' export interface HistoricalProtocolRunOverflowMenuProps { @@ -99,7 +99,7 @@ export function HistoricalProtocolRunOverflowMenu( } interface MenuDropdownProps extends HistoricalProtocolRunOverflowMenuProps { - closeOverflowMenu: React.MouseEventHandler + closeOverflowMenu: MouseEventHandler downloadRunLog: () => void isRunLogLoading: boolean } @@ -126,7 +126,7 @@ function MenuDropdown(props: MenuDropdownProps): JSX.Element { `/devices/${robotName}/protocol-runs/${createRunResponse.data.id}/run-preview` ) } - const onDownloadClick: React.MouseEventHandler = e => { + const onDownloadClick: MouseEventHandler = e => { e.preventDefault() e.stopPropagation() downloadRunLog() @@ -143,9 +143,7 @@ function MenuDropdown(props: MenuDropdownProps): JSX.Element { const robotSerialNumber = robot?.health?.robot_serial ?? robot?.serverHealth?.serialNumber ?? null - const handleResetClick: React.MouseEventHandler = ( - e - ): void => { + const handleResetClick: MouseEventHandler = (e): void => { e.preventDefault() e.stopPropagation() @@ -160,7 +158,7 @@ function MenuDropdown(props: MenuDropdownProps): JSX.Element { trackProtocolRunEvent({ name: ANALYTICS_PROTOCOL_RUN_ACTION.AGAIN }) } - const handleDeleteClick: React.MouseEventHandler = e => { + const handleDeleteClick: MouseEventHandler = e => { e.preventDefault() e.stopPropagation() deleteRun(runId) diff --git a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/AboutPipetteSlideout.test.tsx b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/AboutPipetteSlideout.test.tsx index dd2274a3ab3..c39a0e286fc 100644 --- a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/AboutPipetteSlideout.test.tsx +++ b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/AboutPipetteSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -7,16 +6,18 @@ import { i18n } from '/app/i18n' import { AboutPipetteSlideout } from '../AboutPipetteSlideout' import { mockLeftSpecs } from '/app/redux/pipettes/__fixtures__' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('AboutPipetteSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { pipetteId: '123', diff --git a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/FlexPipetteCard.test.tsx b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/FlexPipetteCard.test.tsx index bd753e9f9d3..6bbb7eacbd9 100644 --- a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/FlexPipetteCard.test.tsx +++ b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/FlexPipetteCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, afterEach, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -11,8 +10,9 @@ import { FlexPipetteCard } from '../FlexPipetteCard' import { ChoosePipette } from '/app/organisms/PipetteWizardFlows/ChoosePipette' import { useDropTipWizardFlows } from '/app/organisms/DropTipWizardFlows' -import type { PipetteData } from '@opentrons/api-client' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' +import type { PipetteData } from '@opentrons/api-client' vi.mock('/app/organisms/PipetteWizardFlows') vi.mock('/app/organisms/PipetteWizardFlows/ChoosePipette') @@ -20,7 +20,7 @@ vi.mock('../AboutPipetteSlideout') vi.mock('/app/organisms/DropTipWizardFlows') vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -29,7 +29,7 @@ const render = (props: React.ComponentProps) => { let mockDTWizToggle: Mock describe('FlexPipetteCard', () => { - let props: React.ComponentProps + let props: ComponentProps mockDTWizToggle = vi.fn() beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteCard.test.tsx b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteCard.test.tsx index e04796bd491..c71ee4ec4b4 100644 --- a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteCard.test.tsx +++ b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -15,6 +14,7 @@ import { useDropTipWizardFlows } from '/app/organisms/DropTipWizardFlows' import { mockLeftSpecs, mockRightSpecs } from '/app/redux/pipettes/__fixtures__' +import type { ComponentProps } from 'react' import type { DispatchApiRequestType } from '/app/redux/robot-api' vi.mock('../PipetteOverflowMenu') @@ -24,7 +24,7 @@ vi.mock('@opentrons/react-api-client') vi.mock('/app/redux/pipettes') vi.mock('/app/organisms/DropTipWizardFlows') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -33,7 +33,7 @@ const render = (props: React.ComponentProps) => { const mockRobotName = 'mockRobotName' describe('PipetteCard', () => { let dispatchApiRequest: DispatchApiRequestType - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { dispatchApiRequest = vi.fn() diff --git a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx index 155d955b6ea..273d6bdf7b6 100644 --- a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx +++ b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -11,8 +10,9 @@ import { } from '/app/redux/pipettes/__fixtures__' import { isFlexPipette } from '@opentrons/shared-data' -import type { Mount } from '/app/redux/pipettes/types' +import type { ComponentProps } from 'react' import type * as SharedData from '@opentrons/shared-data' +import type { Mount } from '/app/redux/pipettes/types' vi.mock('/app/redux/config') vi.mock('@opentrons/shared-data', async importOriginal => { @@ -23,7 +23,7 @@ vi.mock('@opentrons/shared-data', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -31,7 +31,7 @@ const render = (props: React.ComponentProps) => { const LEFT = 'left' as Mount describe('PipetteOverflowMenu', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteSettingsSlideout.test.tsx b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteSettingsSlideout.test.tsx index 37b6f66b863..c75945cd549 100644 --- a/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteSettingsSlideout.test.tsx +++ b/app/src/organisms/Desktop/Devices/PipetteCard/__tests__/PipetteSettingsSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { fireEvent, waitFor, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -16,13 +15,12 @@ import { mockPipetteSettingsFieldsMap, } from '/app/redux/pipettes/__fixtures__' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('@opentrons/react-api-client') -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -31,7 +29,7 @@ const render = ( const mockRobotName = 'mockRobotName' describe('PipetteSettingsSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps let mockUpdatePipetteSettings: Mock beforeEach(() => { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/BackToTopButton.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/BackToTopButton.tsx index a8524988bf2..909b49f1548 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/BackToTopButton.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/BackToTopButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { Link } from 'react-router-dom' import { useRobot } from '/app/redux-resources/robots' @@ -10,8 +9,10 @@ import { ANALYTICS_PROTOCOL_PROCEED_TO_RUN, } from '/app/redux/analytics' +import type { RefObject } from 'react' + interface BackToTopButtonProps { - protocolRunHeaderRef: React.RefObject | null + protocolRunHeaderRef: RefObject | null robotName: string runId: string sourceLocation: string diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/EmptySetupStep.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/EmptySetupStep.tsx index 24c2b449083..5d9eb70774e 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/EmptySetupStep.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/EmptySetupStep.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { COLORS, DIRECTION_COLUMN, @@ -10,10 +9,12 @@ import { JUSTIFY_SPACE_BETWEEN, } from '@opentrons/components' +import type { ReactNode } from 'react' + interface EmptySetupStepProps { - title: React.ReactNode + title: ReactNode description: string - rightElement?: React.ReactNode + rightElement?: ReactNode } export function EmptySetupStep(props: EmptySetupStepProps): JSX.Element { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/__tests__/ProtocolAnalysisErrorBanner.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/__tests__/ProtocolAnalysisErrorBanner.test.tsx index 5b60de044d7..fceea1d15c0 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/__tests__/ProtocolAnalysisErrorBanner.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/__tests__/ProtocolAnalysisErrorBanner.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach } from 'vitest' @@ -6,16 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ProtocolAnalysisErrorBanner } from '../ProtocolAnalysisErrorBanner' -const render = ( - props: React.ComponentProps -) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ProtocolAnalysisErrorBanner', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/ActionButton/index.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/ActionButton/index.tsx index 4b8c0f68076..31495064a14 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/ActionButton/index.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/ActionButton/index.tsx @@ -1,5 +1,3 @@ -import type * as React from 'react' - import { RUN_STATUS_STOP_REQUESTED } from '@opentrons/api-client' import { ALIGN_CENTER, @@ -28,12 +26,13 @@ import { useActionBtnDisabledUtils, useActionButtonProperties } from './hooks' import { getFallbackRobotSerialNumber, isRunAgainStatus } from '../../utils' import { useIsRobotOnWrongVersionOfSoftware } from '/app/redux/robot-update' +import type { MutableRefObject } from 'react' import type { RunHeaderContentProps } from '..' export type BaseActionButtonProps = RunHeaderContentProps interface ActionButtonProps extends BaseActionButtonProps { - isResetRunLoadingRef: React.MutableRefObject + isResetRunLoadingRef: MutableRefObject } export function ActionButton(props: ActionButtonProps): JSX.Element { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/LabeledValue.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/LabeledValue.tsx index 135dd72bbae..183f6194a3f 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/LabeledValue.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/LabeledValue.tsx @@ -1,5 +1,3 @@ -import type * as React from 'react' - import { DIRECTION_COLUMN, COLORS, @@ -8,9 +6,11 @@ import { StyledText, } from '@opentrons/components' +import type { ReactNode } from 'react' + interface LabeledValueProps { label: string - value: React.ReactNode + value: ReactNode } export function LabeledValue(props: LabeledValueProps): JSX.Element { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/index.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/index.tsx index 51908e4435d..7d653c6f439 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/index.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderContent/index.tsx @@ -1,16 +1,15 @@ -import type * as React from 'react' - import { RunHeaderSectionUpper } from './RunHeaderSectionUpper' import { RunHeaderSectionLower } from './RunHeaderSectionLower' -import type { ProtocolRunHeaderProps } from '..' +import type { MutableRefObject } from 'react' import type { AttachedModule, RunStatus } from '@opentrons/api-client' +import type { ProtocolRunHeaderProps } from '..' import type { RunControls } from '/app/organisms/RunTimeControl' import type { UseRunHeaderModalContainerResult } from '../RunHeaderModalContainer' export type RunHeaderContentProps = ProtocolRunHeaderProps & { runStatus: RunStatus | null - isResetRunLoadingRef: React.MutableRefObject + isResetRunLoadingRef: MutableRefObject attachedModules: AttachedModule[] protocolRunControls: RunControls runHeaderModalContainerUtils: UseRunHeaderModalContainerResult diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/HeaterShakerIsRunningModal.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/HeaterShakerIsRunningModal.test.tsx index 03b59af1b57..5960c2a39fa 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/HeaterShakerIsRunningModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/HeaterShakerIsRunningModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -12,6 +11,7 @@ import { HeaterShakerModuleCard } from '../HeaterShakerModuleCard' import { useAttachedModules } from '/app/resources/modules' import { useMostRecentCompletedAnalysis } from '/app/resources/runs' +import type { ComponentProps } from 'react' import type * as ReactApiClient from '@opentrons/react-api-client' vi.mock('@opentrons/react-api-client', async importOriginal => { @@ -69,16 +69,14 @@ const mockMovingHeaterShakerTwo = { usbPort: { path: '/dev/ot_module_heatershaker0', port: 1 }, } as any -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('HeaterShakerIsRunningModal', () => { - let props: React.ComponentProps + let props: ComponentProps let mockCreateLiveCommand = vi.fn() beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/HeaterShakerModuleCard.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/HeaterShakerModuleCard.test.tsx index 4cd20822890..8e98d4778fa 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/HeaterShakerModuleCard.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/HeaterShakerModuleCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, vi, beforeEach } from 'vitest' @@ -8,16 +7,18 @@ import { i18n } from '/app/i18n' import { HeaterShakerModuleCard } from '../HeaterShakerModuleCard' import { HeaterShakerModuleData } from '/app/organisms/ModuleCard/HeaterShakerModuleData' +import type { ComponentProps } from 'react' + vi.mock('/app/organisms/ModuleCard/HeaterShakerModuleData') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('HeaterShakerModuleCard', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { module: mockHeaterShaker, diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/hooks.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/hooks.test.tsx index c5028c6a821..8c9c83fcaf9 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/hooks.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/HeaterShakerIsRunningModal/__tests__/hooks.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { Provider } from 'react-redux' import { describe, it, vi, beforeEach, expect } from 'vitest' import { createStore } from 'redux' @@ -10,6 +9,7 @@ import { RUN_ID_1 } from '/app/resources/runs/__fixtures__' import { useMostRecentCompletedAnalysis } from '/app/resources/runs' import { useHeaterShakerModuleIdsFromRun } from '../hooks' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' @@ -57,7 +57,7 @@ describe('useHeaterShakerModuleIdsFromRun', () => { }, ], } as any) - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook( @@ -127,7 +127,7 @@ describe('useHeaterShakerModuleIdsFromRun', () => { ], } as any) - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook( diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ConfirmCancelModal.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ConfirmCancelModal.test.tsx index c6421040e17..08559f181be 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ConfirmCancelModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ConfirmCancelModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' @@ -17,6 +16,7 @@ import { useIsFlex } from '/app/redux-resources/robots' import { useTrackEvent } from '/app/redux/analytics' import { ConfirmCancelModal } from '../ConfirmCancelModal' +import type { ComponentProps } from 'react' import type * as ApiClient from '@opentrons/react-api-client' vi.mock('@opentrons/react-api-client', async importOriginal => { @@ -30,7 +30,7 @@ vi.mock('/app/redux/analytics') vi.mock('/app/redux-resources/analytics') vi.mock('/app/redux-resources/robots') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -43,7 +43,7 @@ let mockTrackProtocolRunEvent: any const ROBOT_NAME = 'otie' describe('ConfirmCancelModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { mockTrackEvent = vi.fn() mockStopRun = vi.fn((_runId, opts) => opts.onSuccess()) diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ProtocolAnalysisErrorModal.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ProtocolAnalysisErrorModal.test.tsx index 44fcb0278ad..027f6b76b03 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ProtocolAnalysisErrorModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ProtocolAnalysisErrorModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, expect, vi } from 'vitest' @@ -6,16 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ProtocolAnalysisErrorModal } from '../ProtocolAnalysisErrorModal' -const render = ( - props: React.ComponentProps -) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ProtocolAnalysisErrorModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ProtocolDropTipModal.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ProtocolDropTipModal.test.tsx index 0d95071a969..4e583be0648 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ProtocolDropTipModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/ProtocolDropTipModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach } from 'vitest' import { renderHook, act, screen, fireEvent } from '@testing-library/react' @@ -10,6 +9,7 @@ import { ProtocolDropTipModal, } from '../ProtocolDropTipModal' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('/app/local-resources/instruments') @@ -104,14 +104,14 @@ describe('useProtocolDropTipModal', () => { }) }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ProtocolDropTipModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/RunFailedModal.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/RunFailedModal.test.tsx index d49875a0859..75ea8c0c720 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/RunFailedModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/modals/__tests__/RunFailedModal.test.tsx @@ -1,5 +1,5 @@ -import type * as React from 'react' import { describe, it, beforeEach, vi, expect, afterEach } from 'vitest' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' @@ -7,8 +7,9 @@ import { useDownloadRunLog } from '../../../../../hooks' import { RunFailedModal } from '../RunFailedModal' import { RUN_STATUS_FAILED } from '@opentrons/api-client' + +import type { ComponentProps } from 'react' import type { RunError } from '@opentrons/api-client' -import { fireEvent, screen } from '@testing-library/react' vi.mock('../../../../../hooks') @@ -25,14 +26,14 @@ const mockError: RunError = { wrappedErrors: [], } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('RunFailedModal - DesktopApp', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/__tests__/ProtocolRunHeader.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/__tests__/ProtocolRunHeader.test.tsx index e82d58cb75e..f6c88119707 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/__tests__/ProtocolRunHeader.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/__tests__/ProtocolRunHeader.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' import { useNavigate } from 'react-router-dom' @@ -26,6 +25,8 @@ import { useRunHeaderRunControls, } from '../hooks' +import type { ComponentProps } from 'react' + vi.mock('react-router-dom') vi.mock('@opentrons/react-api-client') vi.mock('/app/redux-resources/robots') @@ -43,7 +44,7 @@ const MOCK_RUN_ID = 'MOCK_RUN_ID' const MOCK_ROBOT = 'MOCK_ROBOT' describe('ProtocolRunHeader', () => { - let props: React.ComponentProps + let props: ComponentProps const mockNavigate = vi.fn() beforeEach(() => { @@ -92,7 +93,7 @@ describe('ProtocolRunHeader', () => { vi.resetAllMocks() }) - const render = (props: React.ComponentProps) => { + const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/LabwareListItem.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/LabwareListItem.test.tsx index eabef743182..89622cd7e5e 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/LabwareListItem.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/LabwareListItem.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' import { MemoryRouter } from 'react-router-dom' @@ -21,6 +20,8 @@ import { getLocationInfoNames } from '/app/transformations/commands' import { mockLabwareDef } from '/app/organisms/LegacyLabwarePositionCheck/__fixtures__/mockLabwareDef' import { SecureLabwareModal } from '../SecureLabwareModal' import { LabwareListItem } from '../LabwareListItem' + +import type { ComponentProps } from 'react' import type { LoadLabwareRunTimeCommand, ModuleModel, @@ -78,7 +79,7 @@ const mockThermocyclerModuleDefinition = { const mockModuleId = 'moduleId' const mockNickName = 'nickName' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/OffDeckLabwareList.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/OffDeckLabwareList.test.tsx index 0204958f0f0..b543c3f27c8 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/OffDeckLabwareList.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/OffDeckLabwareList.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -9,9 +8,11 @@ import { mockLabwareDef } from '/app/organisms/LegacyLabwarePositionCheck/__fixt import { LabwareListItem } from '../LabwareListItem' import { OffDeckLabwareList } from '../OffDeckLabwareList' +import type { ComponentProps } from 'react' + vi.mock('../LabwareListItem') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SecureLabwareModal.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SecureLabwareModal.test.tsx index 80147006dc1..f367e007375 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SecureLabwareModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SecureLabwareModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -6,7 +5,9 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { SecureLabwareModal } from '../SecureLabwareModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -15,7 +16,7 @@ const mockTypeMagDeck = 'magneticModuleType' const mockTypeTC = 'thermocyclerModuleType' describe('SecureLabwareModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { type: mockTypeMagDeck, onCloseClick: vi.fn() } }) diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareList.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareList.test.tsx index 85068d39a1b..9f9860de1d4 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareList.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareList.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { describe, it, beforeEach, vi } from 'vitest' import { screen } from '@testing-library/react' @@ -9,13 +8,15 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { SetupLabwareList } from '../SetupLabwareList' import { LabwareListItem } from '../LabwareListItem' + +import type { ComponentProps } from 'react' import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' vi.mock('../LabwareListItem') const protocolWithTC = (multiple_tipacks_with_tc as unknown) as CompletedProtocolAnalysis -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareMap.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareMap.test.tsx index 40f63cbc170..57a84b1f737 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareMap.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareMap.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { MemoryRouter } from 'react-router-dom' import { describe, it, beforeEach, vi, afterEach, expect } from 'vitest' @@ -20,6 +19,7 @@ import { } from '/app/transformations/analysis' import { SetupLabwareMap } from '../SetupLabwareMap' +import type { ComponentProps } from 'react' import type { CompletedProtocolAnalysis, LabwareDefinition2, @@ -86,7 +86,7 @@ const mockTCModule = { type: 'thermocyclerModuleType' as ModuleType, } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/CurrentOffsetsTable.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/CurrentOffsetsTable.test.tsx index 334d5328cec..db2e5a8b5a1 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/CurrentOffsetsTable.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/CurrentOffsetsTable.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, vi, expect, afterEach } from 'vitest' import { screen } from '@testing-library/react' @@ -15,6 +14,7 @@ import { useLPCDisabledReason } from '/app/resources/runs' import { getLatestCurrentOffsets } from '/app/transformations/runs' import { CurrentOffsetsTable } from '../CurrentOffsetsTable' +import type { ComponentProps } from 'react' import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' import type { LabwareOffset } from '@opentrons/api-client' @@ -31,7 +31,7 @@ vi.mock('@opentrons/shared-data', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -64,7 +64,7 @@ const mockCurrentOffsets: LabwareOffset[] = [ ] describe('CurrentOffsetsTable', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { currentOffsets: mockCurrentOffsets, diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/HowLPCWorksModal.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/HowLPCWorksModal.test.tsx index 5dd3d15db69..a12b6948d75 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/HowLPCWorksModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/HowLPCWorksModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { HowLPCWorksModal } from '../HowLPCWorksModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('HowLPCWorksModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onCloseClick: vi.fn() } }) diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquids.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquids.test.tsx index 736d5f5bc85..8436072e2f1 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquids.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquids.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, vi, expect } from 'vitest' import { screen, fireEvent } from '@testing-library/react' @@ -11,6 +10,8 @@ import { SetupLiquidsList } from '../SetupLiquidsList' import { SetupLiquidsMap } from '../SetupLiquidsMap' import { useRunHasStarted } from '/app/resources/runs' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/components', async () => { const actual = await vi.importActual('@opentrons/components') return { @@ -24,7 +25,7 @@ vi.mock('/app/resources/runs') describe('SetupLiquids', () => { const render = ( - props: React.ComponentProps & { + props: ComponentProps & { startConfirmed?: boolean } ) => { @@ -47,7 +48,7 @@ describe('SetupLiquids', () => { ) } - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(SetupLiquidsList).mockReturnValue(
        Mock setup liquids list
        diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsList.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsList.test.tsx index 60cb6a759a0..2d96d408044 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsList.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsList.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { when } from 'vitest-when' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -25,6 +24,7 @@ import { import { LiquidsLabwareDetailsModal } from '/app/organisms/LiquidsLabwareDetailsModal' import { useNotifyRunQuery } from '/app/resources/runs' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' import type * as SharedData from '@opentrons/shared-data' @@ -70,7 +70,7 @@ vi.mock('@opentrons/shared-data', async importOriginal => { vi.mock('/app/redux/analytics') vi.mock('/app/resources/runs') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -78,7 +78,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEvent: Mock describe('SetupLiquidsList', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { runId: '123', robotName: 'test_flex' } vi.mocked(getTotalVolumePerLiquidId).mockReturnValue(400) diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsMap.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsMap.test.tsx index 023e73af09c..97e96232b7e 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsMap.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsMap.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { screen } from '@testing-library/react' import { describe, it, beforeEach, vi, afterEach, expect } from 'vitest' @@ -35,6 +34,7 @@ import { mockFetchModulesSuccessActionPayloadModules } from '/app/redux/modules/ import { SetupLiquidsMap } from '../SetupLiquidsMap' +import type { ComponentProps } from 'react' import type { ModuleModel, ModuleType, @@ -102,7 +102,7 @@ const mockMagneticModule = { quirks: [], } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -113,7 +113,7 @@ const mockProtocolAnalysis = { } as any describe('SetupLiquidsMap', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { runId: RUN_ID, diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/NotConfiguredModal.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/NotConfiguredModal.test.tsx index 9f371faaa64..fc2b584cf22 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/NotConfiguredModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/NotConfiguredModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -9,20 +8,21 @@ import { i18n } from '/app/i18n' import { NotConfiguredModal } from '../NotConfiguredModal' import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { DeckConfiguration } from '@opentrons/shared-data' vi.mock('@opentrons/react-api-client') vi.mock('/app/resources/deck_configuration') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('NotConfiguredModal', () => { - let props: React.ComponentProps + let props: ComponentProps const mockUpdate = vi.fn() beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupFixtureList.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupFixtureList.test.tsx index dd0236ac96d..61708168788 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupFixtureList.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupFixtureList.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -16,6 +15,7 @@ import { NotConfiguredModal } from '../NotConfiguredModal' import { LocationConflictModal } from '/app/organisms/LocationConflictModal' import { DeckFixtureSetupInstructionsModal } from '/app/organisms/DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal' +import type { ComponentProps } from 'react' import type { CutoutConfigAndCompatibility } from '/app/resources/deck_configuration/hooks' vi.mock('/app/resources/deck_configuration/hooks') @@ -61,14 +61,14 @@ const mockConflictDeckConfigCompatibility: CutoutConfigAndCompatibility[] = [ }, ] -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('SetupFixtureList', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { deckConfigCompatibility: mockDeckConfigCompatibility, diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesAndDeck.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesAndDeck.test.tsx index 21926d3c823..615bb5a487d 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesAndDeck.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesAndDeck.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { describe, it, beforeEach, expect, vi } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -20,6 +19,8 @@ import { SetupModulesList } from '../SetupModulesList' import { SetupModulesMap } from '../SetupModulesMap' import { SetupFixtureList } from '../SetupFixtureList' +import type { ComponentProps } from 'react' + vi.mock('/app/redux-resources/robots') vi.mock('../SetupModulesList') vi.mock('../SetupModulesMap') @@ -31,14 +32,14 @@ vi.mock('/app/resources/runs') const MOCK_ROBOT_NAME = 'otie' const MOCK_RUN_ID = '1' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('SetupModuleAndDeck', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robotName: MOCK_ROBOT_NAME, diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesList.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesList.test.tsx index e62d600cea6..95c95fced5a 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesList.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesList.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { fireEvent, screen, waitFor } from '@testing-library/react' import { describe, it, beforeEach, expect, vi } from 'vitest' @@ -27,6 +26,7 @@ import { UnMatchedModuleWarning } from '../UnMatchedModuleWarning' import { SetupModulesList } from '../SetupModulesList' import { LocationConflictModal } from '/app/organisms/LocationConflictModal' +import type { ComponentProps } from 'react' import type { ModuleModel, ModuleType } from '@opentrons/shared-data' import type { DiscoveredRobot } from '/app/redux/discovery/types' @@ -77,14 +77,14 @@ const mockCalibratedData = { last_modified: '2023-06-01T14:42:20.131798+00:00', } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('SetupModulesList', () => { - let props: React.ComponentProps + let props: ComponentProps let mockChainLiveCommands = vi.fn() beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesMap.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesMap.test.tsx index 9d9449283dc..c7619b44f9b 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesMap.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesMap.test.tsx @@ -1,6 +1,4 @@ /* eslint-disable @typescript-eslint/no-unsafe-argument */ - -import type * as React from 'react' import { when } from 'vitest-when' import { MemoryRouter } from 'react-router-dom' import { describe, it, beforeEach, vi, afterEach, expect } from 'vitest' @@ -18,6 +16,8 @@ import { useMostRecentCompletedAnalysis } from '/app/resources/runs' import { ModuleInfo } from '/app/molecules/ModuleInfo' import { SetupModulesMap } from '../SetupModulesMap' import { getAttachedProtocolModuleMatches } from '/app/transformations/analysis' + +import type { ComponentProps } from 'react' import type { CompletedProtocolAnalysis, ModuleModel, @@ -47,7 +47,7 @@ vi.mock('/app/transformations/analysis') vi.mock('/app/molecules/ModuleInfo') vi.mock('/app/resources/modules') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -98,7 +98,7 @@ const mockTCModule = { } describe('SetupModulesMap', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { runId: MOCK_RUN_ID, diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupStep.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupStep.tsx index 25f2baf1d64..2d5fedf7700 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupStep.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupStep.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { @@ -18,19 +17,21 @@ import { TYPOGRAPHY, } from '@opentrons/components' +import type { ReactNode } from 'react' + interface SetupStepProps { /** whether or not to show the full contents of the step */ expanded: boolean /** always shown text name of the step */ - title: React.ReactNode + title: ReactNode /** always shown text that provides a one sentence explanation of the contents */ description: string /** callback that should toggle the expanded state (managed by parent) */ toggleExpanded: () => void /** contents to be shown only when expanded */ - children: React.ReactNode + children: ReactNode /** element to be shown (right aligned) regardless of expanded state */ - rightElement: React.ReactNode + rightElement: ReactNode } const EXPANDED_STYLE = css` diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/EmptySetupStep.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/EmptySetupStep.test.tsx index 673d8b4806c..b716de57f06 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/EmptySetupStep.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/EmptySetupStep.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { EmptySetupStep } from '../EmptySetupStep' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('EmptySetupStep', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { title: 'mockTitle', diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/LabwareInfoOverlay.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/LabwareInfoOverlay.test.tsx index 0198aa9e448..a47f37e1136 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/LabwareInfoOverlay.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/LabwareInfoOverlay.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { screen } from '@testing-library/react' import { describe, it, beforeEach, vi, afterEach, expect } from 'vitest' @@ -13,6 +12,8 @@ import { getLabwareLocation } from '/app/transformations/commands' import { LabwareInfoOverlay } from '../LabwareInfoOverlay' import { getLabwareDefinitionUri } from '/app/transformations/protocols' import { useLabwareOffsetForLabware } from '../useLabwareOffsetForLabware' + +import type { ComponentProps } from 'react' import type { LabwareDefinition2, ProtocolFile, @@ -33,7 +34,7 @@ vi.mock('@opentrons/shared-data', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -51,7 +52,7 @@ const MOCK_LABWARE_VECTOR = { x: 1, y: 2, z: 3 } const MOCK_RUN_ID = 'fake_run_id' describe('LabwareInfoOverlay', () => { - let props: React.ComponentProps + let props: ComponentProps let labware: LoadedLabware[] let labwareDefinitions: ProtocolFile<{}>['labwareDefinitions'] beforeEach(() => { diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx index 5dd1507f893..1895c2e4eca 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { describe, it, beforeEach, vi, afterEach } from 'vitest' import { screen } from '@testing-library/react' @@ -15,6 +14,8 @@ import { mockThermocycler, mockHeaterShaker, } from '/app/redux/modules/__fixtures__' + +import type { ComponentProps } from 'react' import type { ModuleModel, ModuleType } from '@opentrons/shared-data' vi.mock('@opentrons/react-api-client') @@ -49,9 +50,7 @@ const mockTCModule = { } const MOCK_TC_COORDS = [20, 30, 0] -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx index 59425f6ff6b..99922644961 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, afterEach, expect } from 'vitest' import { screen } from '@testing-library/react' import { when } from 'vitest-when' @@ -16,6 +15,7 @@ import { } from '/app/resources/runs/__fixtures__' import { ProtocolRunRuntimeParameters } from '../ProtocolRunRunTimeParameters' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { Run } from '@opentrons/api-client' import type { @@ -100,16 +100,14 @@ const mockCsvRtp = { }, } -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ProtocolRunRuntimeParameters', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { runId: RUN_ID, diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/SetupCalibrationItem.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/SetupCalibrationItem.test.tsx index e39e5d7c83c..9002eb0da0d 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/SetupCalibrationItem.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/SetupCalibrationItem.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { when } from 'vitest-when' import { describe, it, beforeEach, vi, afterEach } from 'vitest' @@ -9,6 +8,8 @@ import { useRunHasStarted } from '/app/resources/runs' import { formatTimestamp } from '/app/transformations/runs' import { SetupCalibrationItem } from '../SetupCalibrationItem' +import type { ComponentProps } from 'react' + vi.mock('/app/resources/runs') vi.mock('/app/transformations/runs') @@ -21,7 +22,7 @@ describe('SetupCalibrationItem', () => { title = 'stub title', button = , runId = RUN_ID, - }: Partial> = {}) => { + }: Partial> = {}) => { return renderWithProviders( { const render = ({ mount = 'left', runId = RUN_ID, - }: Partial< - React.ComponentProps - > = {}) => { + }: Partial> = {}) => { return renderWithProviders( { mount = 'left', robotName = ROBOT_NAME, runId = RUN_ID, - }: Partial< - React.ComponentProps - > = {}) => { + }: Partial> = {}) => { return renderWithProviders( { nextStep = 'module_setup_step', calibrationStatus = { complete: true }, expandStep = mockExpandStep, - }: Partial> = {}) => { + }: Partial> = {}) => { return renderWithProviders( { @@ -16,7 +16,7 @@ describe('SetupStep', () => { toggleExpanded = toggleExpandedMock, children = , rightElement =
        right element
        , - }: Partial> = {}) => { + }: Partial> = {}) => { return renderWithProviders( { hasCalibrated = false, tipRackDefinition = fixtureTiprack300ul as LabwareDefinition2, isExtendedPipOffset = false, - }: Partial< - React.ComponentProps - > = {}) => { + }: Partial> = {}) => { return renderWithProviders( ) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/RenameRobotSlideout.test.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/RenameRobotSlideout.test.tsx index 6f7b1b4ab28..13612c63f19 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/RenameRobotSlideout.test.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/RenameRobotSlideout.test.tsx @@ -2,6 +2,9 @@ import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen, waitFor } from '@testing-library/react' import { describe, it, vi, expect, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' + +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' + import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { useTrackEvent, ANALYTICS_RENAME_ROBOT } from '/app/redux/analytics' @@ -14,7 +17,6 @@ import { mockConnectableRobot, mockReachableRobot, } from '/app/redux/discovery/__fixtures__' - import { RenameRobotSlideout } from '../RenameRobotSlideout' import { useIsFlex } from '/app/redux-resources/robots' @@ -111,7 +113,11 @@ describe('RobotSettings RenameRobotSlideout', () => { await waitFor(() => { expect(mockTrackEvent).toHaveBeenCalledWith({ name: ANALYTICS_RENAME_ROBOT, - properties: { newRobotName: 'mockInput', previousRobotName: 'otie' }, + properties: { + newRobotName: 'mockInput', + previousRobotName: 'otie', + robotType: OT2_ROBOT_TYPE, + }, }) }) }) diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/DeviceReset.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/DeviceReset.tsx index 2249e453fe6..b9cd537894a 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/DeviceReset.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/DeviceReset.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { @@ -14,6 +13,8 @@ import { import { TertiaryButton } from '/app/atoms/buttons' +import type { MouseEventHandler } from 'react' + interface DeviceResetProps { updateIsExpanded: ( isExpanded: boolean, @@ -28,7 +29,7 @@ export function DeviceReset({ }: DeviceResetProps): JSX.Element { const { t } = useTranslation('device_settings') - const handleClick: React.MouseEventHandler = () => { + const handleClick: MouseEventHandler = () => { if (!isRobotBusy) { updateIsExpanded(true, 'deviceReset') } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/DisplayRobotName.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/DisplayRobotName.tsx index c6a380cd6e5..7f1d51022b4 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/DisplayRobotName.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/DisplayRobotName.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { @@ -14,6 +13,8 @@ import { } from '@opentrons/components' import { TertiaryButton } from '/app/atoms/buttons' + +import type { MouseEventHandler } from 'react' interface DisplayRobotNameProps { robotName: string updateIsExpanded: ( @@ -30,7 +31,7 @@ export function DisplayRobotName({ }: DisplayRobotNameProps): JSX.Element { const { t } = useTranslation('device_settings') - const handleClick: React.MouseEventHandler = () => { + const handleClick: MouseEventHandler = () => { if (!isRobotBusy) { updateIsExpanded(true, 'renameRobot') } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/FactoryMode.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/FactoryMode.tsx index 14cb3766040..8fea7e0f82d 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/FactoryMode.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/FactoryMode.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { @@ -14,9 +13,11 @@ import { import { TertiaryButton } from '/app/atoms/buttons' +import type { Dispatch, SetStateAction } from 'react' + interface FactoryModeProps { isRobotBusy: boolean - setShowFactoryModeSlideout: React.Dispatch> + setShowFactoryModeSlideout: Dispatch> sn: string | null } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/GantryHoming.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/GantryHoming.tsx index 96ea82a59cf..6537d1fdf1a 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/GantryHoming.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/GantryHoming.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useDispatch } from 'react-redux' import { useTranslation } from 'react-i18next' @@ -15,6 +14,7 @@ import { import { ToggleButton } from '/app/atoms/buttons' import { updateSetting } from '/app/redux/robot-settings' +import type { MouseEventHandler } from 'react' import type { Dispatch } from '/app/redux/types' import type { RobotSettingsField } from '/app/redux/robot-settings/types' @@ -34,7 +34,7 @@ export function GantryHoming({ const value = settings?.value ? settings.value : false const id = settings?.id ? settings.id : 'disableHomeOnBoot' - const handleClick: React.MouseEventHandler = () => { + const handleClick: MouseEventHandler = () => { if (!isRobotBusy) { dispatch(updateSetting(robotName, id, !value)) } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/LegacySettings.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/LegacySettings.tsx index 5ea0ae6e5ec..7947243d13f 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/LegacySettings.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/LegacySettings.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useDispatch } from 'react-redux' import { useTranslation } from 'react-i18next' @@ -15,6 +14,7 @@ import { import { ToggleButton } from '/app/atoms/buttons' import { updateSetting } from '/app/redux/robot-settings' +import type { MouseEventHandler } from 'react' import type { Dispatch } from '/app/redux/types' import type { RobotSettingsField } from '/app/redux/robot-settings/types' @@ -34,7 +34,7 @@ export function LegacySettings({ const value = settings?.value ? settings.value : false const id = settings?.id ? settings.id : 'deckCalibrationDots' - const handleClick: React.MouseEventHandler = () => { + const handleClick: MouseEventHandler = () => { if (!isRobotBusy) { dispatch(updateSetting(robotName, id, !value)) } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/ShortTrashBin.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/ShortTrashBin.tsx index 5bc00476406..6152163c223 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/ShortTrashBin.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/ShortTrashBin.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useDispatch } from 'react-redux' import { useTranslation } from 'react-i18next' @@ -15,6 +14,7 @@ import { import { ToggleButton } from '/app/atoms/buttons' import { updateSetting } from '/app/redux/robot-settings' +import type { MouseEventHandler } from 'react' import type { Dispatch } from '/app/redux/types' import type { RobotSettingsField } from '/app/redux/robot-settings/types' @@ -34,7 +34,7 @@ export function ShortTrashBin({ const value = settings?.value ? settings.value : false const id = settings?.id ? settings.id : 'shortTrashBin' - const handleClick: React.MouseEventHandler = () => { + const handleClick: MouseEventHandler = () => { if (!isRobotBusy) { dispatch(updateSetting(robotName, id, !value)) } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/UsageSettings.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/UsageSettings.tsx index e8843af6019..c44f573f7a2 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/UsageSettings.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/UsageSettings.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useDispatch } from 'react-redux' import { useTranslation } from 'react-i18next' @@ -15,6 +14,7 @@ import { import { ToggleButton } from '/app/atoms/buttons' import { updateSetting } from '/app/redux/robot-settings' +import type { MouseEventHandler } from 'react' import type { Dispatch } from '/app/redux/types' import type { RobotSettingsField } from '/app/redux/robot-settings/types' @@ -34,7 +34,7 @@ export function UsageSettings({ const value = settings?.value ? settings.value : false const id = settings?.id ? settings.id : 'enableDoorSafetySwitch' - const handleClick: React.MouseEventHandler = () => { + const handleClick: MouseEventHandler = () => { if (!isRobotBusy) { dispatch(updateSetting(robotName, id, !value)) } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/UseOlderAspirateBehavior.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/UseOlderAspirateBehavior.tsx index c3496621f18..c12941a12a0 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/UseOlderAspirateBehavior.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/UseOlderAspirateBehavior.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useDispatch } from 'react-redux' import { useTranslation } from 'react-i18next' @@ -15,6 +14,7 @@ import { import { ToggleButton } from '/app/atoms/buttons' import { updateSetting } from '/app/redux/robot-settings' +import type { MouseEventHandler } from 'react' import type { Dispatch } from '/app/redux/types' import type { RobotSettingsField } from '/app/redux/robot-settings/types' @@ -34,7 +34,7 @@ export function UseOlderAspirateBehavior({ const value = settings?.value ? settings.value : false const id = settings?.id ? settings.id : 'useOldAspirationFunctions' - const handleClick: React.MouseEventHandler = () => { + const handleClick: MouseEventHandler = () => { if (!isRobotBusy) { dispatch(updateSetting(robotName, id, !value)) } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/EnableErrorRecoveryMode.test.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/EnableErrorRecoveryMode.test.tsx index 9406e38f768..b3ff80c9341 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/EnableErrorRecoveryMode.test.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/EnableErrorRecoveryMode.test.tsx @@ -5,21 +5,19 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { useErrorRecoverySettingsToggle } from '/app/resources/errorRecovery' import { EnableErrorRecoveryMode } from '../EnableErrorRecoveryMode' -import type * as React from 'react' +import type { ComponentProps } from 'react' vi.mock('/app/resources/errorRecovery') const mockToggleERSettings = vi.fn() -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('EnableErrorRecoveryMode', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { isRobotBusy: false } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/EnableStatusLight.test.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/EnableStatusLight.test.tsx index 2e2cc956bde..c36d79a04db 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/EnableStatusLight.test.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/EnableStatusLight.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, expect, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -8,18 +7,20 @@ import { i18n } from '/app/i18n' import { useLEDLights } from '/app/resources/robot-settings' import { EnableStatusLight } from '../EnableStatusLight' +import type { ComponentProps } from 'react' + vi.mock('/app/resources/robot-settings') const ROBOT_NAME = 'otie' const mockToggleLights = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('EnableStatusLight', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/OpenJupyterControl.test.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/OpenJupyterControl.test.tsx index 57a01e25680..b6c5b2d9be4 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/OpenJupyterControl.test.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/OpenJupyterControl.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -8,6 +7,8 @@ import { i18n } from '/app/i18n' import { useTrackEvent, ANALYTICS_JUPYTER_OPEN } from '/app/redux/analytics' import { OpenJupyterControl } from '../OpenJupyterControl' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/analytics') const mockIpAddress = '1.1.1.1' @@ -18,7 +19,7 @@ global.window = Object.create(window) Object.defineProperty(window, 'open', { writable: true, configurable: true }) window.open = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -28,7 +29,7 @@ const render = (props: React.ComponentProps) => { } describe('RobotSettings OpenJupyterControl', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robotIp: mockIpAddress, diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/Troubleshooting.test.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/Troubleshooting.test.tsx index a5f28ee7da2..ef9cc7ff185 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/Troubleshooting.test.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/AdvancedTab/__tests__/Troubleshooting.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { act, waitFor, screen } from '@testing-library/react' import { when } from 'vitest-when' @@ -16,6 +15,7 @@ import { import { useRobot } from '/app/redux-resources/robots' import { Troubleshooting } from '../Troubleshooting' +import type { ComponentProps } from 'react' import type { HostConfig } from '@opentrons/api-client' import type { ToasterContextType } from '/app/organisms/ToasterOven/ToasterContext' @@ -29,7 +29,7 @@ const HOST_CONFIG: HostConfig = { hostname: 'localhost' } const MOCK_MAKE_TOAST = vi.fn() const MOCK_EAT_TOAST = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -39,7 +39,7 @@ const render = (props: React.ComponentProps) => { } describe('RobotSettings Troubleshooting', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robotName: ROBOT_NAME, diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/ConnectModal/FormRow.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/ConnectModal/FormRow.tsx index 1481d3f40f9..fddda5bc96a 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/ConnectModal/FormRow.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/ConnectModal/FormRow.tsx @@ -1,12 +1,13 @@ // presentational components for the wifi connect form -import type * as React from 'react' import styled from 'styled-components' import { FONT_WEIGHT_SEMIBOLD, SPACING } from '@opentrons/components' +import type { ReactNode } from 'react' + export interface FormRowProps { label: string labelFor: string - children: React.ReactNode + children: ReactNode } const StyledRow = styled.div` diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/SelectSsid/index.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/SelectSsid/index.tsx index a8b04feba4b..02de4cfabaa 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/SelectSsid/index.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/SelectSsid/index.tsx @@ -1,12 +1,11 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { CONTEXT_MENU } from '@opentrons/components' import { SelectField } from '/app/atoms/SelectField' import { NetworkOptionLabel, NetworkActionLabel } from './NetworkOptionLabel' +import type { ComponentProps } from 'react' import type { TFunction } from 'i18next' import type { SelectOptionOrGroup } from '@opentrons/components' - import type { WifiNetwork } from '../types' export interface SelectSsidProps { @@ -51,7 +50,7 @@ export function SelectSsid(props: SelectSsidProps): JSX.Element { } } - const formatOptionLabel: React.ComponentProps< + const formatOptionLabel: ComponentProps< typeof SelectField >['formatOptionLabel'] = (option, { context }): JSX.Element | null => { const { value, label } = option diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/types.ts b/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/types.ts index 050d26c08c3..ccfa37a7a44 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/types.ts +++ b/app/src/organisms/Desktop/Devices/RobotSettings/ConnectNetwork/types.ts @@ -1,3 +1,4 @@ +import type { ChangeEventHandler, FocusEventHandler } from 'react' import type { FieldError } from 'react-hook-form' import type { WifiNetwork, @@ -80,8 +81,8 @@ export type ConnectFormField = export type ConnectFormFieldProps = Readonly<{ value: string | null error: string | null - onChange: React.ChangeEventHandler - onBlur: React.FocusEventHandler + onChange: ChangeEventHandler + onBlur: FocusEventHandler setValue: (value: string) => unknown setTouched: (touched: boolean) => unknown }> diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/SettingToggle.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/SettingToggle.tsx index 4407779d888..bb5b3c0d824 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/SettingToggle.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/SettingToggle.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useDispatch } from 'react-redux' import { @@ -13,6 +12,8 @@ import { import { ToggleButton } from '/app/atoms/buttons' import { updateSetting } from '/app/redux/robot-settings' + +import type { MouseEventHandler } from 'react' import type { Dispatch } from '/app/redux/types' import type { RobotSettingsField } from '/app/redux/robot-settings/types' @@ -38,7 +39,7 @@ export function SettingToggle({ if (id == null) return null - const handleClick: React.MouseEventHandler = () => { + const handleClick: MouseEventHandler = () => { dispatch(updateSetting(robotName, id, !value)) } diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/RobotUpdateProgressModal.test.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/RobotUpdateProgressModal.test.tsx index a2139f636bd..927c1acfdc8 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/RobotUpdateProgressModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/RobotUpdateProgressModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { i18n } from '/app/i18n' import { act, fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -21,6 +20,7 @@ import { INIT_STATUS, } from '/app/resources/health/hooks' +import type { ComponentProps } from 'react' import type { SetStatusBarCreateCommand } from '@opentrons/shared-data' import type { RobotUpdateSession } from '/app/redux/robot-update/types' @@ -30,9 +30,7 @@ vi.mock('/app/redux/robot-update') vi.mock('/app/redux/robot-update/hooks') vi.mock('/app/resources/health/hooks') -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -50,8 +48,9 @@ describe('DownloadUpdateModal', () => { error: null, } - let props: React.ComponentProps + let props: ComponentProps const mockCreateLiveCommand = vi.fn() + const mockDispatchStartRobotUpdate = vi.fn() beforeEach(() => { mockCreateLiveCommand.mockResolvedValue(null) @@ -68,7 +67,9 @@ describe('DownloadUpdateModal', () => { progressPercent: 50, }) vi.mocked(getRobotSessionIsManualFile).mockReturnValue(false) - vi.mocked(useDispatchStartRobotUpdate).mockReturnValue(vi.fn) + vi.mocked(useDispatchStartRobotUpdate).mockReturnValue( + mockDispatchStartRobotUpdate + ) vi.mocked(getRobotUpdateDownloadError).mockReturnValue(null) }) diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateRobotModal.test.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateRobotModal.test.tsx index e77a0df9533..e4c6b7bfb12 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateRobotModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateRobotModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { createStore } from 'redux' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -14,6 +13,7 @@ import { getDiscoverableRobotByName } from '/app/redux/discovery' import { UpdateRobotModal, RELEASE_NOTES_URL_BASE } from '../UpdateRobotModal' import { useIsRobotBusy } from '/app/redux-resources/robots' +import type { ComponentProps } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' @@ -21,14 +21,14 @@ vi.mock('/app/redux/robot-update') vi.mock('/app/redux/discovery') vi.mock('/app/redux-resources/robots') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('UpdateRobotModal', () => { - let props: React.ComponentProps + let props: ComponentProps let store: Store beforeEach(() => { store = createStore(vi.fn(), {}) diff --git a/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/useRobotUpdateInfo.test.tsx b/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/useRobotUpdateInfo.test.tsx index 2897110aacc..e81d61f1d5c 100644 --- a/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/useRobotUpdateInfo.test.tsx +++ b/app/src/organisms/Desktop/Devices/RobotSettings/UpdateBuildroot/__tests__/useRobotUpdateInfo.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { renderHook } from '@testing-library/react' import { createStore } from 'redux' import { I18nextProvider } from 'react-i18next' @@ -9,6 +8,7 @@ import { i18n } from '/app/i18n' import { useRobotUpdateInfo } from '../useRobotUpdateInfo' import { getRobotUpdateDownloadProgress } from '/app/redux/robot-update' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' import type { @@ -21,7 +21,7 @@ vi.mock('/app/redux/robot-update') describe('useRobotUpdateInfo', () => { let store: Store - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> const MOCK_ROBOT_NAME = 'testRobot' const mockRobotUpdateSession: RobotUpdateSession | null = { diff --git a/app/src/organisms/Desktop/Devices/RobotStatusHeader.tsx b/app/src/organisms/Desktop/Devices/RobotStatusHeader.tsx index 77cad0933ea..abeeceddc0b 100644 --- a/app/src/organisms/Desktop/Devices/RobotStatusHeader.tsx +++ b/app/src/organisms/Desktop/Devices/RobotStatusHeader.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { useSelector, useDispatch } from 'react-redux' import { Link, useNavigate } from 'react-router-dom' @@ -35,6 +34,7 @@ import { import { getNetworkInterfaces, fetchStatus } from '/app/redux/networking' import { useNotifyRunQuery, useCurrentRunId } from '/app/resources/runs' +import type { MouseEvent } from 'react' import type { IconName, StyleProps } from '@opentrons/components' import type { DiscoveredRobot } from '/app/redux/discovery/types' import type { Dispatch, State } from '/app/redux/types' @@ -79,7 +79,7 @@ export function RobotStatusHeader(props: RobotStatusHeaderProps): JSX.Element { currentRunId != null && currentRunStatus != null && displayName != null ? ( { + onClick={(e: MouseEvent) => { e.stopPropagation() }} > diff --git a/app/src/organisms/Desktop/Devices/RunPreview/index.tsx b/app/src/organisms/Desktop/Devices/RunPreview/index.tsx index c2a48aba59a..c217833593e 100644 --- a/app/src/organisms/Desktop/Devices/RunPreview/index.tsx +++ b/app/src/organisms/Desktop/Devices/RunPreview/index.tsx @@ -33,9 +33,11 @@ import { Divider } from '/app/atoms/structure' import { NAV_BAR_WIDTH } from '/app/App/constants' import { getLabwareDefinitionsFromCommands } from '/app/local-resources/labware' +import type { ForwardedRef } from 'react' +import type { ViewportListRef } from 'react-viewport-list' import type { RunStatus } from '@opentrons/api-client' import type { RobotType } from '@opentrons/shared-data' -import type { ViewportListRef } from 'react-viewport-list' + const COLOR_FADE_MS = 500 const LIVE_RUN_COMMANDS_POLL_MS = 3000 // arbitrary large number of commands @@ -49,7 +51,7 @@ interface RunPreviewProps { } export const RunPreviewComponent = ( { runId, jumpedIndex, makeHandleScrollToStep, robotType }: RunPreviewProps, - ref: React.ForwardedRef + ref: ForwardedRef ): JSX.Element | null => { const { t } = useTranslation(['run_details', 'protocol_setup']) const robotSideAnalysis = useMostRecentCompletedAnalysis(runId) diff --git a/app/src/organisms/Desktop/Devices/__tests__/CalibrationStatusBanner.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/CalibrationStatusBanner.test.tsx index fd50c5185ae..316315515b5 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/CalibrationStatusBanner.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/CalibrationStatusBanner.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -8,11 +7,11 @@ import { i18n } from '/app/i18n' import { CalibrationStatusBanner } from '../CalibrationStatusBanner' import { useCalibrationTaskList } from '../hooks' +import type { ComponentProps } from 'react' + vi.mock('../hooks') -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -24,7 +23,7 @@ const render = ( } describe('CalibrationStatusBanner', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robotName: 'otie' } }) diff --git a/app/src/organisms/Desktop/Devices/__tests__/ConnectionTroubleshootingModal.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/ConnectionTroubleshootingModal.test.tsx index d725929a081..a810d459f12 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/ConnectionTroubleshootingModal.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/ConnectionTroubleshootingModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -6,8 +5,10 @@ import { fireEvent, screen } from '@testing-library/react' import { i18n } from '/app/i18n' import { ConnectionTroubleshootingModal } from '../ConnectionTroubleshootingModal' +import type { ComponentProps } from 'react' + const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -15,7 +16,7 @@ const render = ( } describe('ConnectionTroubleshootingModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onClose: vi.fn(), diff --git a/app/src/organisms/Desktop/Devices/__tests__/EstopBanner.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/EstopBanner.test.tsx index 7d052568378..4e9f74b6310 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/EstopBanner.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/EstopBanner.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -6,11 +5,13 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { EstopBanner } from '../EstopBanner' -const render = (props: React.ComponentProps) => +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => renderWithProviders(, { i18nInstance: i18n }) describe('EstopBanner', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { status: 'physicallyEngaged', diff --git a/app/src/organisms/Desktop/Devices/__tests__/HistoricalProtocolRun.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/HistoricalProtocolRun.test.tsx index 070f1c614de..1b9ec0cde4e 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/HistoricalProtocolRun.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/HistoricalProtocolRun.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -10,6 +9,7 @@ import { useRunStatus, useRunTimestamps } from '/app/resources/runs' import { HistoricalProtocolRun } from '../HistoricalProtocolRun' import { HistoricalProtocolRunOverflowMenu } from '../HistoricalProtocolRunOverflowMenu' +import type { ComponentProps } from 'react' import type { RunStatus, RunData } from '@opentrons/api-client' import type { RunTimeParameter } from '@opentrons/shared-data' @@ -25,14 +25,14 @@ const run = { runTimeParameters: [] as RunTimeParameter[], } as RunData -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('RecentProtocolRuns', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/__tests__/HistoricalProtocolRunOverflowMenu.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/HistoricalProtocolRunOverflowMenu.test.tsx index 2b2706c9645..72148f614bf 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/HistoricalProtocolRunOverflowMenu.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/HistoricalProtocolRunOverflowMenu.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { when } from 'vitest-when' @@ -23,6 +22,7 @@ import { useIsEstopNotDisengaged } from '/app/resources/devices' import { HistoricalProtocolRunOverflowMenu } from '../HistoricalProtocolRunOverflowMenu' import { useNotifyAllCommandsQuery } from '/app/resources/runs' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { CommandsData } from '@opentrons/api-client' @@ -40,7 +40,7 @@ vi.mock('/app/redux-resources/analytics') vi.mock('@opentrons/react-api-client') const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders( @@ -59,7 +59,7 @@ let mockTrackProtocolRunEvent: any const mockDownloadRunLog = vi.fn() describe('HistoricalProtocolRunOverflowMenu', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { mockTrackEvent = vi.fn() vi.mocked(useTrackEvent).mockReturnValue(mockTrackEvent) diff --git a/app/src/organisms/Desktop/Devices/__tests__/RobotCard.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/RobotCard.test.tsx index 89d59c47cf8..f2814630b2b 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/RobotCard.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/RobotCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { when } from 'vitest-when' import { screen } from '@testing-library/react' @@ -37,6 +36,7 @@ import { useErrorRecoveryBanner, } from '../ErrorRecoveryBanner' +import type { ComponentProps } from 'react' import type { State } from '/app/redux/types' vi.mock('/app/redux/robot-update/selectors') @@ -94,7 +94,7 @@ const MOCK_STATE: State = { }, } as any -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -107,7 +107,7 @@ const render = (props: React.ComponentProps) => { } describe('RobotCard', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robot: mockConnectableRobot } diff --git a/app/src/organisms/Desktop/Devices/__tests__/RobotOverflowMenu.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/RobotOverflowMenu.test.tsx index b3735e72a77..7f8ce943211 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/RobotOverflowMenu.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/RobotOverflowMenu.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -16,6 +15,8 @@ import { mockConnectedRobot, } from '/app/redux/discovery/__fixtures__' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/robot-update/hooks') vi.mock('/app/resources/runs') vi.mock('/app/organisms/Desktop/ChooseProtocolSlideout') @@ -23,7 +24,7 @@ vi.mock('../hooks') vi.mock('/app/redux-resources/robots') vi.mock('/app/resources/devices/hooks/useIsEstopNotDisengaged') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -35,7 +36,7 @@ const render = (props: React.ComponentProps) => { } describe('RobotOverflowMenu', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Devices/__tests__/RobotOverview.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/RobotOverview.test.tsx index 5d2513bec23..6f262e0a094 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/RobotOverview.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/RobotOverview.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { when } from 'vitest-when' import { screen, fireEvent } from '@testing-library/react' @@ -48,10 +47,11 @@ import { useErrorRecoveryBanner, } from '../ErrorRecoveryBanner' +import type { ComponentProps } from 'react' +import type * as ReactApiClient from '@opentrons/react-api-client' import type { Config } from '/app/redux/config/types' import type { DiscoveryClientRobotAddress } from '/app/redux/discovery/types' import type { State } from '/app/redux/types' -import type * as ReactApiClient from '@opentrons/react-api-client' vi.mock('@opentrons/react-api-client', async importOriginal => { const actual = await importOriginal() @@ -104,7 +104,7 @@ const MOCK_STATE: State = { const mockToggleLights = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -117,7 +117,7 @@ const render = (props: React.ComponentProps) => { } describe('RobotOverview', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robotName: mockConnectableRobot.name } diff --git a/app/src/organisms/Desktop/Devices/__tests__/RobotOverviewOverflowMenu.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/RobotOverviewOverflowMenu.test.tsx index c4d384d0805..21d8e13b666 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/RobotOverviewOverflowMenu.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/RobotOverviewOverflowMenu.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { when } from 'vitest-when' @@ -24,6 +23,8 @@ import { handleUpdateBuildroot } from '../RobotSettings/UpdateBuildroot' import { useIsEstopNotDisengaged } from '/app/resources/devices/hooks/useIsEstopNotDisengaged' import { RobotOverviewOverflowMenu } from '../RobotOverviewOverflowMenu' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/robot-controls') vi.mock('/app/redux/robot-admin') vi.mock('../hooks') @@ -36,9 +37,7 @@ vi.mock('../RobotSettings/UpdateBuildroot') vi.mock('/app/resources/devices/hooks/useIsEstopNotDisengaged') vi.mock('/app/redux-resources/robots') -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -50,7 +49,7 @@ const render = ( } describe('RobotOverviewOverflowMenu', () => { - let props: React.ComponentProps + let props: ComponentProps vi.useFakeTimers() beforeEach(() => { diff --git a/app/src/organisms/Desktop/Devices/__tests__/RobotStatusHeader.test.tsx b/app/src/organisms/Desktop/Devices/__tests__/RobotStatusHeader.test.tsx index 465c46cc566..af05d9ce131 100644 --- a/app/src/organisms/Desktop/Devices/__tests__/RobotStatusHeader.test.tsx +++ b/app/src/organisms/Desktop/Devices/__tests__/RobotStatusHeader.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { RUN_STATUS_RUNNING } from '@opentrons/api-client' import { when } from 'vitest-when' @@ -20,6 +19,7 @@ import { useIsFlex } from '/app/redux-resources/robots' import { RobotStatusHeader } from '../RobotStatusHeader' import { useNotifyRunQuery, useCurrentRunId } from '/app/resources/runs' +import type { ComponentProps } from 'react' import type { DiscoveryClientRobotAddress } from '/app/redux/discovery/types' import type { SimpleInterfaceStatus } from '/app/redux/networking/types' import type { State } from '/app/redux/types' @@ -45,7 +45,7 @@ const MOCK_BUZZ = { const WIFI_IP = 'wifi-ip' const ETHERNET_IP = 'ethernet-ip' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -56,7 +56,7 @@ const render = (props: React.ComponentProps) => { ) } describe('RobotStatusHeader', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = MOCK_OTIE diff --git a/app/src/organisms/Desktop/Devices/hooks/__tests__/useCalibrationTaskList.test.tsx b/app/src/organisms/Desktop/Devices/hooks/__tests__/useCalibrationTaskList.test.tsx index 9d675c77f7e..1ca9c1741c2 100644 --- a/app/src/organisms/Desktop/Devices/hooks/__tests__/useCalibrationTaskList.test.tsx +++ b/app/src/organisms/Desktop/Devices/hooks/__tests__/useCalibrationTaskList.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { createStore } from 'redux' import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' @@ -30,6 +29,7 @@ import { } from '../__fixtures__/taskListFixtures' import { i18n } from '/app/i18n' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' @@ -41,7 +41,7 @@ const mockTipLengthCalLauncher = vi.fn() const mockDeckCalLauncher = vi.fn() describe('useCalibrationTaskList hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> let store: Store const mockDeleteCalibration = vi.fn() diff --git a/app/src/organisms/Desktop/Devices/hooks/__tests__/useDeckCalibrationData.test.tsx b/app/src/organisms/Desktop/Devices/hooks/__tests__/useDeckCalibrationData.test.tsx index c08f0e3e1e5..1aef843c8ef 100644 --- a/app/src/organisms/Desktop/Devices/hooks/__tests__/useDeckCalibrationData.test.tsx +++ b/app/src/organisms/Desktop/Devices/hooks/__tests__/useDeckCalibrationData.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { Provider } from 'react-redux' @@ -15,13 +14,13 @@ import { import { getDiscoverableRobotByName } from '/app/redux/discovery' import { mockDeckCalData } from '/app/redux/calibration/__fixtures__' import { useDispatchApiRequest } from '/app/redux/robot-api' +import { useDeckCalibrationData } from '..' +import { mockConnectableRobot } from '/app/redux/discovery/__fixtures__' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { DispatchApiRequestType } from '/app/redux/robot-api' -import { useDeckCalibrationData } from '..' -import { mockConnectableRobot } from '/app/redux/discovery/__fixtures__' - vi.mock('@opentrons/react-api-client') vi.mock('/app/redux/calibration') vi.mock('/app/redux/robot-api') @@ -31,7 +30,7 @@ const store: Store = createStore(vi.fn(), {}) describe('useDeckCalibrationData hook', () => { let dispatchApiRequest: DispatchApiRequestType - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { dispatchApiRequest = vi.fn() const queryClient = new QueryClient() diff --git a/app/src/organisms/Desktop/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx b/app/src/organisms/Desktop/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx index 2c23dcb0f61..50db68fe850 100644 --- a/app/src/organisms/Desktop/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx +++ b/app/src/organisms/Desktop/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { Provider } from 'react-redux' @@ -15,6 +14,7 @@ import { useDispatchApiRequest } from '/app/redux/robot-api' import { useRobot } from '/app/redux-resources/robots' import { usePipetteOffsetCalibration } from '..' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { DiscoveredRobot } from '/app/redux/discovery/types' import type { DispatchApiRequestType } from '/app/redux/robot-api' @@ -32,7 +32,7 @@ const MOUNT = 'left' as Mount describe('usePipetteOffsetCalibration hook', () => { let dispatchApiRequest: DispatchApiRequestType - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { dispatchApiRequest = vi.fn() const queryClient = new QueryClient() diff --git a/app/src/organisms/Desktop/Devices/hooks/__tests__/usePipetteOffsetCalibrations.test.tsx b/app/src/organisms/Desktop/Devices/hooks/__tests__/usePipetteOffsetCalibrations.test.tsx index 9305b34af38..de390322d11 100644 --- a/app/src/organisms/Desktop/Devices/hooks/__tests__/usePipetteOffsetCalibrations.test.tsx +++ b/app/src/organisms/Desktop/Devices/hooks/__tests__/usePipetteOffsetCalibrations.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { renderHook } from '@testing-library/react' @@ -11,12 +10,14 @@ import { } from '/app/redux/calibration/pipette-offset/__fixtures__' import { usePipetteOffsetCalibrations } from '..' +import type { FunctionComponent, ReactNode } from 'react' + vi.mock('@opentrons/react-api-client') const CALIBRATION_DATA_POLL_MS = 5000 describe('usePipetteOffsetCalibrations hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/organisms/Desktop/Devices/hooks/__tests__/useSyncRobotClock.test.tsx b/app/src/organisms/Desktop/Devices/hooks/__tests__/useSyncRobotClock.test.tsx index 02b593fbaab..1ab5c1f55cb 100644 --- a/app/src/organisms/Desktop/Devices/hooks/__tests__/useSyncRobotClock.test.tsx +++ b/app/src/organisms/Desktop/Devices/hooks/__tests__/useSyncRobotClock.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { Provider } from 'react-redux' import { createStore } from 'redux' @@ -7,6 +6,8 @@ import { QueryClient, QueryClientProvider } from 'react-query' import { syncSystemTime } from '/app/redux/robot-admin' import { useSyncRobotClock } from '..' + +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' vi.mock('/app/redux/discovery') @@ -14,7 +15,7 @@ vi.mock('/app/redux/discovery') const store: Store = createStore(vi.fn(), {}) describe('useSyncRobotClock hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { store.dispatch = vi.fn() const queryClient = new QueryClient() diff --git a/app/src/organisms/Desktop/Devices/hooks/__tests__/useTipLengthCalibrations.test.tsx b/app/src/organisms/Desktop/Devices/hooks/__tests__/useTipLengthCalibrations.test.tsx index 7281b009b5c..d2cec816973 100644 --- a/app/src/organisms/Desktop/Devices/hooks/__tests__/useTipLengthCalibrations.test.tsx +++ b/app/src/organisms/Desktop/Devices/hooks/__tests__/useTipLengthCalibrations.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { QueryClient, QueryClientProvider } from 'react-query' @@ -11,12 +10,14 @@ import { } from '/app/redux/calibration/tip-length/__fixtures__' import { useTipLengthCalibrations } from '..' +import type { FunctionComponent, ReactNode } from 'react' + vi.mock('@opentrons/react-api-client') const CALIBRATIONS_FETCH_MS = 5000 describe('useTipLengthCalibrations hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/organisms/Desktop/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx b/app/src/organisms/Desktop/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx index b8cf7fd9896..1f7eb5041fa 100644 --- a/app/src/organisms/Desktop/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx +++ b/app/src/organisms/Desktop/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { createStore } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' @@ -12,6 +11,7 @@ import { parseProtocolAnalysisOutput } from '/app/transformations/analysis' import { useTrackEvent } from '/app/redux/analytics' import { storedProtocolData } from '/app/redux/protocol-storage/__fixtures__' +import type { FunctionComponent, ReactNode } from 'react' import type { Mock } from 'vitest' import type { Store } from 'redux' import type { ProtocolAnalyticsData } from '/app/redux/analytics/types' @@ -28,7 +28,7 @@ const PROTOCOL_PROPERTIES = { protocolType: 'python' } as ProtocolAnalyticsData let mockTrackEvent: Mock let mockGetProtocolRunAnalyticsData: Mock -let wrapper: React.FunctionComponent<{ children: React.ReactNode }> +let wrapper: FunctionComponent<{ children: ReactNode }> let store: Store = createStore(vi.fn(), {}) describe('useTrackCreateProtocolRunEvent hook', () => { diff --git a/app/src/organisms/Desktop/HowCalibrationWorksModal/__tests__/HowCalibrationWorksModal.test.tsx b/app/src/organisms/Desktop/HowCalibrationWorksModal/__tests__/HowCalibrationWorksModal.test.tsx index 8eee1543c5a..dfa8ae09955 100644 --- a/app/src/organisms/Desktop/HowCalibrationWorksModal/__tests__/HowCalibrationWorksModal.test.tsx +++ b/app/src/organisms/Desktop/HowCalibrationWorksModal/__tests__/HowCalibrationWorksModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -6,16 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { HowCalibrationWorksModal } from '..' -const render = ( - props: React.ComponentProps -) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('HowCalibrationWorksModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onCloseClick: vi.fn() } }) diff --git a/app/src/organisms/Desktop/Labware/AddCustomLabwareSlideout/__tests__/AddCustomLabwareSlideout.test.tsx b/app/src/organisms/Desktop/Labware/AddCustomLabwareSlideout/__tests__/AddCustomLabwareSlideout.test.tsx index 1a4fef0be5c..9d67949e289 100644 --- a/app/src/organisms/Desktop/Labware/AddCustomLabwareSlideout/__tests__/AddCustomLabwareSlideout.test.tsx +++ b/app/src/organisms/Desktop/Labware/AddCustomLabwareSlideout/__tests__/AddCustomLabwareSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { describe, it, expect, vi, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -10,6 +9,8 @@ import { import { renderWithProviders } from '/app/__testing-utils__' import { AddCustomLabwareSlideout } from '..' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/custom-labware') vi.mock('/app/local-resources/labware') vi.mock('/app/redux/analytics') @@ -21,9 +22,7 @@ vi.mock('/app/redux/shell/remote', () => ({ let mockTrackEvent: any -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -35,7 +34,7 @@ const render = ( } describe('AddCustomLabwareSlideout', () => { - const props: React.ComponentProps = { + const props: ComponentProps = { isExpanded: true, onCloseClick: vi.fn(() => null), } diff --git a/app/src/organisms/Desktop/Labware/LabwareCard/__tests__/CustomLabwareOverflowMenu.test.tsx b/app/src/organisms/Desktop/Labware/LabwareCard/__tests__/CustomLabwareOverflowMenu.test.tsx index 588b47ecea3..5e47b3432f4 100644 --- a/app/src/organisms/Desktop/Labware/LabwareCard/__tests__/CustomLabwareOverflowMenu.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareCard/__tests__/CustomLabwareOverflowMenu.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest' @@ -9,6 +8,7 @@ import { i18n } from '/app/i18n' import { useTrackEvent } from '/app/redux/analytics' import { CustomLabwareOverflowMenu } from '../CustomLabwareOverflowMenu' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' import type * as OpentronsComponents from '@opentrons/components' @@ -31,7 +31,7 @@ vi.mock('@opentrons/components', async importOriginal => { }) const render = ( - props: React.ComponentProps + props: ComponentProps ): ReturnType => { return renderWithProviders(, { i18nInstance: i18n, @@ -39,7 +39,7 @@ const render = ( } describe('CustomLabwareOverflowMenu', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/Labware/LabwareCard/__tests__/LabwareCard.test.tsx b/app/src/organisms/Desktop/Labware/LabwareCard/__tests__/LabwareCard.test.tsx index 76abb51c72f..2431472e274 100644 --- a/app/src/organisms/Desktop/Labware/LabwareCard/__tests__/LabwareCard.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareCard/__tests__/LabwareCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, vi, beforeEach } from 'vitest' import { renderWithProviders, nestedTextMatcher } from '/app/__testing-utils__' @@ -8,6 +7,7 @@ import { mockDefinition } from '/app/redux/custom-labware/__fixtures__' import { CustomLabwareOverflowMenu } from '../CustomLabwareOverflowMenu' import { LabwareCard } from '..' +import type { ComponentProps } from 'react' import type * as OpentronsComponents from '@opentrons/components' vi.mock('/app/local-resources/labware') @@ -21,14 +21,14 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('LabwareCard', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(CustomLabwareOverflowMenu).mockReturnValue(
        Mock CustomLabwareOverflowMenu
        diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/StyledComponents/__tests__/ExpandingTitle.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/StyledComponents/__tests__/ExpandingTitle.test.tsx index 6ee44619bc8..b7a872e9a1b 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/StyledComponents/__tests__/ExpandingTitle.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/StyledComponents/__tests__/ExpandingTitle.test.tsx @@ -1,11 +1,12 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, beforeEach } from 'vitest' import { getFootprintDiagram } from '@opentrons/components' import { renderWithProviders } from '/app/__testing-utils__' import { ExpandingTitle } from '../ExpandingTitle' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders() } @@ -13,7 +14,7 @@ const diagram = getFootprintDiagram({}) const DIAGRAM_TEST_ID = 'expanding_title_diagram' describe('ExpandingTitle', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { label: 'Title', diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/StyledComponents/__tests__/LabeledValue.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/StyledComponents/__tests__/LabeledValue.test.tsx index c3a73771f52..196d85cb707 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/StyledComponents/__tests__/LabeledValue.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/StyledComponents/__tests__/LabeledValue.test.tsx @@ -1,15 +1,16 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { LabeledValue } from '../LabeledValue' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders() } describe('LabeledValue', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { label: 'height', diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/Dimensions.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/Dimensions.test.tsx index 32de832214c..2afc92ad6cf 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/Dimensions.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/Dimensions.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -6,14 +5,16 @@ import { i18n } from '/app/i18n' import { mockDefinition } from '/app/redux/custom-labware/__fixtures__' import { Dimensions } from '../Dimensions' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Dimensions', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { definition: mockDefinition, diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/Gallery.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/Gallery.test.tsx index 344981336b0..5a61aa4684c 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/Gallery.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/Gallery.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -6,12 +5,14 @@ import { mockDefinition } from '/app/redux/custom-labware/__fixtures__' import { labwareImages } from '../labware-images' import { Gallery } from '../Gallery' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders() } describe('Gallery', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { labwareImages.mock_definition = ['image1'] props = { diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/LabwareDetails.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/LabwareDetails.test.tsx index 78c98c50a46..10602db9f9f 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/LabwareDetails.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/LabwareDetails.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, afterEach, vi, expect } from 'vitest' @@ -17,6 +16,8 @@ import { WellSpacing } from '../WellSpacing' import { LabwareDetails } from '..' +import type { ComponentProps } from 'react' + vi.mock('/app/local-resources/labware') vi.mock('../../LabwareCard/CustomLabwareOverflowMenu') vi.mock('../Dimensions') @@ -28,7 +29,7 @@ vi.mock('../WellDimensions') vi.mock('../WellSpacing') const render = ( - props: React.ComponentProps + props: ComponentProps ): ReturnType => { return renderWithProviders(, { i18nInstance: i18n, @@ -36,7 +37,7 @@ const render = ( } describe('LabwareDetails', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(CustomLabwareOverflowMenu).mockReturnValue(
        Mock CustomLabwareOverflowMenu
        diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/ManufacturerDetails.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/ManufacturerDetails.test.tsx index 21dc8c8f1a2..9d50aa61500 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/ManufacturerDetails.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/ManufacturerDetails.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ManufacturerDetails } from '../ManufacturerDetails' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ManufacturerDetails', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { brand: { brand: 'Opentrons' }, diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellCount.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellCount.test.tsx index f833c0c6e3f..6d94737a9c4 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellCount.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellCount.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { WellCount } from '../WellCount' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('WellCount', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { count: 1, diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellDimensions.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellDimensions.test.tsx index 3269c3ec241..78af2ac24b2 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellDimensions.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellDimensions.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -10,14 +9,16 @@ import { } from '/app/redux/custom-labware/__fixtures__' import { WellDimensions } from '../WellDimensions' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('WellDimensions', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { labwareParams: mockDefinition.parameters, diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellProperties.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellProperties.test.tsx index 3d21e01f4df..40b17b3b31f 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellProperties.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellProperties.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -6,14 +5,16 @@ import { i18n } from '/app/i18n' import { mockCircularLabwareWellGroupProperties } from '/app/redux/custom-labware/__fixtures__' import { WellProperties } from '../WellProperties' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('WellProperties', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { wellProperties: mockCircularLabwareWellGroupProperties, diff --git a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellSpacing.test.tsx b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellSpacing.test.tsx index 5496bbe33f1..59115886e02 100644 --- a/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellSpacing.test.tsx +++ b/app/src/organisms/Desktop/Labware/LabwareDetails/__tests__/WellSpacing.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -6,14 +5,16 @@ import { i18n } from '/app/i18n' import { mockCircularLabwareWellGroupProperties } from '/app/redux/custom-labware/__fixtures__' import { WellSpacing } from '../WellSpacing' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('WellSpacing', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { wellProperties: mockCircularLabwareWellGroupProperties, diff --git a/app/src/organisms/Desktop/ProtocolAnalysisFailure/ProtocolAnalysisStale.tsx b/app/src/organisms/Desktop/ProtocolAnalysisFailure/ProtocolAnalysisStale.tsx index 9b3a7c00d14..4daa1b24c80 100644 --- a/app/src/organisms/Desktop/ProtocolAnalysisFailure/ProtocolAnalysisStale.tsx +++ b/app/src/organisms/Desktop/ProtocolAnalysisFailure/ProtocolAnalysisStale.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useDispatch } from 'react-redux' import { useTranslation, Trans } from 'react-i18next' @@ -13,9 +12,11 @@ import { TYPOGRAPHY, WRAP_REVERSE, } from '@opentrons/components' +import { analyzeProtocol } from '/app/redux/protocol-storage' +import type { MouseEventHandler } from 'react' import type { Dispatch } from '/app/redux/types' -import { analyzeProtocol } from '/app/redux/protocol-storage' + interface ProtocolAnalysisStaleProps { protocolKey: string } @@ -27,7 +28,7 @@ export function ProtocolAnalysisStale( const { t } = useTranslation(['protocol_list', 'shared']) const dispatch = useDispatch() - const handleClickReanalyze: React.MouseEventHandler = e => { + const handleClickReanalyze: MouseEventHandler = e => { e.preventDefault() e.stopPropagation() dispatch(analyzeProtocol(protocolKey)) diff --git a/app/src/organisms/Desktop/ProtocolAnalysisFailure/__tests__/ProtocolAnalysisFailure.test.tsx b/app/src/organisms/Desktop/ProtocolAnalysisFailure/__tests__/ProtocolAnalysisFailure.test.tsx index fbdec0a45ec..becdabef509 100644 --- a/app/src/organisms/Desktop/ProtocolAnalysisFailure/__tests__/ProtocolAnalysisFailure.test.tsx +++ b/app/src/organisms/Desktop/ProtocolAnalysisFailure/__tests__/ProtocolAnalysisFailure.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect } from 'vitest' @@ -9,8 +8,10 @@ import { i18n } from '/app/i18n' import { ProtocolAnalysisFailure } from '..' import { analyzeProtocol } from '/app/redux/protocol-storage' +import type { ComponentProps } from 'react' + const render = ( - props: Partial> = {} + props: Partial> = {} ) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/ProtocolDetails/ProtocolParameters/__tests__/ProtocolParameters.test.tsx b/app/src/organisms/Desktop/ProtocolDetails/ProtocolParameters/__tests__/ProtocolParameters.test.tsx index e52803cc054..78f8184f7a1 100644 --- a/app/src/organisms/Desktop/ProtocolDetails/ProtocolParameters/__tests__/ProtocolParameters.test.tsx +++ b/app/src/organisms/Desktop/ProtocolDetails/ProtocolParameters/__tests__/ProtocolParameters.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' @@ -6,6 +5,7 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ProtocolParameters } from '..' +import type { ComponentProps } from 'react' import type { RunTimeParameter } from '@opentrons/shared-data' import type * as Components from '@opentrons/components' @@ -80,14 +80,14 @@ const mockRunTimeParameter: RunTimeParameter[] = [ }, ] -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ProtocolParameters', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolDetails.test.tsx b/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolDetails.test.tsx index f613c108b77..e9a75149199 100644 --- a/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolDetails.test.tsx +++ b/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolDetails.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { act, screen, waitFor } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' import { describe, it, beforeEach, vi, expect, afterEach } from 'vitest' @@ -26,6 +25,7 @@ import { import { storedProtocolData } from '/app/redux/protocol-storage/__fixtures__' import { ProtocolDetails } from '..' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' @@ -37,7 +37,7 @@ vi.mock('/app/organisms/Desktop/ChooseRobotToRunProtocolSlideout') vi.mock('/app/organisms/Desktop/SendProtocolToFlexSlideout') const render = ( - props: Partial> = {} + props: Partial> = {} ) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolLabwareDetails.test.tsx b/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolLabwareDetails.test.tsx index 93c215643cf..bc25bcb5569 100644 --- a/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolLabwareDetails.test.tsx +++ b/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolLabwareDetails.test.tsx @@ -1,10 +1,10 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach, vi } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ProtocolLabwareDetails } from '../ProtocolLabwareDetails' +import type { ComponentProps } from 'react' import type { LoadLabwareRunTimeCommand } from '@opentrons/shared-data' import type { InfoScreen } from '@opentrons/components' @@ -67,14 +67,14 @@ const mockRequiredLabwareDetails = [ } as LoadLabwareRunTimeCommand, ] -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ProtocolLabwareDetails', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { requiredLabwareDetails: mockRequiredLabwareDetails, diff --git a/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolLiquidsDetails.test.tsx b/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolLiquidsDetails.test.tsx index 69e55cc1097..9a6f233b312 100644 --- a/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolLiquidsDetails.test.tsx +++ b/app/src/organisms/Desktop/ProtocolDetails/__tests__/ProtocolLiquidsDetails.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach, vi } from 'vitest' import { parseLiquidsInLoadOrder } from '@opentrons/shared-data' @@ -7,6 +6,7 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ProtocolLiquidsDetails } from '../ProtocolLiquidsDetails' +import type { ComponentProps } from 'react' import type * as SharedData from '@opentrons/shared-data' vi.mock('../../Desktop/Devices/ProtocolRun/SetupLiquids/SetupLiquidsList') @@ -18,14 +18,14 @@ vi.mock('@opentrons/shared-data', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ProtocolLiquidsDetails', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { commands: [], diff --git a/app/src/organisms/Desktop/ProtocolDetails/__tests__/RobotConfigurationDetails.test.tsx b/app/src/organisms/Desktop/ProtocolDetails/__tests__/RobotConfigurationDetails.test.tsx index b823732ce95..65ce7d6d24d 100644 --- a/app/src/organisms/Desktop/ProtocolDetails/__tests__/RobotConfigurationDetails.test.tsx +++ b/app/src/organisms/Desktop/ProtocolDetails/__tests__/RobotConfigurationDetails.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, afterEach, vi } from 'vitest' import { screen } from '@testing-library/react' @@ -7,6 +6,8 @@ import { OT2_STANDARD_MODEL, FLEX_STANDARD_MODEL } from '@opentrons/shared-data' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { RobotConfigurationDetails } from '../RobotConfigurationDetails' + +import type { ComponentProps } from 'react' import type { LoadModuleRunTimeCommand } from '@opentrons/shared-data' const mockRequiredModuleDetails = [ @@ -57,16 +58,14 @@ const mockRequiredModuleDetails = [ } as LoadModuleRunTimeCommand, ] -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('RobotConfigurationDetails', () => { - let props: React.ComponentProps + let props: ComponentProps afterEach(() => { vi.clearAllMocks() diff --git a/app/src/organisms/Desktop/ProtocolsLanding/ConfirmDeleteProtocolModal.tsx b/app/src/organisms/Desktop/ProtocolsLanding/ConfirmDeleteProtocolModal.tsx index 14d75238bcc..439d48a9f0d 100644 --- a/app/src/organisms/Desktop/ProtocolsLanding/ConfirmDeleteProtocolModal.tsx +++ b/app/src/organisms/Desktop/ProtocolsLanding/ConfirmDeleteProtocolModal.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { AlertPrimaryButton, @@ -14,9 +13,11 @@ import { TYPOGRAPHY, } from '@opentrons/components' +import type { MouseEventHandler } from 'react' + interface ConfirmDeleteProtocolModalProps { - cancelDeleteProtocol: React.MouseEventHandler | undefined - handleClickDelete: React.MouseEventHandler + cancelDeleteProtocol: MouseEventHandler | undefined + handleClickDelete: MouseEventHandler } export function ConfirmDeleteProtocolModal( diff --git a/app/src/organisms/Desktop/ProtocolsLanding/ProtocolOverflowMenu.tsx b/app/src/organisms/Desktop/ProtocolsLanding/ProtocolOverflowMenu.tsx index 0bcc71f8cc0..eacddbdaca3 100644 --- a/app/src/organisms/Desktop/ProtocolsLanding/ProtocolOverflowMenu.tsx +++ b/app/src/organisms/Desktop/ProtocolsLanding/ProtocolOverflowMenu.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' @@ -35,6 +34,7 @@ import { } from '/app/redux/protocol-storage' import { ConfirmDeleteProtocolModal } from './ConfirmDeleteProtocolModal' +import type { MouseEvent, MouseEventHandler } from 'react' import type { StyleProps } from '@opentrons/components' import type { StoredProtocolData } from '/app/redux/protocol-storage' import type { Dispatch } from '/app/redux/types' @@ -77,13 +77,13 @@ export function ProtocolOverflowMenu( const robotType = mostRecentAnalysis != null ? mostRecentAnalysis?.robotType ?? null : null - const handleClickShowInFolder: React.MouseEventHandler = e => { + const handleClickShowInFolder: MouseEventHandler = e => { e.preventDefault() e.stopPropagation() dispatch(viewProtocolSourceFolder(protocolKey)) setShowOverflowMenu(currentShowOverflowMenu => !currentShowOverflowMenu) } - const handleClickRun: React.MouseEventHandler = e => { + const handleClickRun: MouseEventHandler = e => { e.preventDefault() e.stopPropagation() trackEvent({ @@ -93,25 +93,25 @@ export function ProtocolOverflowMenu( handleRunProtocol(storedProtocolData) setShowOverflowMenu(currentShowOverflowMenu => !currentShowOverflowMenu) } - const handleClickSendToOT3: React.MouseEventHandler = e => { + const handleClickSendToOT3: MouseEventHandler = e => { e.preventDefault() e.stopPropagation() handleSendProtocolToFlex(storedProtocolData) setShowOverflowMenu(currentShowOverflowMenu => !currentShowOverflowMenu) } - const handleClickDelete: React.MouseEventHandler = e => { + const handleClickDelete: MouseEventHandler = e => { e.preventDefault() e.stopPropagation() confirmDeleteProtocol() setShowOverflowMenu(currentShowOverflowMenu => !currentShowOverflowMenu) } - const handleClickReanalyze: React.MouseEventHandler = e => { + const handleClickReanalyze: MouseEventHandler = e => { e.preventDefault() e.stopPropagation() dispatch(analyzeProtocol(protocolKey)) setShowOverflowMenu(currentShowOverflowMenu => !currentShowOverflowMenu) } - const handleClickTimeline: React.MouseEventHandler = e => { + const handleClickTimeline: MouseEventHandler = e => { e.preventDefault() navigate(`/protocols/${protocolKey}/timeline`) setShowOverflowMenu(prevShowOverflowMenu => !prevShowOverflowMenu) @@ -121,7 +121,7 @@ export function ProtocolOverflowMenu( { + onClick={(e: MouseEvent) => { e.stopPropagation() }} > @@ -195,7 +195,7 @@ export function ProtocolOverflowMenu( {showDeleteConfirmation ? createPortal( { + cancelDeleteProtocol={(e: MouseEvent) => { e.preventDefault() e.stopPropagation() cancelDeleteProtocol() diff --git a/app/src/organisms/Desktop/ProtocolsLanding/__tests__/ConfirmDeleteProtocolModal.test.tsx b/app/src/organisms/Desktop/ProtocolsLanding/__tests__/ConfirmDeleteProtocolModal.test.tsx index dd19a80d133..8d040851a56 100644 --- a/app/src/organisms/Desktop/ProtocolsLanding/__tests__/ConfirmDeleteProtocolModal.test.tsx +++ b/app/src/organisms/Desktop/ProtocolsLanding/__tests__/ConfirmDeleteProtocolModal.test.tsx @@ -1,20 +1,19 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ConfirmDeleteProtocolModal } from '../ConfirmDeleteProtocolModal' -const render = ( - props: React.ComponentProps -) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ConfirmDeleteProtocolModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/ProtocolsLanding/__tests__/ProtocolList.test.tsx b/app/src/organisms/Desktop/ProtocolsLanding/__tests__/ProtocolList.test.tsx index 59271bc279c..6f3190712c4 100644 --- a/app/src/organisms/Desktop/ProtocolsLanding/__tests__/ProtocolList.test.tsx +++ b/app/src/organisms/Desktop/ProtocolsLanding/__tests__/ProtocolList.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { BrowserRouter } from 'react-router-dom' import { when } from 'vitest-when' import { fireEvent, screen } from '@testing-library/react' @@ -16,13 +15,15 @@ import { useSortedProtocols } from '../hooks' import { EmptyStateLinks } from '../EmptyStateLinks' import { ProtocolCard } from '../ProtocolCard' +import type { ComponentProps } from 'react' + vi.mock('../hooks') vi.mock('/app/redux/protocol-storage') vi.mock('/app/redux/config') vi.mock('../EmptyStateLinks') vi.mock('../ProtocolCard') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -34,7 +35,7 @@ const render = (props: React.ComponentProps) => { } describe('ProtocolList', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/ProtocolsLanding/__tests__/hooks.test.tsx b/app/src/organisms/Desktop/ProtocolsLanding/__tests__/hooks.test.tsx index 5d1485fe795..0c10c8fb1ef 100644 --- a/app/src/organisms/Desktop/ProtocolsLanding/__tests__/hooks.test.tsx +++ b/app/src/organisms/Desktop/ProtocolsLanding/__tests__/hooks.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { Provider } from 'react-redux' import { createStore } from 'redux' import { renderHook } from '@testing-library/react' @@ -8,6 +7,7 @@ import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { useSortedProtocols } from '../hooks' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' import type { StoredProtocolData } from '/app/redux/protocol-storage' @@ -294,7 +294,7 @@ describe('useSortedProtocols', () => { }) it('should return an object with protocols sorted alphabetically', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} @@ -318,7 +318,7 @@ describe('useSortedProtocols', () => { }) it('should return an object with protocols sorted reverse alphabetically', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} @@ -342,7 +342,7 @@ describe('useSortedProtocols', () => { }) it('should return an object with protocols sorted by most recent modified data', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} @@ -366,7 +366,7 @@ describe('useSortedProtocols', () => { }) it('should return an object with protocols sorted by oldest modified data', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} @@ -390,7 +390,7 @@ describe('useSortedProtocols', () => { }) it('should return an object with protocols sorted by flex then ot-2', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} @@ -413,7 +413,7 @@ describe('useSortedProtocols', () => { ) }) it('should return an object with protocols sorted by ot-2 then flex', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDataDownload.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDataDownload.tsx index 4731df09ae4..47058491684 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDataDownload.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDataDownload.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { saveAs } from 'file-saver' import { useTranslation, Trans } from 'react-i18next' @@ -17,6 +16,8 @@ import { useInstrumentsQuery, useModulesQuery, } from '@opentrons/react-api-client' +import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' + import { TertiaryButton } from '/app/atoms/buttons' import { useDeckCalibrationData, @@ -30,6 +31,8 @@ import { import { useRobot, useIsFlex } from '/app/redux-resources/robots' import { useIsEstopNotDisengaged } from '/app/resources/devices/hooks/useIsEstopNotDisengaged' +import type { MouseEventHandler } from 'react' + // TODO(bc, 2022-02-08): replace with support article when available const FLEX_CALIBRATION_SUPPORT_URL = 'https://support.opentrons.com' @@ -68,11 +71,13 @@ export function CalibrationDataDownload({ tipLengthCalibrations != null && tipLengthCalibrations.length > 0 - const onClickSaveAs: React.MouseEventHandler = e => { + const onClickSaveAs: MouseEventHandler = e => { e.preventDefault() doTrackEvent({ name: ANALYTICS_CALIBRATION_DATA_DOWNLOADED, - properties: {}, + properties: { + robotType: isFlex ? FLEX_ROBOT_TYPE : OT2_ROBOT_TYPE, + }, }) saveAs( new Blob([ diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/ModuleCalibrationItems.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/ModuleCalibrationItems.test.tsx index 8cb0dd62dc6..ee0529a1c4e 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/ModuleCalibrationItems.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/ModuleCalibrationItems.test.tsx @@ -1,6 +1,6 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' +import { ABSORBANCE_READER_TYPE } from '@opentrons/shared-data' import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { mockFetchModulesSuccessActionPayloadModules } from '/app/redux/modules/__fixtures__' @@ -8,8 +8,8 @@ import { ModuleCalibrationOverflowMenu } from '../ModuleCalibrationOverflowMenu' import { formatLastCalibrated } from '../utils' import { ModuleCalibrationItems } from '../ModuleCalibrationItems' +import type { ComponentProps } from 'react' import type { AttachedModule } from '@opentrons/api-client' -import { ABSORBANCE_READER_TYPE } from '@opentrons/shared-data' vi.mock('../ModuleCalibrationOverflowMenu') @@ -55,7 +55,7 @@ const mockCalibratedModule = { const ROBOT_NAME = 'mockRobot' const render = ( - props: React.ComponentProps + props: ComponentProps ): ReturnType => { return renderWithProviders(, { i18nInstance: i18n, @@ -63,7 +63,7 @@ const render = ( } describe('ModuleCalibrationItems', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/ModuleCalibrationOverflowMenu.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/ModuleCalibrationOverflowMenu.test.tsx index 47b5dbec249..2807269794b 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/ModuleCalibrationOverflowMenu.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/ModuleCalibrationOverflowMenu.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen, waitFor } from '@testing-library/react' import { when } from 'vitest-when' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -11,6 +10,7 @@ import { useIsEstopNotDisengaged } from '/app/resources/devices/hooks/useIsEstop import { ModuleCalibrationOverflowMenu } from '../ModuleCalibrationOverflowMenu' +import type { ComponentProps } from 'react' import type { Mount } from '@opentrons/components' vi.mock('@opentrons/react-api-client') @@ -87,7 +87,7 @@ const mockTCHeating = { } as any const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -97,7 +97,7 @@ const render = ( const ROBOT_NAME = 'mockRobot' describe('ModuleCalibrationOverflowMenu', () => { - let props: React.ComponentProps + let props: ComponentProps let mockChainLiveCommands = vi.fn() beforeEach(() => { diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/OverflowMenu.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/OverflowMenu.test.tsx index a0d2ff20096..cf106ccc6b3 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/OverflowMenu.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/OverflowMenu.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { when } from 'vitest-when' import '@testing-library/jest-dom/vitest' @@ -26,10 +25,11 @@ import { renderWithProviders } from '/app/__testing-utils__' import { useIsEstopNotDisengaged } from '/app/resources/devices' import { OverflowMenu } from '../OverflowMenu' +import type { ComponentProps } from 'react' import type { Mount } from '@opentrons/components' const render = ( - props: React.ComponentProps + props: ComponentProps ): ReturnType => { return renderWithProviders(, { i18nInstance: i18n, @@ -81,7 +81,7 @@ const RUN_STATUSES = { const mockUpdateRobotStatus = vi.fn() describe('OverflowMenu', () => { - let props: React.ComponentProps + let props: ComponentProps const mockDeleteCalibration = vi.fn() beforeEach(() => { diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/PipetteOffsetCalibrationItems.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/PipetteOffsetCalibrationItems.test.tsx index 2a6cf82726f..bca259d41c5 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/PipetteOffsetCalibrationItems.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/PipetteOffsetCalibrationItems.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -19,11 +18,12 @@ import { PipetteOffsetCalibrationItems } from '../PipetteOffsetCalibrationItems' import { OverflowMenu } from '../OverflowMenu' import { formatLastCalibrated } from '../utils' +import type { ComponentProps } from 'react' import type { Mount } from '@opentrons/components' import type { AttachedPipettesByMount } from '/app/redux/pipettes/types' const render = ( - props: React.ComponentProps + props: ComponentProps ): ReturnType => { return renderWithProviders(, { i18nInstance: i18n, @@ -73,7 +73,7 @@ const mockAttachedPipettes: AttachedPipettesByMount = { const mockUpdateRobotStatus = vi.fn() describe('PipetteOffsetCalibrationItems', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(useAttachedPipettesFromInstrumentsQuery).mockReturnValue({ diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/TipLengthCalibrationItems.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/TipLengthCalibrationItems.test.tsx index 014ec28ee2c..19270615a06 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/TipLengthCalibrationItems.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/CalibrationDetails/__tests__/TipLengthCalibrationItems.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -6,6 +5,8 @@ import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { TipLengthCalibrationItems } from '../TipLengthCalibrationItems' import { OverflowMenu } from '../OverflowMenu' + +import type { ComponentProps } from 'react' import type { Mount } from '@opentrons/components' vi.mock('/app/redux/custom-labware/selectors') @@ -54,14 +55,14 @@ const mockTipLengthCalibrations = [ const mockUpdateRobotStatus = vi.fn() const render = ( - props: React.ComponentProps + props: ComponentProps ): ReturnType => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('TipLengthCalibrationItems', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(OverflowMenu).mockReturnValue(
        mock overflow menu
        ) diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/CalibrationDataDownload.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/CalibrationDataDownload.test.tsx index b84b25e2e16..b50a892ca73 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/CalibrationDataDownload.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/CalibrationDataDownload.test.tsx @@ -16,6 +16,7 @@ import { useModulesQuery, } from '@opentrons/react-api-client' import { instrumentsResponseFixture } from '@opentrons/api-client' +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { i18n } from '/app/i18n' import { @@ -145,7 +146,7 @@ describe('CalibrationDataDownload', () => { fireEvent.click(downloadButton) expect(mockTrackEvent).toHaveBeenCalledWith({ name: ANALYTICS_CALIBRATION_DATA_DOWNLOADED, - properties: {}, + properties: { robotType: OT2_ROBOT_TYPE }, }) }) diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/CalibrationHealthCheck.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/CalibrationHealthCheck.test.tsx index ee965c9d042..c434f6c1392 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/CalibrationHealthCheck.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/CalibrationHealthCheck.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import userEvent from '@testing-library/user-event' import { fireEvent, screen, waitFor } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -20,14 +19,13 @@ import { } from '/app/redux/calibration/tip-length/__fixtures__' import { mockAttachedPipette } from '/app/redux/pipettes/__fixtures__' import { useRunStatuses } from '/app/resources/runs' - import { useAttachedPipettes, useAttachedPipetteCalibrations, } from '/app/resources/instruments' - import { CalibrationHealthCheck } from '../CalibrationHealthCheck' +import type { ComponentProps } from 'react' import type { AttachedPipettesByMount, PipetteCalibrationsByMount, @@ -66,7 +64,7 @@ let mockTrackEvent: any const mockDispatchRequests = vi.fn() const render = ( - props?: Partial> + props?: Partial> ) => { return renderWithProviders( > + props?: Partial> ) => { return renderWithProviders( , diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsGripperCalibration.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsGripperCalibration.test.tsx index e4a4d48eea1..ff0570443d1 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsGripperCalibration.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsGripperCalibration.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -10,6 +9,7 @@ import { formatLastCalibrated } from '../CalibrationDetails/utils' import { useIsEstopNotDisengaged } from '/app/resources/devices/hooks/useIsEstopNotDisengaged' import { RobotSettingsGripperCalibration } from '../RobotSettingsGripperCalibration' +import type { ComponentProps } from 'react' import type { GripperData } from '@opentrons/api-client' vi.mock('/app/organisms/GripperWizardFlows') @@ -35,7 +35,7 @@ const mockNotCalibratedGripper = { const ROBOT_NAME = 'mockRobot' const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -43,7 +43,7 @@ const render = ( } describe('RobotSettingsGripperCalibration', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(formatLastCalibrated).mockReturnValue('last calibrated 1/2/3') vi.mocked(GripperWizardFlows).mockReturnValue(<>Mock Wizard Flow) diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsModuleCalibration.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsModuleCalibration.test.tsx index 95b71a450af..63d5014da79 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsModuleCalibration.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsModuleCalibration.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, vi, beforeEach } from 'vitest' import { i18n } from '/app/i18n' @@ -7,10 +6,12 @@ import { mockFetchModulesSuccessActionPayloadModules } from '/app/redux/modules/ import { RobotSettingsModuleCalibration } from '../RobotSettingsModuleCalibration' import { ModuleCalibrationItems } from '../CalibrationDetails/ModuleCalibrationItems' +import type { ComponentProps } from 'react' + vi.mock('../CalibrationDetails/ModuleCalibrationItems') const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -20,7 +21,7 @@ const render = ( const ROBOT_NAME = 'mockRobot' describe('RobotSettingsModuleCalibration', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsPipetteOffsetCalibration.test.tsx b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsPipetteOffsetCalibration.test.tsx index 0f628dddfef..6b883499831 100644 --- a/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsPipetteOffsetCalibration.test.tsx +++ b/app/src/organisms/Desktop/RobotSettingsCalibration/__tests__/RobotSettingsPipetteOffsetCalibration.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { describe, it, vi, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -18,6 +17,7 @@ import { useIsFlex } from '/app/redux-resources/robots' import { RobotSettingsPipetteOffsetCalibration } from '../RobotSettingsPipetteOffsetCalibration' import { PipetteOffsetCalibrationItems } from '../CalibrationDetails/PipetteOffsetCalibrationItems' +import type { ComponentProps } from 'react' import type { FormattedPipetteOffsetCalibration } from '..' vi.mock('/app/organisms/Desktop/Devices/hooks') @@ -29,9 +29,7 @@ const mockFormattedPipetteOffsetCalibrations: FormattedPipetteOffsetCalibration[ const mockUpdateRobotStatus = vi.fn() const render = ( - props?: Partial< - React.ComponentProps - > + props?: Partial> ) => { return renderWithProviders( ) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('InterventionTicks', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(Tick).mockImplementation(({ index }) => (
        MOCK TICK at index: {index}
        diff --git a/app/src/organisms/Desktop/RunProgressMeter/__tests__/RunProgressMeter.test.tsx b/app/src/organisms/Desktop/RunProgressMeter/__tests__/RunProgressMeter.test.tsx index 928bd2572a9..469c056c087 100644 --- a/app/src/organisms/Desktop/RunProgressMeter/__tests__/RunProgressMeter.test.tsx +++ b/app/src/organisms/Desktop/RunProgressMeter/__tests__/RunProgressMeter.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -37,6 +36,7 @@ import { RunProgressMeter } from '..' import { renderWithProviders } from '/app/__testing-utils__' import { useRunningStepCounts } from '/app/resources/protocols/hooks' +import type { ComponentProps } from 'react' import type { RunCommandSummary } from '@opentrons/api-client' import type * as ApiClient from '@opentrons/react-api-client' @@ -55,7 +55,7 @@ vi.mock('../../Devices/hooks') vi.mock('/app/resources/protocols/hooks') vi.mock('/app/redux-resources/robots') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -65,7 +65,7 @@ const NON_DETERMINISTIC_RUN_ID = 'nonDeterministicID' const ROBOT_NAME = 'otie' describe('RunProgressMeter', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(ProgressBar).mockReturnValue(
        MOCK PROGRESS BAR
        ) vi.mocked(InterventionModal).mockReturnValue( diff --git a/app/src/organisms/Desktop/RunProgressMeter/hooks/useRunProgressCopy.tsx b/app/src/organisms/Desktop/RunProgressMeter/hooks/useRunProgressCopy.tsx index 65e2f27d6b3..aaa90997167 100644 --- a/app/src/organisms/Desktop/RunProgressMeter/hooks/useRunProgressCopy.tsx +++ b/app/src/organisms/Desktop/RunProgressMeter/hooks/useRunProgressCopy.tsx @@ -4,7 +4,6 @@ import { RUN_STATUS_BLOCKED_BY_OPEN_DOOR, RUN_STATUS_IDLE, } from '@opentrons/api-client' -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { getCommandTextData } from '/app/local-resources/commands' @@ -13,6 +12,7 @@ import { LegacyStyledText } from '@opentrons/components' import { CommandText } from '/app/molecules/Command' import { TERMINAL_RUN_STATUSES } from '../constants' +import type { ReactNode } from 'react' import type { CommandDetail, RunStatus } from '@opentrons/api-client' import type { CompletedProtocolAnalysis, @@ -21,7 +21,7 @@ import type { } from '@opentrons/shared-data' interface UseRunProgressResult { - currentStepContents: React.ReactNode + currentStepContents: ReactNode stepCountStr: string | null progressPercentage: number } diff --git a/app/src/organisms/Desktop/RunProgressMeter/index.tsx b/app/src/organisms/Desktop/RunProgressMeter/index.tsx index fb158f5d686..ecf38cd31f6 100644 --- a/app/src/organisms/Desktop/RunProgressMeter/index.tsx +++ b/app/src/organisms/Desktop/RunProgressMeter/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' import { css } from 'styled-components' @@ -49,6 +48,8 @@ import { useRobotType } from '/app/redux-resources/robots' import { useRunningStepCounts } from '/app/resources/protocols/hooks' import { useRunProgressCopy } from './hooks' +import type { MouseEventHandler } from 'react' + interface RunProgressMeterProps { runId: string robotName: string @@ -92,7 +93,7 @@ export function RunProgressMeter(props: RunProgressMeterProps): JSX.Element { const { downloadRunLog } = useDownloadRunLog(robotName, runId) - const onDownloadClick: React.MouseEventHandler = e => { + const onDownloadClick: MouseEventHandler = e => { if (downloadIsDisabled) return false e.preventDefault() e.stopPropagation() diff --git a/app/src/organisms/Desktop/SendProtocolToFlexSlideout/__tests__/SendProtocolToFlexSlideout.test.tsx b/app/src/organisms/Desktop/SendProtocolToFlexSlideout/__tests__/SendProtocolToFlexSlideout.test.tsx index 5ed8f96fb1a..08e60f84729 100644 --- a/app/src/organisms/Desktop/SendProtocolToFlexSlideout/__tests__/SendProtocolToFlexSlideout.test.tsx +++ b/app/src/organisms/Desktop/SendProtocolToFlexSlideout/__tests__/SendProtocolToFlexSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -36,6 +35,7 @@ import { storedProtocolData as storedProtocolDataFixture } from '/app/redux/prot import { SendProtocolToFlexSlideout } from '..' import { useNotifyAllRunsQuery } from '/app/resources/runs' +import type { ComponentProps } from 'react' import type * as ApiClient from '@opentrons/react-api-client' vi.mock('@opentrons/react-api-client', async importOriginal => { @@ -53,9 +53,7 @@ vi.mock('/app/redux/custom-labware') vi.mock('/app/redux/protocol-storage/selectors') vi.mock('/app/resources/runs') -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/Desktop/SystemLanguagePreferenceModal/__tests__/SystemLanguagePreferenceModal.test.tsx b/app/src/organisms/Desktop/SystemLanguagePreferenceModal/__tests__/SystemLanguagePreferenceModal.test.tsx index 104085fcb15..af4c4feb5d0 100644 --- a/app/src/organisms/Desktop/SystemLanguagePreferenceModal/__tests__/SystemLanguagePreferenceModal.test.tsx +++ b/app/src/organisms/Desktop/SystemLanguagePreferenceModal/__tests__/SystemLanguagePreferenceModal.test.tsx @@ -5,6 +5,10 @@ import { describe, it, vi, afterEach, beforeEach, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' +import { + ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_MODAL, + useTrackEvent, +} from '/app/redux/analytics' import { getAppLanguage, getStoredSystemLanguage, @@ -16,6 +20,7 @@ import { SystemLanguagePreferenceModal } from '..' vi.mock('react-router-dom') vi.mock('/app/redux/config') vi.mock('/app/redux/shell') +vi.mock('/app/redux/analytics') const render = () => { return renderWithProviders(, { @@ -24,6 +29,7 @@ const render = () => { } const mockNavigate = vi.fn() +const mockTrackEvent = vi.fn() const MOCK_DEFAULT_LANGUAGE = 'en-US' @@ -33,6 +39,7 @@ describe('SystemLanguagePreferenceModal', () => { vi.mocked(getSystemLanguage).mockReturnValue(MOCK_DEFAULT_LANGUAGE) vi.mocked(getStoredSystemLanguage).mockReturnValue(MOCK_DEFAULT_LANGUAGE) vi.mocked(useNavigate).mockReturnValue(mockNavigate) + vi.mocked(useTrackEvent).mockReturnValue(mockTrackEvent) }) afterEach(() => { vi.resetAllMocks() @@ -68,6 +75,14 @@ describe('SystemLanguagePreferenceModal', () => { 'language.systemLanguage', MOCK_DEFAULT_LANGUAGE ) + expect(mockTrackEvent).toBeCalledWith({ + name: ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_MODAL, + properties: { + language: MOCK_DEFAULT_LANGUAGE, + systemLanguage: MOCK_DEFAULT_LANGUAGE, + modalType: 'appBootModal', + }, + }) }) it('should default to English (US) if system language is unsupported', () => { @@ -90,6 +105,14 @@ describe('SystemLanguagePreferenceModal', () => { MOCK_DEFAULT_LANGUAGE ) expect(updateConfigValue).toBeCalledWith('language.systemLanguage', 'es-MX') + expect(mockTrackEvent).toBeCalledWith({ + name: ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_MODAL, + properties: { + language: MOCK_DEFAULT_LANGUAGE, + systemLanguage: 'es-MX', + modalType: 'appBootModal', + }, + }) }) it('should set a supported app language when system language is an unsupported locale of the same language', () => { @@ -112,6 +135,14 @@ describe('SystemLanguagePreferenceModal', () => { MOCK_DEFAULT_LANGUAGE ) expect(updateConfigValue).toBeCalledWith('language.systemLanguage', 'en-GB') + expect(mockTrackEvent).toBeCalledWith({ + name: ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_MODAL, + properties: { + language: MOCK_DEFAULT_LANGUAGE, + systemLanguage: 'en-GB', + modalType: 'appBootModal', + }, + }) }) it('should render the correct header, description, and buttons when system language changes', () => { @@ -139,6 +170,14 @@ describe('SystemLanguagePreferenceModal', () => { 'language.systemLanguage', 'zh-CN' ) + expect(mockTrackEvent).toBeCalledWith({ + name: ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_MODAL, + properties: { + language: 'zh-CN', + systemLanguage: 'zh-CN', + modalType: 'systemLanguageUpdateModal', + }, + }) fireEvent.click(secondaryButton) expect(updateConfigValue).toHaveBeenNthCalledWith( 3, @@ -168,6 +207,14 @@ describe('SystemLanguagePreferenceModal', () => { 'language.systemLanguage', 'zh-Hant' ) + expect(mockTrackEvent).toBeCalledWith({ + name: ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_MODAL, + properties: { + language: 'zh-CN', + systemLanguage: 'zh-Hant', + modalType: 'systemLanguageUpdateModal', + }, + }) fireEvent.click(secondaryButton) expect(updateConfigValue).toHaveBeenNthCalledWith( 3, diff --git a/app/src/organisms/Desktop/SystemLanguagePreferenceModal/index.tsx b/app/src/organisms/Desktop/SystemLanguagePreferenceModal/index.tsx index d3b04f19061..f135c0fe10a 100644 --- a/app/src/organisms/Desktop/SystemLanguagePreferenceModal/index.tsx +++ b/app/src/organisms/Desktop/SystemLanguagePreferenceModal/index.tsx @@ -16,6 +16,10 @@ import { } from '@opentrons/components' import { LANGUAGES } from '/app/i18n' +import { + ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_MODAL, + useTrackEvent, +} from '/app/redux/analytics' import { getAppLanguage, getStoredSystemLanguage, @@ -32,7 +36,7 @@ type ArrayElement< export function SystemLanguagePreferenceModal(): JSX.Element | null { const { i18n, t } = useTranslation(['app_settings', 'shared', 'branded']) - + const trackEvent = useTrackEvent() const [currentOption, setCurrentOption] = useState( LANGUAGES[0] ) @@ -66,6 +70,16 @@ export function SystemLanguagePreferenceModal(): JSX.Element | null { const handlePrimaryClick = (): void => { dispatch(updateConfigValue('language.appLanguage', currentOption.value)) dispatch(updateConfigValue('language.systemLanguage', systemLanguage)) + trackEvent({ + name: ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_MODAL, + properties: { + language: currentOption.value, + systemLanguage, + modalType: showUpdateModal + ? 'systemLanguageUpdateModal' + : 'appBootModal', + }, + }) } const handleDropdownClick = (value: string): void => { diff --git a/app/src/organisms/Desktop/UpdateAppModal/__tests__/UpdateAppModal.test.tsx b/app/src/organisms/Desktop/UpdateAppModal/__tests__/UpdateAppModal.test.tsx index 3131bee25a3..4469abc159a 100644 --- a/app/src/organisms/Desktop/UpdateAppModal/__tests__/UpdateAppModal.test.tsx +++ b/app/src/organisms/Desktop/UpdateAppModal/__tests__/UpdateAppModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen, fireEvent } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -9,10 +8,11 @@ import { renderWithProviders } from '/app/__testing-utils__' import { useRemoveActiveAppUpdateToast } from '../../Alerts' import { UpdateAppModal, RELEASE_NOTES_URL_BASE } from '..' +import type { ComponentProps } from 'react' +import type * as Dom from 'react-router-dom' import type { State } from '/app/redux/types' import type { ShellUpdateState } from '/app/redux/shell/types' import type * as ShellState from '/app/redux/shell' -import type * as Dom from 'react-router-dom' import type { UpdateAppModalProps } from '..' vi.mock('/app/redux/shell/update', async importOriginal => { @@ -35,7 +35,7 @@ vi.mock('../../Alerts') const getShellUpdateState = Shell.getShellUpdateState -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, initialState: { @@ -45,7 +45,7 @@ const render = (props: React.ComponentProps) => { } describe('UpdateAppModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/UpdateRobotBanner/__tests__/UpdateRobotBanner.test.tsx b/app/src/organisms/Desktop/UpdateRobotBanner/__tests__/UpdateRobotBanner.test.tsx index e7d90f70ea3..e1b67d7c9dc 100644 --- a/app/src/organisms/Desktop/UpdateRobotBanner/__tests__/UpdateRobotBanner.test.tsx +++ b/app/src/organisms/Desktop/UpdateRobotBanner/__tests__/UpdateRobotBanner.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { fireEvent, screen } from '@testing-library/react' @@ -12,19 +11,21 @@ import { import { handleUpdateBuildroot } from '../../Devices/RobotSettings/UpdateBuildroot' import { UpdateRobotBanner } from '..' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/robot-update') vi.mock('../../Devices/RobotSettings/UpdateBuildroot') const getUpdateDisplayInfo = Buildroot.getRobotUpdateDisplayInfo -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('UpdateRobotBanner', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/Desktop/UpdateRobotBanner/index.tsx b/app/src/organisms/Desktop/UpdateRobotBanner/index.tsx index e5d7d2d0e85..390f4bc3ac1 100644 --- a/app/src/organisms/Desktop/UpdateRobotBanner/index.tsx +++ b/app/src/organisms/Desktop/UpdateRobotBanner/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { @@ -13,6 +12,7 @@ import { import { getRobotUpdateDisplayInfo } from '/app/redux/robot-update' import { handleUpdateBuildroot } from '../Devices/RobotSettings/UpdateBuildroot' +import type { MouseEvent } from 'react' import type { StyleProps } from '@opentrons/components' import type { State } from '/app/redux/types' import type { DiscoveredRobot } from '/app/redux/discovery/types' @@ -35,7 +35,7 @@ export function UpdateRobotBanner( robot !== null && robot.healthStatus === 'ok' ? ( { + onClick={(e: MouseEvent) => { e.stopPropagation() }} flexDirection={DIRECTION_COLUMN} diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/AddFixtureModal.test.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/AddFixtureModal.test.tsx index 450a64cc0e6..955c9e0f86b 100644 --- a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/AddFixtureModal.test.tsx +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/AddFixtureModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect, afterEach } from 'vitest' @@ -16,6 +15,7 @@ import { i18n } from '/app/i18n' import { AddFixtureModal } from '../AddFixtureModal' import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { DeckConfiguration } from '@opentrons/shared-data' import type { Modules } from '@opentrons/api-client' @@ -26,14 +26,14 @@ vi.mock('/app/resources/deck_configuration') const mockCloseModal = vi.fn() const mockUpdateDeckConfiguration = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Touchscreen AddFixtureModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -88,7 +88,7 @@ describe('Touchscreen AddFixtureModal', () => { }) describe('Desktop AddFixtureModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx index fd0e56ffa4d..b0b213170dc 100644 --- a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx @@ -1,10 +1,11 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { DeckConfigurationDiscardChangesModal } from '../DeckConfigurationDiscardChangesModal' + +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const mockFunc = vi.fn() @@ -19,7 +20,7 @@ vi.mock('react-router-dom', async importOriginal => { }) const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders( , @@ -30,7 +31,7 @@ const render = ( } describe('DeckConfigurationDiscardChangesModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckFixtureSetupInstructionsModal.test.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckFixtureSetupInstructionsModal.test.tsx index ddc9ff33194..bfd218f5e97 100644 --- a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckFixtureSetupInstructionsModal.test.tsx +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckFixtureSetupInstructionsModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -6,12 +5,14 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { DeckFixtureSetupInstructionsModal } from '../DeckFixtureSetupInstructionsModal' +import type { ComponentProps } from 'react' + const mockFunc = vi.fn() const PNG_FILE_NAME = '/app/src/assets/images/on-device-display/deck_fixture_setup_qrcode.png' const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -19,7 +20,7 @@ const render = ( } describe('Touchscreen DeckFixtureSetupInstructionsModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -49,7 +50,7 @@ describe('Touchscreen DeckFixtureSetupInstructionsModal', () => { }) describe('Desktop DeckFixtureSetupInstructionsModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeviceDetailsDeckConfiguration.test.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeviceDetailsDeckConfiguration.test.tsx index 16ef3db90a7..409f0d3f452 100644 --- a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeviceDetailsDeckConfiguration.test.tsx +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeviceDetailsDeckConfiguration.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { when } from 'vitest-when' import { describe, it, beforeEach, vi, afterEach } from 'vitest' @@ -23,6 +22,7 @@ import { useNotifyDeckConfigurationQuery, } from '/app/resources/deck_configuration' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { MaintenanceRun } from '@opentrons/api-client' import type { DeckConfiguration } from '@opentrons/shared-data' @@ -62,7 +62,7 @@ const mockCurrnetMaintenanceRun = { } as MaintenanceRun const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -70,7 +70,7 @@ const render = ( } describe('DeviceDetailsDeckConfiguration', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/DropTipWizardFlows/__tests__/DropTipWizard.test.tsx b/app/src/organisms/DropTipWizardFlows/__tests__/DropTipWizard.test.tsx index d1108fc3c18..9ea6a6f2363 100644 --- a/app/src/organisms/DropTipWizardFlows/__tests__/DropTipWizard.test.tsx +++ b/app/src/organisms/DropTipWizardFlows/__tests__/DropTipWizard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -31,6 +30,8 @@ import { CONFIRM_POSITION, } from '../constants' +import type { ComponentProps } from 'react' + vi.mock('/app/molecules/InProgressModal') vi.mock('../ExitConfirmation') vi.mock('../steps') @@ -38,7 +39,7 @@ vi.mock('../ErrorInfo') vi.mock('../DropTipWizardHeader') const renderDropTipWizardContainer = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -46,7 +47,7 @@ const renderDropTipWizardContainer = ( } describe('DropTipWizardContainer', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = mockDropTipWizardContainerProps @@ -75,7 +76,7 @@ describe('DropTipWizardContainer', () => { }) const renderDropTipWizardContent = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -83,7 +84,7 @@ const renderDropTipWizardContent = ( } describe('DropTipWizardContent', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = mockDropTipWizardContainerProps diff --git a/app/src/organisms/DropTipWizardFlows/__tests__/DropTipWizardHeader.test.tsx b/app/src/organisms/DropTipWizardFlows/__tests__/DropTipWizardHeader.test.tsx index c5720adf4ab..74bb70f6a8e 100644 --- a/app/src/organisms/DropTipWizardFlows/__tests__/DropTipWizardHeader.test.tsx +++ b/app/src/organisms/DropTipWizardFlows/__tests__/DropTipWizardHeader.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { beforeEach, describe, expect, it, vi } from 'vitest' import { screen } from '@testing-library/react' @@ -10,17 +9,18 @@ import { DropTipWizardHeader, } from '../DropTipWizardHeader' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' import type { UseWizardExitHeaderProps } from '../DropTipWizardHeader' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('DropTipWizardHeader', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = mockDropTipWizardContainerProps diff --git a/app/src/organisms/EmergencyStop/__tests__/EstopMissingModal.test.tsx b/app/src/organisms/EmergencyStop/__tests__/EstopMissingModal.test.tsx index c2ce7cea0e1..c71c0a146ee 100644 --- a/app/src/organisms/EmergencyStop/__tests__/EstopMissingModal.test.tsx +++ b/app/src/organisms/EmergencyStop/__tests__/EstopMissingModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -8,16 +7,18 @@ import { i18n } from '/app/i18n' import { getIsOnDevice } from '/app/redux/config' import { EstopMissingModal } from '../EstopMissingModal' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('EstopMissingModal - Touchscreen', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -40,7 +41,7 @@ describe('EstopMissingModal - Touchscreen', () => { }) describe('EstopMissingModal - Desktop', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/EmergencyStop/__tests__/EstopPressedModal.test.tsx b/app/src/organisms/EmergencyStop/__tests__/EstopPressedModal.test.tsx index 067211c4c06..6d259bd6acb 100644 --- a/app/src/organisms/EmergencyStop/__tests__/EstopPressedModal.test.tsx +++ b/app/src/organisms/EmergencyStop/__tests__/EstopPressedModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' import { describe, it, vi, beforeEach, expect } from 'vitest' @@ -10,18 +9,20 @@ import { getIsOnDevice } from '/app/redux/config' import { EstopPressedModal } from '../EstopPressedModal' import { usePlacePlateReaderLid } from '/app/resources/modules' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') vi.mock('/app/redux/config') vi.mock('/app/resources/modules') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('EstopPressedModal - Touchscreen', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -85,7 +86,7 @@ describe('EstopPressedModal - Touchscreen', () => { }) describe('EstopPressedModal - Desktop', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/EmergencyStop/__tests__/EstopTakeover.test.tsx b/app/src/organisms/EmergencyStop/__tests__/EstopTakeover.test.tsx index 3ff0503dc69..4ffd822fb80 100644 --- a/app/src/organisms/EmergencyStop/__tests__/EstopTakeover.test.tsx +++ b/app/src/organisms/EmergencyStop/__tests__/EstopTakeover.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, expect, vi } from 'vitest' import { screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -19,6 +18,8 @@ import { getLocalRobot } from '/app/redux/discovery' import { mockConnectedRobot } from '/app/redux/discovery/__fixtures__' import { EstopTakeover } from '../EstopTakeover' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') vi.mock('../EstopMissingModal') vi.mock('../EstopPressedModal') @@ -33,14 +34,14 @@ const mockPressed = { }, } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('EstopTakeover', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/IgnoreErrorSkipStep.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/IgnoreErrorSkipStep.tsx index 16cb755d4da..2f8f7016773 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/IgnoreErrorSkipStep.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/IgnoreErrorSkipStep.tsx @@ -27,6 +27,7 @@ import { SkipStepInfo, } from '../shared' +import type { ChangeEvent } from 'react' import type { RecoveryContentProps } from '../types' export function IgnoreErrorSkipStep(props: RecoveryContentProps): JSX.Element { @@ -143,7 +144,7 @@ export function IgnoreErrorStepHome({ > ) => { + onChange={(e: ChangeEvent) => { setSelectedOption(e.currentTarget.value as IgnoreOption) }} options={IGNORE_OPTIONS_IN_ORDER.map(option => { diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/CancelRun.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/CancelRun.test.tsx index cbf8126e353..06923d65492 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/CancelRun.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/CancelRun.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import { screen, waitFor } from '@testing-library/react' @@ -9,11 +8,13 @@ import { CancelRun } from '../CancelRun' import { RECOVERY_MAP } from '../../constants' import { SelectRecoveryOption } from '../SelectRecoveryOption' import { clickButtonLabeled } from '../../__tests__/util' + +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('../SelectRecoveryOption') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -21,7 +22,7 @@ const render = (props: React.ComponentProps) => { describe('RecoveryFooterButtons', () => { const { CANCEL_RUN, ROBOT_CANCELING, DROP_TIP_FLOWS } = RECOVERY_MAP - let props: React.ComponentProps + let props: ComponentProps let mockGoBackPrevStep: Mock let mockhandleMotionRouting: Mock let mockProceedToRouteAndStep: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/FillWellAndSkip.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/FillWellAndSkip.test.tsx index 3c7675ec21c..6f0145a9ef3 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/FillWellAndSkip.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/FillWellAndSkip.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach } from 'vitest' import { screen, waitFor } from '@testing-library/react' @@ -11,6 +10,7 @@ import { CancelRun } from '../CancelRun' import { SelectRecoveryOption } from '../SelectRecoveryOption' import { clickButtonLabeled } from '../../__tests__/util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('../../shared', async () => { @@ -32,28 +32,26 @@ vi.mock('../CancelRun') vi.mock('../SelectRecoveryOption') vi.mock('/app/molecules/Command') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } -const renderFillWell = (props: React.ComponentProps) => { +const renderFillWell = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } -const renderSkipToNextStep = ( - props: React.ComponentProps -) => { +const renderSkipToNextStep = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('FillWellAndSkip', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -118,7 +116,7 @@ describe('FillWellAndSkip', () => { }) describe('FillWell', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -136,7 +134,7 @@ describe('FillWell', () => { }) describe('SkipToNextStep', () => { - let props: React.ComponentProps + let props: ComponentProps let mockhandleMotionRouting: Mock let mockGoBackPrevStep: Mock let mockProceedToRouteAndStep: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/HomeAndRetry.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/HomeAndRetry.test.tsx index 3286041b7fb..aae543bc559 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/HomeAndRetry.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/HomeAndRetry.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' @@ -10,17 +9,19 @@ import { SelectRecoveryOption } from '../SelectRecoveryOption' import { HomeAndRetry } from '../HomeAndRetry' import { TipSelection } from '../../shared/TipSelection' +import type { ComponentProps } from 'react' + vi.mock('../SelectRecoveryOption') vi.mock('../../shared/TipSelection') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('HomeAndRetry', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { ...mockRecoveryContentProps, diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/IgnoreErrorSkipStep.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/IgnoreErrorSkipStep.test.tsx index 547334f77c4..a1655ae57b2 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/IgnoreErrorSkipStep.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/IgnoreErrorSkipStep.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach } from 'vitest' import { screen, fireEvent, waitFor } from '@testing-library/react' @@ -15,6 +14,7 @@ import { SelectRecoveryOption } from '../SelectRecoveryOption' import { clickButtonLabeled } from '../../__tests__/util' import { SkipStepInfo } from '/app/organisms/ErrorRecoveryFlows/shared' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('/app/organisms/ErrorRecoveryFlows/shared', async () => { @@ -31,14 +31,14 @@ vi.mock('/app/organisms/ErrorRecoveryFlows/shared', async () => { }) vi.mock('../SelectRecoveryOption') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } const renderIgnoreErrorStepHome = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -46,7 +46,7 @@ const renderIgnoreErrorStepHome = ( } describe('IgnoreErrorSkipStep', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -98,7 +98,7 @@ describe('IgnoreErrorSkipStep', () => { }) describe('IgnoreErrorStepHome', () => { - let props: React.ComponentProps + let props: ComponentProps let mockIgnoreErrorKindThisRun: Mock let mockProceedToRouteAndStep: Mock let mockGoBackPrevStep: Mock @@ -184,7 +184,7 @@ describe('IgnoreErrorStepHome', () => { }) describe('IgnoreOptions', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManageTips.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManageTips.test.tsx index 941b19081c7..b047f7a463b 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManageTips.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManageTips.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach } from 'vitest' import { screen, @@ -18,6 +17,7 @@ import { DT_ROUTES } from '/app/organisms/DropTipWizardFlows/constants' import { SelectRecoveryOption } from '../SelectRecoveryOption' import { clickButtonLabeled } from '../../__tests__/util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' import type { PipetteModelSpecs } from '@opentrons/shared-data' @@ -34,14 +34,14 @@ const MOCK_ACTUAL_PIPETTE = { }, } as PipetteModelSpecs -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ManageTips', () => { - let props: React.ComponentProps + let props: ComponentProps let mockProceedNextStep: Mock let mockProceedToRouteAndStep: Mock let mockhandleMotionRouting: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManualMoveLwAndSkip.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManualMoveLwAndSkip.test.tsx index 48f8615cf81..8cc5285e31a 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManualMoveLwAndSkip.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManualMoveLwAndSkip.test.tsx @@ -6,7 +6,7 @@ import { i18n } from '/app/i18n' import { ManualMoveLwAndSkip } from '../ManualMoveLwAndSkip' import { RECOVERY_MAP } from '../../constants' -import type * as React from 'react' +import type { ComponentProps } from 'react' vi.mock('../../shared', () => ({ GripperIsHoldingLabware: vi.fn(() => ( @@ -23,7 +23,7 @@ vi.mock('../SelectRecoveryOption', () => ({ })) describe('ManualMoveLwAndSkip', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -34,7 +34,7 @@ describe('ManualMoveLwAndSkip', () => { } as any }) - const render = (props: React.ComponentProps) => { + const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManualReplaceLwAndRetry.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManualReplaceLwAndRetry.test.tsx index fb47ccb5f2f..0d25fcda029 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManualReplaceLwAndRetry.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/ManualReplaceLwAndRetry.test.tsx @@ -6,7 +6,7 @@ import { i18n } from '/app/i18n' import { ManualReplaceLwAndRetry } from '../ManualReplaceLwAndRetry' import { RECOVERY_MAP } from '../../constants' -import type * as React from 'react' +import type { ComponentProps } from 'react' vi.mock('../../shared', () => ({ GripperIsHoldingLabware: vi.fn(() => ( @@ -23,7 +23,7 @@ vi.mock('../SelectRecoveryOption', () => ({ })) describe('ManualReplaceLwAndRetry', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -35,9 +35,7 @@ describe('ManualReplaceLwAndRetry', () => { } as any }) - const render = ( - props: React.ComponentProps - ) => { + const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetryNewTips.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetryNewTips.test.tsx index dcee4c10c56..cfd55c45d77 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetryNewTips.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetryNewTips.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest' import { screen, waitFor } from '@testing-library/react' @@ -10,6 +9,7 @@ import { RECOVERY_MAP } from '../../constants' import { SelectRecoveryOption } from '../SelectRecoveryOption' import { clickButtonLabeled } from '../../__tests__/util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('/app/molecules/Command') @@ -23,14 +23,14 @@ vi.mock('../../shared', async () => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } const renderRetryWithNewTips = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -38,7 +38,7 @@ const renderRetryWithNewTips = ( } describe('RetryNewTips', () => { - let props: React.ComponentProps + let props: ComponentProps let mockProceedToRouteAndStep: Mock beforeEach(() => { @@ -121,7 +121,7 @@ describe('RetryNewTips', () => { }) describe('RetryWithNewTips', () => { - let props: React.ComponentProps + let props: ComponentProps let mockhandleMotionRouting: Mock let mockRetryFailedCommand: Mock let mockResumeRun: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetrySameTips.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetrySameTips.test.tsx index 4514c9cc350..7457b50f824 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetrySameTips.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetrySameTips.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest' import { screen, waitFor } from '@testing-library/react' @@ -10,19 +9,20 @@ import { RECOVERY_MAP } from '../../constants' import { SelectRecoveryOption } from '../SelectRecoveryOption' import { clickButtonLabeled } from '../../__tests__/util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('/app/molecules/Command') vi.mock('../SelectRecoveryOption') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } const renderRetrySameTipsInfo = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -30,7 +30,7 @@ const renderRetrySameTipsInfo = ( } describe('RetrySameTips', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -72,7 +72,7 @@ describe('RetrySameTips', () => { }) describe('RetrySameTipsInfo', () => { - let props: React.ComponentProps + let props: ComponentProps let mockhandleMotionRouting: Mock let mockRetryFailedCommand: Mock let mockResumeRun: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetryStep.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetryStep.test.tsx index ec39f5b7c18..f972275c224 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetryStep.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/RetryStep.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' @@ -9,17 +8,19 @@ import { RetryStep } from '../RetryStep' import { RECOVERY_MAP } from '../../constants' import { SelectRecoveryOption } from '../SelectRecoveryOption' +import type { ComponentProps } from 'react' + vi.mock('/app/molecules/Command') vi.mock('../SelectRecoveryOption') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('RetryStep', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SelectRecoveryOptions.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SelectRecoveryOptions.test.tsx index 62fe8eea3c8..caa67196866 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SelectRecoveryOptions.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SelectRecoveryOptions.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import { screen, fireEvent } from '@testing-library/react' import { when } from 'vitest-when' @@ -23,10 +22,11 @@ import { import { RECOVERY_MAP, ERROR_KINDS } from '../../constants' import { clickButtonLabeled } from '../../__tests__/util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' const renderSelectRecoveryOption = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders( , @@ -37,7 +37,7 @@ const renderSelectRecoveryOption = ( } const renderRecoveryOptions = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -45,7 +45,7 @@ const renderRecoveryOptions = ( } describe('SelectRecoveryOption', () => { const { RETRY_STEP, RETRY_NEW_TIPS } = RECOVERY_MAP - let props: React.ComponentProps + let props: ComponentProps let mockProceedToRouteAndStep: Mock let mockSetSelectedRecoveryOption: Mock let mockGetRecoveryOptionCopy: Mock @@ -253,7 +253,7 @@ describe('SelectRecoveryOption', () => { }) }) describe('RecoveryOptions', () => { - let props: React.ComponentProps + let props: ComponentProps let mockSetSelectedRoute: Mock let mockGetRecoveryOptionCopy: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SkipStepNewTips.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SkipStepNewTips.test.tsx index 09afa086dca..a492184cbc7 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SkipStepNewTips.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SkipStepNewTips.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -9,6 +8,7 @@ import { SkipStepNewTips } from '../SkipStepNewTips' import { RECOVERY_MAP } from '../../constants' import { SelectRecoveryOption } from '../SelectRecoveryOption' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('/app/molecules/Command') @@ -23,14 +23,14 @@ vi.mock('../../shared', async () => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('SkipStepNewTips', () => { - let props: React.ComponentProps + let props: ComponentProps let mockProceedToRouteAndStep: Mock beforeEach(() => { diff --git a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SkipStepSameTips.test.tsx b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SkipStepSameTips.test.tsx index 157825b3322..eb716694d68 100644 --- a/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SkipStepSameTips.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/RecoveryOptions/__tests__/SkipStepSameTips.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -10,18 +9,20 @@ import { RECOVERY_MAP } from '../../constants' import { SelectRecoveryOption } from '../SelectRecoveryOption' import { SkipStepInfo } from '/app/organisms/ErrorRecoveryFlows/shared' +import type { ComponentProps } from 'react' + vi.mock('/app/molecules/Command') vi.mock('/app/organisms/ErrorRecoveryFlows/shared') vi.mock('../SelectRecoveryOption') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('SkipStepSameTips', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryFlows.test.tsx b/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryFlows.test.tsx index 2e425b73495..53bc8c15a8b 100644 --- a/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryFlows.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryFlows.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, expect, it, beforeEach } from 'vitest' import { screen, renderHook } from '@testing-library/react' @@ -24,6 +23,7 @@ import { useERWizard, ErrorRecoveryWizard } from '../ErrorRecoveryWizard' import { useRecoverySplash, RecoverySplash } from '../RecoverySplash' import { useRunLoadedLabwareDefinitionsByUri } from '/app/resources/runs' +import type { ComponentProps } from 'react' import type { RunStatus } from '@opentrons/api-client' vi.mock('../ErrorRecoveryWizard') @@ -128,14 +128,14 @@ describe('useErrorRecoveryFlows', () => { }) }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ErrorRecoveryFlows', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryWizard.test.tsx b/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryWizard.test.tsx index d97072e45f3..1f358fc574c 100644 --- a/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryWizard.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryWizard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import { renderHook, act, screen } from '@testing-library/react' @@ -35,6 +34,8 @@ import { RecoveryDoorOpenSpecial, } from '../shared' +import type { ComponentProps } from 'react' + vi.mock('../RecoveryOptions') vi.mock('../RecoveryInProgress') vi.mock('../RecoveryError') @@ -96,7 +97,7 @@ describe('useERWizard', () => { }) const renderRecoveryComponent = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -104,7 +105,7 @@ const renderRecoveryComponent = ( } describe('ErrorRecoveryComponent', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = mockRecoveryContentProps @@ -158,7 +159,7 @@ describe('ErrorRecoveryComponent', () => { }) const renderRecoveryContent = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -192,7 +193,7 @@ describe('ErrorRecoveryContent', () => { HOME_AND_RETRY, } = RECOVERY_MAP - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = mockRecoveryContentProps diff --git a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryDoorOpen.test.tsx b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryDoorOpen.test.tsx index a9fc92e1b84..57b0eff70a9 100644 --- a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryDoorOpen.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryDoorOpen.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, vi, expect } from 'vitest' import { screen } from '@testing-library/react' @@ -10,16 +9,17 @@ import { i18n } from '/app/i18n' import { RecoveryDoorOpen } from '../RecoveryDoorOpen' import { clickButtonLabeled } from './util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('RecoveryDoorOpen', () => { - let props: React.ComponentProps + let props: ComponentProps let mockResumeRecovery: Mock let mockProceedToRouteAndStep: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryError.test.tsx b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryError.test.tsx index f46f3f949ba..9d19b32d788 100644 --- a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryError.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryError.test.tsx @@ -1,5 +1,4 @@ /* eslint-disable testing-library/prefer-presence-queries */ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach } from 'vitest' import { screen, fireEvent, waitFor } from '@testing-library/react' @@ -9,9 +8,10 @@ import { i18n } from '/app/i18n' import { RecoveryError } from '../RecoveryError' import { RECOVERY_MAP } from '../constants' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -20,7 +20,7 @@ const render = (props: React.ComponentProps) => { const { ERROR_WHILE_RECOVERING } = RECOVERY_MAP describe('RecoveryError', () => { - let props: React.ComponentProps + let props: ComponentProps let proceedToRouteAndStepMock: Mock let getRecoverOptionCopyMock: Mock let handleMotionRoutingMock: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryInProgress.test.tsx b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryInProgress.test.tsx index 2dfa5711644..b9c6149a696 100644 --- a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryInProgress.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryInProgress.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { beforeEach, describe, it, vi, afterEach, expect } from 'vitest' import { act, renderHook, screen } from '@testing-library/react' @@ -12,7 +11,9 @@ import { } from '../RecoveryInProgress' import { RECOVERY_MAP } from '../constants' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -28,7 +29,7 @@ describe('RecoveryInProgress', () => { ROBOT_SKIPPING_STEP, ROBOT_RELEASING_LABWARE, } = RECOVERY_MAP - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoverySplash.test.tsx b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoverySplash.test.tsx index 901ab22e158..17b7f9fd24d 100644 --- a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoverySplash.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoverySplash.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { fireEvent, screen, waitFor, renderHook } from '@testing-library/react' @@ -21,6 +20,7 @@ import { StepInfo } from '../shared' import { useToaster } from '../../ToasterOven' import { clickButtonLabeled } from './util' +import type { ComponentProps, FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' vi.mock('/app/redux/config') @@ -30,7 +30,7 @@ vi.mock('../../ToasterOven') const store: Store = createStore(vi.fn(), {}) describe('useRunPausedSplash', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { vi.mocked(getIsOnDevice).mockReturnValue(true) const queryClient = new QueryClient() @@ -65,7 +65,7 @@ describe('useRunPausedSplash', () => { }) }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -77,7 +77,7 @@ const render = (props: React.ComponentProps) => { } describe('RecoverySplash', () => { - let props: React.ComponentProps + let props: ComponentProps const mockToggleERWiz = vi.fn(() => Promise.resolve()) const mockProceedToRouteAndStep = vi.fn() const mockHandleMotionRouting = vi.fn(() => Promise.resolve()) diff --git a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryTakeover.test.tsx b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryTakeover.test.tsx index 1eec7782713..6a71c84ba3c 100644 --- a/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryTakeover.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/__tests__/RecoveryTakeover.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -14,18 +13,19 @@ import { RecoveryTakeover, RecoveryTakeoverDesktop } from '../RecoveryTakeover' import { useUpdateClientDataRecovery } from '/app/resources/client_data' import { clickButtonLabeled } from './util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('/app/resources/client_data') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('RecoveryTakeover', () => { - let props: React.ComponentProps + let props: ComponentProps let mockClearClientData: Mock beforeEach(() => { @@ -91,7 +91,7 @@ describe('RecoveryTakeover', () => { }) describe('RecoveryTakeoverDesktop', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useRecoveryOptionCopy.test.tsx b/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useRecoveryOptionCopy.test.tsx index 11e8a574246..0ec262c3f41 100644 --- a/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useRecoveryOptionCopy.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useRecoveryOptionCopy.test.tsx @@ -1,5 +1,3 @@ -import type * as React from 'react' - import { describe, it } from 'vitest' import { screen } from '@testing-library/react' @@ -10,6 +8,8 @@ import type { ErrorKind, RecoveryRoute } from '../../types' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' +import type { ComponentProps } from 'react' + function MockRenderCmpt({ route, errorKind, @@ -26,7 +26,7 @@ function MockRenderCmpt({ ) } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useRecoveryToasts.test.tsx b/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useRecoveryToasts.test.tsx index 085551f42e7..1ce852e86aa 100644 --- a/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useRecoveryToasts.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useRecoveryToasts.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import { I18nextProvider } from 'react-i18next' import { i18n } from '/app/i18n' @@ -16,6 +15,7 @@ import { RECOVERY_MAP } from '../../constants' import { useToaster } from '../../../ToasterOven' import { useCommandTextString } from '/app/local-resources/commands' +import type { ReactElement } from 'react' import type { Mock } from 'vitest' import type { BuildToast } from '../useRecoveryToasts' @@ -42,7 +42,7 @@ const DEFAULT_PROPS: BuildToast = { } // Utility function for rendering with I18nextProvider -const renderWithI18n = (component: React.ReactElement) => { +const renderWithI18n = (component: ReactElement) => { return render({component}) } diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/LeftColumnLabwareInfo.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/LeftColumnLabwareInfo.tsx index 87cdac57255..c6fa3623cf4 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/LeftColumnLabwareInfo.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/LeftColumnLabwareInfo.tsx @@ -1,11 +1,11 @@ import { InterventionContent } from '/app/molecules/InterventionModal/InterventionContent' -import type * as React from 'react' +import type { ComponentProps } from 'react' import type { RecoveryContentProps } from '../types' type LeftColumnLabwareInfoProps = RecoveryContentProps & { title: string - type: React.ComponentProps['infoProps']['type'] + type: ComponentProps['infoProps']['type'] /* Renders a warning InlineNotification if provided. */ bannerText?: string } @@ -24,7 +24,7 @@ export function LeftColumnLabwareInfo({ } = failedLabwareUtils const { displayNameNewLoc, displayNameCurrentLoc } = failedLabwareLocations - const buildNewLocation = (): React.ComponentProps< + const buildNewLocation = (): ComponentProps< typeof InterventionContent >['infoProps']['newLocationProps'] => displayNameNewLoc != null diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryContentWrapper.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryContentWrapper.tsx index 9274079897f..d7c2abd900f 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryContentWrapper.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryContentWrapper.tsx @@ -1,7 +1,6 @@ // TODO: replace this by making these props true of interventionmodal content wrappers // once error recovery uses interventionmodal consistently -import type * as React from 'react' import { css } from 'styled-components' import { DIRECTION_COLUMN, @@ -18,19 +17,21 @@ import { } from '/app/molecules/InterventionModal' import { RecoveryFooterButtons } from './RecoveryFooterButtons' +import type { ComponentProps, ReactNode } from 'react' + interface SingleColumnContentWrapperProps { - children: React.ReactNode - footerDetails?: React.ComponentProps + children: ReactNode + footerDetails?: ComponentProps } interface TwoColumnContentWrapperProps { - children: [React.ReactNode, React.ReactNode] - footerDetails?: React.ComponentProps + children: [ReactNode, ReactNode] + footerDetails?: ComponentProps } interface OneOrTwoColumnContentWrapperProps { - children: [React.ReactNode, React.ReactNode] - footerDetails?: React.ComponentProps + children: [ReactNode, ReactNode] + footerDetails?: ComponentProps } // For flex-direction: column recovery content with one column only. export function RecoverySingleColumnContentWrapper({ diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryInterventionModal.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryInterventionModal.tsx index 82974023805..73ac8497deb 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryInterventionModal.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryInterventionModal.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { createPortal } from 'react-dom' import { css } from 'styled-components' @@ -13,11 +12,12 @@ import { import { InterventionModal } from '/app/molecules/InterventionModal' import { getModalPortalEl, getTopPortalEl } from '/app/App/portal' +import type { ComponentProps } from 'react' import type { ModalType } from '/app/molecules/InterventionModal' import type { DesktopSizeType } from '../types' export type RecoveryInterventionModalProps = Omit< - React.ComponentProps, + ComponentProps, 'type' > & { /* If on desktop, specifies the hard-coded dimensions height of the modal. */ diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/StepInfo.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/StepInfo.tsx index bbc12ce0429..ba68ee88507 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/StepInfo.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/StepInfo.tsx @@ -1,11 +1,10 @@ -import type * as React from 'react' - import { useTranslation } from 'react-i18next' import { Flex, DISPLAY_INLINE, StyledText } from '@opentrons/components' import { CommandText } from '/app/molecules/Command' +import type { ComponentProps } from 'react' import type { StyleProps } from '@opentrons/components' import type { RecoveryContentProps } from '../types' @@ -15,8 +14,8 @@ interface StepInfoProps extends StyleProps { robotType: RecoveryContentProps['robotType'] protocolAnalysis: RecoveryContentProps['protocolAnalysis'] allRunDefs: RecoveryContentProps['allRunDefs'] - desktopStyle?: React.ComponentProps['desktopStyle'] - oddStyle?: React.ComponentProps['oddStyle'] + desktopStyle?: ComponentProps['desktopStyle'] + oddStyle?: ComponentProps['oddStyle'] } export function StepInfo({ diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/TwoColLwInfoAndDeck.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/TwoColLwInfoAndDeck.tsx index 9bf8f12bc22..ad7ac489d7c 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/TwoColLwInfoAndDeck.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/TwoColLwInfoAndDeck.tsx @@ -1,9 +1,9 @@ import { - Flex, - MoveLabwareOnDeck, COLORS, - Module, + Flex, LabwareRender, + Module, + MoveLabwareOnDeck, } from '@opentrons/components' import { inferModuleOrientationFromXCoordinate } from '@opentrons/shared-data' @@ -14,7 +14,7 @@ import { RecoveryFooterButtons } from './RecoveryFooterButtons' import { LeftColumnLabwareInfo } from './LeftColumnLabwareInfo' import { RECOVERY_MAP } from '../constants' -import type * as React from 'react' +import type { ComponentProps } from 'react' import type { RecoveryContentProps } from '../types' import type { InterventionContent } from '/app/molecules/InterventionModal/InterventionContent' @@ -100,7 +100,7 @@ export function TwoColLwInfoAndDeck( } } - const buildType = (): React.ComponentProps< + const buildType = (): ComponentProps< typeof InterventionContent >['infoProps']['type'] => { switch (selectedRecoveryOption) { diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/ErrorDetailsModal.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/ErrorDetailsModal.test.tsx index ce754df9cfa..da76c3e09d9 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/ErrorDetailsModal.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/ErrorDetailsModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, expect, vi } from 'vitest' import { screen, act, renderHook } from '@testing-library/react' @@ -17,6 +16,8 @@ import { StallErrorBanner, } from '../ErrorDetailsModal' +import type { ComponentProps } from 'react' + vi.mock('react-dom', () => ({ ...vi.importActual('react-dom'), createPortal: vi.fn((element, container) => element), @@ -47,14 +48,14 @@ describe('useErrorDetailsModal', () => { }) }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ErrorDetailsModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx index 95af112fa58..adedca04009 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx @@ -10,13 +10,12 @@ import { GripperIsHoldingLabware, HOLDING_LABWARE_OPTIONS, } from '../GripperIsHoldingLabware' +import { RECOVERY_MAP } from '/app/organisms/ErrorRecoveryFlows/constants' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' -import { RECOVERY_MAP } from '/app/organisms/ErrorRecoveryFlows/constants' -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -26,7 +25,7 @@ let mockProceedToRouteAndStep: Mock let mockProceedNextStep: Mock describe('GripperIsHoldingLabware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { mockProceedToRouteAndStep = vi.fn(() => Promise.resolve()) mockProceedNextStep = vi.fn(() => Promise.resolve()) diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperReleaseLabware.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperReleaseLabware.test.tsx index 3bdd9f97819..91fdc3d6a9e 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperReleaseLabware.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperReleaseLabware.test.tsx @@ -7,20 +7,21 @@ import { i18n } from '/app/i18n' import { mockRecoveryContentProps } from '/app/organisms/ErrorRecoveryFlows/__fixtures__' import { clickButtonLabeled } from '/app/organisms/ErrorRecoveryFlows/__tests__/util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('/app/assets/videos/error-recovery/Gripper_Release.webm', () => ({ default: 'mocked-animation-path.webm', })) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('GripperReleaseLabware', () => { - let props: React.ComponentProps + let props: ComponentProps let mockHandleMotionRouting: Mock beforeEach(() => { diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/LeftColumnLabwareInfo.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/LeftColumnLabwareInfo.test.tsx index f38e1e06922..c8ab8bc4ad6 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/LeftColumnLabwareInfo.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/LeftColumnLabwareInfo.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, expect, vi } from 'vitest' import { screen } from '@testing-library/react' @@ -8,16 +7,18 @@ import { i18n } from '/app/i18n' import { LeftColumnLabwareInfo } from '../LeftColumnLabwareInfo' import { InterventionContent } from '/app/molecules/InterventionModal/InterventionContent' +import type { ComponentProps } from 'react' + vi.mock('/app/molecules/InterventionModal/InterventionContent') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('LeftColumnLabwareInfo', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RecoveryDoorOpenSpecial.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RecoveryDoorOpenSpecial.test.tsx index 5cc4ae74b87..b54ccc649d7 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RecoveryDoorOpenSpecial.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RecoveryDoorOpenSpecial.test.tsx @@ -11,11 +11,11 @@ import { i18n } from '/app/i18n' import { RecoveryDoorOpenSpecial } from '../RecoveryDoorOpenSpecial' import { RECOVERY_MAP } from '../../constants' -import type * as React from 'react' +import type { ComponentProps } from 'react' import { clickButtonLabeled } from '/app/organisms/ErrorRecoveryFlows/__tests__/util' describe('RecoveryDoorOpenSpecial', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { @@ -39,9 +39,7 @@ describe('RecoveryDoorOpenSpecial', () => { } as any }) - const render = ( - props: React.ComponentProps - ) => { + const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RecoveryFooterButtons.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RecoveryFooterButtons.test.tsx index 6381d2b579a..6643dcf8021 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RecoveryFooterButtons.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RecoveryFooterButtons.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import { screen, fireEvent } from '@testing-library/react' @@ -8,16 +7,17 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { RecoveryFooterButtons } from '../RecoveryFooterButtons' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('RecoveryFooterButtons', () => { - let props: React.ComponentProps + let props: ComponentProps let mockPrimaryBtnOnClick: Mock let mockSecondaryBtnOnClick: Mock let mockTertiaryBtnOnClick: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RetryStepInfo.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RetryStepInfo.test.tsx index 94f77910657..810cf1c00f1 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RetryStepInfo.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/RetryStepInfo.test.tsx @@ -7,10 +7,11 @@ import { RetryStepInfo } from '../RetryStepInfo' import { ERROR_KINDS, RECOVERY_MAP } from '../../constants' import { clickButtonLabeled } from '/app/organisms/ErrorRecoveryFlows/__tests__/util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' describe('RetryStepInfo', () => { - let props: React.ComponentProps + let props: ComponentProps let mockHandleMotionRouting: Mock let mockRetryFailedCommand: Mock let mockResumeRun: Mock @@ -33,7 +34,7 @@ describe('RetryStepInfo', () => { } as any }) - const render = (props: React.ComponentProps) => { + const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/SelectTips.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/SelectTips.test.tsx index 08db6269c4d..425bf68b264 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/SelectTips.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/SelectTips.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach } from 'vitest' import { screen, fireEvent, waitFor } from '@testing-library/react' @@ -9,19 +8,20 @@ import { SelectTips } from '../SelectTips' import { RECOVERY_MAP } from '../../constants' import { TipSelectionModal } from '../TipSelectionModal' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('../TipSelectionModal') vi.mock('../TipSelection') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('SelectTips', () => { - let props: React.ComponentProps + let props: ComponentProps let mockGoBackPrevStep: Mock let mockhandleMotionRouting: Mock let mockProceedNextStep: Mock diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/SkipStepInfo.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/SkipStepInfo.test.tsx index 28ef4177648..0bd7b1a5a72 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/SkipStepInfo.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/SkipStepInfo.test.tsx @@ -7,10 +7,11 @@ import { SkipStepInfo } from '../SkipStepInfo' import { RECOVERY_MAP } from '../../constants' import { clickButtonLabeled } from '/app/organisms/ErrorRecoveryFlows/__tests__/util' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' describe('SkipStepInfo', () => { - let props: React.ComponentProps + let props: ComponentProps let mockHandleMotionRouting: Mock let mockSkipFailedCommand: Mock @@ -32,7 +33,7 @@ describe('SkipStepInfo', () => { } as any }) - const render = (props: React.ComponentProps) => { + const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/StepInfo.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/StepInfo.test.tsx index d6fbb50c345..aefd143aee1 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/StepInfo.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/StepInfo.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, beforeEach, vi } from 'vitest' import { screen } from '@testing-library/react' @@ -8,16 +7,18 @@ import { i18n } from '/app/i18n' import { StepInfo } from '../StepInfo' import { CommandText } from '/app/molecules/Command' +import type { ComponentProps } from 'react' + vi.mock('/app/molecules/Command') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('StepInfo', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelection.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelection.test.tsx index 9df7f8e02ec..c6bee4f8d55 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelection.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelection.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -8,16 +7,18 @@ import { i18n } from '/app/i18n' import { TipSelection } from '../TipSelection' import { WellSelection } from '../../../WellSelection' +import type { ComponentProps } from 'react' + vi.mock('../../../WellSelection') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('TipSelection', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { ...mockRecoveryContentProps, diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelectionModal.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelectionModal.test.tsx index fed5a44d4ce..32711ec9762 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelectionModal.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelectionModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { screen } from '@testing-library/react' @@ -8,16 +7,18 @@ import { i18n } from '/app/i18n' import { TipSelectionModal } from '../TipSelectionModal' import { TipSelection } from '../TipSelection' +import type { ComponentProps } from 'react' + vi.mock('../TipSelection') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('TipSelectionModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TwoColLwInfoAndDeck.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TwoColLwInfoAndDeck.test.tsx index 0629038f800..e151cb11d7a 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TwoColLwInfoAndDeck.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TwoColLwInfoAndDeck.test.tsx @@ -11,7 +11,7 @@ import { RECOVERY_MAP } from '../../constants' import { LeftColumnLabwareInfo } from '../LeftColumnLabwareInfo' import { getSlotNameAndLwLocFrom } from '../../hooks/useDeckMapUtils' -import type * as React from 'react' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('@opentrons/components', async () => { @@ -26,14 +26,14 @@ vi.mock('../../hooks/useDeckMapUtils') let mockProceedNextStep: Mock -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('TwoColLwInfoAndDeck', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { mockProceedNextStep = vi.fn() diff --git a/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx index bb205f3f852..16aa35ec87d 100644 --- a/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { act, screen, waitFor } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -10,6 +9,8 @@ import { } from '@opentrons/react-api-client' import { i18n } from '/app/i18n' import { FirmwareUpdateModal } from '..' + +import type { ComponentProps } from 'react' import type { BadPipette, PipetteData, @@ -18,14 +19,14 @@ import type { vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('FirmwareUpdateModal', () => { - let props: React.ComponentProps + let props: ComponentProps const refetch = vi.fn(() => Promise.resolve()) const updateSubsystem = vi.fn(() => Promise.resolve()) beforeEach(() => { diff --git a/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateInProgressModal.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateInProgressModal.test.tsx index f2ce6047481..2e237468b3d 100644 --- a/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateInProgressModal.test.tsx +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateInProgressModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen } from '@testing-library/react' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { UpdateInProgressModal } from '../UpdateInProgressModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('UpdateInProgressModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { subsystem: 'pipette_right', diff --git a/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateNeededModal.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateNeededModal.test.tsx index 53c91223b47..eb8e1cdcc5b 100644 --- a/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateNeededModal.test.tsx +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateNeededModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -12,6 +11,7 @@ import { UpdateNeededModal } from '../UpdateNeededModal' import { UpdateInProgressModal } from '../UpdateInProgressModal' import { UpdateResultsModal } from '../UpdateResultsModal' +import type { ComponentProps } from 'react' import type { BadPipette, SubsystemUpdateProgressData, @@ -21,14 +21,14 @@ vi.mock('@opentrons/react-api-client') vi.mock('../UpdateInProgressModal') vi.mock('../UpdateResultsModal') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('UpdateNeededModal', () => { - let props: React.ComponentProps + let props: ComponentProps const refetch = vi.fn(() => Promise.resolve()) const updateSubsystem = vi.fn(() => Promise.resolve({ diff --git a/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateResultsModal.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateResultsModal.test.tsx index 29c5233db45..5c4f3f02473 100644 --- a/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateResultsModal.test.tsx +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateResultsModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { UpdateResultsModal } from '../UpdateResultsModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('UpdateResultsModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { isSuccess: true, diff --git a/app/src/organisms/GripperWizardFlows/MovePin.tsx b/app/src/organisms/GripperWizardFlows/MovePin.tsx index 1cf5153eaa5..b4cb6ebcf25 100644 --- a/app/src/organisms/GripperWizardFlows/MovePin.tsx +++ b/app/src/organisms/GripperWizardFlows/MovePin.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation, Trans } from 'react-i18next' import { EXTENSION } from '@opentrons/shared-data' import { @@ -25,6 +24,7 @@ import movePinRearToStorage from '/app/assets/videos/gripper-wizards/PIN_FROM_RE import calibratingFrontJaw from '/app/assets/videos/gripper-wizards/CALIBRATING_FRONT_JAW.webm' import calibratingRearJaw from '/app/assets/videos/gripper-wizards/CALIBRATING_REAR_JAW.webm' +import type { ReactNode } from 'react' import type { Coordinates } from '@opentrons/shared-data' import type { CreateMaintenanceCommand } from '/app/resources/runs' import type { GripperWizardStepProps, MovePinStep } from './types' @@ -137,10 +137,10 @@ export const MovePin = (props: MovePinProps): JSX.Element | null => { [m in typeof movement]: { inProgressText: string header: string - body: React.ReactNode + body: ReactNode buttonText: string - prepImage: React.ReactNode - inProgressImage?: React.ReactNode + prepImage: ReactNode + inProgressImage?: ReactNode } } = { [MOVE_PIN_TO_FRONT_JAW]: { diff --git a/app/src/organisms/GripperWizardFlows/__tests__/BeforeBeginning.test.tsx b/app/src/organisms/GripperWizardFlows/__tests__/BeforeBeginning.test.tsx index 888e6ba30b2..da3b45eec62 100644 --- a/app/src/organisms/GripperWizardFlows/__tests__/BeforeBeginning.test.tsx +++ b/app/src/organisms/GripperWizardFlows/__tests__/BeforeBeginning.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen, waitFor } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -8,15 +7,17 @@ import { RUN_ID_1 } from '/app/resources/runs/__fixtures__' import { BeforeBeginning } from '../BeforeBeginning' import { GRIPPER_FLOW_TYPES } from '../constants' +import type { ComponentProps } from 'react' + vi.mock('/app/molecules/InProgressModal/InProgressModal') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('BeforeBeginning', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { goBack: vi.fn(), diff --git a/app/src/organisms/GripperWizardFlows/__tests__/ExitConfirmation.test.tsx b/app/src/organisms/GripperWizardFlows/__tests__/ExitConfirmation.test.tsx index 4b20f234bfb..871a58d1ba9 100644 --- a/app/src/organisms/GripperWizardFlows/__tests__/ExitConfirmation.test.tsx +++ b/app/src/organisms/GripperWizardFlows/__tests__/ExitConfirmation.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -7,12 +6,14 @@ import { i18n } from '/app/i18n' import { ExitConfirmation } from '../ExitConfirmation' import { GRIPPER_FLOW_TYPES } from '../constants' +import type { ComponentProps } from 'react' + describe('ExitConfirmation', () => { const mockBack = vi.fn() const mockExit = vi.fn() const render = ( - props: Partial> = {} + props: Partial> = {} ) => { return renderWithProviders( { let mockChainRunCommands: any let mockSetErrorMessage: any - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { return renderWithProviders( { @@ -25,9 +26,7 @@ describe('MovePin', () => { const mockSetFrontJawOffset = vi.fn() const mockRunId = 'fakeRunId' - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { return renderWithProviders( { const mockProceed = vi.fn() - const render = ( - props: Partial> = {} - ) => { + const render = (props: Partial> = {}) => { return renderWithProviders( { let mockChainRunCommands: any let mockSetErrorMessage: any const render = ( - props: Partial> = {} + props: Partial> = {} ) => { return renderWithProviders( { when(useIsFlex).calledWith('otie').thenReturn(isFlex) - return ( - props: React.ComponentProps - ) => { + return (props: ComponentProps) => { return renderWithProviders( , { @@ -26,7 +25,7 @@ const getRenderer = (isFlex: boolean) => { } describe('IncompatibleModuleDesktopModalBody', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { modules: [], diff --git a/app/src/organisms/IncompatibleModule/__tests__/IncompatibleModuleODDModalBody.test.tsx b/app/src/organisms/IncompatibleModule/__tests__/IncompatibleModuleODDModalBody.test.tsx index e2d4e1a2af0..9c59e9a821a 100644 --- a/app/src/organisms/IncompatibleModule/__tests__/IncompatibleModuleODDModalBody.test.tsx +++ b/app/src/organisms/IncompatibleModule/__tests__/IncompatibleModuleODDModalBody.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -7,8 +6,10 @@ import { i18n } from '/app/i18n' import { IncompatibleModuleODDModalBody } from '../IncompatibleModuleODDModalBody' import * as Fixtures from '../__fixtures__' +import type { ComponentProps } from 'react' + const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -16,7 +17,7 @@ const render = ( } describe('IncompatibleModuleODDModalBody', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { modules: [], diff --git a/app/src/organisms/IncompatibleModule/__tests__/IncompatibleModuleTakeover.test.tsx b/app/src/organisms/IncompatibleModule/__tests__/IncompatibleModuleTakeover.test.tsx index d3da5d17958..24e35265621 100644 --- a/app/src/organisms/IncompatibleModule/__tests__/IncompatibleModuleTakeover.test.tsx +++ b/app/src/organisms/IncompatibleModule/__tests__/IncompatibleModuleTakeover.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach, afterEach, expect, vi } from 'vitest' import { when } from 'vitest-when' @@ -18,6 +17,8 @@ import { } from '/app/App/portal' import * as Fixtures from '../__fixtures__' +import type { ComponentProps } from 'react' + vi.mock('../hooks') vi.mock('../IncompatibleModuleODDModalBody') vi.mock('../IncompatibleModuleDesktopModalBody') @@ -32,7 +33,7 @@ const getRenderer = (incompatibleModules: AttachedModule[]) => { vi.mocked(IncompatibleModuleDesktopModalBody).mockReturnValue(
        TEST ELEMENT DESKTOP
        ) - return (props: React.ComponentProps) => { + return (props: ComponentProps) => { const [rendered] = renderWithProviders( <> @@ -55,7 +56,7 @@ const getRenderer = (incompatibleModules: AttachedModule[]) => { } describe('IncompatibleModuleTakeover', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { isOnDevice: true } }) diff --git a/app/src/organisms/IncompatibleModule/hooks/__tests__/useIncompatibleModulesAttached.test.tsx b/app/src/organisms/IncompatibleModule/hooks/__tests__/useIncompatibleModulesAttached.test.tsx index 7e1a7342db1..c58d75c7b6d 100644 --- a/app/src/organisms/IncompatibleModule/hooks/__tests__/useIncompatibleModulesAttached.test.tsx +++ b/app/src/organisms/IncompatibleModule/hooks/__tests__/useIncompatibleModulesAttached.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { QueryClient, QueryClientProvider } from 'react-query' import { vi, it, expect, describe, beforeEach } from 'vitest' @@ -8,16 +7,17 @@ import { useIncompatibleModulesAttached } from '..' import * as Fixtures from '../__fixtures__' +import type { FunctionComponent, ReactNode } from 'react' import type { Modules } from '@opentrons/api-client' import type { UseQueryResult } from 'react-query' vi.mock('@opentrons/react-api-client') describe('useIncompatibleModulesAttached', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { const queryClient = new QueryClient() - const clientProvider: React.FunctionComponent<{ - children: React.ReactNode + const clientProvider: FunctionComponent<{ + children: ReactNode }> = ({ children }) => ( {children} ) diff --git a/app/src/organisms/InterventionModal/MoveLabwareInterventionContent.tsx b/app/src/organisms/InterventionModal/MoveLabwareInterventionContent.tsx index af561b6c15d..556c051d32d 100644 --- a/app/src/organisms/InterventionModal/MoveLabwareInterventionContent.tsx +++ b/app/src/organisms/InterventionModal/MoveLabwareInterventionContent.tsx @@ -191,7 +191,6 @@ export function MoveLabwareInterventionContent({ -) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('InterventionCommandMessage', () => { - let props: React.ComponentProps + let props: ComponentProps it('truncates command text greater than 220 characters long', () => { props = { commandMessage: longCommandMessage } diff --git a/app/src/organisms/InterventionModal/__tests__/InterventionCommandMessage.test.tsx b/app/src/organisms/InterventionModal/__tests__/InterventionCommandMessage.test.tsx index 6f3a688b808..a09994c929d 100644 --- a/app/src/organisms/InterventionModal/__tests__/InterventionCommandMessage.test.tsx +++ b/app/src/organisms/InterventionModal/__tests__/InterventionCommandMessage.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -10,16 +9,16 @@ import { truncatedCommandMessage, } from '../__fixtures__' -const render = ( - props: React.ComponentProps -) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('InterventionCommandMessage', () => { - let props: React.ComponentProps + let props: ComponentProps it('truncates command text greater than 220 characters long', () => { props = { commandMessage: longCommandMessage } diff --git a/app/src/organisms/InterventionModal/__tests__/InterventionModal.test.tsx b/app/src/organisms/InterventionModal/__tests__/InterventionModal.test.tsx index 59b8c659a1a..bb4799e1754 100644 --- a/app/src/organisms/InterventionModal/__tests__/InterventionModal.test.tsx +++ b/app/src/organisms/InterventionModal/__tests__/InterventionModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, renderHook, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -18,6 +17,7 @@ import { import { InterventionModal, useInterventionModal } from '..' import { useIsFlex } from '/app/redux-resources/robots' +import type { ComponentProps } from 'react' import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' import type { RunData } from '@opentrons/api-client' @@ -90,14 +90,14 @@ describe('useInterventionModal', () => { }) }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('InterventionModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robotName: ROBOT_NAME, diff --git a/app/src/organisms/LegacyApplyHistoricOffsets/__tests__/ApplyHistoricOffsets.test.tsx b/app/src/organisms/LegacyApplyHistoricOffsets/__tests__/ApplyHistoricOffsets.test.tsx index db70b1c096d..fb39565b161 100644 --- a/app/src/organisms/LegacyApplyHistoricOffsets/__tests__/ApplyHistoricOffsets.test.tsx +++ b/app/src/organisms/LegacyApplyHistoricOffsets/__tests__/ApplyHistoricOffsets.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi } from 'vitest' @@ -10,6 +9,7 @@ import { getIsLabwareOffsetCodeSnippetsOn } from '/app/redux/config' import { getLabwareDefinitionsFromCommands } from '/app/local-resources/labware' import { LegacyApplyHistoricOffsets } from '..' +import type { ComponentProps } from 'react' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { OffsetCandidate } from '../hooks/useOffsetCandidatesForAnalysis' @@ -64,11 +64,9 @@ const mockFourthCandidate: OffsetCandidate = { describe('ApplyHistoricOffsets', () => { const mockSetShouldApplyOffsets = vi.fn() const render = ( - props?: Partial> + props?: Partial> ) => - renderWithProviders< - React.ComponentProps - >( + renderWithProviders>( - renderWithProviders>( + renderWithProviders>( { ) it('returns historical run details with newest first', async () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) =>
        {children}
        const { result } = renderHook(useHistoricRunDetails, { wrapper }) @@ -57,7 +57,7 @@ describe('useHistoricRunDetails', () => { links: {}, }) ) - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) =>
        {children}
        const { result } = renderHook( diff --git a/app/src/organisms/LegacyApplyHistoricOffsets/hooks/__tests__/useOffsetCandidatesForAnalysis.test.tsx b/app/src/organisms/LegacyApplyHistoricOffsets/hooks/__tests__/useOffsetCandidatesForAnalysis.test.tsx index 832417cb9af..b4581abe15e 100644 --- a/app/src/organisms/LegacyApplyHistoricOffsets/hooks/__tests__/useOffsetCandidatesForAnalysis.test.tsx +++ b/app/src/organisms/LegacyApplyHistoricOffsets/hooks/__tests__/useOffsetCandidatesForAnalysis.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import { when } from 'vitest-when' import { renderHook, waitFor } from '@testing-library/react' @@ -13,6 +12,7 @@ import { getLabwareLocationCombos } from '../getLabwareLocationCombos' import { useOffsetCandidatesForAnalysis } from '../useOffsetCandidatesForAnalysis' import { storedProtocolData as storedProtocolDataFixture } from '/app/redux/protocol-storage/__fixtures__' +import type { FunctionComponent, ReactNode } from 'react' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { OffsetCandidate } from '../useOffsetCandidatesForAnalysis' @@ -102,7 +102,7 @@ describe('useOffsetCandidatesForAnalysis', () => { }) it('returns an empty array if robot ip but no analysis output', async () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) =>
        {children}
        const { result } = renderHook( @@ -115,7 +115,7 @@ describe('useOffsetCandidatesForAnalysis', () => { }) it('returns an empty array if no robot ip', async () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) =>
        {children}
        const { result } = renderHook( @@ -131,7 +131,7 @@ describe('useOffsetCandidatesForAnalysis', () => { }) }) it('returns candidates for each first match with newest first', async () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) =>
        {children}
        const { result } = renderHook( diff --git a/app/src/organisms/LegacyLabwarePositionCheck/PrepareSpace.tsx b/app/src/organisms/LegacyLabwarePositionCheck/PrepareSpace.tsx index 8820acfef33..f77973cbc1f 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/PrepareSpace.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/PrepareSpace.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import styled, { css } from 'styled-components' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' @@ -23,6 +22,7 @@ import { SmallButton } from '/app/atoms/buttons' import { NeedHelpLink } from '/app/molecules/OT2CalibrationNeedHelpLink' import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' +import type { ReactNode } from 'react' import type { CompletedProtocolAnalysis, LabwareDefinition2, @@ -61,8 +61,8 @@ interface PrepareSpaceProps extends Omit { labwareDef: LabwareDefinition2 protocolData: CompletedProtocolAnalysis confirmPlacement: () => void - header: React.ReactNode - body: React.ReactNode + header: ReactNode + body: ReactNode robotType: RobotType } export const PrepareSpace = (props: PrepareSpaceProps): JSX.Element | null => { diff --git a/app/src/organisms/LegacyLabwarePositionCheck/TwoUpTileLayout.tsx b/app/src/organisms/LegacyLabwarePositionCheck/TwoUpTileLayout.tsx index 7c6cd309bb4..396d49d5150 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/TwoUpTileLayout.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/TwoUpTileLayout.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import styled, { css } from 'styled-components' import { DIRECTION_COLUMN, @@ -12,6 +11,8 @@ import { DISPLAY_INLINE_BLOCK, } from '@opentrons/components' +import type { ReactNode } from 'react' + const Title = styled.h1` ${TYPOGRAPHY.h1Default}; margin-bottom: ${SPACING.spacing8}; @@ -36,11 +37,11 @@ export interface TwoUpTileLayoutProps { /** main header text on left half */ title: string /** paragraph text below title on left half */ - body: React.ReactNode + body: ReactNode /** entire contents of the right half */ - rightElement: React.ReactNode + rightElement: ReactNode /** footer underneath both halves of content */ - footer: React.ReactNode + footer: ReactNode } export function TwoUpTileLayout(props: TwoUpTileLayoutProps): JSX.Element { diff --git a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/CheckItem.test.tsx b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/CheckItem.test.tsx index 17442dfc42b..5c2907c5276 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/CheckItem.test.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/CheckItem.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, afterEach, expect } from 'vitest' @@ -15,6 +14,7 @@ import { CheckItem } from '../CheckItem' import { SECTIONS } from '../constants' import { mockCompletedAnalysis, mockExistingOffsets } from '../__fixtures__' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('/app/redux/config') @@ -23,14 +23,14 @@ vi.mock('../../Desktop/Devices/hooks') const mockStartPosition = { x: 10, y: 20, z: 30 } const mockEndPosition = { x: 9, y: 19, z: 29 } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('CheckItem', () => { - let props: React.ComponentProps + let props: ComponentProps let mockChainRunCommands: Mock beforeEach(() => { diff --git a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ExitConfirmation.test.tsx b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ExitConfirmation.test.tsx index 6a93da71dc5..e710c991ccb 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ExitConfirmation.test.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ExitConfirmation.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, afterEach, expect, vi } from 'vitest' import { ExitConfirmation } from '../ExitConfirmation' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ExitConfirmation', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/PickUpTip.test.tsx b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/PickUpTip.test.tsx index c23e1c1af2c..286e6f5f095 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/PickUpTip.test.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/PickUpTip.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen, waitFor } from '@testing-library/react' import { it, describe, beforeEach, vi, afterEach, expect } from 'vitest' import { FLEX_ROBOT_TYPE, HEATERSHAKER_MODULE_V1 } from '@opentrons/shared-data' @@ -8,23 +7,25 @@ import { getIsOnDevice } from '/app/redux/config' import { PickUpTip } from '../PickUpTip' import { SECTIONS } from '../constants' import { mockCompletedAnalysis, mockExistingOffsets } from '../__fixtures__' -import type { CommandData } from '@opentrons/api-client' import { nestedTextMatcher, renderWithProviders } from '/app/__testing-utils__' + +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' +import type { CommandData } from '@opentrons/api-client' vi.mock('/app/resources/protocols') vi.mock('/app/redux/config') const mockStartPosition = { x: 10, y: 20, z: 30 } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('PickUpTip', () => { - let props: React.ComponentProps + let props: ComponentProps let mockChainRunCommands: Mock beforeEach(() => { diff --git a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ResultsSummary.test.tsx b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ResultsSummary.test.tsx index 24101904de4..30a29496aaf 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ResultsSummary.test.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ResultsSummary.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, afterEach, expect, vi } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { i18n } from '/app/i18n' @@ -13,16 +12,18 @@ import { mockWorkingOffsets, } from '../__fixtures__' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ResultsSummary', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ReturnTip.test.tsx b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ReturnTip.test.tsx index 0af86097f9c..112be630a31 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ReturnTip.test.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/ReturnTip.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' @@ -12,17 +11,19 @@ import { useProtocolMetadata } from '/app/resources/protocols' import { getIsOnDevice } from '/app/redux/config' import { ReturnTip } from '../ReturnTip' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') vi.mock('/app/resources/protocols') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ReturnTip', () => { - let props: React.ComponentProps + let props: ComponentProps let mockChainRunCommands beforeEach(() => { diff --git a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/TipConfirmation.test.tsx b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/TipConfirmation.test.tsx index 8f8878a7122..a262641fd84 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/TipConfirmation.test.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/TipConfirmation.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { describe, it, beforeEach, afterEach, expect, vi } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { TipConfirmation } from '../TipConfirmation' import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('TipConfirmation', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/useLaunchLPC.test.tsx b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/useLaunchLPC.test.tsx index 070931ee998..83613b0d778 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/__tests__/useLaunchLPC.test.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/__tests__/useLaunchLPC.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' import { when } from 'vitest-when' @@ -27,6 +26,7 @@ import { import { useLaunchLegacyLPC } from '../useLaunchLegacyLPC' import { LegacyLabwarePositionCheck } from '..' +import type { FunctionComponent, ReactNode } from 'react' import type { Mock } from 'vitest' import type { LabwareOffset } from '@opentrons/api-client' import type { LabwareDefinition2 } from '@opentrons/shared-data' @@ -57,7 +57,7 @@ const mockCurrentOffsets: LabwareOffset[] = [ const mockLabwareDef = fixtureTiprack300ul as LabwareDefinition2 describe('useLaunchLPC hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> let mockCreateMaintenanceRun: Mock let mockCreateLabwareDefinition: Mock let mockDeleteMaintenanceRun: Mock diff --git a/app/src/organisms/LiquidsLabwareDetailsModal/LiquidDetailCard.tsx b/app/src/organisms/LiquidsLabwareDetailsModal/LiquidDetailCard.tsx index cb1591dc72f..7dc33069500 100644 --- a/app/src/organisms/LiquidsLabwareDetailsModal/LiquidDetailCard.tsx +++ b/app/src/organisms/LiquidsLabwareDetailsModal/LiquidDetailCard.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useSelector } from 'react-redux' import { css } from 'styled-components' import { @@ -27,6 +26,8 @@ import { import { getIsOnDevice } from '/app/redux/config' import { getWellRangeForLiquidLabwarePair } from '/app/transformations/analysis' +import type { Dispatch, SetStateAction } from 'react' + export const CARD_OUTLINE_BORDER_STYLE = css` border-style: ${BORDERS.styleSolid}; border-width: 1px; @@ -56,7 +57,7 @@ interface LiquidDetailCardProps { description: string | null displayColor: string volumeByWell: { [well: string]: number } - setSelectedValue: React.Dispatch> + setSelectedValue: Dispatch> selectedValue: string | undefined labwareWellOrdering: string[][] } diff --git a/app/src/organisms/LiquidsLabwareDetailsModal/__tests__/LiquidDetailCard.test.tsx b/app/src/organisms/LiquidsLabwareDetailsModal/__tests__/LiquidDetailCard.test.tsx index a96c8128897..522fae501b1 100644 --- a/app/src/organisms/LiquidsLabwareDetailsModal/__tests__/LiquidDetailCard.test.tsx +++ b/app/src/organisms/LiquidsLabwareDetailsModal/__tests__/LiquidDetailCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -12,12 +11,14 @@ import { } from '/app/redux/analytics' import { getIsOnDevice } from '/app/redux/config' import { LiquidDetailCard } from '../LiquidDetailCard' + +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('/app/redux/analytics') vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -25,7 +26,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEvent: Mock describe('LiquidDetailCard', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { mockTrackEvent = vi.fn() diff --git a/app/src/organisms/LiquidsLabwareDetailsModal/__tests__/LiquidsLabwareDetailsModal.test.tsx b/app/src/organisms/LiquidsLabwareDetailsModal/__tests__/LiquidsLabwareDetailsModal.test.tsx index 967a840ee75..e70756ed3f3 100644 --- a/app/src/organisms/LiquidsLabwareDetailsModal/__tests__/LiquidsLabwareDetailsModal.test.tsx +++ b/app/src/organisms/LiquidsLabwareDetailsModal/__tests__/LiquidsLabwareDetailsModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, vi, afterEach, expect } from 'vitest' import { screen } from '@testing-library/react' @@ -21,6 +20,7 @@ import { import { LiquidsLabwareDetailsModal } from '../LiquidsLabwareDetailsModal' import { LiquidDetailCard } from '../LiquidDetailCard' +import type { ComponentProps } from 'react' import type * as Components from '@opentrons/components' import type * as SharedData from '@opentrons/shared-data' @@ -44,16 +44,14 @@ vi.mock('/app/transformations/commands') vi.mock('/app/transformations/analysis') vi.mock('../LiquidDetailCard') -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('LiquidsLabwareDetailsModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { window.HTMLElement.prototype.scrollIntoView = function () {} props = { diff --git a/app/src/organisms/LocationConflictModal/__tests__/LocationConflictModal.test.tsx b/app/src/organisms/LocationConflictModal/__tests__/LocationConflictModal.test.tsx index 207caa02a1b..1d72ae1b858 100644 --- a/app/src/organisms/LocationConflictModal/__tests__/LocationConflictModal.test.tsx +++ b/app/src/organisms/LocationConflictModal/__tests__/LocationConflictModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { screen, fireEvent } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -21,6 +20,7 @@ import { useCloseCurrentRun } from '/app/resources/runs' import { LocationConflictModal } from '../LocationConflictModal' import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { DeckConfiguration } from '@opentrons/shared-data' @@ -33,7 +33,7 @@ const mockFixture = { cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -45,7 +45,7 @@ const render = (props: React.ComponentProps) => { } describe('LocationConflictModal', () => { - let props: React.ComponentProps + let props: ComponentProps const mockUpdate = vi.fn() beforeEach(() => { props = { diff --git a/app/src/organisms/ModuleCard/Collapsible.tsx b/app/src/organisms/ModuleCard/Collapsible.tsx index cc15a88d4a0..00f032b52ef 100644 --- a/app/src/organisms/ModuleCard/Collapsible.tsx +++ b/app/src/organisms/ModuleCard/Collapsible.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { ALIGN_CENTER, @@ -13,13 +12,15 @@ import { } from '@opentrons/components' import type { IconName } from '@opentrons/components' +import type { ReactNode } from 'react' + interface CollapsibleProps { expanded: boolean - title: React.ReactNode + title: ReactNode expandedIcon?: IconName collapsedIcon?: IconName toggleExpanded: () => void - children: React.ReactNode + children: ReactNode } const EXPANDED_STYLE = css` diff --git a/app/src/organisms/ModuleCard/__tests__/AboutModuleSlideout.test.tsx b/app/src/organisms/ModuleCard/__tests__/AboutModuleSlideout.test.tsx index 35eb81ab169..e397eae0b50 100644 --- a/app/src/organisms/ModuleCard/__tests__/AboutModuleSlideout.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/AboutModuleSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -20,16 +19,18 @@ import { import { useCurrentRunStatus } from '/app/organisms/RunTimeControl' import { AboutModuleSlideout } from '../AboutModuleSlideout' +import type { ComponentProps } from 'react' + vi.mock('/app/organisms/RunTimeControl') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('AboutModuleSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { module: mockMagneticModule, diff --git a/app/src/organisms/ModuleCard/__tests__/Collapsible.test.tsx b/app/src/organisms/ModuleCard/__tests__/Collapsible.test.tsx index 3db479e3228..9ec5f2d0e1b 100644 --- a/app/src/organisms/ModuleCard/__tests__/Collapsible.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/Collapsible.test.tsx @@ -1,16 +1,17 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { Collapsible } from '../Collapsible' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('Collapsible', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { expanded: false, diff --git a/app/src/organisms/ModuleCard/__tests__/ConfirmAttachmentModal.test.tsx b/app/src/organisms/ModuleCard/__tests__/ConfirmAttachmentModal.test.tsx index ccc81bcb167..6c4d41973da 100644 --- a/app/src/organisms/ModuleCard/__tests__/ConfirmAttachmentModal.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/ConfirmAttachmentModal.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ConfirmAttachmentModal } from '../ConfirmAttachmentModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ConfirmAttachmentBanner', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ModuleCard/__tests__/ErrorInfo.test.tsx b/app/src/organisms/ModuleCard/__tests__/ErrorInfo.test.tsx index bde80a0d7d2..2a93208d89e 100644 --- a/app/src/organisms/ModuleCard/__tests__/ErrorInfo.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/ErrorInfo.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { beforeEach, describe, expect, it } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -9,6 +8,8 @@ import { mockTemperatureModule, mockThermocycler, } from '/app/redux/modules/__fixtures__' + +import type { ComponentProps } from 'react' import type { HeaterShakerModule, ThermocyclerModule, @@ -71,14 +72,14 @@ const mockErrorHeaterShaker = { }, } as HeaterShakerModule -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ErrorInfo', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { attachedModule: mockTemperatureModule, diff --git a/app/src/organisms/ModuleCard/__tests__/FirmwareUpdateFailedModal.test.tsx b/app/src/organisms/ModuleCard/__tests__/FirmwareUpdateFailedModal.test.tsx index 13395bcff69..f3eaa7dc0ed 100644 --- a/app/src/organisms/ModuleCard/__tests__/FirmwareUpdateFailedModal.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/FirmwareUpdateFailedModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -6,16 +5,16 @@ import { i18n } from '/app/i18n' import { mockTemperatureModule } from '/app/redux/modules/__fixtures__' import { FirmwareUpdateFailedModal } from '../FirmwareUpdateFailedModal' -const render = ( - props: React.ComponentProps -) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('FirmwareUpdateFailedModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onCloseClick: vi.fn(), diff --git a/app/src/organisms/ModuleCard/__tests__/HeaterShakerModuleData.test.tsx b/app/src/organisms/ModuleCard/__tests__/HeaterShakerModuleData.test.tsx index 348fdb614d4..dab6f1fc7ad 100644 --- a/app/src/organisms/ModuleCard/__tests__/HeaterShakerModuleData.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/HeaterShakerModuleData.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -6,16 +5,18 @@ import { i18n } from '/app/i18n' import { StatusLabel } from '/app/atoms/StatusLabel' import { HeaterShakerModuleData } from '../HeaterShakerModuleData' +import type { ComponentProps } from 'react' + vi.mock('/app/atoms/StatusLabel') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('HeaterShakerModuleData', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { moduleData: { diff --git a/app/src/organisms/ModuleCard/__tests__/HeaterShakerSlideout.test.tsx b/app/src/organisms/ModuleCard/__tests__/HeaterShakerSlideout.test.tsx index 883d5b6bb7c..b02e5205f42 100644 --- a/app/src/organisms/ModuleCard/__tests__/HeaterShakerSlideout.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/HeaterShakerSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -9,16 +8,18 @@ import { i18n } from '/app/i18n' import { mockHeaterShaker } from '/app/redux/modules/__fixtures__' import { HeaterShakerSlideout } from '../HeaterShakerSlideout' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('HeaterShakerSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps let mockCreateLiveCommand = vi.fn() beforeEach(() => { diff --git a/app/src/organisms/ModuleCard/__tests__/MagneticModuleData.test.tsx b/app/src/organisms/ModuleCard/__tests__/MagneticModuleData.test.tsx index b6534d233e3..0440b16b251 100644 --- a/app/src/organisms/ModuleCard/__tests__/MagneticModuleData.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/MagneticModuleData.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { afterEach, beforeEach, describe, it, vi } from 'vitest' @@ -8,16 +7,18 @@ import { StatusLabel } from '/app/atoms/StatusLabel' import { MagneticModuleData } from '../MagneticModuleData' import { mockMagneticModule } from '/app/redux/modules/__fixtures__' +import type { ComponentProps } from 'react' + vi.mock('/app/atoms/StatusLabel') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('MagneticModuleData', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { moduleHeight: mockMagneticModule.data.height, diff --git a/app/src/organisms/ModuleCard/__tests__/MagneticModuleSlideout.test.tsx b/app/src/organisms/ModuleCard/__tests__/MagneticModuleSlideout.test.tsx index fa10546af90..c52817fb517 100644 --- a/app/src/organisms/ModuleCard/__tests__/MagneticModuleSlideout.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/MagneticModuleSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { COLORS } from '@opentrons/components' @@ -13,15 +12,17 @@ import { mockMagneticModuleGen2, } from '/app/redux/modules/__fixtures__' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('MagneticModuleSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps let mockCreateLiveCommand = vi.fn() beforeEach(() => { mockCreateLiveCommand = vi.fn() diff --git a/app/src/organisms/ModuleCard/__tests__/ModuleCard.test.tsx b/app/src/organisms/ModuleCard/__tests__/ModuleCard.test.tsx index d30a885b759..078dfe12ada 100644 --- a/app/src/organisms/ModuleCard/__tests__/ModuleCard.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/ModuleCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -29,12 +28,13 @@ import { FirmwareUpdateFailedModal } from '../FirmwareUpdateFailedModal' import { ErrorInfo } from '../ErrorInfo' import { ModuleCard } from '..' +import type { ComponentProps } from 'react' +import type { Mock } from 'vitest' import type { HeaterShakerModule, MagneticModule, ThermocyclerModule, } from '/app/redux/modules/types' -import type { Mock } from 'vitest' vi.mock('../ErrorInfo') vi.mock('../MagneticModuleData') @@ -175,14 +175,14 @@ const mockEatToast = vi.fn() const MOCK_LATEST_REQUEST_ID = '1234' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ModuleCard', () => { - let props: React.ComponentProps + let props: ComponentProps let mockHandleModuleApiRequests: Mock beforeEach(() => { diff --git a/app/src/organisms/ModuleCard/__tests__/ModuleOverflowMenu.test.tsx b/app/src/organisms/ModuleCard/__tests__/ModuleOverflowMenu.test.tsx index 75701934e36..6e54dee83f9 100644 --- a/app/src/organisms/ModuleCard/__tests__/ModuleOverflowMenu.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/ModuleOverflowMenu.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -16,13 +15,14 @@ import { useIsFlex } from '/app/redux-resources/robots' import { useCurrentRunId, useRunStatuses } from '/app/resources/runs' import { ModuleOverflowMenu } from '../ModuleOverflowMenu' +import type { ComponentProps } from 'react' import type { TemperatureStatus } from '@opentrons/api-client' vi.mock('/app/resources/legacy_sessions') vi.mock('/app/redux-resources/robots') vi.mock('/app/resources/runs') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -161,7 +161,7 @@ const mockThermocyclerGen2LidClosed = { } as any describe('ModuleOverflowMenu', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(useIsLegacySessionInProgress).mockReturnValue(false) vi.mocked(useRunStatuses).mockReturnValue({ diff --git a/app/src/organisms/ModuleCard/__tests__/ModuleSetupModal.test.tsx b/app/src/organisms/ModuleCard/__tests__/ModuleSetupModal.test.tsx index 87f340b2845..1b3abfab5ce 100644 --- a/app/src/organisms/ModuleCard/__tests__/ModuleSetupModal.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/ModuleSetupModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ModuleSetupModal } from '../ModuleSetupModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ModuleSetupModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { close: vi.fn(), moduleDisplayName: 'mockModuleDisplayName' } }) diff --git a/app/src/organisms/ModuleCard/__tests__/TemperatureModuleData.test.tsx b/app/src/organisms/ModuleCard/__tests__/TemperatureModuleData.test.tsx index 5b851ce5796..a9e2d88fb26 100644 --- a/app/src/organisms/ModuleCard/__tests__/TemperatureModuleData.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/TemperatureModuleData.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -8,16 +7,18 @@ import { StatusLabel } from '/app/atoms/StatusLabel' import { TemperatureModuleData } from '../TemperatureModuleData' import { mockTemperatureModuleGen2 } from '/app/redux/modules/__fixtures__' +import type { ComponentProps } from 'react' + vi.mock('/app/atoms/StatusLabel') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('TemperatureModuleData', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { moduleStatus: mockTemperatureModuleGen2.data.status, diff --git a/app/src/organisms/ModuleCard/__tests__/TemperatureModuleSlideout.test.tsx b/app/src/organisms/ModuleCard/__tests__/TemperatureModuleSlideout.test.tsx index ce65306741d..12ecc39f2f1 100644 --- a/app/src/organisms/ModuleCard/__tests__/TemperatureModuleSlideout.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/TemperatureModuleSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -12,18 +11,18 @@ import { } from '/app/redux/modules/__fixtures__' import { TemperatureModuleSlideout } from '../TemperatureModuleSlideout' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('TemperatureModuleSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps let mockCreateLiveCommand = vi.fn() beforeEach(() => { diff --git a/app/src/organisms/ModuleCard/__tests__/TestShakeSlideout.test.tsx b/app/src/organisms/ModuleCard/__tests__/TestShakeSlideout.test.tsx index f11816df8b6..865c656b1ed 100644 --- a/app/src/organisms/ModuleCard/__tests__/TestShakeSlideout.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/TestShakeSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen, waitFor } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -12,12 +11,14 @@ import { useLatchControls } from '../hooks' import { TestShakeSlideout } from '../TestShakeSlideout' import { ModuleSetupModal } from '../ModuleSetupModal' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') vi.mock('@opentrons/react-api-client') vi.mock('../hooks') vi.mock('../ModuleSetupModal') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -90,7 +91,7 @@ const mockMovingHeaterShaker = { } as any describe('TestShakeSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps let mockCreateLiveCommand = vi.fn() const mockToggleLatch = vi.fn() beforeEach(() => { diff --git a/app/src/organisms/ModuleCard/__tests__/ThermocyclerModuleData.test.tsx b/app/src/organisms/ModuleCard/__tests__/ThermocyclerModuleData.test.tsx index 0885c74bb5d..fc2346cf9ba 100644 --- a/app/src/organisms/ModuleCard/__tests__/ThermocyclerModuleData.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/ThermocyclerModuleData.test.tsx @@ -1,6 +1,4 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' - import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -11,9 +9,10 @@ import { } from '/app/redux/modules/__fixtures__' import { ThermocyclerModuleData } from '../ThermocyclerModuleData' +import type { ComponentProps } from 'react' import type { ThermocyclerData } from '/app/redux/modules/api-types' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -49,7 +48,7 @@ const mockDataHeating = { } as ThermocyclerData describe('ThermocyclerModuleData', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { data: mockThermocycler.data, diff --git a/app/src/organisms/ModuleCard/__tests__/ThermocyclerModuleSlideout.test.tsx b/app/src/organisms/ModuleCard/__tests__/ThermocyclerModuleSlideout.test.tsx index d93a1b1f607..1557b821dd9 100644 --- a/app/src/organisms/ModuleCard/__tests__/ThermocyclerModuleSlideout.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/ThermocyclerModuleSlideout.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -9,18 +8,18 @@ import { i18n } from '/app/i18n' import { mockThermocycler } from '/app/redux/modules/__fixtures__' import { ThermocyclerModuleSlideout } from '../ThermocyclerModuleSlideout' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ThermocyclerModuleSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps let mockCreateLiveCommand = vi.fn() beforeEach(() => { mockCreateLiveCommand = vi.fn() diff --git a/app/src/organisms/ModuleCard/__tests__/hooks.test.tsx b/app/src/organisms/ModuleCard/__tests__/hooks.test.tsx index ce0f0450179..2fe0c5502ef 100644 --- a/app/src/organisms/ModuleCard/__tests__/hooks.test.tsx +++ b/app/src/organisms/ModuleCard/__tests__/hooks.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { Provider } from 'react-redux' import { when } from 'vitest-when' import { createStore } from 'redux' @@ -30,6 +29,7 @@ import { useIsHeaterShakerInProtocol, } from '../hooks' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' @@ -188,7 +188,7 @@ describe('useLatchControls', () => { }) it('should return latch is open and handle latch function and command to close latch', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -212,7 +212,7 @@ describe('useLatchControls', () => { }) }) it('should return if latch is closed and handle latch function opens latch', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -263,7 +263,7 @@ describe('useModuleOverflowMenu', () => { vi.restoreAllMocks() }) it('should return everything for menuItemsByModuleType and create deactive heater command', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -304,7 +304,7 @@ describe('useModuleOverflowMenu', () => { const mockAboutClick = vi.fn() const mockTestShakeClick = vi.fn() const mockHandleWizard = vi.fn() - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -336,7 +336,7 @@ describe('useModuleOverflowMenu', () => { it('should return only 1 menu button when module is a magnetic module and calls handleClick when module is disengaged', () => { const mockHandleClick = vi.fn() - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -366,7 +366,7 @@ describe('useModuleOverflowMenu', () => { }) it('should render magnetic module and create disengage command', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -404,7 +404,7 @@ describe('useModuleOverflowMenu', () => { it('should render temperature module and call handleClick when module is idle', () => { const mockHandleClick = vi.fn() - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -433,7 +433,7 @@ describe('useModuleOverflowMenu', () => { }) it('should render temp module and create deactivate temp command', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -470,7 +470,7 @@ describe('useModuleOverflowMenu', () => { it('should render TC module and call handleClick when module is idle', () => { const mockHandleClick = vi.fn() - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -499,7 +499,7 @@ describe('useModuleOverflowMenu', () => { }) it('should render TC module and create open lid command', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -537,7 +537,7 @@ describe('useModuleOverflowMenu', () => { }) it('should render TC module and create deactivate lid command', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -575,7 +575,7 @@ describe('useModuleOverflowMenu', () => { }) it('should render TC module gen 2 and create a close lid command', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -650,7 +650,7 @@ describe('useIsHeaterShakerInProtocol', () => { }) it('should return true when a heater shaker is in the protocol', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook(useIsHeaterShakerInProtocol, { wrapper }) @@ -674,7 +674,7 @@ describe('useIsHeaterShakerInProtocol', () => { id, })), } as any) - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook(useIsHeaterShakerInProtocol, { wrapper }) diff --git a/app/src/organisms/ODD/ChildNavigation/__tests__/ChildNavigation.test.tsx b/app/src/organisms/ODD/ChildNavigation/__tests__/ChildNavigation.test.tsx index 82a0dfb0b3c..44ff1414dd6 100644 --- a/app/src/organisms/ODD/ChildNavigation/__tests__/ChildNavigation.test.tsx +++ b/app/src/organisms/ODD/ChildNavigation/__tests__/ChildNavigation.test.tsx @@ -1,19 +1,20 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { ChildNavigation } from '..' + +import type { ComponentProps } from 'react' import type { SmallButton } from '/app/atoms/buttons' -const render = (props: React.ComponentProps) => +const render = (props: ComponentProps) => renderWithProviders() const mockOnClickBack = vi.fn() const mockOnClickButton = vi.fn() const mockOnClickSecondaryButton = vi.fn() -const mockSecondaryButtonProps: React.ComponentProps = { +const mockSecondaryButtonProps: ComponentProps = { onClick: mockOnClickSecondaryButton, buttonText: 'Setup Instructions', buttonType: 'tertiaryLowLight', @@ -22,7 +23,7 @@ const mockSecondaryButtonProps: React.ComponentProps = { } describe('ChildNavigation', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/ChildNavigation/index.tsx b/app/src/organisms/ODD/ChildNavigation/index.tsx index ea6c72f293b..ff1ebed1c95 100644 --- a/app/src/organisms/ODD/ChildNavigation/index.tsx +++ b/app/src/organisms/ODD/ChildNavigation/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import styled from 'styled-components' import { @@ -21,6 +20,7 @@ import { ODD_FOCUS_VISIBLE } from '/app/atoms/buttons/constants' import { SmallButton } from '/app/atoms/buttons' import { InlineNotification } from '/app/atoms/InlineNotification' +import type { ComponentProps, MouseEventHandler, ReactNode } from 'react' import type { IconName, StyleProps } from '@opentrons/components' import type { InlineNotificationProps } from '/app/atoms/InlineNotification' import type { @@ -30,15 +30,15 @@ import type { interface ChildNavigationProps extends StyleProps { header: string - onClickBack?: React.MouseEventHandler - buttonText?: React.ReactNode + onClickBack?: MouseEventHandler + buttonText?: ReactNode inlineNotification?: InlineNotificationProps - onClickButton?: React.MouseEventHandler + onClickButton?: MouseEventHandler buttonType?: SmallButtonTypes buttonIsDisabled?: boolean iconName?: IconName iconPlacement?: IconPlacement - secondaryButtonProps?: React.ComponentProps + secondaryButtonProps?: ComponentProps ariaDisabled?: boolean } diff --git a/app/src/organisms/ODD/InstrumentInfo/__tests__/InstrumentInfo.test.tsx b/app/src/organisms/ODD/InstrumentInfo/__tests__/InstrumentInfo.test.tsx index a478716483d..ec8b55bb17a 100644 --- a/app/src/organisms/ODD/InstrumentInfo/__tests__/InstrumentInfo.test.tsx +++ b/app/src/organisms/ODD/InstrumentInfo/__tests__/InstrumentInfo.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' @@ -8,22 +7,23 @@ import { PipetteWizardFlows } from '/app/organisms/PipetteWizardFlows' import { GripperWizardFlows } from '/app/organisms/GripperWizardFlows' import { InstrumentInfo } from '..' +import type { ComponentProps } from 'react' +import type * as ReactRouterDom from 'react-router-dom' import type { GripperData } from '@opentrons/api-client' -import type * as Dom from 'react-router-dom' const mockNavigate = vi.fn() vi.mock('/app/organisms/PipetteWizardFlows') vi.mock('/app/organisms/GripperWizardFlows') vi.mock('react-router-dom', async importOriginal => { - const reactRouterDom = await importOriginal() + const reactRouterDom = await importOriginal() return { ...reactRouterDom, useNavigate: () => mockNavigate, } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -65,7 +65,7 @@ const mockGripperDataWithCalData: GripperData = { } describe('InstrumentInfo', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(PipetteWizardFlows).mockReturnValue(
        mock PipetteWizardFlows
        diff --git a/app/src/organisms/ODD/InstrumentMountItem/LabeledMount.tsx b/app/src/organisms/ODD/InstrumentMountItem/LabeledMount.tsx index 20fe3941604..c909e4768f0 100644 --- a/app/src/organisms/ODD/InstrumentMountItem/LabeledMount.tsx +++ b/app/src/organisms/ODD/InstrumentMountItem/LabeledMount.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' import { @@ -15,6 +14,8 @@ import { TEXT_TRANSFORM_CAPITALIZE, TYPOGRAPHY, } from '@opentrons/components' + +import type { MouseEventHandler } from 'react' import type { Mount } from '/app/redux/pipettes/types' const MountButton = styled.button<{ isAttached: boolean }>` @@ -34,7 +35,7 @@ const MountButton = styled.button<{ isAttached: boolean }>` interface LabeledMountProps { mount: Mount | 'extension' instrumentName: string | null - handleClick: React.MouseEventHandler + handleClick: MouseEventHandler } export function LabeledMount(props: LabeledMountProps): JSX.Element { diff --git a/app/src/organisms/ODD/InstrumentMountItem/__tests__/ProtocolInstrumentMountItem.test.tsx b/app/src/organisms/ODD/InstrumentMountItem/__tests__/ProtocolInstrumentMountItem.test.tsx index 6c4c308b8d2..52c62382241 100644 --- a/app/src/organisms/ODD/InstrumentMountItem/__tests__/ProtocolInstrumentMountItem.test.tsx +++ b/app/src/organisms/ODD/InstrumentMountItem/__tests__/ProtocolInstrumentMountItem.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { LEFT } from '@opentrons/shared-data' @@ -8,6 +7,8 @@ import { PipetteWizardFlows } from '/app/organisms/PipetteWizardFlows' import { GripperWizardFlows } from '/app/organisms/GripperWizardFlows' import { ProtocolInstrumentMountItem } from '..' +import type { ComponentProps } from 'react' + vi.mock('/app/organisms/PipetteWizardFlows') vi.mock('/app/organisms/GripperWizardFlows') vi.mock('../../TakeoverModal') @@ -51,16 +52,14 @@ const mockLeftPipetteData = { ok: true, } -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ProtocolInstrumentMountItem', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { mount: LEFT, diff --git a/app/src/organisms/ODD/NameRobot/__tests__/ConfirmRobotName.test.tsx b/app/src/organisms/ODD/NameRobot/__tests__/ConfirmRobotName.test.tsx index d9e8521260e..21d34d3a59d 100644 --- a/app/src/organisms/ODD/NameRobot/__tests__/ConfirmRobotName.test.tsx +++ b/app/src/organisms/ODD/NameRobot/__tests__/ConfirmRobotName.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -7,6 +6,7 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ConfirmRobotName } from '../ConfirmRobotName' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const mockNavigate = vi.fn() @@ -19,7 +19,7 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -31,7 +31,7 @@ const render = (props: React.ComponentProps) => { } describe('ConfirmRobotName', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robotName: 'otie', diff --git a/app/src/organisms/ODD/Navigation/__tests__/Navigation.test.tsx b/app/src/organisms/ODD/Navigation/__tests__/Navigation.test.tsx index c86ba363d5c..1a212f83e46 100644 --- a/app/src/organisms/ODD/Navigation/__tests__/Navigation.test.tsx +++ b/app/src/organisms/ODD/Navigation/__tests__/Navigation.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -12,6 +11,8 @@ import { NavigationMenu } from '../NavigationMenu' import { Navigation } from '..' import { useScrollPosition } from '/app/local-resources/dom-utils' +import type { ComponentProps } from 'react' + vi.mock('/app/resources/networking/hooks/useNetworkConnection') vi.mock('/app/redux/discovery') vi.mock('../NavigationMenu') @@ -19,7 +20,7 @@ vi.mock('/app/local-resources/dom-utils') mockConnectedRobot.name = '12345678901234567' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -29,7 +30,7 @@ const render = (props: React.ComponentProps) => { } describe('Navigation', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = {} vi.mocked(getLocalRobot).mockReturnValue(mockConnectedRobot) diff --git a/app/src/organisms/ODD/Navigation/__tests__/NavigationMenu.test.tsx b/app/src/organisms/ODD/Navigation/__tests__/NavigationMenu.test.tsx index b40122cdd6b..b4b70528cda 100644 --- a/app/src/organisms/ODD/Navigation/__tests__/NavigationMenu.test.tsx +++ b/app/src/organisms/ODD/Navigation/__tests__/NavigationMenu.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -9,6 +8,7 @@ import { useLights } from '/app/resources/devices' import { RestartRobotConfirmationModal } from '../RestartRobotConfirmationModal' import { NavigationMenu } from '../NavigationMenu' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' vi.mock('/app/redux/robot-admin') @@ -27,14 +27,14 @@ vi.mock('react-router-dom', async importOriginal => { const mockToggleLights = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('NavigationMenu', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onClick: vi.fn(), diff --git a/app/src/organisms/ODD/Navigation/__tests__/RestartRobotConfirmationModal.test.tsx b/app/src/organisms/ODD/Navigation/__tests__/RestartRobotConfirmationModal.test.tsx index 8922a4225c2..5b3bc007567 100644 --- a/app/src/organisms/ODD/Navigation/__tests__/RestartRobotConfirmationModal.test.tsx +++ b/app/src/organisms/ODD/Navigation/__tests__/RestartRobotConfirmationModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -7,12 +6,14 @@ import { i18n } from '/app/i18n' import { restartRobot } from '/app/redux/robot-admin' import { RestartRobotConfirmationModal } from '../RestartRobotConfirmationModal' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/robot-admin') const mockFunc = vi.fn() const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -20,7 +21,7 @@ const render = ( } describe('RestartRobotConfirmationModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/NetworkSettings/__tests__/AlternativeSecurityTypeModal.test.tsx b/app/src/organisms/ODD/NetworkSettings/__tests__/AlternativeSecurityTypeModal.test.tsx index a01af9bba66..2707b07a8f5 100644 --- a/app/src/organisms/ODD/NetworkSettings/__tests__/AlternativeSecurityTypeModal.test.tsx +++ b/app/src/organisms/ODD/NetworkSettings/__tests__/AlternativeSecurityTypeModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -6,6 +5,7 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { AlternativeSecurityTypeModal } from '../AlternativeSecurityTypeModal' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const mockFunc = vi.fn() @@ -18,16 +18,14 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('AlternativeSecurityTypeModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/NetworkSettings/__tests__/ConnectingNetwork.test.tsx b/app/src/organisms/ODD/NetworkSettings/__tests__/ConnectingNetwork.test.tsx index e040bee4572..29444afea6d 100644 --- a/app/src/organisms/ODD/NetworkSettings/__tests__/ConnectingNetwork.test.tsx +++ b/app/src/organisms/ODD/NetworkSettings/__tests__/ConnectingNetwork.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { screen } from '@testing-library/react' import { beforeEach, describe, expect, it } from 'vitest' @@ -7,7 +6,9 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ConnectingNetwork } from '../ConnectingNetwork' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders( @@ -19,7 +20,7 @@ const render = (props: React.ComponentProps) => { } describe('ConnectingNetwork', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/NetworkSettings/__tests__/DisplayWifiList.test.tsx b/app/src/organisms/ODD/NetworkSettings/__tests__/DisplayWifiList.test.tsx index e1449be3b9d..11e0ef16a9b 100644 --- a/app/src/organisms/ODD/NetworkSettings/__tests__/DisplayWifiList.test.tsx +++ b/app/src/organisms/ODD/NetworkSettings/__tests__/DisplayWifiList.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -8,6 +7,7 @@ import * as Fixtures from '/app/redux/networking/__fixtures__' import { DisplaySearchNetwork } from '../DisplaySearchNetwork' import { DisplayWifiList } from '../DisplayWifiList' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const mockNavigate = vi.fn() @@ -31,14 +31,14 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('DisplayWifiList', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { list: mockWifiList, diff --git a/app/src/organisms/ODD/NetworkSettings/__tests__/FailedToConnect.test.tsx b/app/src/organisms/ODD/NetworkSettings/__tests__/FailedToConnect.test.tsx index 3dbf7bf1f46..74e11378af8 100644 --- a/app/src/organisms/ODD/NetworkSettings/__tests__/FailedToConnect.test.tsx +++ b/app/src/organisms/ODD/NetworkSettings/__tests__/FailedToConnect.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -7,9 +6,10 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { FailedToConnect } from '../FailedToConnect' +import type { ComponentProps } from 'react' import type { RequestState } from '/app/redux/robot-api/types' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -33,7 +33,7 @@ const failureState = { } as RequestState describe('ConnectedResult', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/NetworkSettings/__tests__/SelectAuthenticationType.test.tsx b/app/src/organisms/ODD/NetworkSettings/__tests__/SelectAuthenticationType.test.tsx index bfce05cc22d..2520e944ad7 100644 --- a/app/src/organisms/ODD/NetworkSettings/__tests__/SelectAuthenticationType.test.tsx +++ b/app/src/organisms/ODD/NetworkSettings/__tests__/SelectAuthenticationType.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' import { afterEach, beforeEach, describe, it, vi } from 'vitest' @@ -11,6 +10,7 @@ import { AlternativeSecurityTypeModal } from '../AlternativeSecurityTypeModal' import { SelectAuthenticationType } from '../SelectAuthenticationType' import { SetWifiCred } from '../SetWifiCred' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const mockNavigate = vi.fn() @@ -36,9 +36,7 @@ const initialMockWifi = { type: INTERFACE_WIFI, } -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -50,7 +48,7 @@ const render = ( } describe('SelectAuthenticationType', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { selectedAuthType: 'wpa-psk', diff --git a/app/src/organisms/ODD/NetworkSettings/__tests__/SetWifiCred.test.tsx b/app/src/organisms/ODD/NetworkSettings/__tests__/SetWifiCred.test.tsx index d1a25f069c9..85cc94d895e 100644 --- a/app/src/organisms/ODD/NetworkSettings/__tests__/SetWifiCred.test.tsx +++ b/app/src/organisms/ODD/NetworkSettings/__tests__/SetWifiCred.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -7,11 +6,13 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { SetWifiCred } from '../SetWifiCred' +import type { ComponentProps } from 'react' + const mockSetPassword = vi.fn() vi.mock('/app/redux/discovery') vi.mock('/app/redux/robot-api') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -23,7 +24,7 @@ const render = (props: React.ComponentProps) => { } describe('SetWifiCred', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { password: 'mock-password', diff --git a/app/src/organisms/ODD/NetworkSettings/__tests__/SetWifiSsid.test.tsx b/app/src/organisms/ODD/NetworkSettings/__tests__/SetWifiSsid.test.tsx index 11eab279c37..c5b0ff26ee5 100644 --- a/app/src/organisms/ODD/NetworkSettings/__tests__/SetWifiSsid.test.tsx +++ b/app/src/organisms/ODD/NetworkSettings/__tests__/SetWifiSsid.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -7,8 +6,10 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { SetWifiSsid } from '../SetWifiSsid' +import type { ComponentProps } from 'react' + const mockSetSelectedSsid = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -20,7 +21,7 @@ const render = (props: React.ComponentProps) => { } describe('SetWifiSsid', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { setInputSsid: mockSetSelectedSsid, diff --git a/app/src/organisms/ODD/NetworkSettings/__tests__/WifiConnectionDetails.test.tsx b/app/src/organisms/ODD/NetworkSettings/__tests__/WifiConnectionDetails.test.tsx index efcee37e0c6..76e63934328 100644 --- a/app/src/organisms/ODD/NetworkSettings/__tests__/WifiConnectionDetails.test.tsx +++ b/app/src/organisms/ODD/NetworkSettings/__tests__/WifiConnectionDetails.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -11,6 +10,7 @@ import * as Fixtures from '/app/redux/networking/__fixtures__' import { NetworkDetailsModal } from '../../RobotSettingsDashboard/NetworkSettings/NetworkDetailsModal' import { WifiConnectionDetails } from '../WifiConnectionDetails' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' vi.mock('/app/resources/networking/hooks') @@ -27,7 +27,7 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -51,7 +51,7 @@ const mockWifiList = [ ] describe('WifiConnectionDetails', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { ssid: 'mockWifi', diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupDeckConfiguration/__tests__/ProtocolSetupDeckConfiguration.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupDeckConfiguration/__tests__/ProtocolSetupDeckConfiguration.test.tsx index 84a7fd2eb87..21b26365d81 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupDeckConfiguration/__tests__/ProtocolSetupDeckConfiguration.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupDeckConfiguration/__tests__/ProtocolSetupDeckConfiguration.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { fireEvent, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, afterEach } from 'vitest' @@ -15,6 +14,7 @@ import { useMostRecentCompletedAnalysis } from '/app/resources/runs' import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' import { ProtocolSetupDeckConfiguration } from '..' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { CompletedProtocolAnalysis, @@ -47,7 +47,7 @@ vi.mock('@opentrons/components', async importOriginal => { }) const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -55,7 +55,7 @@ const render = ( } describe('ProtocolSetupDeckConfiguration', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupInstruments/ProtocolSetupInstruments.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupInstruments/ProtocolSetupInstruments.tsx index 1af859bc431..1826ea10339 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupInstruments/ProtocolSetupInstruments.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupInstruments/ProtocolSetupInstruments.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import styled from 'styled-components' import { useTranslation } from 'react-i18next' import { @@ -16,15 +15,16 @@ import { PipetteRecalibrationODDWarning } from '/app/organisms/ODD/PipetteRecali import { getShowPipetteCalibrationWarning } from '/app/transformations/instruments' import { useMostRecentCompletedAnalysis } from '/app/resources/runs' import { ProtocolInstrumentMountItem } from '/app/organisms/ODD/InstrumentMountItem' +import { isGripperInCommands } from '/app/resources/protocols/utils' +import type { Dispatch, SetStateAction } from 'react' import type { GripperData, PipetteData } from '@opentrons/api-client' import type { GripperModel } from '@opentrons/shared-data' import type { SetupScreens } from '../types' -import { isGripperInCommands } from '/app/resources/protocols/utils' export interface ProtocolSetupInstrumentsProps { runId: string - setSetupScreen: React.Dispatch> + setSetupScreen: Dispatch> } export function ProtocolSetupInstruments({ diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/__tests__/LabwareMapView.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/__tests__/LabwareMapView.test.tsx index 860d927578e..3f387db51f6 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/__tests__/LabwareMapView.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/__tests__/LabwareMapView.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { when } from 'vitest-when' import { describe, it, vi, beforeEach, afterEach, expect } from 'vitest' @@ -17,6 +16,7 @@ import { getStandardDeckViewLayerBlockList } from '/app/local-resources/deck_con import { mockProtocolModuleInfo } from '../__fixtures__' import { LabwareMapView } from '../LabwareMapView' +import type { ComponentProps } from 'react' import type { getSimplestDeckConfigForProtocol, CompletedProtocolAnalysis, @@ -50,7 +50,7 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLiquids/__tests__/LiquidDetails.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLiquids/__tests__/LiquidDetails.test.tsx index 720b6db7545..9d05000cf8f 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLiquids/__tests__/LiquidDetails.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLiquids/__tests__/LiquidDetails.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen, fireEvent } from '@testing-library/react' import { describe, it, beforeEach, vi } from 'vitest' @@ -13,20 +12,22 @@ import { MOCK_LABWARE_INFO_BY_LIQUID_ID, MOCK_PROTOCOL_ANALYSIS, } from '../fixtures' + +import type { ComponentProps } from 'react' import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' vi.mock('/app/transformations/analysis') vi.mock('/app/transformations/commands') vi.mock('/app/organisms/LiquidsLabwareDetailsModal') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('LiquidDetails', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { commands: (MOCK_PROTOCOL_ANALYSIS as CompletedProtocolAnalysis).commands, diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLiquids/__tests__/ProtocolSetupLiquids.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLiquids/__tests__/ProtocolSetupLiquids.test.tsx index 487fbbd0bce..eed74fae79d 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLiquids/__tests__/ProtocolSetupLiquids.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLiquids/__tests__/ProtocolSetupLiquids.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, vi } from 'vitest' import { screen, fireEvent } from '@testing-library/react' @@ -20,6 +19,7 @@ import { } from '../fixtures' import { ProtocolSetupLiquids } from '..' +import type { ComponentProps } from 'react' import type * as SharedData from '@opentrons/shared-data' vi.mock('/app/transformations/analysis') @@ -41,13 +41,13 @@ describe('ProtocolSetupLiquids', () => { isConfirmed = confirmed }) - const render = (props: React.ComponentProps) => { + const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { runId: RUN_ID_1, diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/FixtureTable.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/FixtureTable.test.tsx index e6ca8735d77..b5336d9c535 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/FixtureTable.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/FixtureTable.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, afterEach, vi, expect } from 'vitest' @@ -18,6 +17,8 @@ import { FixtureTable } from '../FixtureTable' import { getLocalRobot } from '/app/redux/discovery' import { mockConnectedRobot } from '/app/redux/discovery/__fixtures__' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/discovery') vi.mock('/app/resources/deck_configuration/hooks') vi.mock('/app/organisms/LocationConflictModal') @@ -26,14 +27,14 @@ const mockSetSetupScreen = vi.fn() const mockSetCutoutId = vi.fn() const mockSetProvidedFixtureOptions = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('FixtureTable', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { mostRecentAnalysis: { commands: [], labware: [] } as any, diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/ModulesAndDeckMapView.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/ModulesAndDeckMapView.test.tsx index d31a0312d02..a06ad0118db 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/ModulesAndDeckMapView.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/ModulesAndDeckMapView.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' @@ -12,6 +11,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ModulesAndDeckMapView } from '../ModulesAndDeckMapView' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/components/src/hardware-sim/BaseDeck') vi.mock('@opentrons/api-client') vi.mock('@opentrons/shared-data/js/helpers/getSimplestFlexDeckConfig') @@ -99,14 +100,14 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ModulesAndDeckMapView', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/SetupInstructionsModal.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/SetupInstructionsModal.test.tsx index 8f6f4c01739..f4ac8d4fec1 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/SetupInstructionsModal.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/SetupInstructionsModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, beforeEach, vi } from 'vitest' @@ -7,18 +6,20 @@ import { i18n } from '/app/i18n' import { SetupInstructionsModal } from '../SetupInstructionsModal' +import type { ComponentProps } from 'react' + const mockSetShowSetupInstructionsModal = vi.fn() const QR_CODE_IMAGE_FILE = '/app/src/assets/images/on-device-display/setup_instructions_qr_code.png' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('SetupInstructionsModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupOffsets/index.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupOffsets/index.tsx index 310c1dadbc4..85e9352d5fe 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupOffsets/index.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupOffsets/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { Chip, @@ -24,9 +23,11 @@ import { } from '/app/resources/runs' import { getLatestCurrentOffsets } from '/app/transformations/runs' +import type { Dispatch, SetStateAction } from 'react' + export interface ProtocolSetupOffsetsProps { runId: string - setSetupScreen: React.Dispatch> + setSetupScreen: Dispatch> lpcDisabledReason: string | null launchLPC: () => void LPCWizard: JSX.Element | null diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/ViewOnlyParameters.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/ViewOnlyParameters.tsx index 1946d122848..7f5b73db3b0 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/ViewOnlyParameters.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/ViewOnlyParameters.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { css } from 'styled-components' @@ -22,11 +21,12 @@ import { useMostRecentCompletedAnalysis } from '/app/resources/runs' import { ChildNavigation } from '/app/organisms/ODD/ChildNavigation' import { useToaster } from '/app/organisms/ToasterOven' +import type { Dispatch, SetStateAction } from 'react' import type { SetupScreens } from '../types' export interface ViewOnlyParametersProps { runId: string - setSetupScreen: React.Dispatch> + setSetupScreen: Dispatch> } export function ViewOnlyParameters({ diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/AnalysisFailedModal.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/AnalysisFailedModal.test.tsx index ac43f26d621..dec3fc608e2 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/AnalysisFailedModal.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/AnalysisFailedModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { when } from 'vitest-when' import { fireEvent, screen } from '@testing-library/react' @@ -7,6 +6,8 @@ import { useDismissCurrentRunMutation } from '@opentrons/react-api-client' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { AnalysisFailedModal } from '../AnalysisFailedModal' + +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const PROTOCOL_ID = 'mockProtocolId' @@ -26,14 +27,14 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('AnalysisFailedModal', () => { - let props: React.ComponentProps + let props: ComponentProps when(vi.mocked(useDismissCurrentRunMutation)) .calledWith() diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseCsvFile.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseCsvFile.test.tsx index 2f365fa5fbc..560f9f9490a 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseCsvFile.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseCsvFile.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, vi, expect } from 'vitest' import { screen, fireEvent } from '@testing-library/react' import { when } from 'vitest-when' @@ -13,6 +12,7 @@ import { getShellUpdateDataFiles } from '/app/redux/shell' import { EmptyFile } from '../EmptyFile' import { ChooseCsvFile } from '../ChooseCsvFile' +import type { ComponentProps } from 'react' import type { CsvFileParameter } from '@opentrons/shared-data' vi.mock('@opentrons/react-api-client') @@ -47,14 +47,14 @@ const mockDataOnRobot = { }, } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ChooseCsvFile', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { protocolId: PROTOCOL_ID, diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseEnum.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseEnum.test.tsx index a65c760d544..613e17c9523 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseEnum.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseEnum.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { it, describe, beforeEach, vi, expect } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -7,14 +6,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ChooseEnum } from '../ChooseEnum' +import type { ComponentProps } from 'react' + vi.mocked('../../../../ToasterOven') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ChooseEnum', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseNumber.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseNumber.test.tsx index 611c0e124fc..89af3d22e4c 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseNumber.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ChooseNumber.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { it, describe, beforeEach, vi, expect } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -8,6 +7,7 @@ import { useToaster } from '/app/organisms/ToasterOven' import { mockRunTimeParameterData } from '../../__fixtures__' import { ChooseNumber } from '../ChooseNumber' +import type { ComponentProps } from 'react' import type { NumberParameter } from '@opentrons/shared-data' vi.mock('/app/organisms/ToasterOven') @@ -18,14 +18,14 @@ const mockFloatNumberParameterData = mockRunTimeParameterData[6] as NumberParame const mockSetParameter = vi.fn() const mockMakeSnackbar = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ChooseNumber', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ProtocolSetupParameters.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ProtocolSetupParameters.test.tsx index 18a01391711..f32442f7fda 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ProtocolSetupParameters.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ProtocolSetupParameters.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { it, describe, beforeEach, vi, expect } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -19,6 +18,7 @@ import { mockRunTimeParameterData } from '../../__fixtures__' import { useToaster } from '/app/organisms/ToasterOven' import { ProtocolSetupParameters } from '..' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' import type { HostConfig } from '@opentrons/api-client' import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' @@ -51,16 +51,14 @@ const mockMostRecentAnalysis = ({ } as unknown) as CompletedProtocolAnalysis const mockMakeSnackbar = vi.fn() -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ProtocolSetupParameters', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ResetValuesModal.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ResetValuesModal.test.tsx index 4e263f9984b..d777a44da04 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ResetValuesModal.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ResetValuesModal.test.tsx @@ -1,23 +1,24 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ResetValuesModal } from '../ResetValuesModal' + +import type { ComponentProps } from 'react' import type { RunTimeParameter } from '@opentrons/shared-data' const mockGoBack = vi.fn() const mockSetRunTimeParametersOverrides = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ResetValuesModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ViewOnlyParameters.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ViewOnlyParameters.test.tsx index aed74fea585..2c0827de156 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ViewOnlyParameters.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/__tests__/ViewOnlyParameters.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { it, describe, beforeEach, vi, expect } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -9,17 +8,19 @@ import { useToaster } from '/app/organisms/ToasterOven' import { mockRunTimeParameterData } from '../../__fixtures__' import { ViewOnlyParameters } from '../ViewOnlyParameters' +import type { ComponentProps } from 'react' + vi.mock('/app/resources/runs') vi.mock('/app/organisms/ToasterOven') const RUN_ID = 'mockId' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } const mockMakeSnackBar = vi.fn() describe('ViewOnlyParameters', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/CreateNewTransfer.tsx b/app/src/organisms/ODD/QuickTransferFlow/CreateNewTransfer.tsx index 10b036b9064..b74ecc7065e 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/CreateNewTransfer.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/CreateNewTransfer.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation, Trans } from 'react-i18next' import { @@ -12,11 +11,13 @@ import { import { ChildNavigation } from '/app/organisms/ODD/ChildNavigation' import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' + +import type { ComponentProps } from 'react' import type { SmallButton } from '/app/atoms/buttons' interface CreateNewTransferProps { onNext: () => void - exitButtonProps: React.ComponentProps + exitButtonProps: ComponentProps } export function CreateNewTransfer(props: CreateNewTransferProps): JSX.Element { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/ConfirmExitModal.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/ConfirmExitModal.test.tsx index 4b50c31ca29..18fdc854a85 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/ConfirmExitModal.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/ConfirmExitModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ConfirmExitModal } from '../ConfirmExitModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ConfirmExitModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/CreateNewTransfer.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/CreateNewTransfer.test.tsx index 178086ae401..7d134e0e2be 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/CreateNewTransfer.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/CreateNewTransfer.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' import { DeckConfigurator } from '@opentrons/components' @@ -7,6 +6,7 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { CreateNewTransfer } from '../CreateNewTransfer' +import type { ComponentProps } from 'react' import type * as OpentronsComponents from '@opentrons/components' vi.mock('@opentrons/components', async importOriginal => { @@ -16,14 +16,14 @@ vi.mock('@opentrons/components', async importOriginal => { DeckConfigurator: vi.fn(), } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('CreateNewTransfer', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/NameQuickTransfer.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/NameQuickTransfer.test.tsx index 363c89cdc82..3b247ce2ef8 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/NameQuickTransfer.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/NameQuickTransfer.test.tsx @@ -1,10 +1,11 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { NameQuickTransfer } from '../NameQuickTransfer' + +import type { ComponentProps } from 'react' import type { InputField } from '@opentrons/components' vi.mock('../utils') @@ -17,14 +18,14 @@ vi.mock('/app/atoms/InputField', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('NameQuickTransfer', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/Overview.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/Overview.test.tsx index 242b0f58a92..192d378f97c 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/Overview.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/Overview.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, afterEach, vi, beforeEach } from 'vitest' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { Overview } from '../Overview' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Overview', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/AirGap.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/AirGap.test.tsx index a4cc4a2879a..f1e6245389f 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/AirGap.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/AirGap.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -8,6 +7,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { AirGap } from '../../QuickTransferAdvancedSettings/AirGap' + +import type { ComponentProps } from 'react' import type { QuickTransferSummaryState } from '../../types' vi.mock('/app/redux-resources/analytics') @@ -21,7 +22,7 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -29,7 +30,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEventWithRobotSerial: any describe('AirGap', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/BlowOut.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/BlowOut.test.tsx index c75788ac8cd..6921e9daea7 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/BlowOut.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/BlowOut.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -7,13 +6,15 @@ import { i18n } from '/app/i18n' import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { BlowOut } from '../../QuickTransferAdvancedSettings/BlowOut' + +import type { ComponentProps } from 'react' import type { QuickTransferSummaryState } from '../../types' vi.mock('/app/resources/deck_configuration') vi.mock('/app/redux-resources/analytics') vi.mock('../utils') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -21,7 +22,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEventWithRobotSerial: any describe('BlowOut', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Delay.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Delay.test.tsx index 957f3eb6e62..32b26e4712f 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Delay.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Delay.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -8,6 +7,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { Delay } from '../../QuickTransferAdvancedSettings/Delay' + +import type { ComponentProps } from 'react' import type { QuickTransferSummaryState } from '../../types' vi.mock('/app/redux-resources/analytics') @@ -21,7 +22,7 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -29,7 +30,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEventWithRobotSerial: any describe('Delay', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/FlowRate.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/FlowRate.test.tsx index 4b01bb52ebe..413af34ce99 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/FlowRate.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/FlowRate.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -8,6 +7,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { FlowRateEntry } from '../../QuickTransferAdvancedSettings/FlowRate' + +import type { ComponentProps } from 'react' import type { QuickTransferSummaryState } from '../../types' vi.mock('/app/redux-resources/analytics') @@ -21,7 +22,7 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -29,7 +30,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEventWithRobotSerial: any describe('FlowRate', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Mix.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Mix.test.tsx index c4d1c170be3..298bd040f1c 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Mix.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Mix.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -8,6 +7,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { Mix } from '../../QuickTransferAdvancedSettings/Mix' + +import type { ComponentProps } from 'react' import type { QuickTransferSummaryState } from '../../types' vi.mock('/app/redux-resources/analytics') @@ -21,7 +22,7 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -29,7 +30,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEventWithRobotSerial: any describe('Mix', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/PipettePath.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/PipettePath.test.tsx index e62571bdc6a..536c14bbbfd 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/PipettePath.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/PipettePath.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -9,6 +8,8 @@ import { i18n } from '/app/i18n' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { PipettePath } from '../../QuickTransferAdvancedSettings/PipettePath' import { useBlowOutLocationOptions } from '../../QuickTransferAdvancedSettings/BlowOut' + +import type { ComponentProps } from 'react' import type { QuickTransferSummaryState } from '../../types' vi.mock('/app/redux-resources/analytics') @@ -23,7 +24,7 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -31,7 +32,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEventWithRobotSerial: any describe('PipettePath', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/QuickTransferAdvancedSettings.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/QuickTransferAdvancedSettings.test.tsx index 64e400f5a10..aac998fc8dd 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/QuickTransferAdvancedSettings.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/QuickTransferAdvancedSettings.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -16,6 +15,8 @@ import { TouchTip } from '../../QuickTransferAdvancedSettings/TouchTip' import { AirGap } from '../../QuickTransferAdvancedSettings/AirGap' import { BlowOut } from '../../QuickTransferAdvancedSettings/BlowOut' +import type { ComponentProps } from 'react' + vi.mock('/app/redux-resources/analytics') vi.mock('/app/organisms/ToasterOven') vi.mock('../../QuickTransferAdvancedSettings/PipettePath') @@ -28,7 +29,7 @@ vi.mock('../../QuickTransferAdvancedSettings/AirGap') vi.mock('../../QuickTransferAdvancedSettings/BlowOut') const render = ( - props: React.ComponentProps + props: ComponentProps ): any => { return renderWithProviders(, { i18nInstance: i18n, @@ -38,7 +39,7 @@ let mockTrackEventWithRobotSerial: any let mockMakeSnackbar: any describe('QuickTransferAdvancedSettings', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TipPosition.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TipPosition.test.tsx index dc109c2c302..02e5022785c 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TipPosition.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TipPosition.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -8,6 +7,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { TipPositionEntry } from '../../QuickTransferAdvancedSettings/TipPosition' + +import type { ComponentProps } from 'react' import type { QuickTransferSummaryState } from '../../types' vi.mock('/app/redux-resources/analytics') @@ -21,7 +22,7 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -29,7 +30,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEventWithRobotSerial: any describe('TipPosition', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TouchTip.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TouchTip.test.tsx index cc30db0a54f..a5338c8aa71 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TouchTip.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TouchTip.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -8,6 +7,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { TouchTip } from '../../QuickTransferAdvancedSettings/TouchTip' + +import type { ComponentProps } from 'react' import type { QuickTransferSummaryState } from '../../types' vi.mock('/app/redux-resources/analytics') @@ -21,7 +22,7 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -29,7 +30,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEventWithRobotSerial: any describe('TouchTip', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectDestLabware.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectDestLabware.test.tsx index 6448542c14e..38007f7cc58 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectDestLabware.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectDestLabware.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -6,15 +5,17 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { SelectDestLabware } from '../SelectDestLabware' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('SelectDestLabware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectPipette.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectPipette.test.tsx index e32f7645593..b614041b127 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectPipette.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectPipette.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' import { useInstrumentsQuery } from '@opentrons/react-api-client' @@ -8,17 +7,19 @@ import { i18n } from '/app/i18n' import { useIsOEMMode } from '/app/resources/robot-settings/hooks' import { SelectPipette } from '../SelectPipette' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') vi.mock('/app/resources/robot-settings/hooks') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('SelectPipette', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectSourceLabware.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectSourceLabware.test.tsx index 73121ea7b2d..99e53fab15b 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectSourceLabware.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectSourceLabware.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -6,15 +5,17 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { SelectSourceLabware } from '../SelectSourceLabware' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('SelectSourceLabware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectTipRack.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectTipRack.test.tsx index f4ee22bd2b9..1489e744ec6 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectTipRack.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SelectTipRack.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -6,15 +5,17 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { SelectTipRack } from '../SelectTipRack' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('SelectTipRack', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SummaryAndSettings.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SummaryAndSettings.test.tsx index 0f5f7c7742c..246fa343260 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/SummaryAndSettings.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/SummaryAndSettings.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -16,6 +15,8 @@ import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { SummaryAndSettings } from '../SummaryAndSettings' import { NameQuickTransfer } from '../NameQuickTransfer' import { Overview } from '../Overview' + +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const mockNavigate = vi.fn() @@ -41,7 +42,7 @@ vi.mock('../utils/createQuickTransferFile') vi.mock('@opentrons/react-api-client') vi.mock('/app/resources/deck_configuration') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -49,7 +50,7 @@ const render = (props: React.ComponentProps) => { let mockTrackEventWithRobotSerial: any describe('SummaryAndSettings', () => { - let props: React.ComponentProps + let props: ComponentProps const createProtocol = vi.fn() const createRun = vi.fn() diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/ChangeTip.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/ChangeTip.test.tsx index 213633678e5..cfe5b0a5086 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/ChangeTip.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/ChangeTip.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -8,9 +7,11 @@ import { ANALYTICS_QUICK_TRANSFER_SETTING_SAVED } from '/app/redux/analytics' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { ChangeTip } from '../../TipManagement/ChangeTip' +import type { ComponentProps } from 'react' + vi.mock('/app/redux-resources/analytics') -const render = (props: React.ComponentProps): any => { +const render = (props: ComponentProps): any => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -19,7 +20,7 @@ const render = (props: React.ComponentProps): any => { let mockTrackEventWithRobotSerial: any describe('ChangeTip', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/TipDropLocation.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/TipDropLocation.test.tsx index aed3d143b31..712e7e2217e 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/TipDropLocation.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/TipDropLocation.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -9,10 +8,12 @@ import { ANALYTICS_QUICK_TRANSFER_SETTING_SAVED } from '/app/redux/analytics' import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { TipDropLocation } from '../../TipManagement/TipDropLocation' +import type { ComponentProps } from 'react' + vi.mock('/app/resources/deck_configuration') vi.mock('/app/redux-resources/analytics') -const render = (props: React.ComponentProps): any => { +const render = (props: ComponentProps): any => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -20,7 +21,7 @@ const render = (props: React.ComponentProps): any => { let mockTrackEventWithRobotSerial: any describe('TipDropLocation', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/TipManagement.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/TipManagement.test.tsx index 618153a8b53..61f38149a99 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/TipManagement.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/TipManagement/TipManagement.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -10,11 +9,13 @@ import { ChangeTip } from '../../TipManagement/ChangeTip' import { TipDropLocation } from '../../TipManagement/TipDropLocation' import { TipManagement } from '../../TipManagement/' +import type { ComponentProps } from 'react' + vi.mock('../../TipManagement/ChangeTip') vi.mock('../../TipManagement/TipDropLocation') vi.mock('/app/redux-resources/analytics') -const render = (props: React.ComponentProps): any => { +const render = (props: ComponentProps): any => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -22,7 +23,7 @@ const render = (props: React.ComponentProps): any => { let mockTrackEventWithRobotSerial: any describe('TipManagement', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/VolumeEntry.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/VolumeEntry.test.tsx index 8a14b9a5993..e96ea2515cd 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/VolumeEntry.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/VolumeEntry.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest' @@ -10,6 +9,8 @@ import { NumericalKeyboard } from '/app/atoms/SoftwareKeyboard' import { getVolumeRange } from '../utils' import { VolumeEntry } from '../VolumeEntry' +import type { ComponentProps } from 'react' + vi.mock('/app/atoms/SoftwareKeyboard') vi.mock('../utils') @@ -21,14 +22,14 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('VolumeEntry', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotDashboard/__tests__/RecentRunProtocolCard.test.tsx b/app/src/organisms/ODD/RobotDashboard/__tests__/RecentRunProtocolCard.test.tsx index 10ee119176e..cb1b541b39b 100644 --- a/app/src/organisms/ODD/RobotDashboard/__tests__/RecentRunProtocolCard.test.tsx +++ b/app/src/organisms/ODD/RobotDashboard/__tests__/RecentRunProtocolCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { formatDistance } from 'date-fns' import { MemoryRouter } from 'react-router-dom' @@ -26,6 +25,7 @@ import { useCloneRun, useNotifyAllRunsQuery } from '/app/resources/runs' import { useRerunnableStatusText } from '../hooks' import { RecentRunProtocolCard } from '../' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' import type { ProtocolHardware } from '/app/transformations/commands' @@ -103,7 +103,7 @@ const mockBadRunData = { const mockCloneRun = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -120,7 +120,7 @@ const mockTrackProtocolRunEvent = vi.fn( ) describe('RecentRunProtocolCard', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotDashboard/__tests__/RecentRunProtocolCarousel.test.tsx b/app/src/organisms/ODD/RobotDashboard/__tests__/RecentRunProtocolCarousel.test.tsx index 277edf80d87..31026884d3c 100644 --- a/app/src/organisms/ODD/RobotDashboard/__tests__/RecentRunProtocolCarousel.test.tsx +++ b/app/src/organisms/ODD/RobotDashboard/__tests__/RecentRunProtocolCarousel.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { beforeEach, describe, it, vi } from 'vitest' @@ -6,6 +5,7 @@ import { renderWithProviders } from '/app/__testing-utils__' import { useNotifyAllRunsQuery } from '/app/resources/runs' import { RecentRunProtocolCard, RecentRunProtocolCarousel } from '..' +import type { ComponentProps } from 'react' import type { RunData } from '@opentrons/api-client' vi.mock('@opentrons/react-api-client') @@ -30,14 +30,12 @@ const mockRun = { runTimeParameters: [], } -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders() } describe('RecentRunProtocolCarousel', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotDashboard/hooks/__tests__/useHardwareStatusText.test.tsx b/app/src/organisms/ODD/RobotDashboard/hooks/__tests__/useHardwareStatusText.test.tsx index f209e69f5ec..996e00d56c7 100644 --- a/app/src/organisms/ODD/RobotDashboard/hooks/__tests__/useHardwareStatusText.test.tsx +++ b/app/src/organisms/ODD/RobotDashboard/hooks/__tests__/useHardwareStatusText.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { I18nextProvider } from 'react-i18next' import { renderHook } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -7,10 +6,12 @@ import { i18n } from '/app/i18n' import { useFeatureFlag } from '/app/redux/config' import { useHardwareStatusText } from '..' +import type { FunctionComponent, ReactNode } from 'react' + vi.mock('/app/redux/config') describe('useHardwareStatusText', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { wrapper = ({ children }) => ( {children} diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/LanguageSetting.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/LanguageSetting.tsx index 49f58e26993..50af850a44f 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/LanguageSetting.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/LanguageSetting.tsx @@ -1,7 +1,8 @@ -import { Fragment } from 'react' +import { Fragment, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' import styled from 'styled-components' +import uuidv1 from 'uuid/v4' import { BORDERS, @@ -14,6 +15,8 @@ import { } from '@opentrons/components' import { LANGUAGES } from '/app/i18n' +import { ANALYTICS_LANGUAGE_UPDATED_ODD_SETTINGS } from '/app/redux/analytics' +import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { ChildNavigation } from '/app/organisms/ODD/ChildNavigation' import { getAppLanguage, updateConfigValue } from '/app/redux/config' @@ -42,16 +45,31 @@ interface LanguageSettingProps { setCurrentOption: SetSettingOption } +const uuid: () => string = uuidv1 + export function LanguageSetting({ setCurrentOption, }: LanguageSettingProps): JSX.Element { const { t } = useTranslation('app_settings') const dispatch = useDispatch() + const { trackEventWithRobotSerial } = useTrackEventWithRobotSerial() + + let transactionId = '' + useEffect(() => { + transactionId = uuid() + }, []) const appLanguage = useSelector(getAppLanguage) const handleChange = (event: ChangeEvent): void => { dispatch(updateConfigValue('language.appLanguage', event.target.value)) + trackEventWithRobotSerial({ + name: ANALYTICS_LANGUAGE_UPDATED_ODD_SETTINGS, + properties: { + language: event.target.value, + transactionId, + }, + }) } return ( diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsSelectAuthenticationType.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsSelectAuthenticationType.tsx index f8ce5e6a205..8193a44b23b 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsSelectAuthenticationType.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsSelectAuthenticationType.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { DIRECTION_COLUMN, Flex } from '@opentrons/components' @@ -6,6 +5,7 @@ import { DIRECTION_COLUMN, Flex } from '@opentrons/components' import { ChildNavigation } from '/app/organisms/ODD/ChildNavigation' import { SelectAuthenticationType } from '../../NetworkSettings' +import type { Dispatch, SetStateAction } from 'react' import type { WifiSecurityType } from '@opentrons/api-client' import type { SetSettingOption } from '../types' @@ -13,7 +13,7 @@ interface RobotSettingsSelectAuthenticationTypeProps { handleWifiConnect: () => void selectedAuthType: WifiSecurityType setCurrentOption: SetSettingOption - setSelectedAuthType: React.Dispatch> + setSelectedAuthType: Dispatch> } /** diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsSetWifiCred.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsSetWifiCred.tsx index 9204f22f5c4..aaafbf5d590 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsSetWifiCred.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsSetWifiCred.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { DIRECTION_COLUMN, Flex } from '@opentrons/components' @@ -6,13 +5,14 @@ import { DIRECTION_COLUMN, Flex } from '@opentrons/components' import { ChildNavigation } from '/app/organisms/ODD/ChildNavigation' import { SetWifiCred } from '../../NetworkSettings/SetWifiCred' +import type { Dispatch, SetStateAction } from 'react' import type { SetSettingOption } from '../types' interface RobotSettingsSetWifiCredProps { handleConnect: () => void password: string setCurrentOption: SetSettingOption - setPassword: React.Dispatch> + setPassword: Dispatch> } /** diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsWifi.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsWifi.tsx index add3565fe74..67edb5249ff 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsWifi.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/RobotSettingsWifi.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { DIRECTION_COLUMN, Flex } from '@opentrons/components' @@ -6,11 +5,12 @@ import { DIRECTION_COLUMN, Flex } from '@opentrons/components' import { ChildNavigation } from '/app/organisms/ODD/ChildNavigation' import { WifiConnectionDetails } from './WifiConnectionDetails' +import type { Dispatch, SetStateAction } from 'react' import type { WifiSecurityType } from '@opentrons/api-client' import type { SetSettingOption } from '../types' interface RobotSettingsWifiProps { - setSelectedSsid: React.Dispatch> + setSelectedSsid: Dispatch> setCurrentOption: SetSettingOption activeSsid?: string connectedWifiAuthType?: WifiSecurityType diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/EthernetConnectionDetails.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/EthernetConnectionDetails.test.tsx index ddefd80196d..d034b6b6e7c 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/EthernetConnectionDetails.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/EthernetConnectionDetails.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -11,13 +10,13 @@ import { getLocalRobot } from '/app/redux/discovery' import { mockConnectedRobot } from '/app/redux/discovery/__fixtures__' import { EthernetConnectionDetails } from '../EthernetConnectionDetails' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/discovery') vi.mock('/app/redux/discovery/selectors') vi.mock('/app/redux/networking/selectors') -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) @@ -31,7 +30,7 @@ const mockEthernet = { } describe('EthernetConnectionDetails', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { handleGoBack: vi.fn(), diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/NetworkDetailsModal.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/NetworkDetailsModal.test.tsx index 76b4c6f1be0..6b4048dbcfc 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/NetworkDetailsModal.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/NetworkDetailsModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -7,16 +6,18 @@ import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { NetworkDetailsModal } from '../NetworkDetailsModal' +import type { ComponentProps } from 'react' + const mockFn = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('NetworkDetailsModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/NetworkSettings.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/NetworkSettings.test.tsx index 266778c0c81..37a5db9c3f2 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/NetworkSettings.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/NetworkSettings.test.tsx @@ -1,5 +1,4 @@ /* eslint-disable testing-library/no-node-access */ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -12,6 +11,7 @@ import { WifiConnectionDetails } from '../WifiConnectionDetails' import { EthernetConnectionDetails } from '../EthernetConnectionDetails' import { NetworkSettings } from '..' +import type { ComponentProps } from 'react' import type { DiscoveredRobot } from '/app/redux/discovery/types' import type { WifiNetwork } from '/app/redux/networking/types' @@ -22,14 +22,14 @@ vi.mock('../EthernetConnectionDetails') const mockSetCurrentOption = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('NetworkSettings', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/WifiConnectionDetails.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/WifiConnectionDetails.test.tsx index 9650a89b76c..c7311087fe4 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/WifiConnectionDetails.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/__tests__/WifiConnectionDetails.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { when } from 'vitest-when' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -10,6 +9,8 @@ import { getLocalRobot } from '/app/redux/discovery' import * as Networking from '/app/redux/networking' import { NetworkDetailsModal } from '../NetworkDetailsModal' import { WifiConnectionDetails } from '../WifiConnectionDetails' + +import type { ComponentProps } from 'react' import type * as Dom from 'react-router-dom' import type { State } from '/app/redux/types' @@ -36,14 +37,14 @@ const initialMockWifi = { type: Networking.INTERFACE_WIFI, } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('WifiConnectionDetails', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { activeSsid: 'mock wifi ssid', diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/index.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/index.tsx index db73b89dae3..9afeeb15cc0 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/index.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/NetworkSettings/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { useTranslation } from 'react-i18next' @@ -19,6 +18,7 @@ import { import { ChildNavigation } from '/app/organisms/ODD/ChildNavigation' +import type { ComponentProps } from 'react' import type { IconName, ChipType } from '@opentrons/components' import type { NetworkConnection } from '/app/resources/networking/hooks/useNetworkConnection' import type { SetSettingOption } from '../types' @@ -87,7 +87,7 @@ export function NetworkSettings({ ) } -interface NetworkSettingButtonProps extends React.ComponentProps { +interface NetworkSettingButtonProps extends ComponentProps { buttonTitle: string iconName: IconName chipType: ChipType diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/RobotSettingButton.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/RobotSettingButton.tsx index f777c9fcb77..1a47e3bbe4e 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/RobotSettingButton.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/RobotSettingButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { @@ -20,6 +19,7 @@ import { TYPOGRAPHY, } from '@opentrons/components' +import type { MouseEventHandler, ReactNode } from 'react' import type { IconName } from '@opentrons/components' const SETTING_BUTTON_STYLE = css` @@ -36,10 +36,10 @@ const SETTING_BUTTON_STYLE = css` interface RobotSettingButtonProps { settingName: string - onClick: React.MouseEventHandler + onClick: MouseEventHandler iconName?: IconName settingInfo?: string - rightElement?: React.ReactNode + rightElement?: ReactNode dataTestId?: string } diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/TouchScreenSleep.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/TouchScreenSleep.tsx index cb123b261be..3872d79ba21 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/TouchScreenSleep.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/TouchScreenSleep.tsx @@ -14,7 +14,7 @@ import { getOnDeviceDisplaySettings, updateConfigValue, } from '/app/redux/config' -import { SLEEP_NEVER_MS } from '/app/local-resources/config' +import { SLEEP_NEVER_MS } from '/app/local-resources/dom-utils' import type { ChangeEvent } from 'react' import type { Dispatch } from '/app/redux/types' diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/DeviceReset.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/DeviceReset.test.tsx index 9f71205231e..3f273ab2df2 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/DeviceReset.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/DeviceReset.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -9,6 +8,7 @@ import { useDispatchApiRequest } from '/app/redux/robot-api' import { DeviceReset } from '../DeviceReset' +import type { ComponentProps } from 'react' import type { DispatchApiRequestType } from '/app/redux/robot-api' vi.mock('/app/redux/robot-admin') @@ -47,7 +47,7 @@ const mockResetConfigOptions = [ }, ] -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( , @@ -56,7 +56,7 @@ const render = (props: React.ComponentProps) => { } describe('DeviceReset', () => { - let props: React.ComponentProps + let props: ComponentProps let dispatchApiRequest: DispatchApiRequestType beforeEach(() => { diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/LanguageSetting.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/LanguageSetting.test.tsx index 80d35ebea15..50ce6edc7e6 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/LanguageSetting.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/LanguageSetting.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -10,28 +9,37 @@ import { SIMPLIFIED_CHINESE_DISPLAY_NAME, SIMPLIFIED_CHINESE, } from '/app/i18n' +import { ANALYTICS_LANGUAGE_UPDATED_ODD_SETTINGS } from '/app/redux/analytics' +import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { getAppLanguage, updateConfigValue } from '/app/redux/config' import { renderWithProviders } from '/app/__testing-utils__' import { LanguageSetting } from '../LanguageSetting' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') +vi.mock('/app/redux-resources/analytics') const mockSetCurrentOption = vi.fn() +const mockTrackEvent = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('LanguageSetting', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { setCurrentOption: mockSetCurrentOption, } vi.mocked(getAppLanguage).mockReturnValue(US_ENGLISH) + vi.mocked(useTrackEventWithRobotSerial).mockReturnValue({ + trackEventWithRobotSerial: mockTrackEvent, + }) }) it('should render text and buttons', () => { @@ -49,6 +57,13 @@ describe('LanguageSetting', () => { 'language.appLanguage', SIMPLIFIED_CHINESE ) + expect(mockTrackEvent).toHaveBeenCalledWith({ + name: ANALYTICS_LANGUAGE_UPDATED_ODD_SETTINGS, + properties: { + language: SIMPLIFIED_CHINESE, + transactionId: expect.anything(), + }, + }) }) it('should call mock function when tapping back button', () => { diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/Privacy.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/Privacy.test.tsx index 03f4a987462..d281ccecf6f 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/Privacy.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/Privacy.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, describe, beforeEach, afterEach, expect, it } from 'vitest' @@ -9,17 +8,19 @@ import { getRobotSettings } from '/app/redux/robot-settings' import { Privacy } from '../Privacy' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/analytics') vi.mock('/app/redux/robot-settings') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Privacy', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { robotName: 'Otie', diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/RobotSystemVersion.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/RobotSystemVersion.test.tsx index ad30e2539fa..955161149d8 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/RobotSystemVersion.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/RobotSystemVersion.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -9,12 +8,14 @@ import { renderWithProviders } from '/app/__testing-utils__' import { RobotSystemVersion } from '../RobotSystemVersion' import { RobotSystemVersionModal } from '../RobotSystemVersionModal' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/shell') vi.mock('../RobotSystemVersionModal') const mockBack = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -26,7 +27,7 @@ const render = (props: React.ComponentProps) => { } describe('RobotSystemVersion', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/RobotSystemVersionModal.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/RobotSystemVersionModal.test.tsx index 0d7a125eb1f..0b8f891f1a5 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/RobotSystemVersionModal.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/RobotSystemVersionModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -6,6 +5,8 @@ import '@testing-library/jest-dom/vitest' import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { RobotSystemVersionModal } from '../RobotSystemVersionModal' + +import type { ComponentProps } from 'react' import type * as Dom from 'react-router-dom' const mockFn = vi.fn() @@ -19,16 +20,14 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('RobotSystemVersionModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TextSize.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TextSize.test.tsx index 703323c0d7e..3ca0124810a 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TextSize.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TextSize.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -6,15 +5,17 @@ import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { TextSize } from '../TextSize' +import type { ComponentProps } from 'react' + const mockFunc = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('TextSize', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TouchScreenSleep.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TouchScreenSleep.test.tsx index 990c6bcf436..6c75c584cfe 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TouchScreenSleep.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TouchScreenSleep.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import { i18n } from '/app/i18n' @@ -6,19 +5,21 @@ import { updateConfigValue } from '/app/redux/config' import { TouchScreenSleep } from '../TouchScreenSleep' import { renderWithProviders } from '/app/__testing-utils__' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') // Note (kj:06/28/2023) this line is to avoid causing errors for scrollIntoView window.HTMLElement.prototype.scrollIntoView = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('TouchScreenSleep', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TouchscreenBrightness.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TouchscreenBrightness.test.tsx index 76993c42300..0dd4c87331d 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TouchscreenBrightness.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/TouchscreenBrightness.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -10,18 +9,20 @@ import { import { renderWithProviders } from '/app/__testing-utils__' import { TouchscreenBrightness } from '../TouchscreenBrightness' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') const mockFunc = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('TouchscreenBrightness', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/UpdateChannel.test.tsx b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/UpdateChannel.test.tsx index c25e9582a4b..5cf5d34ffde 100644 --- a/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/UpdateChannel.test.tsx +++ b/app/src/organisms/ODD/RobotSettingsDashboard/__tests__/UpdateChannel.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -13,6 +12,8 @@ import { renderWithProviders } from '/app/__testing-utils__' import { UpdateChannel } from '../UpdateChannel' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/config') const mockChannelOptions = [ @@ -26,14 +27,14 @@ const mockChannelOptions = [ const mockhandleBackPress = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('UpdateChannel', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { handleBackPress: mockhandleBackPress, diff --git a/app/src/organisms/ODD/RobotSetupHeader/index.tsx b/app/src/organisms/ODD/RobotSetupHeader/index.tsx index 6b7a3fa1049..3e828ddb061 100644 --- a/app/src/organisms/ODD/RobotSetupHeader/index.tsx +++ b/app/src/organisms/ODD/RobotSetupHeader/index.tsx @@ -1,5 +1,3 @@ -import type * as React from 'react' - import { ALIGN_CENTER, Btn, @@ -17,14 +15,15 @@ import { import { SmallButton } from '/app/atoms/buttons' import { InlineNotification } from '/app/atoms/InlineNotification' +import type { MouseEventHandler, ReactNode } from 'react' import type { InlineNotificationProps } from '/app/atoms/InlineNotification' interface RobotSetupHeaderProps { header: string - buttonText?: React.ReactNode + buttonText?: ReactNode inlineNotification?: InlineNotificationProps - onClickBack?: React.MouseEventHandler - onClickButton?: React.MouseEventHandler + onClickBack?: MouseEventHandler + onClickButton?: MouseEventHandler } export function RobotSetupHeader({ diff --git a/app/src/organisms/ODD/RunningProtocol/__tests__/ConfirmCancelRunModal.test.tsx b/app/src/organisms/ODD/RunningProtocol/__tests__/ConfirmCancelRunModal.test.tsx index 69f610d3ef8..bef530f1458 100644 --- a/app/src/organisms/ODD/RunningProtocol/__tests__/ConfirmCancelRunModal.test.tsx +++ b/app/src/organisms/ODD/RunningProtocol/__tests__/ConfirmCancelRunModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' @@ -21,6 +20,7 @@ import { mockConnectedRobot } from '/app/redux/discovery/__fixtures__' import { ConfirmCancelRunModal } from '../ConfirmCancelRunModal' import { CancelingRunModal } from '../CancelingRunModal' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' vi.mock('@opentrons/react-api-client') @@ -46,7 +46,7 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -63,7 +63,7 @@ const ROBOT_NAME = 'otie' const mockFn = vi.fn() describe('ConfirmCancelRunModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RunningProtocol/__tests__/CurrentRunningProtocolCommand.test.tsx b/app/src/organisms/ODD/RunningProtocol/__tests__/CurrentRunningProtocolCommand.test.tsx index 581df7c013c..ceda8df2e42 100644 --- a/app/src/organisms/ODD/RunningProtocol/__tests__/CurrentRunningProtocolCommand.test.tsx +++ b/app/src/organisms/ODD/RunningProtocol/__tests__/CurrentRunningProtocolCommand.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -12,6 +11,8 @@ import { useRunningStepCounts } from '/app/resources/protocols/hooks' import { useNotifyAllCommandsQuery } from '/app/resources/runs' import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' +import type { ComponentProps } from 'react' + vi.mock('/app/resources/runs') vi.mock('/app/resources/protocols/hooks') @@ -28,7 +29,7 @@ const mockRunTimer = { } const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -36,7 +37,7 @@ const render = ( } describe('CurrentRunningProtocolCommand', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RunningProtocol/__tests__/RunFailedModal.test.tsx b/app/src/organisms/ODD/RunningProtocol/__tests__/RunFailedModal.test.tsx index 8dcfd2e5b88..40e1366d324 100644 --- a/app/src/organisms/ODD/RunningProtocol/__tests__/RunFailedModal.test.tsx +++ b/app/src/organisms/ODD/RunningProtocol/__tests__/RunFailedModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -12,6 +11,8 @@ import { RunFailedModal } from '../RunFailedModal' import type { NavigateFunction } from 'react-router-dom' import { RUN_STATUS_FAILED } from '@opentrons/api-client' +import type { ComponentProps } from 'react' + vi.mock('@opentrons/react-api-client') const RUN_ID = 'mock_runID' @@ -82,7 +83,7 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -94,7 +95,7 @@ const render = (props: React.ComponentProps) => { } describe('RunFailedModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/ODD/RunningProtocol/__tests__/RunningProtocolCommandList.test.tsx b/app/src/organisms/ODD/RunningProtocol/__tests__/RunningProtocolCommandList.test.tsx index 199ae940c3b..5f2ceba8121 100644 --- a/app/src/organisms/ODD/RunningProtocol/__tests__/RunningProtocolCommandList.test.tsx +++ b/app/src/organisms/ODD/RunningProtocol/__tests__/RunningProtocolCommandList.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -10,20 +9,20 @@ import { i18n } from '/app/i18n' import { mockRobotSideAnalysis } from '/app/molecules/Command/__fixtures__' import { RunningProtocolCommandList } from '../RunningProtocolCommandList' +import type { ComponentProps } from 'react' + const mockPlayRun = vi.fn() const mockPauseRun = vi.fn() const mockShowModal = vi.fn() -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('RunningProtocolCommandList', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { runStatus: RUN_STATUS_RUNNING, diff --git a/app/src/organisms/ODD/RunningProtocol/__tests__/RunningProtocolSkeleton.test.tsx b/app/src/organisms/ODD/RunningProtocol/__tests__/RunningProtocolSkeleton.test.tsx index 656d4d250d1..fcd48819c49 100644 --- a/app/src/organisms/ODD/RunningProtocol/__tests__/RunningProtocolSkeleton.test.tsx +++ b/app/src/organisms/ODD/RunningProtocol/__tests__/RunningProtocolSkeleton.test.tsx @@ -1,18 +1,17 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { beforeEach, describe, expect, it } from 'vitest' import { renderWithProviders } from '/app/__testing-utils__' import { RunningProtocolSkeleton } from '../RunningProtocolSkeleton' -const render = ( - props: React.ComponentProps -) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders() } describe('RunningProtocolSkeleton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/PipetteWizardFlows/CheckPipetteButton.tsx b/app/src/organisms/PipetteWizardFlows/CheckPipetteButton.tsx index 2300204b65b..25438c1442c 100644 --- a/app/src/organisms/PipetteWizardFlows/CheckPipetteButton.tsx +++ b/app/src/organisms/PipetteWizardFlows/CheckPipetteButton.tsx @@ -1,11 +1,12 @@ -import type * as React from 'react' import { useInstrumentsQuery } from '@opentrons/react-api-client' import { PrimaryButton } from '@opentrons/components' import { SmallButton } from '/app/atoms/buttons' +import type { Dispatch, SetStateAction } from 'react' + interface CheckPipetteButtonProps { proceedButtonText: string - setFetching: React.Dispatch> + setFetching: Dispatch> isFetching: boolean isOnDevice: boolean | null proceed?: () => void diff --git a/app/src/organisms/PipetteWizardFlows/MountPipette.tsx b/app/src/organisms/PipetteWizardFlows/MountPipette.tsx index 9ba1b036785..b750aee0ad2 100644 --- a/app/src/organisms/PipetteWizardFlows/MountPipette.tsx +++ b/app/src/organisms/PipetteWizardFlows/MountPipette.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { SINGLE_MOUNT_PIPETTES, @@ -17,11 +16,13 @@ import { Skeleton } from '/app/atoms/Skeleton' import { CheckPipetteButton } from './CheckPipetteButton' import { BODY_STYLE, SECTIONS } from './constants' import { getPipetteAnimations, getPipetteAnimations96 } from './utils' + +import type { Dispatch, ReactNode, SetStateAction } from 'react' import type { PipetteWizardStepProps } from './types' interface MountPipetteProps extends PipetteWizardStepProps { isFetching: boolean - setFetching: React.Dispatch> + setFetching: Dispatch> } const BACKGROUND_SIZE = '47rem' @@ -47,7 +48,7 @@ export const MountPipette = (props: MountPipetteProps): JSX.Element => { backgroundSize={BACKGROUND_SIZE} /> ) - let bodyText: React.ReactNode =
        + let bodyText: ReactNode =
        if (isFetching) { bodyText = ( <> diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/AttachProbe.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/AttachProbe.test.tsx index 00120fe438a..0bbab02ebc5 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/AttachProbe.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/AttachProbe.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen, waitFor } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -16,7 +15,9 @@ import { FLOWS } from '../constants' import { AttachProbe } from '../AttachProbe' import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] @@ -24,7 +25,7 @@ const render = (props: React.ComponentProps) => { vi.mock('/app/resources/deck_configuration') describe('AttachProbe', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { mount: LEFT, diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/BeforeBeginning.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/BeforeBeginning.test.tsx index a75e8bfe97a..db8b03816c2 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/BeforeBeginning.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/BeforeBeginning.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, waitFor, screen } from '@testing-library/react' import { describe, it, vi, beforeEach, expect, afterEach } from 'vitest' @@ -19,19 +18,21 @@ import { BeforeBeginning } from '../BeforeBeginning' import { FLOWS } from '../constants' import { getIsGantryEmpty } from '../utils' +import type { ComponentProps } from 'react' + // TODO(jr, 11/3/22): uncomment out the get help link when we have // the correct URL to link it to vi.mock('/app/molecules/InProgressModal/InProgressModal') vi.mock('../utils') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('BeforeBeginning', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { selectedPipette: SINGLE_MOUNT_PIPETTES, diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/Carriage.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/Carriage.test.tsx index 17c8140ebe8..389fde2801f 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/Carriage.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/Carriage.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -11,14 +10,16 @@ import { RUN_ID_1 } from '/app/resources/runs/__fixtures__' import { FLOWS } from '../constants' import { Carriage } from '../Carriage' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('Carriage', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { mount: LEFT, diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/CheckPipetteButton.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/CheckPipetteButton.test.tsx index e5dfc5fe3de..76c60357b46 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/CheckPipetteButton.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/CheckPipetteButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, waitFor, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' @@ -7,14 +6,16 @@ import { useInstrumentsQuery } from '@opentrons/react-api-client' import { renderWithProviders } from '/app/__testing-utils__' import { CheckPipetteButton } from '../CheckPipetteButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } vi.mock('@opentrons/react-api-client') describe('CheckPipetteButton', () => { - let props: React.ComponentProps + let props: ComponentProps const refetch = vi.fn(() => Promise.resolve()) beforeEach(() => { props = { diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/ChoosePipette.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/ChoosePipette.test.tsx index bda196f388c..ab14c846013 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/ChoosePipette.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/ChoosePipette.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { LEFT, NINETY_SIX_CHANNEL, @@ -17,18 +16,20 @@ import { useAttachedPipettesFromInstrumentsQuery } from '/app/resources/instrume import { ChoosePipette } from '../ChoosePipette' import { getIsGantryEmpty } from '../utils' +import type { ComponentProps } from 'react' + vi.mock('../utils') vi.mock('/app/resources/instruments') vi.mock('/app/redux/config') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ChoosePipette', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { vi.mocked(getIsOnDevice).mockReturnValue(false) vi.mocked(getIsGantryEmpty).mockReturnValue(true) diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/DetachPipette.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/DetachPipette.test.tsx index d7777ed368c..a8f85ef3d73 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/DetachPipette.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/DetachPipette.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -19,17 +18,19 @@ import { RUN_ID_1 } from '/app/resources/runs/__fixtures__' import { FLOWS } from '../constants' import { DetachPipette } from '../DetachPipette' +import type { ComponentProps } from 'react' + vi.mock('../CheckPipetteButton') vi.mock('/app/molecules/InProgressModal/InProgressModal') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('DetachPipette', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { selectedPipette: SINGLE_MOUNT_PIPETTES, diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/DetachProbe.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/DetachProbe.test.tsx index 059846aebb5..755c795e0d4 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/DetachProbe.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/DetachProbe.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -12,16 +11,18 @@ import { RUN_ID_1 } from '/app/resources/runs/__fixtures__' import { FLOWS } from '../constants' import { DetachProbe } from '../DetachProbe' +import type { ComponentProps } from 'react' + vi.mock('/app/molecules/InProgressModal/InProgressModal') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('DetachProbe', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { selectedPipette: SINGLE_MOUNT_PIPETTES, diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/ExitModal.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/ExitModal.test.tsx index a30407379a2..b09319fcb94 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/ExitModal.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/ExitModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' @@ -7,14 +6,16 @@ import { i18n } from '/app/i18n' import { FLOWS } from '../constants' import { ExitModal } from '../ExitModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('ExitModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/MountPipette.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/MountPipette.test.tsx index 4c5d9dda2e0..24e8bb926b8 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/MountPipette.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/MountPipette.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, beforeEach, vi } from 'vitest' @@ -16,16 +15,18 @@ import { FLOWS } from '../constants' import { CheckPipetteButton } from '../CheckPipetteButton' import { MountPipette } from '../MountPipette' +import type { ComponentProps } from 'react' + vi.mock('../CheckPipetteButton') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('MountPipette', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { selectedPipette: SINGLE_MOUNT_PIPETTES, diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/MountingPlate.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/MountingPlate.test.tsx index 38744ad1bab..2393d1080d5 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/MountingPlate.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/MountingPlate.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, waitFor, screen } from '@testing-library/react' import { describe, it, expect, beforeEach, vi } from 'vitest' @@ -10,14 +9,16 @@ import { RUN_ID_1 } from '/app/resources/runs/__fixtures__' import { FLOWS } from '../constants' import { MountingPlate } from '../MountingPlate' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('MountingPlate', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { mount: LEFT, diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/Results.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/Results.test.tsx index 3382ac401a0..df53d95cdb7 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/Results.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/Results.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { act, fireEvent, screen, waitFor } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -18,19 +17,20 @@ import { RUN_ID_1 } from '/app/resources/runs/__fixtures__' import { Results } from '../Results' import { FLOWS } from '../constants' +import type { ComponentProps } from 'react' import type { Mock } from 'vitest' vi.mock('@opentrons/react-api-client') vi.mock('/app/resources/robot-settings/hooks') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('Results', () => { - let props: React.ComponentProps + let props: ComponentProps let pipettePromise: Promise let mockRefetchInstruments: Mock beforeEach(() => { diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/UnskippableModal.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/UnskippableModal.test.tsx index bc738d0caf3..f2d51af9a5f 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/UnskippableModal.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/UnskippableModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi } from 'vitest' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { UnskippableModal } from '../UnskippableModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('UnskippableModal', () => { - let props: React.ComponentProps + let props: ComponentProps it('returns the correct information for unskippable modal, pressing return button calls goBack prop', () => { props = { goBack: vi.fn(), diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/hooks.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/hooks.test.tsx index f44bd96fc6e..996ec520af2 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/hooks.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/hooks.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, vi, afterEach, expect } from 'vitest' import { I18nextProvider } from 'react-i18next' import { renderHook } from '@testing-library/react' @@ -16,6 +15,8 @@ import { import { FLOWS } from '../constants' import { usePipetteFlowWizardHeaderText } from '../hooks' +import type { FunctionComponent, ReactNode } from 'react' + const BASE_PROPS_FOR_RUN_SETUP = { flowType: FLOWS.CALIBRATE, selectedPipette: SINGLE_MOUNT_PIPETTES, @@ -23,7 +24,7 @@ const BASE_PROPS_FOR_RUN_SETUP = { } describe('usePipetteFlowWizardHeaderText', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { wrapper = ({ children }) => ( {children} diff --git a/app/src/organisms/PipetteWizardFlows/types.ts b/app/src/organisms/PipetteWizardFlows/types.ts index a8785e8a31c..3870141ab6e 100644 --- a/app/src/organisms/PipetteWizardFlows/types.ts +++ b/app/src/organisms/PipetteWizardFlows/types.ts @@ -1,6 +1,7 @@ -import type { SECTIONS, FLOWS } from './constants' +import type { Dispatch, SetStateAction } from 'react' import type { useCreateCommandMutation } from '@opentrons/react-api-client' import type { PipetteMount, CreateCommand } from '@opentrons/shared-data' +import type { SECTIONS, FLOWS } from './constants' import type { AttachedPipettesFromInstrumentsQuery } from '/app/resources/instruments' export type PipetteWizardStep = @@ -78,7 +79,7 @@ export interface PipetteWizardStepProps { isRobotMoving: boolean maintenanceRunId?: string attachedPipettes: AttachedPipettesFromInstrumentsQuery - setShowErrorMessage: React.Dispatch> + setShowErrorMessage: Dispatch> errorMessage: string | null selectedPipette: SelectablePipettes isOnDevice: boolean | null diff --git a/app/src/organisms/TakeoverModal/TakeoverModal.tsx b/app/src/organisms/TakeoverModal/TakeoverModal.tsx index 8f6441124a7..34a0754609e 100644 --- a/app/src/organisms/TakeoverModal/TakeoverModal.tsx +++ b/app/src/organisms/TakeoverModal/TakeoverModal.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' @@ -18,12 +17,13 @@ import { getTopPortalEl } from '/app/App/portal' import { SmallButton } from '/app/atoms/buttons' import { OddModal } from '/app/molecules/OddModal' +import type { Dispatch, SetStateAction } from 'react' import type { OddModalHeaderBaseProps } from '/app/molecules/OddModal/types' interface TakeoverModalProps { title: string showConfirmTerminateModal: boolean - setShowConfirmTerminateModal: React.Dispatch> + setShowConfirmTerminateModal: Dispatch> confirmTerminate: () => void terminateInProgress: boolean } diff --git a/app/src/organisms/TakeoverModal/__tests__/MaintenanceRunTakeover.test.tsx b/app/src/organisms/TakeoverModal/__tests__/MaintenanceRunTakeover.test.tsx index 94a59aa903a..92c286e9bbd 100644 --- a/app/src/organisms/TakeoverModal/__tests__/MaintenanceRunTakeover.test.tsx +++ b/app/src/organisms/TakeoverModal/__tests__/MaintenanceRunTakeover.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -8,6 +7,7 @@ import { useMaintenanceRunTakeover } from '../useMaintenanceRunTakeover' import { MaintenanceRunTakeover } from '../MaintenanceRunTakeover' import { useNotifyCurrentMaintenanceRun } from '/app/resources/maintenance_runs' +import type { ComponentProps } from 'react' import type { MaintenanceRunStatus } from '../MaintenanceRunStatusProvider' vi.mock('../useMaintenanceRunTakeover') @@ -21,14 +21,14 @@ const MOCK_MAINTENANCE_RUN: MaintenanceRunStatus = { setOddRunIds: () => null, } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('MaintenanceRunTakeover', () => { - let props: React.ComponentProps + let props: ComponentProps const testComponent =
        {'Test Component'}
        beforeEach(() => { diff --git a/app/src/organisms/TakeoverModal/__tests__/TakeoverModal.test.tsx b/app/src/organisms/TakeoverModal/__tests__/TakeoverModal.test.tsx index a902544e4a0..4f3ffd78894 100644 --- a/app/src/organisms/TakeoverModal/__tests__/TakeoverModal.test.tsx +++ b/app/src/organisms/TakeoverModal/__tests__/TakeoverModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -6,14 +5,16 @@ import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { TakeoverModal } from '../TakeoverModal' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('TakeoverModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { showConfirmTerminateModal: false, diff --git a/app/src/organisms/UpdateRobotSoftware/ErrorUpdateSoftware.tsx b/app/src/organisms/UpdateRobotSoftware/ErrorUpdateSoftware.tsx index f1629e15b64..ab1b44991b6 100644 --- a/app/src/organisms/UpdateRobotSoftware/ErrorUpdateSoftware.tsx +++ b/app/src/organisms/UpdateRobotSoftware/ErrorUpdateSoftware.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { @@ -14,9 +13,11 @@ import { TYPOGRAPHY, } from '@opentrons/components' +import type { ReactNode } from 'react' + interface ErrorUpdateSoftwareProps { errorMessage: string - children: React.ReactNode + children: ReactNode } export function ErrorUpdateSoftware({ errorMessage, diff --git a/app/src/organisms/UpdateRobotSoftware/__tests__/CompleteUpdateSoftware.test.tsx b/app/src/organisms/UpdateRobotSoftware/__tests__/CompleteUpdateSoftware.test.tsx index b6b91424b92..be6d9056cc0 100644 --- a/app/src/organisms/UpdateRobotSoftware/__tests__/CompleteUpdateSoftware.test.tsx +++ b/app/src/organisms/UpdateRobotSoftware/__tests__/CompleteUpdateSoftware.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -6,16 +5,18 @@ import { i18n } from '/app/i18n' import { renderWithProviders } from '/app/__testing-utils__' import { CompleteUpdateSoftware } from '../CompleteUpdateSoftware' +import type { ComponentProps } from 'react' + vi.mock('/app/redux/robot-admin') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('CompleteUpdateSoftware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/UpdateRobotSoftware/__tests__/ErrorUpdateSoftware.test.tsx b/app/src/organisms/UpdateRobotSoftware/__tests__/ErrorUpdateSoftware.test.tsx index d1706a4bf18..6f585d31db0 100644 --- a/app/src/organisms/UpdateRobotSoftware/__tests__/ErrorUpdateSoftware.test.tsx +++ b/app/src/organisms/UpdateRobotSoftware/__tests__/ErrorUpdateSoftware.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ErrorUpdateSoftware } from '../ErrorUpdateSoftware' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ErrorUpdateSoftware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/organisms/UpdateRobotSoftware/__tests__/UpdateSoftware.test.tsx b/app/src/organisms/UpdateRobotSoftware/__tests__/UpdateSoftware.test.tsx index 93deeb27956..76344df2c4c 100644 --- a/app/src/organisms/UpdateRobotSoftware/__tests__/UpdateSoftware.test.tsx +++ b/app/src/organisms/UpdateRobotSoftware/__tests__/UpdateSoftware.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -6,14 +5,16 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { UpdateSoftware } from '../UpdateSoftware' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('UpdateSoftware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { updateType: 'downloading', diff --git a/app/src/pages/Desktop/AppSettings/GeneralSettings.tsx b/app/src/pages/Desktop/AppSettings/GeneralSettings.tsx index 85b24816da6..eed4f5be96a 100644 --- a/app/src/pages/Desktop/AppSettings/GeneralSettings.tsx +++ b/app/src/pages/Desktop/AppSettings/GeneralSettings.tsx @@ -1,8 +1,9 @@ // app info card with version and updated -import { useState } from 'react' +import { useState, useEffect } from 'react' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' import { useSelector, useDispatch } from 'react-redux' +import uuidv1 from 'uuid/v4' import { ALIGN_CENTER, @@ -41,6 +42,7 @@ import { import { useTrackEvent, ANALYTICS_APP_UPDATE_NOTIFICATIONS_TOGGLED, + ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_SETTINGS, } from '/app/redux/analytics' import { getAppLanguage, updateConfigValue } from '/app/redux/config' import { UpdateAppModal } from '/app/organisms/Desktop/UpdateAppModal' @@ -55,6 +57,7 @@ const GITHUB_LINK = 'https://github.com/Opentrons/opentrons/blob/edge/app-shell/build/release-notes.md' const ENABLE_APP_UPDATE_NOTIFICATIONS = 'Enable app update notifications' +const uuid: () => string = uuidv1 export function GeneralSettings(): JSX.Element { const { t } = useTranslation(['app_settings', 'shared', 'branded']) @@ -68,9 +71,19 @@ export function GeneralSettings(): JSX.Element { const appLanguage = useSelector(getAppLanguage) const currentLanguageOption = LANGUAGES.find(lng => lng.value === appLanguage) - + let transactionId = '' + useEffect(() => { + transactionId = uuid() + }, []) const handleDropdownClick = (value: string): void => { dispatch(updateConfigValue('language.appLanguage', value)) + trackEvent({ + name: ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_SETTINGS, + properties: { + language: value, + transactionId, + }, + }) } const [showUpdateBanner, setShowUpdateBanner] = useState( diff --git a/app/src/pages/Desktop/AppSettings/__test__/GeneralSettings.test.tsx b/app/src/pages/Desktop/AppSettings/__test__/GeneralSettings.test.tsx index 43d17a4d2cb..a06f4204bd7 100644 --- a/app/src/pages/Desktop/AppSettings/__test__/GeneralSettings.test.tsx +++ b/app/src/pages/Desktop/AppSettings/__test__/GeneralSettings.test.tsx @@ -12,6 +12,10 @@ import { US_ENGLISH_DISPLAY_NAME, } from '/app/i18n' import { getAlertIsPermanentlyIgnored } from '/app/redux/alerts' +import { + ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_SETTINGS, + useTrackEvent, +} from '/app/redux/analytics' import { getAppLanguage, updateConfigValue } from '/app/redux/config' import * as Shell from '/app/redux/shell' import { GeneralSettings } from '../GeneralSettings' @@ -32,11 +36,14 @@ const render = (): ReturnType => { ) } +const mockTrackEvent = vi.fn() + describe('GeneralSettings', () => { beforeEach(() => { vi.mocked(Shell.getAvailableShellUpdate).mockReturnValue(null) vi.mocked(getAlertIsPermanentlyIgnored).mockReturnValue(false) vi.mocked(getAppLanguage).mockReturnValue(US_ENGLISH) + vi.mocked(useTrackEvent).mockReturnValue(mockTrackEvent) }) afterEach(() => { vi.resetAllMocks() @@ -118,5 +125,12 @@ describe('GeneralSettings', () => { 'language.appLanguage', SIMPLIFIED_CHINESE ) + expect(mockTrackEvent).toHaveBeenCalledWith({ + name: ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_SETTINGS, + properties: { + language: SIMPLIFIED_CHINESE, + transactionId: expect.anything(), + }, + }) }) }) diff --git a/app/src/pages/Desktop/Labware/__tests__/hooks.test.tsx b/app/src/pages/Desktop/Labware/__tests__/hooks.test.tsx index 5fe55c260dc..c2edcacd08a 100644 --- a/app/src/pages/Desktop/Labware/__tests__/hooks.test.tsx +++ b/app/src/pages/Desktop/Labware/__tests__/hooks.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { Provider } from 'react-redux' import { createStore } from 'redux' import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' @@ -20,6 +19,7 @@ import { import { useLabwareFailure, useNewLabwareName } from '../hooks' import { useAllLabware } from '/app/local-resources/labware' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' import type { FailedLabwareFile } from '/app/redux/custom-labware/types' @@ -39,7 +39,7 @@ describe('useAllLabware hook', () => { }) it('should return object with only definition and modified date', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook(() => useAllLabware('reverse', 'all'), { @@ -53,7 +53,7 @@ describe('useAllLabware hook', () => { expect(labware2.definition).toBe(mockValidLabware.definition) }) it('should return alphabetically sorted list', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook(() => useAllLabware('alphabetical', 'all'), { @@ -67,7 +67,7 @@ describe('useAllLabware hook', () => { expect(labware1.definition).toBe(mockValidLabware.definition) }) it('should return no labware if not the right filter', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook(() => useAllLabware('reverse', 'reservoir'), { @@ -80,7 +80,7 @@ describe('useAllLabware hook', () => { expect(labware2).toBe(undefined) }) it('should return labware with wellPlate filter', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook(() => useAllLabware('reverse', 'wellPlate'), { @@ -94,7 +94,7 @@ describe('useAllLabware hook', () => { expect(labware2.definition).toBe(mockValidLabware.definition) }) it('should return custom labware with customLabware filter', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook( @@ -127,7 +127,7 @@ describe('useLabwareFailure hook', () => { vi.restoreAllMocks() }) it('should return invalid labware definition', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -147,7 +147,7 @@ describe('useLabwareFailure hook', () => { errorMessage: null, }) - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -170,7 +170,7 @@ describe('useLabwareFailure hook', () => { errorMessage: null, }) - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -190,7 +190,7 @@ describe('useLabwareFailure hook', () => { errorMessage: 'error', }) - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( @@ -217,7 +217,7 @@ describe('useNewLabwareName hook', () => { }) it('should return filename as a string', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook(useNewLabwareName, { wrapper }) diff --git a/app/src/pages/ODD/ChooseLanguage/__tests__/ChooseLanguage.test.tsx b/app/src/pages/ODD/ChooseLanguage/__tests__/ChooseLanguage.test.tsx index 8508a7b4d08..fa5c793e2d2 100644 --- a/app/src/pages/ODD/ChooseLanguage/__tests__/ChooseLanguage.test.tsx +++ b/app/src/pages/ODD/ChooseLanguage/__tests__/ChooseLanguage.test.tsx @@ -1,10 +1,12 @@ -import { vi, it, describe, expect } from 'vitest' +import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' -import { updateConfigValue } from '/app/redux/config' +import { ANALYTICS_LANGUAGE_UPDATED_ODD_UNBOXING_FLOW } from '/app/redux/analytics' +import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' +import { updateConfigValue, getAppLanguage } from '/app/redux/config' import { ChooseLanguage } from '..' import type { NavigateFunction } from 'react-router-dom' @@ -18,6 +20,9 @@ vi.mock('react-router-dom', async importOriginal => { } }) vi.mock('/app/redux/config') +vi.mock('/app/redux-resources/analytics') + +const mockTrackEvent = vi.fn() const render = () => { return renderWithProviders( @@ -31,6 +36,12 @@ const render = () => { } describe('ChooseLanguage', () => { + beforeEach(() => { + vi.mocked(useTrackEventWithRobotSerial).mockReturnValue({ + trackEventWithRobotSerial: mockTrackEvent, + }) + vi.mocked(getAppLanguage).mockReturnValue('en-US') + }) it('should render text, language options, and continue button', () => { render() screen.getByText('Choose your language') @@ -54,6 +65,12 @@ describe('ChooseLanguage', () => { it('should call mockNavigate when tapping continue', () => { render() fireEvent.click(screen.getByRole('button', { name: 'Continue' })) + expect(mockTrackEvent).toHaveBeenCalledWith({ + name: ANALYTICS_LANGUAGE_UPDATED_ODD_UNBOXING_FLOW, + properties: { + language: 'en-US', + }, + }) expect(mockNavigate).toHaveBeenCalledWith('/welcome') }) }) diff --git a/app/src/pages/ODD/ChooseLanguage/index.tsx b/app/src/pages/ODD/ChooseLanguage/index.tsx index d0110e68591..8ecb87451f7 100644 --- a/app/src/pages/ODD/ChooseLanguage/index.tsx +++ b/app/src/pages/ODD/ChooseLanguage/index.tsx @@ -13,6 +13,8 @@ import { TYPOGRAPHY, } from '@opentrons/components' +import { ANALYTICS_LANGUAGE_UPDATED_ODD_UNBOXING_FLOW } from '/app/redux/analytics' +import { useTrackEventWithRobotSerial } from '/app/redux-resources/analytics' import { MediumButton } from '/app/atoms/buttons' import { LANGUAGES, US_ENGLISH } from '/app/i18n' import { RobotSetupHeader } from '/app/organisms/ODD/RobotSetupHeader' @@ -24,6 +26,7 @@ export function ChooseLanguage(): JSX.Element { const { i18n, t } = useTranslation(['app_settings', 'shared']) const navigate = useNavigate() const dispatch = useDispatch() + const { trackEventWithRobotSerial } = useTrackEventWithRobotSerial() const appLanguage = useSelector(getAppLanguage) @@ -69,6 +72,12 @@ export function ChooseLanguage(): JSX.Element { { + trackEventWithRobotSerial({ + name: ANALYTICS_LANGUAGE_UPDATED_ODD_UNBOXING_FLOW, + properties: { + language: appLanguage, + }, + }) navigate('/welcome') }} width="100%" diff --git a/app/src/pages/ODD/ConnectViaEthernet/__tests__/DisplayConnectionStatus.test.tsx b/app/src/pages/ODD/ConnectViaEthernet/__tests__/DisplayConnectionStatus.test.tsx index 9efbfd5c3dc..0caa3a6ba10 100644 --- a/app/src/pages/ODD/ConnectViaEthernet/__tests__/DisplayConnectionStatus.test.tsx +++ b/app/src/pages/ODD/ConnectViaEthernet/__tests__/DisplayConnectionStatus.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -6,6 +5,7 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { DisplayConnectionStatus } from '../DisplayConnectionStatus' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const mockFunc = vi.fn() @@ -18,16 +18,14 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = ( - props: React.ComponentProps -) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('DisplayConnectionStatus', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/pages/ODD/ConnectViaEthernet/__tests__/TitleHeader.test.tsx b/app/src/pages/ODD/ConnectViaEthernet/__tests__/TitleHeader.test.tsx index cffa8e9c63a..8c8667619b9 100644 --- a/app/src/pages/ODD/ConnectViaEthernet/__tests__/TitleHeader.test.tsx +++ b/app/src/pages/ODD/ConnectViaEthernet/__tests__/TitleHeader.test.tsx @@ -1,10 +1,10 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '/app/__testing-utils__' import { TitleHeader } from '../TitleHeader' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' const mockNavigate = vi.fn() @@ -16,12 +16,12 @@ vi.mock('react-router-dom', async importOriginal => { } }) -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders() } describe('TitleHeader', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/pages/ODD/ConnectViaWifi/SetWifiCred.tsx b/app/src/pages/ODD/ConnectViaWifi/SetWifiCred.tsx index e2716fc2282..2d81286d058 100644 --- a/app/src/pages/ODD/ConnectViaWifi/SetWifiCred.tsx +++ b/app/src/pages/ODD/ConnectViaWifi/SetWifiCred.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useTranslation } from 'react-i18next' import { Flex, DIRECTION_COLUMN } from '@opentrons/components' @@ -6,13 +5,14 @@ import { Flex, DIRECTION_COLUMN } from '@opentrons/components' import { SetWifiCred as SetWifiCredComponent } from '/app/organisms/ODD/NetworkSettings' import { RobotSetupHeader } from '/app/organisms/ODD/RobotSetupHeader' +import type { Dispatch, SetStateAction } from 'react' import type { WifiScreenOption } from './' interface SetWifiCredProps { handleConnect: () => void password: string setCurrentOption: (option: WifiScreenOption) => void - setPassword: React.Dispatch> + setPassword: Dispatch> } export function SetWifiCred({ diff --git a/app/src/pages/ODD/InitialLoadingScreen/index.tsx b/app/src/pages/ODD/InitialLoadingScreen/index.tsx index f35fad13b56..003d37e549e 100644 --- a/app/src/pages/ODD/InitialLoadingScreen/index.tsx +++ b/app/src/pages/ODD/InitialLoadingScreen/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { useSelector } from 'react-redux' import { ALIGN_CENTER, @@ -12,10 +11,12 @@ import { import { useRobotSettingsQuery } from '@opentrons/react-api-client' import { getIsShellReady } from '/app/redux/shell' +import type { ReactNode } from 'react' + export function InitialLoadingScreen({ children, }: { - children?: React.ReactNode + children?: ReactNode }): JSX.Element { const isShellReady = useSelector(getIsShellReady) diff --git a/app/src/pages/ODD/InstrumentsDashboard/index.tsx b/app/src/pages/ODD/InstrumentsDashboard/index.tsx index acc88714979..49268c0ec51 100644 --- a/app/src/pages/ODD/InstrumentsDashboard/index.tsx +++ b/app/src/pages/ODD/InstrumentsDashboard/index.tsx @@ -7,6 +7,7 @@ import { AttachedInstrumentMountItem } from '/app/organisms/ODD/InstrumentMountI import { GripperWizardFlows } from '/app/organisms/GripperWizardFlows' import { getShowPipetteCalibrationWarning } from '/app/transformations/instruments' import { PipetteRecalibrationODDWarning } from '/app/organisms/ODD/PipetteRecalibrationODDWarning' +import type { ComponentProps } from 'react' import type { GripperData, PipetteData } from '@opentrons/api-client' const FETCH_PIPETTE_CAL_POLL = 10000 @@ -16,8 +17,8 @@ export const InstrumentsDashboard = (): JSX.Element => { refetchInterval: FETCH_PIPETTE_CAL_POLL, }) const [wizardProps, setWizardProps] = useState< - | React.ComponentProps - | React.ComponentProps + | ComponentProps + | ComponentProps | null >(null) diff --git a/app/src/pages/ODD/NameRobot/index.tsx b/app/src/pages/ODD/NameRobot/index.tsx index b0162041963..1417adbbf37 100644 --- a/app/src/pages/ODD/NameRobot/index.tsx +++ b/app/src/pages/ODD/NameRobot/index.tsx @@ -23,6 +23,7 @@ import { TYPOGRAPHY, } from '@opentrons/components' import { useUpdateRobotNameMutation } from '@opentrons/react-api-client' +import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' import { removeRobot, @@ -166,6 +167,7 @@ export function NameRobot(): JSX.Element { properties: { previousRobotName: previousName, newRobotName: newRobotName, + robotType: FLEX_ROBOT_TYPE, }, }) handleSubmit(onSubmit)() diff --git a/app/src/pages/ODD/ProtocolDashboard/PinnedProtocolCarousel.tsx b/app/src/pages/ODD/ProtocolDashboard/PinnedProtocolCarousel.tsx index 59e9fc5c117..267b77a5cea 100644 --- a/app/src/pages/ODD/ProtocolDashboard/PinnedProtocolCarousel.tsx +++ b/app/src/pages/ODD/ProtocolDashboard/PinnedProtocolCarousel.tsx @@ -1,4 +1,4 @@ -import type * as React from 'react' +import styled from 'styled-components' import { ALIGN_FLEX_START, DIRECTION_ROW, @@ -9,13 +9,13 @@ import { import { useNotifyAllRunsQuery } from '/app/resources/runs' import { PinnedProtocol } from './PinnedProtocol' +import type { Dispatch, SetStateAction } from 'react' import type { ProtocolResource } from '@opentrons/shared-data' import type { CardSizeType } from './PinnedProtocol' -import styled from 'styled-components' interface PinnedProtocolCarouselProps { pinnedProtocols: ProtocolResource[] - longPress: React.Dispatch> + longPress: Dispatch> setShowDeleteConfirmationModal: (showDeleteConfirmationModal: boolean) => void setTargetProtocolId: (targetProtocolId: string) => void isRequiredCSV?: boolean diff --git a/app/src/pages/ODD/ProtocolDashboard/ProtocolCard.tsx b/app/src/pages/ODD/ProtocolDashboard/ProtocolCard.tsx index 61a0bcb9061..6786205d889 100644 --- a/app/src/pages/ODD/ProtocolDashboard/ProtocolCard.tsx +++ b/app/src/pages/ODD/ProtocolDashboard/ProtocolCard.tsx @@ -35,6 +35,7 @@ import { LongPressModal } from './LongPressModal' import { formatTimeWithUtcLabel } from '/app/resources/runs' import { useUpdatedLastRunTime } from '/app/pages/ODD/ProtocolDashboard/hooks' +import type { Dispatch, SetStateAction } from 'react' import type { UseLongPressResult } from '@opentrons/components' import type { ProtocolResource } from '@opentrons/shared-data' import type { OddModalHeaderBaseProps } from '/app/molecules/OddModal/types' @@ -43,7 +44,7 @@ const REFETCH_INTERVAL = 5000 interface ProtocolCardProps { protocol: ProtocolResource - longPress: React.Dispatch> + longPress: Dispatch> setShowDeleteConfirmationModal: (showDeleteConfirmationModal: boolean) => void setTargetProtocolId: (targetProtocolId: string) => void lastRun?: string diff --git a/app/src/pages/ODD/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx b/app/src/pages/ODD/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx index 1c55405dbde..059e62f85e5 100644 --- a/app/src/pages/ODD/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx +++ b/app/src/pages/ODD/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { act, fireEvent, screen } from '@testing-library/react' @@ -10,6 +9,8 @@ import { useHost, useProtocolQuery } from '@opentrons/react-api-client' import { i18n } from '/app/i18n' import { useToaster } from '/app/organisms/ToasterOven' import { DeleteProtocolConfirmationModal } from '../DeleteProtocolConfirmationModal' + +import type { ComponentProps } from 'react' import type { HostConfig } from '@opentrons/api-client' vi.mock('@opentrons/api-client') @@ -22,7 +23,7 @@ const mockMakeSnackbar = vi.fn() const MOCK_HOST_CONFIG = {} as HostConfig const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -30,7 +31,7 @@ const render = ( } describe('DeleteProtocolConfirmationModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/pages/ODD/ProtocolDashboard/__tests__/PinnedProtocol.test.tsx b/app/src/pages/ODD/ProtocolDashboard/__tests__/PinnedProtocol.test.tsx index f92904573d0..a98f0478d6d 100644 --- a/app/src/pages/ODD/ProtocolDashboard/__tests__/PinnedProtocol.test.tsx +++ b/app/src/pages/ODD/ProtocolDashboard/__tests__/PinnedProtocol.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { act, fireEvent, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' @@ -10,9 +9,10 @@ import { i18n } from '/app/i18n' import { useFeatureFlag } from '/app/redux/config' import { PinnedProtocol } from '../PinnedProtocol' +import type { ComponentProps } from 'react' +import type { NavigateFunction } from 'react-router-dom' import type { Chip } from '@opentrons/components' import type { ProtocolResource } from '@opentrons/shared-data' -import type { NavigateFunction } from 'react-router-dom' const mockNavigate = vi.fn() @@ -50,7 +50,7 @@ const mockProtocol: ProtocolResource = { key: '26ed5a82-502f-4074-8981-57cdda1d066d', } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -62,7 +62,7 @@ const render = (props: React.ComponentProps) => { } describe('Pinned Protocol', () => { - let props: React.ComponentProps + let props: ComponentProps vi.useFakeTimers() beforeEach(() => { diff --git a/app/src/pages/ODD/ProtocolDashboard/__tests__/ProtocolCard.test.tsx b/app/src/pages/ODD/ProtocolDashboard/__tests__/ProtocolCard.test.tsx index c26b429e29e..5f1587242d8 100644 --- a/app/src/pages/ODD/ProtocolDashboard/__tests__/ProtocolCard.test.tsx +++ b/app/src/pages/ODD/ProtocolDashboard/__tests__/ProtocolCard.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { act, fireEvent, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' @@ -14,6 +13,7 @@ import { i18n } from '/app/i18n' import { useFeatureFlag } from '/app/redux/config' import { ProtocolCard } from '../ProtocolCard' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' import type { UseQueryResult } from 'react-query' import type { @@ -77,7 +77,7 @@ const mockProtocolWithCSV: ProtocolResource = { key: '26ed5a82-502f-4074-8981-57cdda1d066d', } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders( @@ -89,7 +89,7 @@ const render = (props: React.ComponentProps) => { } describe('ProtocolCard', () => { - let props: React.ComponentProps + let props: ComponentProps vi.useFakeTimers() beforeEach(() => { diff --git a/app/src/pages/ODD/ProtocolDetails/__tests__/Deck.test.tsx b/app/src/pages/ODD/ProtocolDetails/__tests__/Deck.test.tsx index a99e2c3f82e..902cd1d3b8c 100644 --- a/app/src/pages/ODD/ProtocolDetails/__tests__/Deck.test.tsx +++ b/app/src/pages/ODD/ProtocolDetails/__tests__/Deck.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' import { when } from 'vitest-when' @@ -12,6 +11,7 @@ import { import { i18n } from '/app/i18n' import { Deck } from '../Deck' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' import type { Protocol } from '@opentrons/api-client' @@ -141,14 +141,14 @@ const MOCK_PROTOCOL_ANALYSIS = { ], } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Deck', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { protocolId: MOCK_PROTOCOL_ID, diff --git a/app/src/pages/ODD/ProtocolDetails/__tests__/EmptySection.test.tsx b/app/src/pages/ODD/ProtocolDetails/__tests__/EmptySection.test.tsx index 32b388ef1f3..9c1832fc08f 100644 --- a/app/src/pages/ODD/ProtocolDetails/__tests__/EmptySection.test.tsx +++ b/app/src/pages/ODD/ProtocolDetails/__tests__/EmptySection.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { it, describe } from 'vitest' import { screen } from '@testing-library/react' import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { EmptySection } from '../EmptySection' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, })[0] } describe('EmptySection', () => { - let props: React.ComponentProps + let props: ComponentProps it('should render text for labware', () => { props = { diff --git a/app/src/pages/ODD/ProtocolDetails/__tests__/Hardware.test.tsx b/app/src/pages/ODD/ProtocolDetails/__tests__/Hardware.test.tsx index a8f78c8a121..7d03ce6ba3d 100644 --- a/app/src/pages/ODD/ProtocolDetails/__tests__/Hardware.test.tsx +++ b/app/src/pages/ODD/ProtocolDetails/__tests__/Hardware.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' import { when } from 'vitest-when' @@ -12,19 +11,21 @@ import { i18n } from '/app/i18n' import { useRequiredProtocolHardware } from '/app/resources/protocols' import { Hardware } from '../Hardware' +import type { ComponentProps } from 'react' + vi.mock('/app/resources/protocols') vi.mock('/app/redux/config') const MOCK_PROTOCOL_ID = 'mock_protocol_id' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Hardware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { protocolId: MOCK_PROTOCOL_ID, diff --git a/app/src/pages/ODD/ProtocolDetails/__tests__/Labware.test.tsx b/app/src/pages/ODD/ProtocolDetails/__tests__/Labware.test.tsx index 0c1aab61196..14568a6ceb3 100644 --- a/app/src/pages/ODD/ProtocolDetails/__tests__/Labware.test.tsx +++ b/app/src/pages/ODD/ProtocolDetails/__tests__/Labware.test.tsx @@ -1,10 +1,6 @@ -import type * as React from 'react' import { vi, it, describe, beforeEach, afterEach } from 'vitest' +import { screen } from '@testing-library/react' import { when } from 'vitest-when' -import { renderWithProviders } from '/app/__testing-utils__' -import { i18n } from '/app/i18n' -import { useRequiredProtocolLabware } from '/app/resources/protocols' -import { Labware } from '../Labware' import { fixtureTiprack10ul, @@ -12,21 +8,26 @@ import { fixture96Plate, } from '@opentrons/shared-data' +import { renderWithProviders } from '/app/__testing-utils__' +import { i18n } from '/app/i18n' +import { useRequiredProtocolLabware } from '/app/resources/protocols' +import { Labware } from '../Labware' + +import type { ComponentProps } from 'react' import type { LabwareDefinition2 } from '@opentrons/shared-data' -import { screen } from '@testing-library/react' vi.mock('/app/resources/protocols') const MOCK_PROTOCOL_ID = 'mock_protocol_id' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Labware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { protocolId: MOCK_PROTOCOL_ID, diff --git a/app/src/pages/ODD/ProtocolDetails/__tests__/Liquids.test.tsx b/app/src/pages/ODD/ProtocolDetails/__tests__/Liquids.test.tsx index be019dd6cf1..23233c6c50d 100644 --- a/app/src/pages/ODD/ProtocolDetails/__tests__/Liquids.test.tsx +++ b/app/src/pages/ODD/ProtocolDetails/__tests__/Liquids.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, beforeEach } from 'vitest' import { when } from 'vitest-when' import { screen } from '@testing-library/react' @@ -16,6 +15,7 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { Liquids } from '../Liquids' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { Protocol } from '@opentrons/api-client' import type * as SharedData from '@opentrons/shared-data' @@ -180,14 +180,14 @@ const MOCK_LABWARE_INFO_BY_LIQUID_ID = { ], } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Liquids', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { protocolId: MOCK_PROTOCOL_ID, diff --git a/app/src/pages/ODD/ProtocolDetails/__tests__/Parameters.test.tsx b/app/src/pages/ODD/ProtocolDetails/__tests__/Parameters.test.tsx index f41115cf638..b2d60c57c92 100644 --- a/app/src/pages/ODD/ProtocolDetails/__tests__/Parameters.test.tsx +++ b/app/src/pages/ODD/ProtocolDetails/__tests__/Parameters.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { it, describe, beforeEach, vi } from 'vitest' import { screen } from '@testing-library/react' @@ -9,17 +8,19 @@ import { useRunTimeParameters } from '/app/resources/protocols' import { Parameters } from '../Parameters' import { mockRunTimeParameterData } from '/app/organisms/ODD/ProtocolSetup/__fixtures__' +import type { ComponentProps } from 'react' + vi.mock('/app/organisms/ToasterOven') vi.mock('/app/resources/protocols') -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } const MOCK_MAKE_SNACK_BAR = vi.fn() describe('Parameters', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/pages/ODD/ProtocolSetup/__tests__/ConfirmAttachedModal.test.tsx b/app/src/pages/ODD/ProtocolSetup/__tests__/ConfirmAttachedModal.test.tsx index f06e36df20d..5a9b2ea98bc 100644 --- a/app/src/pages/ODD/ProtocolSetup/__tests__/ConfirmAttachedModal.test.tsx +++ b/app/src/pages/ODD/ProtocolSetup/__tests__/ConfirmAttachedModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -7,17 +6,19 @@ import { renderWithProviders } from '/app/__testing-utils__' import { i18n } from '/app/i18n' import { ConfirmAttachedModal } from '../ConfirmAttachedModal' +import type { ComponentProps } from 'react' + const mockOnCloseClick = vi.fn() const mockOnConfirmClick = vi.fn() -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('ConfirmAttachedModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/pages/ODD/QuickTransferDashboard/PinnedTransferCarousel.tsx b/app/src/pages/ODD/QuickTransferDashboard/PinnedTransferCarousel.tsx index 8b6554c3aa1..fc5b127b437 100644 --- a/app/src/pages/ODD/QuickTransferDashboard/PinnedTransferCarousel.tsx +++ b/app/src/pages/ODD/QuickTransferDashboard/PinnedTransferCarousel.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import styled from 'styled-components' import { ALIGN_FLEX_START, @@ -11,12 +10,13 @@ import { import { PinnedTransfer } from './PinnedTransfer' +import type { Dispatch, SetStateAction } from 'react' import type { ProtocolResource } from '@opentrons/shared-data' import type { CardSizeType } from './PinnedTransfer' export function PinnedTransferCarousel(props: { pinnedTransfers: ProtocolResource[] - longPress: React.Dispatch> + longPress: Dispatch> setShowDeleteConfirmationModal: (showDeleteConfirmationModal: boolean) => void setTargetTransferId: (targetTransferId: string) => void }): JSX.Element { diff --git a/app/src/pages/ODD/QuickTransferDashboard/__tests__/DeleteTransferConfirmationModal.test.tsx b/app/src/pages/ODD/QuickTransferDashboard/__tests__/DeleteTransferConfirmationModal.test.tsx index 1b42a6a5e3e..e7cb5ad92e6 100644 --- a/app/src/pages/ODD/QuickTransferDashboard/__tests__/DeleteTransferConfirmationModal.test.tsx +++ b/app/src/pages/ODD/QuickTransferDashboard/__tests__/DeleteTransferConfirmationModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { act, fireEvent, screen } from '@testing-library/react' @@ -11,6 +10,7 @@ import { i18n } from '/app/i18n' import { useToaster } from '/app/organisms/ToasterOven' import { DeleteTransferConfirmationModal } from '../DeleteTransferConfirmationModal' +import type { ComponentProps } from 'react' import type { NavigateFunction } from 'react-router-dom' import type { HostConfig } from '@opentrons/api-client' @@ -33,7 +33,7 @@ const mockMakeSnackbar = vi.fn() const MOCK_HOST_CONFIG = {} as HostConfig const render = ( - props: React.ComponentProps + props: ComponentProps ) => { return renderWithProviders(, { i18nInstance: i18n, @@ -41,7 +41,7 @@ const render = ( } describe('DeleteTransferConfirmationModal', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/app/src/pages/ODD/QuickTransferDetails/__tests__/Deck.test.tsx b/app/src/pages/ODD/QuickTransferDetails/__tests__/Deck.test.tsx index e15296037d5..415a25fdc65 100644 --- a/app/src/pages/ODD/QuickTransferDetails/__tests__/Deck.test.tsx +++ b/app/src/pages/ODD/QuickTransferDetails/__tests__/Deck.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' import { when } from 'vitest-when' @@ -12,6 +11,7 @@ import { import { i18n } from '/app/i18n' import { Deck } from '../Deck' +import type { ComponentProps } from 'react' import type { UseQueryResult } from 'react-query' import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' import type { Protocol } from '@opentrons/api-client' @@ -141,14 +141,14 @@ const MOCK_PROTOCOL_ANALYSIS = { ], } -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Deck', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { transferId: MOCK_PROTOCOL_ID, diff --git a/app/src/pages/ODD/QuickTransferDetails/__tests__/Hardware.test.tsx b/app/src/pages/ODD/QuickTransferDetails/__tests__/Hardware.test.tsx index 2b4af1a5178..a5f707fdf85 100644 --- a/app/src/pages/ODD/QuickTransferDetails/__tests__/Hardware.test.tsx +++ b/app/src/pages/ODD/QuickTransferDetails/__tests__/Hardware.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' import { when } from 'vitest-when' @@ -12,20 +11,22 @@ import { i18n } from '/app/i18n' import { useRequiredProtocolHardware } from '/app/resources/protocols' import { Hardware } from '../Hardware' +import type { ComponentProps } from 'react' + vi.mock('/app/transformations/commands') vi.mock('/app/resources/protocols') vi.mock('/app/redux/config') const MOCK_PROTOCOL_ID = 'mock_protocol_id' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Hardware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { transferId: MOCK_PROTOCOL_ID, diff --git a/app/src/pages/ODD/QuickTransferDetails/__tests__/Labware.test.tsx b/app/src/pages/ODD/QuickTransferDetails/__tests__/Labware.test.tsx index 7dd49d4f279..09f09f73718 100644 --- a/app/src/pages/ODD/QuickTransferDetails/__tests__/Labware.test.tsx +++ b/app/src/pages/ODD/QuickTransferDetails/__tests__/Labware.test.tsx @@ -1,32 +1,31 @@ -import type * as React from 'react' import { vi, it, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' -import { renderWithProviders } from '/app/__testing-utils__' -import { i18n } from '/app/i18n' -import { useRequiredProtocolLabware } from '/app/resources/protocols' -import { Labware } from '../Labware' - +import { screen } from '@testing-library/react' import { fixtureTiprack10ul, fixtureTiprack300ul, fixture96Plate, } from '@opentrons/shared-data' +import { renderWithProviders } from '/app/__testing-utils__' +import { i18n } from '/app/i18n' +import { useRequiredProtocolLabware } from '/app/resources/protocols' +import { Labware } from '../Labware' +import type { ComponentProps } from 'react' import type { LabwareDefinition2 } from '@opentrons/shared-data' -import { screen } from '@testing-library/react' vi.mock('/app/resources/protocols') const MOCK_PROTOCOL_ID = 'mock_protocol_id' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('Labware', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { transferId: MOCK_PROTOCOL_ID, diff --git a/app/src/pages/ODD/RobotDashboard/__tests__/WelcomeModal.test.tsx b/app/src/pages/ODD/RobotDashboard/__tests__/WelcomeModal.test.tsx index 7fc9bf46ea2..8258f29f281 100644 --- a/app/src/pages/ODD/RobotDashboard/__tests__/WelcomeModal.test.tsx +++ b/app/src/pages/ODD/RobotDashboard/__tests__/WelcomeModal.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -9,6 +8,7 @@ import { i18n } from '/app/i18n' import { updateConfigValue } from '/app/redux/config' import { WelcomeModal } from '../WelcomeModal' +import type { ComponentProps } from 'react' import type { SetStatusBarCreateCommand } from '@opentrons/shared-data' vi.mock('/app/redux/config') @@ -17,14 +17,14 @@ vi.mock('@opentrons/react-api-client') const mockFunc = vi.fn() const WELCOME_MODAL_IMAGE_NAME = 'welcome_dashboard_modal.png' -const render = (props: React.ComponentProps) => { +const render = (props: ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } describe('WelcomeModal', () => { - let props: React.ComponentProps + let props: ComponentProps let mockCreateLiveCommand = vi.fn() beforeEach(() => { diff --git a/app/src/redux-resources/analytics/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx b/app/src/redux-resources/analytics/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx index b99b66c8816..1f0501e0c96 100644 --- a/app/src/redux-resources/analytics/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx +++ b/app/src/redux-resources/analytics/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { renderHook, waitFor } from '@testing-library/react' @@ -14,6 +13,8 @@ import { useStoredProtocolAnalysis } from '/app/resources/analysis' import { useProtocolMetadata } from '/app/resources/protocols' import { formatInterval } from '/app/transformations/commands' import { mockConnectableRobot } from '/app/redux/discovery/__fixtures__' + +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' vi.mock('/app/redux/analytics/hash') @@ -23,7 +24,7 @@ vi.mock('/app/resources/analysis') vi.mock('/app/resources/runs') vi.mock('/app/transformations/commands') -let wrapper: React.FunctionComponent<{ children: React.ReactNode }> +let wrapper: FunctionComponent<{ children: ReactNode }> let store: Store = createStore(vi.fn(), {}) const RUN_ID = '1' diff --git a/app/src/redux-resources/analytics/hooks/__tests__/useRobotAnalyticsData.test.tsx b/app/src/redux-resources/analytics/hooks/__tests__/useRobotAnalyticsData.test.tsx index a781d71c495..bdb7407f843 100644 --- a/app/src/redux-resources/analytics/hooks/__tests__/useRobotAnalyticsData.test.tsx +++ b/app/src/redux-resources/analytics/hooks/__tests__/useRobotAnalyticsData.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { renderHook } from '@testing-library/react' @@ -18,6 +17,7 @@ import { getRobotSerialNumber, } from '/app/redux/discovery' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { DiscoveredRobot } from '/app/redux/discovery/types' import type { AttachedPipettesByMount } from '/app/redux/pipettes/types' @@ -41,7 +41,7 @@ const ATTACHED_PIPETTES = { } const ROBOT_SERIAL_NUMBER = 'OT123' -let wrapper: React.FunctionComponent<{ children: React.ReactNode }> +let wrapper: FunctionComponent<{ children: ReactNode }> let store: Store = createStore(vi.fn(), {}) describe('useRobotAnalyticsData hook', () => { diff --git a/app/src/redux-resources/analytics/hooks/__tests__/useTrackProtocolRunEvent.test.tsx b/app/src/redux-resources/analytics/hooks/__tests__/useTrackProtocolRunEvent.test.tsx index f769dc005c4..b387efa58fd 100644 --- a/app/src/redux-resources/analytics/hooks/__tests__/useTrackProtocolRunEvent.test.tsx +++ b/app/src/redux-resources/analytics/hooks/__tests__/useTrackProtocolRunEvent.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { createStore } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' @@ -12,9 +11,11 @@ import { useTrackEvent, ANALYTICS_PROTOCOL_RUN_ACTION, } from '/app/redux/analytics' +import { getAppLanguage } from '/app/redux/config' import { mockConnectableRobot } from '/app/redux/discovery/__fixtures__' import { useRobot } from '/app/redux-resources/robots' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { Mock } from 'vitest' @@ -23,6 +24,7 @@ vi.mock('../useProtocolRunAnalyticsData') vi.mock('/app/redux/discovery') vi.mock('/app/redux/pipettes') vi.mock('/app/redux/analytics') +vi.mock('/app/redux/config') vi.mock('/app/redux/robot-settings') const RUN_ID = 'runId' @@ -31,7 +33,7 @@ const PROTOCOL_PROPERTIES = { protocolType: 'python' } let mockTrackEvent: Mock let mockGetProtocolRunAnalyticsData: Mock -let wrapper: React.FunctionComponent<{ children: React.ReactNode }> +let wrapper: FunctionComponent<{ children: ReactNode }> let store: Store = createStore(vi.fn(), {}) describe('useTrackProtocolRunEvent hook', () => { @@ -55,6 +57,7 @@ describe('useTrackProtocolRunEvent hook', () => { ) vi.mocked(useRobot).mockReturnValue(mockConnectableRobot) vi.mocked(useTrackEvent).mockReturnValue(mockTrackEvent) + vi.mocked(getAppLanguage).mockReturnValue('en-US') when(vi.mocked(useProtocolRunAnalyticsData)) .calledWith(RUN_ID, mockConnectableRobot) @@ -88,7 +91,11 @@ describe('useTrackProtocolRunEvent hook', () => { ) expect(mockTrackEvent).toHaveBeenCalledWith({ name: ANALYTICS_PROTOCOL_RUN_ACTION.START, - properties: { ...PROTOCOL_PROPERTIES, transactionId: RUN_ID }, + properties: { + ...PROTOCOL_PROPERTIES, + transactionId: RUN_ID, + appLanguage: 'en-US', + }, }) }) diff --git a/app/src/redux-resources/analytics/hooks/useTrackProtocolRunEvent.ts b/app/src/redux-resources/analytics/hooks/useTrackProtocolRunEvent.ts index 05c3ce16746..0603994d4b4 100644 --- a/app/src/redux-resources/analytics/hooks/useTrackProtocolRunEvent.ts +++ b/app/src/redux-resources/analytics/hooks/useTrackProtocolRunEvent.ts @@ -1,5 +1,7 @@ +import { useSelector } from 'react-redux' import { useTrackEvent } from '/app/redux/analytics' import { useProtocolRunAnalyticsData } from './useProtocolRunAnalyticsData' +import { getAppLanguage } from '/app/redux/config' import { useRobot } from '/app/redux-resources/robots' interface ProtocolRunAnalyticsEvent { @@ -21,7 +23,7 @@ export function useTrackProtocolRunEvent( runId, robot ) - + const appLanguage = useSelector(getAppLanguage) const trackProtocolRunEvent: TrackProtocolRunEvent = ({ name, properties = {}, @@ -37,6 +39,7 @@ export function useTrackProtocolRunEvent( // It's sometimes unavoidable (namely on the desktop app) to prevent sending an event multiple times. // In these circumstances, we need an idempotency key to accurately filter events in Mixpanel. transactionId: runId, + appLanguage, }, }) }) diff --git a/app/src/redux-resources/config/__tests__/useIsUnboxingFlowOngoing.test.tsx b/app/src/redux-resources/config/__tests__/useIsUnboxingFlowOngoing.test.tsx index d7610096015..cc65ca15100 100644 --- a/app/src/redux-resources/config/__tests__/useIsUnboxingFlowOngoing.test.tsx +++ b/app/src/redux-resources/config/__tests__/useIsUnboxingFlowOngoing.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { renderHook } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import { Provider } from 'react-redux' @@ -7,6 +6,7 @@ import { createStore } from 'redux' import { getIsOnDevice, getOnDeviceDisplaySettings } from '/app/redux/config' import { useIsUnboxingFlowOngoing } from '../useIsUnboxingFlowOngoing' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' @@ -22,7 +22,7 @@ const mockDisplaySettings = { } describe('useIsUnboxingFlowOngoing', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { wrapper = ({ children }) => {children} vi.mocked(getOnDeviceDisplaySettings).mockReturnValue(mockDisplaySettings) diff --git a/app/src/redux-resources/robots/hooks/__tests__/useIsFlex.test.tsx b/app/src/redux-resources/robots/hooks/__tests__/useIsFlex.test.tsx index acb68840dfe..19ca25dff24 100644 --- a/app/src/redux-resources/robots/hooks/__tests__/useIsFlex.test.tsx +++ b/app/src/redux-resources/robots/hooks/__tests__/useIsFlex.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { Provider } from 'react-redux' @@ -9,6 +8,8 @@ import { QueryClient, QueryClientProvider } from 'react-query' import { getRobotModelByName } from '/app/redux/discovery' import { useIsFlex } from '..' + +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' vi.mock('/app/redux/discovery/selectors') @@ -16,7 +17,7 @@ vi.mock('/app/redux/discovery/selectors') const store: Store = createStore(vi.fn(), {}) describe('useIsFlex hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/redux-resources/robots/hooks/__tests__/useIsRobotViewable.test.tsx b/app/src/redux-resources/robots/hooks/__tests__/useIsRobotViewable.test.tsx index 8b659d25656..38e908b8452 100644 --- a/app/src/redux-resources/robots/hooks/__tests__/useIsRobotViewable.test.tsx +++ b/app/src/redux-resources/robots/hooks/__tests__/useIsRobotViewable.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { Provider } from 'react-redux' @@ -13,6 +12,8 @@ import { mockUnreachableRobot, } from '/app/redux/discovery/__fixtures__' import { useIsRobotViewable } from '../useIsRobotViewable' + +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' vi.mock('/app/redux/discovery') @@ -20,7 +21,7 @@ vi.mock('/app/redux/discovery') const store: Store = createStore(vi.fn(), {}) describe('useIsRobotViewable hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/redux-resources/robots/hooks/__tests__/useRobot.test.tsx b/app/src/redux-resources/robots/hooks/__tests__/useRobot.test.tsx index df7e05347dd..f99452c7994 100644 --- a/app/src/redux-resources/robots/hooks/__tests__/useRobot.test.tsx +++ b/app/src/redux-resources/robots/hooks/__tests__/useRobot.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { Provider } from 'react-redux' @@ -11,6 +10,7 @@ import { mockConnectableRobot } from '/app/redux/discovery/__fixtures__' import { useRobot } from '..' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' vi.mock('/app/redux/discovery') @@ -18,7 +18,7 @@ vi.mock('/app/redux/discovery') const store: Store = createStore(vi.fn(), {}) describe('useRobot hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/redux/analytics/__tests__/make-event.test.ts b/app/src/redux/analytics/__tests__/make-event.test.ts index 70506dc162a..8cc56e18950 100644 --- a/app/src/redux/analytics/__tests__/make-event.test.ts +++ b/app/src/redux/analytics/__tests__/make-event.test.ts @@ -1,5 +1,7 @@ import { vi, describe, it, expect, beforeEach } from 'vitest' +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' + import { makeEvent } from '../make-event' import * as selectors from '../selectors' @@ -49,6 +51,7 @@ describe('analytics events map', () => { name: 'pipetteOffsetCalibrationStarted', properties: { ...action.payload, + robotType: OT2_ROBOT_TYPE, }, }) }) @@ -65,6 +68,7 @@ describe('analytics events map', () => { name: 'tipLengthCalibrationStarted', properties: { ...action.payload, + robotType: OT2_ROBOT_TYPE, }, }) }) @@ -77,6 +81,7 @@ describe('analytics events map', () => { robotName: 'my-robot', sessionId: 'seshid', command: { command: 'calibration.exitSession' }, + robotType: OT2_ROBOT_TYPE, }, } as any vi.mocked(selectors.getAnalyticsSessionExitDetails).mockReturnValue({ @@ -86,7 +91,7 @@ describe('analytics events map', () => { return expect(makeEvent(action, state)).resolves.toEqual({ name: 'my-session-typeExit', - properties: { step: 'session-step' }, + properties: { step: 'session-step', robotType: OT2_ROBOT_TYPE }, }) }) @@ -117,12 +122,11 @@ describe('analytics events map', () => { properties: { pipetteModel: 'my-pipette-model', tipRackDisplayName: 'some display name', + robotType: OT2_ROBOT_TYPE, }, }) }) - }) - describe('events with calibration data', () => { it('analytics:RESOURCE_MONITOR_REPORT -> resourceMonitorReport event', () => { const state = {} as any const action = { diff --git a/app/src/redux/analytics/constants.ts b/app/src/redux/analytics/constants.ts index cde9b0a1d59..aadeb7c6696 100644 --- a/app/src/redux/analytics/constants.ts +++ b/app/src/redux/analytics/constants.ts @@ -103,3 +103,15 @@ export const ANALYTICS_QUICK_TRANSFER_RERUN = 'quickTransferReRunFromSummary' */ export const ANALYTICS_RESOURCE_MONITOR_REPORT: 'analytics:RESOURCE_MONITOR_REPORT' = 'analytics:RESOURCE_MONITOR_REPORT' + +/** + * Internationalization Analytics + */ +export const ANALYTICS_LANGUAGE_UPDATED_ODD_UNBOXING_FLOW: 'languageUpdatedOddUnboxingFlow' = + 'languageUpdatedOddUnboxingFlow' +export const ANALYTICS_LANGUAGE_UPDATED_ODD_SETTINGS: 'languageUpdatedOddSettings' = + 'languageUpdatedOddSettings' +export const ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_MODAL: 'languageUpdatedDesktopAppModal' = + 'languageUpdatedDesktopAppModal' +export const ANALYTICS_LANGUAGE_UPDATED_DESKTOP_APP_SETTINGS: 'languageUpdatedDesktopAppSettings' = + 'languageUpdatedDesktopAppSettings' diff --git a/app/src/redux/analytics/make-event.ts b/app/src/redux/analytics/make-event.ts index bc5c8955104..608915c4112 100644 --- a/app/src/redux/analytics/make-event.ts +++ b/app/src/redux/analytics/make-event.ts @@ -13,6 +13,7 @@ import { getAnalyticsSessionExitDetails, getSessionInstrumentAnalyticsData, } from './selectors' +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' import type { State, Action } from '../types' import type { AnalyticsEvent } from './types' @@ -180,6 +181,7 @@ export function makeEvent( name: `${sessionDetails.sessionType}Exit`, properties: { step: sessionDetails.step, + robotType: OT2_ROBOT_TYPE, }, } : null @@ -203,6 +205,7 @@ export function makeEvent( 'tiprackDefinition' in commandData ? commandData.tiprackDefinition.metadata.displayName : null, + robotType: OT2_ROBOT_TYPE, }, } : null @@ -234,6 +237,7 @@ export function makeEvent( name: 'pipetteOffsetCalibrationStarted', properties: { ...action.payload, + robotType: OT2_ROBOT_TYPE, }, }) } @@ -243,6 +247,7 @@ export function makeEvent( name: 'tipLengthCalibrationStarted', properties: { ...action.payload, + robotType: OT2_ROBOT_TYPE, }, }) } diff --git a/app/src/redux/analytics/selectors.ts b/app/src/redux/analytics/selectors.ts index 4751a8eb99e..962f2c55832 100644 --- a/app/src/redux/analytics/selectors.ts +++ b/app/src/redux/analytics/selectors.ts @@ -1,24 +1,24 @@ import * as Sessions from '../sessions' -import { getViewableRobots, getRobotApiVersion } from '../discovery' +import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' +import { getViewableRobots, getRobotApiVersion } from '../discovery' import { getRobotUpdateVersion, getRobotUpdateRobot, getRobotUpdateSession, getRobotSystemType, } from '../robot-update' - import { getRobotSessionById } from '../sessions/selectors' import type { State } from '../types' - import type { AnalyticsConfig, BuildrootAnalyticsData, AnalyticsSessionExitDetails, SessionInstrumentAnalyticsData, } from './types' +import type { RobotType } from '@opentrons/shared-data' export function getBuildrootAnalyticsData( state: State, @@ -40,12 +40,29 @@ export function getBuildrootAnalyticsData( const currentVersion = getRobotApiVersion(robot) ?? 'unknown' const currentSystem = getRobotSystemType(robot) ?? 'unknown' + const getRobotType = (): RobotType | undefined => { + switch (currentSystem) { + case 'flex': + return FLEX_ROBOT_TYPE + case 'ot2-buildroot': + case 'ot2-balena': + return OT2_ROBOT_TYPE + case 'unknown': + return undefined + default: { + console.error('Unexpected system type: ', currentSystem) + return undefined + } + } + } + return { currentVersion, currentSystem, updateVersion: updateVersion ?? 'unknown', error: session != null && 'error' in session ? session.error : null, robotSerialNumber, + robotType: getRobotType(), } } diff --git a/app/src/redux/analytics/types.ts b/app/src/redux/analytics/types.ts index d27c2955fe2..95b320e88ab 100644 --- a/app/src/redux/analytics/types.ts +++ b/app/src/redux/analytics/types.ts @@ -1,4 +1,4 @@ -import type { PipetteMount as Mount } from '@opentrons/shared-data' +import type { PipetteMount as Mount, RobotType } from '@opentrons/shared-data' import type { CalibrationCheckComparisonsPerCalibration } from '../sessions/types' import type { DeckCalibrationStatus } from '../calibration/types' import type { Config } from '../config/types' @@ -42,6 +42,7 @@ export interface BuildrootAnalyticsData { updateVersion: string error: string | null robotSerialNumber: string | null + robotType: RobotType | undefined } export interface PipetteOffsetCalibrationAnalyticsData { diff --git a/app/src/redux/config/selectors.ts b/app/src/redux/config/selectors.ts index dea9cc3f171..cdbe9bb22c6 100644 --- a/app/src/redux/config/selectors.ts +++ b/app/src/redux/config/selectors.ts @@ -1,5 +1,5 @@ import { createSelector } from 'reselect' -import { SLEEP_NEVER_MS } from '/app/local-resources/config' +import { SLEEP_NEVER_MS } from '/app/local-resources/dom-utils' import type { State } from '../types' import type { Config, diff --git a/app/src/redux/robot-update/__tests__/hooks.test.tsx b/app/src/redux/robot-update/__tests__/hooks.test.tsx index 7528bf290bc..bf9cee3afbc 100644 --- a/app/src/redux/robot-update/__tests__/hooks.test.tsx +++ b/app/src/redux/robot-update/__tests__/hooks.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import { createStore } from 'redux' import { renderHook } from '@testing-library/react' @@ -9,11 +8,12 @@ import { i18n } from '/app/i18n' import { useDispatchStartRobotUpdate } from '../hooks' import { startRobotUpdate, clearRobotUpdateSession } from '../actions' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '../../types' describe('useDispatchStartRobotUpdate', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> let store: Store const mockRobotName = 'robotName' const mockSystemFile = 'systemFile' diff --git a/app/src/resources/analysis/hooks/__tests__/useStoredProtocolAnalysis.test.tsx b/app/src/resources/analysis/hooks/__tests__/useStoredProtocolAnalysis.test.tsx index 2437ed6e1a7..8bebe10c0e7 100644 --- a/app/src/resources/analysis/hooks/__tests__/useStoredProtocolAnalysis.test.tsx +++ b/app/src/resources/analysis/hooks/__tests__/useStoredProtocolAnalysis.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { QueryClient, QueryClientProvider } from 'react-query' @@ -25,6 +24,7 @@ import { } from '../__fixtures__/storedProtocolAnalysis' import { useNotifyRunQuery } from '/app/resources/runs' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { UseQueryResult } from 'react-query' import type { Protocol, Run } from '@opentrons/api-client' @@ -63,7 +63,7 @@ const PROTOCOL_ID = 'the_protocol_id' const PROTOCOL_KEY = 'the_protocol_key' describe('useStoredProtocolAnalysis hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/resources/calibration/__tests__/useDeckCalibrationStatus.test.tsx b/app/src/resources/calibration/__tests__/useDeckCalibrationStatus.test.tsx index 768c4152ff2..3cf71852f01 100644 --- a/app/src/resources/calibration/__tests__/useDeckCalibrationStatus.test.tsx +++ b/app/src/resources/calibration/__tests__/useDeckCalibrationStatus.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { Provider } from 'react-redux' @@ -12,6 +11,8 @@ import { getDiscoverableRobotByName } from '/app/redux/discovery' import { useDeckCalibrationStatus } from '..' import { mockConnectableRobot } from '/app/redux/discovery/__fixtures__' + +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' vi.mock('@opentrons/react-api-client') @@ -21,7 +22,7 @@ vi.mock('/app/redux/discovery') const store: Store = createStore(vi.fn(), {}) describe('useDeckCalibrationStatus hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/resources/devices/hooks/__tests__/useLights.test.tsx b/app/src/resources/devices/hooks/__tests__/useLights.test.tsx index 7485a61f757..e190902f24b 100644 --- a/app/src/resources/devices/hooks/__tests__/useLights.test.tsx +++ b/app/src/resources/devices/hooks/__tests__/useLights.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { Provider } from 'react-redux' import { createStore } from 'redux' @@ -11,6 +10,7 @@ import { import { useLights } from '../useLights' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { Mock } from 'vitest' @@ -19,7 +19,7 @@ vi.mock('@opentrons/react-api-client') const store: Store = createStore(vi.fn(), {}) describe('useLights hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> let setLights: Mock beforeEach(() => { diff --git a/app/src/resources/instruments/__tests__/useAttachedPipetteCalibrations.test.tsx b/app/src/resources/instruments/__tests__/useAttachedPipetteCalibrations.test.tsx index ef5309a52d5..02316923bd3 100644 --- a/app/src/resources/instruments/__tests__/useAttachedPipetteCalibrations.test.tsx +++ b/app/src/resources/instruments/__tests__/useAttachedPipetteCalibrations.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { vi, it, expect, describe, beforeEach } from 'vitest' import { Provider } from 'react-redux' @@ -21,6 +20,8 @@ import { } from '/app/redux/calibration/tip-length/__fixtures__' import { useAttachedPipetteCalibrations } from '..' + +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' @@ -43,7 +44,7 @@ const PIPETTE_CALIBRATIONS = { } describe('useAttachedPipetteCalibrations hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/resources/instruments/__tests__/useAttachedPipettes.test.tsx b/app/src/resources/instruments/__tests__/useAttachedPipettes.test.tsx index 35dbd023839..30f9922a1a7 100644 --- a/app/src/resources/instruments/__tests__/useAttachedPipettes.test.tsx +++ b/app/src/resources/instruments/__tests__/useAttachedPipettes.test.tsx @@ -8,7 +8,8 @@ import { pipetteResponseFixtureLeft, pipetteResponseFixtureRight, } from '@opentrons/api-client' -import type * as React from 'react' + +import type { FunctionComponent, ReactNode } from 'react' import type { UseQueryResult } from 'react-query' import type { FetchPipettesResponseBody } from '@opentrons/api-client' import type { PipetteModelSpecs } from '@opentrons/shared-data' @@ -17,7 +18,7 @@ vi.mock('@opentrons/react-api-client') vi.mock('@opentrons/shared-data') describe('useAttachedPipettes hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { vi.mocked(getPipetteModelSpecs).mockReturnValue({ name: 'mockName', diff --git a/app/src/resources/instruments/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts b/app/src/resources/instruments/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts index a0ae4757582..cc2bdbdc081 100644 --- a/app/src/resources/instruments/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts +++ b/app/src/resources/instruments/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts @@ -7,7 +7,7 @@ import { } from '@opentrons/api-client' import { useIsOEMMode } from '/app/resources/robot-settings/hooks' import { useAttachedPipettesFromInstrumentsQuery } from '..' -import type * as React from 'react' +import type { FunctionComponent, ReactNode } from 'react' vi.mock('@opentrons/react-api-client') vi.mock('/app/resources/robot-settings/hooks') @@ -17,7 +17,7 @@ describe('useAttachedPipettesFromInstrumentsQuery hook', () => { vi.mocked(useIsOEMMode).mockReturnValue(false) }) - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> it('returns attached pipettes', () => { vi.mocked(useInstrumentsQuery).mockReturnValue({ data: { diff --git a/app/src/resources/modules/hooks/__tests__/useAttachedModules.test.tsx b/app/src/resources/modules/hooks/__tests__/useAttachedModules.test.tsx index 49fba0eeaa0..6eec9e0996f 100644 --- a/app/src/resources/modules/hooks/__tests__/useAttachedModules.test.tsx +++ b/app/src/resources/modules/hooks/__tests__/useAttachedModules.test.tsx @@ -4,13 +4,14 @@ import { mockModulesResponse } from '@opentrons/api-client' import { useModulesQuery } from '@opentrons/react-api-client' import { useAttachedModules } from '..' +import type { FunctionComponent, ReactNode } from 'react' import type { UseQueryResult } from 'react-query' import type { Modules } from '@opentrons/api-client' vi.mock('@opentrons/react-api-client') describe('useAttachedModules hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> it('returns attached modules', () => { vi.mocked(useModulesQuery).mockReturnValue({ diff --git a/app/src/resources/networking/hooks/__tests__/useCanDisconnect.test.tsx b/app/src/resources/networking/hooks/__tests__/useCanDisconnect.test.tsx index 3985dc36ca8..d8788bf7ee1 100644 --- a/app/src/resources/networking/hooks/__tests__/useCanDisconnect.test.tsx +++ b/app/src/resources/networking/hooks/__tests__/useCanDisconnect.test.tsx @@ -1,18 +1,18 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { describe, it, expect, vi, beforeEach } from 'vitest' import { createStore } from 'redux' import { Provider } from 'react-redux' -import { SECURITY_WPA_EAP } from '@opentrons/api-client' import { renderHook } from '@testing-library/react' +import { SECURITY_WPA_EAP } from '@opentrons/api-client' import { getRobotApiVersionByName } from '/app/redux/discovery' import { useIsFlex } from '/app/redux-resources/robots' import { useCanDisconnect } from '../useCanDisconnect' import { useWifiList } from '../useWifiList' -import type { WifiNetwork } from '@opentrons/api-client' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' +import type { WifiNetwork } from '@opentrons/api-client' import type { State } from '/app/redux/types' vi.mock('../useWifiList') @@ -21,9 +21,9 @@ vi.mock('/app/redux/discovery') const store: Store = createStore(state => state, {}) -const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ - children, -}) => {children} +const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children }) => ( + {children} +) const mockWifiNetwork: WifiNetwork = { ssid: 'linksys', diff --git a/app/src/resources/networking/hooks/__tests__/useNetworkConnection.test.tsx b/app/src/resources/networking/hooks/__tests__/useNetworkConnection.test.tsx index 2c0e6257e42..9335c7eafea 100644 --- a/app/src/resources/networking/hooks/__tests__/useNetworkConnection.test.tsx +++ b/app/src/resources/networking/hooks/__tests__/useNetworkConnection.test.tsx @@ -1,5 +1,3 @@ -import type * as React from 'react' - import { when } from 'vitest-when' import { describe, it, expect, vi, beforeEach } from 'vitest' import { Provider } from 'react-redux' @@ -14,6 +12,8 @@ import * as Fixtures from '/app/redux/networking/__fixtures__' import { getNetworkInterfaces } from '/app/redux/networking' import { useNetworkConnection } from '../useNetworkConnection' + +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' vi.mock('/app/redux/networking/selectors') @@ -48,7 +48,7 @@ const store: Store = createStore(vi.fn(), {}) // ToDo (kj:0202/2023) USB test cases will be added when USB is out describe('useNetworkConnection', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { wrapper = ({ children }) => ( diff --git a/app/src/resources/protocols/hooks/__tests__/useProtocolMetadata.test.tsx b/app/src/resources/protocols/hooks/__tests__/useProtocolMetadata.test.tsx index 48ced67d25f..bea57c80284 100644 --- a/app/src/resources/protocols/hooks/__tests__/useProtocolMetadata.test.tsx +++ b/app/src/resources/protocols/hooks/__tests__/useProtocolMetadata.test.tsx @@ -1,5 +1,4 @@ // tests for the HostConfig context and hook -import type * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { Provider } from 'react-redux' @@ -8,6 +7,7 @@ import { renderHook } from '@testing-library/react' import { useCurrentProtocol } from '../useCurrentProtocol' import { useProtocolMetadata } from '../useProtocolMetadata' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type { State } from '/app/redux/types' @@ -39,7 +39,7 @@ describe('useProtocolMetadata', () => { }) it('should return author, lastUpdated, method, description, and robot type', () => { - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => {children} const { result } = renderHook(useProtocolMetadata, { wrapper }) diff --git a/app/src/resources/runs/__tests__/useCloneRun.test.tsx b/app/src/resources/runs/__tests__/useCloneRun.test.tsx index 9323bbf8073..cf9de675f67 100644 --- a/app/src/resources/runs/__tests__/useCloneRun.test.tsx +++ b/app/src/resources/runs/__tests__/useCloneRun.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { when } from 'vitest-when' import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' @@ -13,6 +12,7 @@ import { import { useCloneRun } from '../useCloneRun' import { useNotifyRunQuery } from '../useNotifyRunQuery' +import type { FunctionComponent, ReactNode } from 'react' import type { HostConfig } from '@opentrons/api-client' vi.mock('@opentrons/react-api-client') @@ -23,7 +23,7 @@ const RUN_ID_NO_RTP: string = 'run_id_no_rtp' const RUN_ID_RTP: string = 'run_id_rtp' describe('useCloneRun hook', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { when(vi.mocked(useHost)).calledWith().thenReturn(HOST_CONFIG) @@ -90,8 +90,8 @@ describe('useCloneRun hook', () => { } as any) const queryClient = new QueryClient() - const clientProvider: React.FunctionComponent<{ - children: React.ReactNode + const clientProvider: FunctionComponent<{ + children: ReactNode }> = ({ children }) => ( {children} ) diff --git a/app/src/resources/runs/__tests__/useLPCDisabledReason.test.tsx b/app/src/resources/runs/__tests__/useLPCDisabledReason.test.tsx index 0be19bc19d3..349804ac58b 100644 --- a/app/src/resources/runs/__tests__/useLPCDisabledReason.test.tsx +++ b/app/src/resources/runs/__tests__/useLPCDisabledReason.test.tsx @@ -1,13 +1,14 @@ -import type * as React from 'react' import { renderHook } from '@testing-library/react' import { Provider } from 'react-redux' import { I18nextProvider } from 'react-i18next' import { createStore } from 'redux' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' + import { getLoadedLabwareDefinitionsByUri, simple_v6 as _uncastedSimpleV6Protocol, } from '@opentrons/shared-data' + import { i18n } from '/app/i18n' import { RUN_ID_1 } from '..//__fixtures__' import { useStoredProtocolAnalysis } from '/app/resources/analysis' @@ -17,6 +18,7 @@ import { useRunCalibrationStatus } from '../useRunCalibrationStatus' import { useMostRecentCompletedAnalysis } from '../useMostRecentCompletedAnalysis' import { useRunHasStarted } from '../useRunHasStarted' +import type { FunctionComponent, ReactNode } from 'react' import type { Store } from 'redux' import type * as SharedData from '@opentrons/shared-data' import type { State } from '/app/redux/types' @@ -38,7 +40,7 @@ const simpleV6Protocol = (_uncastedSimpleV6Protocol as unknown) as SharedData.Pr describe('useLPCDisabledReason', () => { const store: Store = createStore(vi.fn(), {}) - const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + const wrapper: FunctionComponent<{ children: ReactNode }> = ({ children, }) => ( diff --git a/app/src/resources/runs/__tests__/useModuleCalibrationStatus.test.tsx b/app/src/resources/runs/__tests__/useModuleCalibrationStatus.test.tsx index 5691230dbaf..fef1217b173 100644 --- a/app/src/resources/runs/__tests__/useModuleCalibrationStatus.test.tsx +++ b/app/src/resources/runs/__tests__/useModuleCalibrationStatus.test.tsx @@ -1,4 +1,5 @@ -import type * as React from 'react' +import { Provider } from 'react-redux' +import { createStore } from 'redux' import { QueryClient, QueryClientProvider } from 'react-query' import { renderHook } from '@testing-library/react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' @@ -10,15 +11,13 @@ import { useIsFlex } from '/app/redux-resources/robots' import { mockMagneticModuleGen2 } from '/app/redux/modules/__fixtures__' +import type { FunctionComponent, ReactNode } from 'react' import type { ModuleModel, ModuleType } from '@opentrons/shared-data' -import { Provider } from 'react-redux' -import { createStore } from 'redux' - vi.mock('/app/redux-resources/robots') vi.mock('../useModuleRenderInfoForProtocolById') -let wrapper: React.FunctionComponent<{ children: React.ReactNode }> +let wrapper: FunctionComponent<{ children: ReactNode }> const mockMagneticModuleDefinition = { moduleId: 'someMagneticModule', diff --git a/app/src/resources/runs/__tests__/useRunCalibrationStatus.test.tsx b/app/src/resources/runs/__tests__/useRunCalibrationStatus.test.tsx index d0a81ff3e50..a93a3fe5d7a 100644 --- a/app/src/resources/runs/__tests__/useRunCalibrationStatus.test.tsx +++ b/app/src/resources/runs/__tests__/useRunCalibrationStatus.test.tsx @@ -1,10 +1,11 @@ -import type * as React from 'react' +import { Provider } from 'react-redux' +import { createStore } from 'redux' import { QueryClient, QueryClientProvider } from 'react-query' import { renderHook } from '@testing-library/react' import { vi, it, expect, describe, beforeEach } from 'vitest' import { when } from 'vitest-when' -import { mockTipRackDefinition } from '/app/redux/custom-labware/__fixtures__' +import { mockTipRackDefinition } from '/app/redux/custom-labware/__fixtures__' import { useRunCalibrationStatus, useRunPipetteInfoByMount, @@ -13,9 +14,8 @@ import { import { useDeckCalibrationStatus } from '/app/resources/calibration' import { useIsFlex } from '/app/redux-resources/robots' +import type { FunctionComponent, ReactNode } from 'react' import type { PipetteInfo } from '/app/redux/pipettes' -import { Provider } from 'react-redux' -import { createStore } from 'redux' vi.mock('../useRunPipetteInfoByMount') vi.mock('../useNotifyRunQuery') @@ -23,7 +23,7 @@ vi.mock('/app/resources/calibration') vi.mock('/app/resources/analysis') vi.mock('/app/redux-resources/robots') -let wrapper: React.FunctionComponent<{ children: React.ReactNode }> +let wrapper: FunctionComponent<{ children: ReactNode }> describe('useRunCalibrationStatus hook', () => { beforeEach(() => { diff --git a/app/src/resources/runs/utils.ts b/app/src/resources/runs/utils.ts index d9b6781f4b2..1ab7c205158 100644 --- a/app/src/resources/runs/utils.ts +++ b/app/src/resources/runs/utils.ts @@ -1,6 +1,6 @@ import { format } from 'date-fns' -import type * as React from 'react' +import type { Dispatch, SetStateAction } from 'react' import type { UseMutateAsyncFunction } from 'react-query' import type { CommandData } from '@opentrons/api-client' import type { CreateCommand } from '@opentrons/shared-data' @@ -11,7 +11,7 @@ export const chainRunCommandsRecursive = ( commands: CreateCommand[], createRunCommand: CreateRunCommand, continuePastCommandFailure: boolean = true, - setIsLoading: React.Dispatch> + setIsLoading: Dispatch> ): Promise => { if (commands.length < 1) { return Promise.reject(new Error('no commands to execute')) @@ -57,7 +57,7 @@ export const chainLiveCommandsRecursive = ( CreateLiveCommandMutateParams >, continuePastCommandFailure: boolean = true, - setIsLoading: React.Dispatch> + setIsLoading: Dispatch> ): Promise => { if (commands.length < 1) { return Promise.reject(new Error('no commands to execute')) @@ -100,7 +100,7 @@ export const chainMaintenanceCommandsRecursive = ( commands: CreateCommand[], createMaintenanceCommand: CreateMaintenanceCommand, continuePastCommandFailure: boolean = true, - setIsLoading: React.Dispatch> + setIsLoading: Dispatch> ): Promise => { if (commands.length < 1) { return Promise.reject(new Error('no commands to execute')) diff --git a/app/src/transformations/commands/hooks/__tests__/useMissingProtocolHardware.test.tsx b/app/src/transformations/commands/hooks/__tests__/useMissingProtocolHardware.test.tsx index 99ce33a9de3..54fd39d607f 100644 --- a/app/src/transformations/commands/hooks/__tests__/useMissingProtocolHardware.test.tsx +++ b/app/src/transformations/commands/hooks/__tests__/useMissingProtocolHardware.test.tsx @@ -1,8 +1,7 @@ import omitBy from 'lodash/omitBy' import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' -import type { UseQueryResult } from 'react-query' import { renderHook } from '@testing-library/react' -import type { Protocol } from '@opentrons/api-client' + import { useProtocolQuery, useProtocolAnalysisAsDocumentQuery, @@ -14,14 +13,19 @@ import { WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, fixtureTiprack300ul, } from '@opentrons/shared-data' + +import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration/useNotifyDeckConfigurationQuery' +import { useMissingProtocolHardware } from '../useMissingProtocolHardware' +import { mockHeaterShaker } from '/app/redux/modules/__fixtures__' + +import type { FunctionComponent, ReactNode } from 'react' +import type { UseQueryResult } from 'react-query' +import type { Protocol } from '@opentrons/api-client' import type { CompletedProtocolAnalysis, DeckConfiguration, LabwareDefinition2, } from '@opentrons/shared-data' -import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration/useNotifyDeckConfigurationQuery' -import { useMissingProtocolHardware } from '../useMissingProtocolHardware' -import { mockHeaterShaker } from '/app/redux/modules/__fixtures__' vi.mock('@opentrons/react-api-client') vi.mock('/app/resources/deck_configuration/useNotifyDeckConfigurationQuery') @@ -161,7 +165,7 @@ const PROTOCOL_ANALYSIS = { runTimeParameters: mockRTPData, } as any describe.only('useMissingProtocolHardware', () => { - let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + let wrapper: FunctionComponent<{ children: ReactNode }> beforeEach(() => { vi.mocked(useInstrumentsQuery).mockReturnValue({ data: { data: [] }, diff --git a/components/src/alerts/AlertItem.tsx b/components/src/alerts/AlertItem.tsx index 708f44f746c..4ef5eb04a8c 100644 --- a/components/src/alerts/AlertItem.tsx +++ b/components/src/alerts/AlertItem.tsx @@ -1,9 +1,9 @@ -import type * as React from 'react' import cx from 'classnames' import { Icon } from '../icons' import { IconButton } from '../buttons' import styles from './alerts.module.css' +import type { ReactNode } from 'react' import type { IconProps } from '../icons' export type AlertType = 'success' | 'warning' | 'error' | 'info' @@ -12,9 +12,9 @@ export interface AlertItemProps { /** name constant of the icon to display */ type: AlertType /** title/main message of colored alert bar */ - title: React.ReactNode + title: ReactNode /** Alert message body contents */ - children?: React.ReactNode + children?: ReactNode /** Additional class name */ className?: string /** optional handler to show close button/clear alert */ diff --git a/components/src/atoms/Checkbox/__tests__/Checkbox.test.tsx b/components/src/atoms/Checkbox/__tests__/Checkbox.test.tsx index cfee4c22835..1bc8265ad4f 100644 --- a/components/src/atoms/Checkbox/__tests__/Checkbox.test.tsx +++ b/components/src/atoms/Checkbox/__tests__/Checkbox.test.tsx @@ -1,16 +1,17 @@ -import type * as React from 'react' import { describe, beforeEach, afterEach, vi, expect, it } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '../../../testing/utils' import { Checkbox } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('Checkbox', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/Checkbox/index.tsx b/components/src/atoms/Checkbox/index.tsx index f4ae61dee1f..c5763665351 100644 --- a/components/src/atoms/Checkbox/index.tsx +++ b/components/src/atoms/Checkbox/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { COLORS, BORDERS } from '../../helix-design-system' import { Flex } from '../../primitives' @@ -14,13 +13,15 @@ import { import { RESPONSIVENESS, SPACING } from '../../ui-style-constants' import { StyledText } from '../StyledText' +import type { MouseEventHandler } from 'react' + export interface CheckboxProps { /** checkbox is checked if value is true */ isChecked: boolean /** label text that describes the option */ labelText: string /** callback click/tap handler */ - onClick: React.MouseEventHandler + onClick: MouseEventHandler /** html tabindex property */ tabIndex?: number /** if disabled is true, mouse events will not trigger onClick callback */ diff --git a/components/src/atoms/CheckboxField/__tests__/CheckboxField.test.tsx b/components/src/atoms/CheckboxField/__tests__/CheckboxField.test.tsx index 06fc3153d9e..b3b0e561711 100644 --- a/components/src/atoms/CheckboxField/__tests__/CheckboxField.test.tsx +++ b/components/src/atoms/CheckboxField/__tests__/CheckboxField.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, beforeEach, afterEach, vi, expect, it } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -8,12 +7,14 @@ import { BORDERS, COLORS } from '../../../helix-design-system' import { TYPOGRAPHY, SPACING } from '../../../ui-style-constants' import { CheckboxField } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('CheckboxField', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/CheckboxField/index.tsx b/components/src/atoms/CheckboxField/index.tsx index 9f02ef52bc0..1be78e36c1a 100644 --- a/components/src/atoms/CheckboxField/index.tsx +++ b/components/src/atoms/CheckboxField/index.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { SPACING, TYPOGRAPHY } from '../../ui-style-constants' import { COLORS, BORDERS } from '../../helix-design-system' @@ -11,21 +10,23 @@ import { JUSTIFY_CENTER, } from '../../styles' +import type { ChangeEventHandler, ComponentProps, ReactNode } from 'react' + export interface CheckboxFieldProps { /** change handler */ - onChange: React.ChangeEventHandler + onChange: ChangeEventHandler /** checkbox is checked if value is true */ value?: boolean /** name of field in form */ name?: string /** label text for checkbox */ - label?: React.ReactNode + label?: ReactNode /** checkbox is disabled if value is true */ disabled?: boolean /** html tabindex property */ tabIndex?: number /** props passed into label div. TODO IMMEDIATELY what is the Flow type? */ - labelProps?: React.ComponentProps<'div'> + labelProps?: ComponentProps<'div'> /** if true, render indeterminate icon */ isIndeterminate?: boolean } diff --git a/components/src/atoms/Chip/__tests__/Chip.test.tsx b/components/src/atoms/Chip/__tests__/Chip.test.tsx index 65de215160f..9fb190e665b 100644 --- a/components/src/atoms/Chip/__tests__/Chip.test.tsx +++ b/components/src/atoms/Chip/__tests__/Chip.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' import { BORDERS, COLORS } from '../../../helix-design-system' @@ -6,12 +5,14 @@ import { SPACING } from '../../../ui-style-constants' import { renderWithProviders } from '../../../testing/utils' import { Chip } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders() } describe('Chip Touchscreen', () => { - let props: React.ComponentProps + let props: ComponentProps it('should render text, icon, bgcolor with success colors', () => { props = { @@ -214,7 +215,7 @@ describe('Chip Touchscreen', () => { }) describe('Chip Web', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { Object.defineProperty(window, 'innerWidth', { diff --git a/components/src/atoms/Divider/index.tsx b/components/src/atoms/Divider/index.tsx index 7de6a3757f4..df9a9e9af07 100644 --- a/components/src/atoms/Divider/index.tsx +++ b/components/src/atoms/Divider/index.tsx @@ -1,7 +1,8 @@ -import type * as React from 'react' import { Box, COLORS, SPACING } from '../..' -type Props = React.ComponentProps +import type { ComponentProps } from 'react' + +type Props = ComponentProps export function Divider(props: Props): JSX.Element { return ( diff --git a/components/src/atoms/InputField/__tests__/InputField.test.tsx b/components/src/atoms/InputField/__tests__/InputField.test.tsx index f53d4f4163a..87b3e752272 100644 --- a/components/src/atoms/InputField/__tests__/InputField.test.tsx +++ b/components/src/atoms/InputField/__tests__/InputField.test.tsx @@ -1,15 +1,16 @@ -import type * as React from 'react' import { describe, it, vi, beforeEach, expect } from 'vitest' import { screen, fireEvent } from '@testing-library/react' import { renderWithProviders } from '../../../testing/utils' import { InputField } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('HeaterShakerSlideout', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { type: 'number', diff --git a/components/src/atoms/InputField/index.tsx b/components/src/atoms/InputField/index.tsx index 001374f71ce..2064bac4d75 100644 --- a/components/src/atoms/InputField/index.tsx +++ b/components/src/atoms/InputField/index.tsx @@ -20,6 +20,7 @@ import type { ChangeEventHandler, FocusEvent, MouseEvent, + MutableRefObject, ReactNode, } from 'react' import type { IconName } from '../../icons' @@ -81,7 +82,7 @@ export interface InputFieldProps { /** small or medium input field height, relevant only */ size?: 'medium' | 'small' /** react useRef to control input field instead of react event */ - ref?: React.MutableRefObject + ref?: MutableRefObject /** optional IconName to display icon aligned to left of input field */ leftIcon?: IconName /** if true, show delete icon aligned to right of input field */ diff --git a/components/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx b/components/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx index 04c42ba654b..2d874f61c99 100644 --- a/components/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx +++ b/components/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx @@ -1,11 +1,12 @@ -import type * as React from 'react' import { Flex } from '../../../primitives' import { DIRECTION_COLUMN } from '../../../styles' import { SPACING } from '../../../ui-style-constants' import { StyledText } from '../../StyledText' +import type { ReactNode } from 'react' + interface ListButtonAccordionProps { - children: React.ReactNode + children: ReactNode // determines if the accordion is expanded or not isExpanded?: boolean // is it nested into another accordion? diff --git a/components/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx b/components/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx index 85f76f901b2..d0e8f19821f 100644 --- a/components/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx +++ b/components/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx @@ -1,9 +1,10 @@ -import type * as React from 'react' import { Flex } from '../../../primitives' import { DIRECTION_COLUMN } from '../../../styles' +import type { ReactNode } from 'react' + interface ListButtonAccordionContainerProps { - children: React.ReactNode + children: ReactNode id: string } /* diff --git a/components/src/atoms/ListButton/__tests__/ListButton.test.tsx b/components/src/atoms/ListButton/__tests__/ListButton.test.tsx index e7ba460b5e2..fe4e3fb7349 100644 --- a/components/src/atoms/ListButton/__tests__/ListButton.test.tsx +++ b/components/src/atoms/ListButton/__tests__/ListButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { fireEvent, screen } from '@testing-library/react' @@ -7,11 +6,13 @@ import { COLORS } from '../../../helix-design-system' import { ListButton } from '..' -const render = (props: React.ComponentProps) => +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => renderWithProviders() describe('ListButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/ListButton/__tests__/ListButtonAccordion.test.tsx b/components/src/atoms/ListButton/__tests__/ListButtonAccordion.test.tsx index 29a2673c773..07ce7452549 100644 --- a/components/src/atoms/ListButton/__tests__/ListButtonAccordion.test.tsx +++ b/components/src/atoms/ListButton/__tests__/ListButtonAccordion.test.tsx @@ -1,15 +1,16 @@ -import type * as React from 'react' import { describe, it, beforeEach } from 'vitest' import { screen } from '@testing-library/react' import { renderWithProviders } from '../../../testing/utils' import { ListButtonAccordion } from '..' -const render = (props: React.ComponentProps) => +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => renderWithProviders() describe('ListButtonAccordion', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/ListButton/__tests__/ListButtonRadioButton.test.tsx b/components/src/atoms/ListButton/__tests__/ListButtonRadioButton.test.tsx index e9448ffabdf..95520a9691b 100644 --- a/components/src/atoms/ListButton/__tests__/ListButtonRadioButton.test.tsx +++ b/components/src/atoms/ListButton/__tests__/ListButtonRadioButton.test.tsx @@ -1,15 +1,16 @@ -import type * as React from 'react' import { describe, it, beforeEach, vi, expect } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '../../../testing/utils' import { ListButtonRadioButton } from '..' -const render = (props: React.ComponentProps) => +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => renderWithProviders() describe('ListButtonRadioButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/ListButton/index.tsx b/components/src/atoms/ListButton/index.tsx index 3f26c830a50..fd4d0cce052 100644 --- a/components/src/atoms/ListButton/index.tsx +++ b/components/src/atoms/ListButton/index.tsx @@ -1,9 +1,10 @@ -import type * as React from 'react' import { css } from 'styled-components' import { Flex } from '../../primitives' import { SPACING } from '../../ui-style-constants' import { BORDERS, COLORS } from '../../helix-design-system' import { CURSOR_POINTER } from '../../styles' + +import type { ReactNode } from 'react' import type { StyleProps } from '../../primitives' export * from './ListButtonChildren/index' @@ -12,7 +13,7 @@ export type ListButtonType = 'noActive' | 'connected' | 'notConnected' interface ListButtonProps extends StyleProps { type: ListButtonType - children: React.ReactNode + children: ReactNode disabled?: boolean onClick?: () => void } diff --git a/components/src/atoms/ListItem/__tests__/ListItem.test.tsx b/components/src/atoms/ListItem/__tests__/ListItem.test.tsx index ce15aec5d8e..7b603d85868 100644 --- a/components/src/atoms/ListItem/__tests__/ListItem.test.tsx +++ b/components/src/atoms/ListItem/__tests__/ListItem.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, describe, it, expect, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { fireEvent, screen } from '@testing-library/react' @@ -7,11 +6,13 @@ import { BORDERS, COLORS } from '../../../helix-design-system' import { ListItem } from '..' -const render = (props: React.ComponentProps) => +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => renderWithProviders() describe('ListItem', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/ListItem/index.tsx b/components/src/atoms/ListItem/index.tsx index 5a47c614ea8..d1d9b8d1312 100644 --- a/components/src/atoms/ListItem/index.tsx +++ b/components/src/atoms/ListItem/index.tsx @@ -1,9 +1,10 @@ -import type * as React from 'react' import { css } from 'styled-components' import { Flex } from '../../primitives' import { RESPONSIVENESS, SPACING } from '../../ui-style-constants' import { BORDERS, COLORS } from '../../helix-design-system' import { FLEX_MAX_CONTENT } from '../../styles' + +import type { ReactNode } from 'react' import type { StyleProps } from '../../primitives' export * from './ListItemChildren' @@ -19,7 +20,7 @@ interface ListItemProps extends StyleProps { /** ListItem state type */ type: ListItemType /** ListItem contents */ - children: React.ReactNode + children: ReactNode onClick?: () => void onMouseEnter?: () => void onMouseLeave?: () => void diff --git a/components/src/atoms/MenuList/OverflowBtn.tsx b/components/src/atoms/MenuList/OverflowBtn.tsx index efe9195f03d..0414f95f7d3 100644 --- a/components/src/atoms/MenuList/OverflowBtn.tsx +++ b/components/src/atoms/MenuList/OverflowBtn.tsx @@ -1,20 +1,22 @@ -import * as React from 'react' +import { forwardRef } from 'react' import { css } from 'styled-components' import { Btn } from '../../primitives' import { BORDERS, COLORS } from '../../helix-design-system' import { SPACING } from '../../ui-style-constants' -interface OverflowBtnProps extends React.ComponentProps { +import type { ComponentProps, ForwardedRef, ReactNode } from 'react' + +interface OverflowBtnProps extends ComponentProps { fillColor?: string } export const OverflowBtn: ( props: OverflowBtnProps, - ref: React.ForwardedRef -) => React.ReactNode = React.forwardRef( + ref: ForwardedRef +) => ReactNode = forwardRef( ( props: OverflowBtnProps, - ref: React.ForwardedRef + ref: ForwardedRef ): JSX.Element => { const { fillColor, ...restProps } = props return ( diff --git a/components/src/atoms/MenuList/__tests__/MenuItem.test.tsx b/components/src/atoms/MenuList/__tests__/MenuItem.test.tsx index f6d0485be45..4a90984f638 100644 --- a/components/src/atoms/MenuList/__tests__/MenuItem.test.tsx +++ b/components/src/atoms/MenuList/__tests__/MenuItem.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, beforeEach } from 'vitest' import { screen } from '@testing-library/react' @@ -8,12 +7,14 @@ import { SPACING, TYPOGRAPHY } from '../../../ui-style-constants' import { MenuItem } from '../MenuItem' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('MenuItem', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/MenuList/__tests__/MenuList.test.tsx b/components/src/atoms/MenuList/__tests__/MenuList.test.tsx index e38e145eceb..7b2ccffc42b 100644 --- a/components/src/atoms/MenuList/__tests__/MenuList.test.tsx +++ b/components/src/atoms/MenuList/__tests__/MenuList.test.tsx @@ -1,18 +1,19 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '../../../testing/utils' import { MenuList } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } const mockBtn =
        mockBtn
        describe('MenuList', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { children: mockBtn, diff --git a/components/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx b/components/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx index 00f080fae2c..af60a617c41 100644 --- a/components/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx +++ b/components/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { vi, it, expect, describe } from 'vitest' import { fireEvent, screen } from '@testing-library/react' @@ -6,7 +5,9 @@ import { COLORS } from '../../../helix-design-system' import { renderWithProviders } from '../../../testing/utils' import { OverflowBtn } from '../OverflowBtn' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } diff --git a/components/src/atoms/MenuList/index.tsx b/components/src/atoms/MenuList/index.tsx index 7b930243ba0..f06fe983523 100644 --- a/components/src/atoms/MenuList/index.tsx +++ b/components/src/atoms/MenuList/index.tsx @@ -1,5 +1,3 @@ -import type * as React from 'react' - import { BORDERS, COLORS } from '../../helix-design-system' import { DIRECTION_COLUMN, @@ -10,10 +8,12 @@ import { Flex } from '../../primitives' import { SPACING } from '../../ui-style-constants' import { ModalShell } from '../../modals' +import type { MouseEventHandler, ReactNode } from 'react' + interface MenuListProps { - children: React.ReactNode + children: ReactNode isOnDevice?: boolean - onClick?: React.MouseEventHandler + onClick?: MouseEventHandler } export const MenuList = (props: MenuListProps): JSX.Element | null => { diff --git a/components/src/atoms/Snackbar/__tests__/Snackbar.test.tsx b/components/src/atoms/Snackbar/__tests__/Snackbar.test.tsx index a4ae1f8f6b0..0f093548cdc 100644 --- a/components/src/atoms/Snackbar/__tests__/Snackbar.test.tsx +++ b/components/src/atoms/Snackbar/__tests__/Snackbar.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen, act } from '@testing-library/react' @@ -6,12 +5,14 @@ import { renderWithProviders } from '../../../testing/utils' import { Snackbar } from '..' import { COLORS } from '../../../helix-design-system' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('Snackbar', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { message: 'test message', diff --git a/components/src/atoms/StyledText/LegacyStyledText.tsx b/components/src/atoms/StyledText/LegacyStyledText.tsx index 83df2c69e06..7816a8967f9 100644 --- a/components/src/atoms/StyledText/LegacyStyledText.tsx +++ b/components/src/atoms/StyledText/LegacyStyledText.tsx @@ -2,11 +2,11 @@ import styled, { css } from 'styled-components' import { Text } from '../../primitives' import { TYPOGRAPHY, RESPONSIVENESS } from '../../ui-style-constants' -import type * as React from 'react' +import type { ComponentProps, ReactNode } from 'react' import type { FlattenSimpleInterpolation } from 'styled-components' -export interface LegacyProps extends React.ComponentProps { - children?: React.ReactNode +export interface LegacyProps extends ComponentProps { + children?: ReactNode } const styleMap: { [tag: string]: FlattenSimpleInterpolation } = { diff --git a/components/src/atoms/StyledText/StyledText.tsx b/components/src/atoms/StyledText/StyledText.tsx index fc33536da9a..df16b3f8b0a 100644 --- a/components/src/atoms/StyledText/StyledText.tsx +++ b/components/src/atoms/StyledText/StyledText.tsx @@ -3,7 +3,7 @@ import { Text } from '../../primitives' import { TYPOGRAPHY, RESPONSIVENESS } from '../../ui-style-constants' import { TYPOGRAPHY as HELIX_TYPOGRAPHY } from '../../helix-design-system/product' -import type * as React from 'react' +import type { ComponentProps, ReactNode } from 'react' import type { FlattenSimpleInterpolation } from 'styled-components' const helixProductStyleMap = { @@ -290,10 +290,10 @@ const ODDStyleMap = { }, } as const -export interface Props extends React.ComponentProps { +export interface Props extends ComponentProps { oddStyle?: ODDStyles desktopStyle?: HelixStyles - children?: React.ReactNode + children?: ReactNode } export const ODD_STYLES = Object.keys(ODDStyleMap) export const HELIX_STYLES = Object.keys(helixProductStyleMap) diff --git a/components/src/atoms/Tag/__tests__/Tag.test.tsx b/components/src/atoms/Tag/__tests__/Tag.test.tsx index dcb25c77d27..9c7ba83731d 100644 --- a/components/src/atoms/Tag/__tests__/Tag.test.tsx +++ b/components/src/atoms/Tag/__tests__/Tag.test.tsx @@ -1,16 +1,17 @@ -import type * as React from 'react' import { describe, it, expect } from 'vitest' import { screen } from '@testing-library/react' import { COLORS } from '../../../helix-design-system' import { renderWithProviders } from '../../../testing/utils' import { Tag } from '../index' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders() } describe('Tag', () => { - let props: React.ComponentProps + let props: ComponentProps it('should render text, icon with default', () => { props = { diff --git a/components/src/atoms/Toast/__tests__/ODDToast.test.tsx b/components/src/atoms/Toast/__tests__/ODDToast.test.tsx index d198df7f03e..3999fc8ec6e 100644 --- a/components/src/atoms/Toast/__tests__/ODDToast.test.tsx +++ b/components/src/atoms/Toast/__tests__/ODDToast.test.tsx @@ -1,16 +1,17 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { act, fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '../../../testing/utils' import { Toast, TOAST_ANIMATION_DURATION } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('Toast', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { id: '1', diff --git a/components/src/atoms/Toast/__tests__/Toast.test.tsx b/components/src/atoms/Toast/__tests__/Toast.test.tsx index 5133651ecd6..2d4e189e895 100644 --- a/components/src/atoms/Toast/__tests__/Toast.test.tsx +++ b/components/src/atoms/Toast/__tests__/Toast.test.tsx @@ -1,16 +1,17 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { act, fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '../../../testing/utils' import { Toast, TOAST_ANIMATION_DURATION } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('Toast', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { id: '1', diff --git a/components/src/atoms/ToggleGroup/__tests__/ToggleGroup.test.tsx b/components/src/atoms/ToggleGroup/__tests__/ToggleGroup.test.tsx index f7beb737696..f754467da5e 100644 --- a/components/src/atoms/ToggleGroup/__tests__/ToggleGroup.test.tsx +++ b/components/src/atoms/ToggleGroup/__tests__/ToggleGroup.test.tsx @@ -1,15 +1,16 @@ -import type * as React from 'react' import { describe, it, expect, vi } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '../../../testing/utils' import { ToggleGroup } from '../index' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders() } describe('ToggleGroup', () => { - let props: React.ComponentProps + let props: ComponentProps it('should render text and buttons', () => { props = { diff --git a/components/src/atoms/Tooltip/__tests__/Tooltip.test.tsx b/components/src/atoms/Tooltip/__tests__/Tooltip.test.tsx index ddc1e4f6a1a..18fe3fcce85 100644 --- a/components/src/atoms/Tooltip/__tests__/Tooltip.test.tsx +++ b/components/src/atoms/Tooltip/__tests__/Tooltip.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { screen } from '@testing-library/react' @@ -11,7 +10,9 @@ import { POSITION_ABSOLUTE } from '../../../styles' import { renderWithProviders } from '../../../testing/utils' import { Tooltip } from '..' -const render = (props: React.ComponentProps) => { +import type { ComponentProps, ReactNode } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } @@ -39,11 +40,11 @@ const MockTooltipProps = { } describe('Tooltip', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { - children: 'mock children' as React.ReactNode, + children: 'mock children' as ReactNode, tooltipProps: MockTooltipProps, key: 'mock key', } diff --git a/components/src/atoms/Tooltip/index.tsx b/components/src/atoms/Tooltip/index.tsx index 6bc04add77c..9ba18b99e1e 100644 --- a/components/src/atoms/Tooltip/index.tsx +++ b/components/src/atoms/Tooltip/index.tsx @@ -1,15 +1,14 @@ -import type * as React from 'react' - import { COLORS } from '../../helix-design-system' import { TYPOGRAPHY } from '../../ui-style-constants' import { LegacyTooltip } from '../../tooltips' import { FLEX_MAX_CONTENT } from '../../styles' +import type { ReactNode } from 'react' import type { UseTooltipResultTooltipProps } from '../../tooltips' import type { StyleProps } from '../../primitives' export interface TooltipProps extends StyleProps { - children: React.ReactNode + children: ReactNode tooltipProps: UseTooltipResultTooltipProps & { visible: boolean } key?: string } diff --git a/components/src/atoms/buttons/LargeButton.tsx b/components/src/atoms/buttons/LargeButton.tsx index 67436adf6ed..7bfcf4b6533 100644 --- a/components/src/atoms/buttons/LargeButton.tsx +++ b/components/src/atoms/buttons/LargeButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { css } from 'styled-components' import { Btn } from '../../primitives' @@ -16,6 +15,7 @@ import { } from '../..' import { Icon } from '../../icons' +import type { ReactNode } from 'react' import type { StyleProps } from '../../primitives' import type { IconName } from '../../icons' @@ -126,7 +126,7 @@ interface LargeButtonProps extends StyleProps { type?: 'submit' onClick?: () => void buttonType?: LargeButtonTypes - buttonText: React.ReactNode + buttonText: ReactNode iconName?: IconName disabled?: boolean /** aria-disabled for displaying snack bar. */ diff --git a/components/src/atoms/buttons/RadioButton.tsx b/components/src/atoms/buttons/RadioButton.tsx index a4d1a769144..8b371912e6a 100644 --- a/components/src/atoms/buttons/RadioButton.tsx +++ b/components/src/atoms/buttons/RadioButton.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import styled, { css } from 'styled-components' import { Flex } from '../../primitives' import { COLORS, BORDERS } from '../../helix-design-system' @@ -12,14 +11,16 @@ import { Icon, StyledText, } from '../../index' + +import type { ChangeEventHandler, ReactNode } from 'react' +import type { FlattenSimpleInterpolation } from 'styled-components' import type { IconName } from '../../icons' import type { StyleProps } from '../../primitives' -import type { FlattenSimpleInterpolation } from 'styled-components' interface RadioButtonProps extends StyleProps { - buttonLabel: string | React.ReactNode + buttonLabel: string | ReactNode buttonValue: string | number - onChange: React.ChangeEventHandler + onChange: ChangeEventHandler disabled?: boolean iconName?: IconName isSelected?: boolean diff --git a/components/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx b/components/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx index cad0175d981..61d1b07729c 100644 --- a/components/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, expect } from 'vitest' import { screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -8,12 +7,14 @@ import { TYPOGRAPHY, SPACING } from '../../../ui-style-constants' import { AlertPrimaryButton } from '../AlertPrimaryButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('AlertPrimaryButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/buttons/__tests__/AltPrimaryButton.test.tsx b/components/src/atoms/buttons/__tests__/AltPrimaryButton.test.tsx index f65613d0561..7697336c219 100644 --- a/components/src/atoms/buttons/__tests__/AltPrimaryButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/AltPrimaryButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, expect } from 'vitest' import { screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -7,12 +6,14 @@ import { BORDERS, COLORS } from '../../../helix-design-system' import { TYPOGRAPHY, SPACING } from '../../../ui-style-constants' import { AltPrimaryButton } from '../AltPrimaryButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('AltPrimaryButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/buttons/__tests__/EmptySelectorButton.test.tsx b/components/src/atoms/buttons/__tests__/EmptySelectorButton.test.tsx index 6fea2d8d297..bf5e2953086 100644 --- a/components/src/atoms/buttons/__tests__/EmptySelectorButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/EmptySelectorButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import '@testing-library/jest-dom/vitest' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -6,12 +5,14 @@ import { renderWithProviders } from '../../../testing/utils' import { JUSTIFY_CENTER, JUSTIFY_START } from '../../../styles' import { EmptySelectorButton } from '../EmptySelectorButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('EmptySelectorButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onClick: vi.fn(), diff --git a/components/src/atoms/buttons/__tests__/LargeButton.test.tsx b/components/src/atoms/buttons/__tests__/LargeButton.test.tsx index 52f6c9e71f6..628dd88b541 100644 --- a/components/src/atoms/buttons/__tests__/LargeButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/LargeButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { fireEvent, screen } from '@testing-library/react' @@ -7,12 +6,14 @@ import { renderWithProviders } from '../../../testing/utils' import { COLORS } from '../../../helix-design-system' import { LargeButton } from '../LargeButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('LargeButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onClick: vi.fn(), diff --git a/components/src/atoms/buttons/__tests__/PrimaryButton.test.tsx b/components/src/atoms/buttons/__tests__/PrimaryButton.test.tsx index 558f4a595eb..8f465d4bc63 100644 --- a/components/src/atoms/buttons/__tests__/PrimaryButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/PrimaryButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, expect } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -7,12 +6,14 @@ import { BORDERS, COLORS } from '../../../helix-design-system' import { TYPOGRAPHY, SPACING } from '../../../ui-style-constants' import { PrimaryButton } from '../PrimaryButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('PrimaryButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/atoms/buttons/__tests__/RadioButton.test.tsx b/components/src/atoms/buttons/__tests__/RadioButton.test.tsx index 95aaf6532fc..b259bcc97fb 100644 --- a/components/src/atoms/buttons/__tests__/RadioButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/RadioButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import '@testing-library/jest-dom/vitest' import { screen, queryByAttribute } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -7,12 +6,14 @@ import { COLORS } from '../../../helix-design-system' import { SPACING } from '../../../ui-style-constants' import { RadioButton } from '../RadioButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('RadioButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { onChange: vi.fn(), diff --git a/components/src/atoms/buttons/__tests__/SecondaryButton.test.tsx b/components/src/atoms/buttons/__tests__/SecondaryButton.test.tsx index 8887e679268..c7fdcc3229f 100644 --- a/components/src/atoms/buttons/__tests__/SecondaryButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/SecondaryButton.test.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import { describe, it, beforeEach, expect } from 'vitest' import { screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -8,12 +7,14 @@ import { BORDERS, COLORS } from '../../../helix-design-system' import { SecondaryButton } from '../SecondaryButton' -const render = (props: React.ComponentProps) => { +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { return renderWithProviders()[0] } describe('SecondaryButton', () => { - let props: React.ComponentProps + let props: ComponentProps beforeEach(() => { props = { diff --git a/components/src/buttons/Button.tsx b/components/src/buttons/Button.tsx index 749c4e603a5..3c159a3b759 100644 --- a/components/src/buttons/Button.tsx +++ b/components/src/buttons/Button.tsx @@ -1,4 +1,3 @@ -import type * as React from 'react' import cx from 'classnames' import omit from 'lodash/omit' @@ -7,6 +6,7 @@ import styles from './buttons.module.css' import { BUTTON_TYPE_BUTTON } from '../primitives' +import type { ComponentType, MouseEventHandler, ReactNode } from 'react' import type { BUTTON_TYPE_SUBMIT, BUTTON_TYPE_RESET } from '../primitives' import type { IconName } from '../icons' import type { UseHoverTooltipTargetProps } from '../tooltips' @@ -15,7 +15,7 @@ export interface ButtonProps { /** id attribute */ id?: string /** click handler */ - onClick?: React.MouseEventHandler + onClick?: MouseEventHandler /** name attribute */ name?: string /** title attribute */ @@ -31,7 +31,7 @@ export interface ButtonProps { /** inverts the default color/background/border of default button style */ inverted?: boolean /** contents of the button */ - children?: React.ReactNode + children?: ReactNode /** type of button (default "button") */ type?: | typeof BUTTON_TYPE_SUBMIT @@ -40,7 +40,7 @@ export interface ButtonProps { /** ID of form that button is for */ form?: string /** custom element or component to use instead of `