meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7010__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. meerk40t/__init__.py +1 -1
  2. meerk40t/balormk/balor_params.py +167 -167
  3. meerk40t/balormk/clone_loader.py +457 -457
  4. meerk40t/balormk/controller.py +1566 -1512
  5. meerk40t/balormk/cylindermod.py +64 -0
  6. meerk40t/balormk/device.py +966 -1959
  7. meerk40t/balormk/driver.py +778 -591
  8. meerk40t/balormk/galvo_commands.py +1195 -0
  9. meerk40t/balormk/gui/balorconfig.py +237 -111
  10. meerk40t/balormk/gui/balorcontroller.py +191 -184
  11. meerk40t/balormk/gui/baloroperationproperties.py +116 -115
  12. meerk40t/balormk/gui/corscene.py +845 -0
  13. meerk40t/balormk/gui/gui.py +179 -147
  14. meerk40t/balormk/livelightjob.py +466 -382
  15. meerk40t/balormk/mock_connection.py +131 -109
  16. meerk40t/balormk/plugin.py +133 -135
  17. meerk40t/balormk/usb_connection.py +306 -301
  18. meerk40t/camera/__init__.py +1 -1
  19. meerk40t/camera/camera.py +514 -397
  20. meerk40t/camera/gui/camerapanel.py +1241 -1095
  21. meerk40t/camera/gui/gui.py +58 -58
  22. meerk40t/camera/plugin.py +441 -399
  23. meerk40t/ch341/__init__.py +27 -27
  24. meerk40t/ch341/ch341device.py +628 -628
  25. meerk40t/ch341/libusb.py +595 -589
  26. meerk40t/ch341/mock.py +171 -171
  27. meerk40t/ch341/windriver.py +157 -157
  28. meerk40t/constants.py +13 -0
  29. meerk40t/core/__init__.py +1 -1
  30. meerk40t/core/bindalias.py +550 -539
  31. meerk40t/core/core.py +47 -47
  32. meerk40t/core/cutcode/cubiccut.py +73 -73
  33. meerk40t/core/cutcode/cutcode.py +315 -312
  34. meerk40t/core/cutcode/cutgroup.py +141 -137
  35. meerk40t/core/cutcode/cutobject.py +192 -185
  36. meerk40t/core/cutcode/dwellcut.py +37 -37
  37. meerk40t/core/cutcode/gotocut.py +29 -29
  38. meerk40t/core/cutcode/homecut.py +29 -29
  39. meerk40t/core/cutcode/inputcut.py +34 -34
  40. meerk40t/core/cutcode/linecut.py +33 -33
  41. meerk40t/core/cutcode/outputcut.py +34 -34
  42. meerk40t/core/cutcode/plotcut.py +335 -335
  43. meerk40t/core/cutcode/quadcut.py +61 -61
  44. meerk40t/core/cutcode/rastercut.py +168 -148
  45. meerk40t/core/cutcode/waitcut.py +34 -34
  46. meerk40t/core/cutplan.py +1843 -1316
  47. meerk40t/core/drivers.py +330 -329
  48. meerk40t/core/elements/align.py +801 -669
  49. meerk40t/core/elements/branches.py +1844 -1507
  50. meerk40t/core/elements/clipboard.py +229 -219
  51. meerk40t/core/elements/element_treeops.py +4561 -2837
  52. meerk40t/core/elements/element_types.py +125 -105
  53. meerk40t/core/elements/elements.py +4329 -3617
  54. meerk40t/core/elements/files.py +117 -64
  55. meerk40t/core/elements/geometry.py +473 -224
  56. meerk40t/core/elements/grid.py +467 -316
  57. meerk40t/core/elements/materials.py +158 -94
  58. meerk40t/core/elements/notes.py +50 -38
  59. meerk40t/core/elements/offset_clpr.py +933 -912
  60. meerk40t/core/elements/offset_mk.py +963 -955
  61. meerk40t/core/elements/penbox.py +339 -267
  62. meerk40t/core/elements/placements.py +300 -83
  63. meerk40t/core/elements/render.py +785 -687
  64. meerk40t/core/elements/shapes.py +2618 -2092
  65. meerk40t/core/elements/trace.py +651 -563
  66. meerk40t/core/elements/tree_commands.py +415 -409
  67. meerk40t/core/elements/undo_redo.py +116 -58
  68. meerk40t/core/elements/wordlist.py +319 -200
  69. meerk40t/core/exceptions.py +9 -9
  70. meerk40t/core/laserjob.py +220 -220
  71. meerk40t/core/logging.py +63 -63
  72. meerk40t/core/node/blobnode.py +83 -86
  73. meerk40t/core/node/bootstrap.py +105 -103
  74. meerk40t/core/node/branch_elems.py +40 -31
  75. meerk40t/core/node/branch_ops.py +45 -38
  76. meerk40t/core/node/branch_regmark.py +48 -41
  77. meerk40t/core/node/cutnode.py +29 -32
  78. meerk40t/core/node/effect_hatch.py +375 -257
  79. meerk40t/core/node/effect_warp.py +398 -0
  80. meerk40t/core/node/effect_wobble.py +441 -309
  81. meerk40t/core/node/elem_ellipse.py +404 -309
  82. meerk40t/core/node/elem_image.py +1082 -801
  83. meerk40t/core/node/elem_line.py +358 -292
  84. meerk40t/core/node/elem_path.py +259 -201
  85. meerk40t/core/node/elem_point.py +129 -102
  86. meerk40t/core/node/elem_polyline.py +310 -246
  87. meerk40t/core/node/elem_rect.py +376 -286
  88. meerk40t/core/node/elem_text.py +445 -418
  89. meerk40t/core/node/filenode.py +59 -40
  90. meerk40t/core/node/groupnode.py +138 -74
  91. meerk40t/core/node/image_processed.py +777 -766
  92. meerk40t/core/node/image_raster.py +156 -113
  93. meerk40t/core/node/layernode.py +31 -31
  94. meerk40t/core/node/mixins.py +135 -107
  95. meerk40t/core/node/node.py +1427 -1304
  96. meerk40t/core/node/nutils.py +117 -114
  97. meerk40t/core/node/op_cut.py +462 -335
  98. meerk40t/core/node/op_dots.py +296 -251
  99. meerk40t/core/node/op_engrave.py +414 -311
  100. meerk40t/core/node/op_image.py +755 -369
  101. meerk40t/core/node/op_raster.py +787 -522
  102. meerk40t/core/node/place_current.py +37 -40
  103. meerk40t/core/node/place_point.py +329 -126
  104. meerk40t/core/node/refnode.py +58 -47
  105. meerk40t/core/node/rootnode.py +225 -219
  106. meerk40t/core/node/util_console.py +48 -48
  107. meerk40t/core/node/util_goto.py +84 -65
  108. meerk40t/core/node/util_home.py +61 -61
  109. meerk40t/core/node/util_input.py +102 -102
  110. meerk40t/core/node/util_output.py +102 -102
  111. meerk40t/core/node/util_wait.py +65 -65
  112. meerk40t/core/parameters.py +709 -707
  113. meerk40t/core/planner.py +875 -785
  114. meerk40t/core/plotplanner.py +656 -652
  115. meerk40t/core/space.py +120 -113
  116. meerk40t/core/spoolers.py +706 -705
  117. meerk40t/core/svg_io.py +1836 -1549
  118. meerk40t/core/treeop.py +534 -445
  119. meerk40t/core/undos.py +278 -124
  120. meerk40t/core/units.py +784 -680
  121. meerk40t/core/view.py +393 -322
  122. meerk40t/core/webhelp.py +62 -62
  123. meerk40t/core/wordlist.py +513 -504
  124. meerk40t/cylinder/cylinder.py +247 -0
  125. meerk40t/cylinder/gui/cylindersettings.py +41 -0
  126. meerk40t/cylinder/gui/gui.py +24 -0
  127. meerk40t/device/__init__.py +1 -1
  128. meerk40t/device/basedevice.py +322 -123
  129. meerk40t/device/devicechoices.py +50 -0
  130. meerk40t/device/dummydevice.py +163 -128
  131. meerk40t/device/gui/defaultactions.py +618 -602
  132. meerk40t/device/gui/effectspanel.py +114 -0
  133. meerk40t/device/gui/formatterpanel.py +253 -290
  134. meerk40t/device/gui/warningpanel.py +337 -260
  135. meerk40t/device/mixins.py +13 -13
  136. meerk40t/dxf/__init__.py +1 -1
  137. meerk40t/dxf/dxf_io.py +766 -554
  138. meerk40t/dxf/plugin.py +47 -35
  139. meerk40t/external_plugins.py +79 -79
  140. meerk40t/external_plugins_build.py +28 -28
  141. meerk40t/extra/cag.py +112 -116
  142. meerk40t/extra/coolant.py +403 -0
  143. meerk40t/extra/encode_detect.py +198 -0
  144. meerk40t/extra/ezd.py +1165 -1165
  145. meerk40t/extra/hershey.py +835 -340
  146. meerk40t/extra/imageactions.py +322 -316
  147. meerk40t/extra/inkscape.py +630 -622
  148. meerk40t/extra/lbrn.py +424 -424
  149. meerk40t/extra/outerworld.py +284 -0
  150. meerk40t/extra/param_functions.py +1542 -1556
  151. meerk40t/extra/potrace.py +257 -253
  152. meerk40t/extra/serial_exchange.py +118 -0
  153. meerk40t/extra/updater.py +602 -453
  154. meerk40t/extra/vectrace.py +147 -146
  155. meerk40t/extra/winsleep.py +83 -83
  156. meerk40t/extra/xcs_reader.py +597 -0
  157. meerk40t/fill/fills.py +781 -335
  158. meerk40t/fill/patternfill.py +1061 -1061
  159. meerk40t/fill/patterns.py +614 -567
  160. meerk40t/grbl/control.py +87 -87
  161. meerk40t/grbl/controller.py +990 -903
  162. meerk40t/grbl/device.py +1081 -768
  163. meerk40t/grbl/driver.py +989 -771
  164. meerk40t/grbl/emulator.py +532 -497
  165. meerk40t/grbl/gcodejob.py +783 -767
  166. meerk40t/grbl/gui/grblconfiguration.py +373 -298
  167. meerk40t/grbl/gui/grblcontroller.py +485 -271
  168. meerk40t/grbl/gui/grblhardwareconfig.py +269 -153
  169. meerk40t/grbl/gui/grbloperationconfig.py +105 -0
  170. meerk40t/grbl/gui/gui.py +147 -116
  171. meerk40t/grbl/interpreter.py +44 -44
  172. meerk40t/grbl/loader.py +22 -22
  173. meerk40t/grbl/mock_connection.py +56 -56
  174. meerk40t/grbl/plugin.py +294 -264
  175. meerk40t/grbl/serial_connection.py +93 -88
  176. meerk40t/grbl/tcp_connection.py +81 -79
  177. meerk40t/grbl/ws_connection.py +112 -0
  178. meerk40t/gui/__init__.py +1 -1
  179. meerk40t/gui/about.py +2042 -296
  180. meerk40t/gui/alignment.py +1644 -1608
  181. meerk40t/gui/autoexec.py +199 -0
  182. meerk40t/gui/basicops.py +791 -670
  183. meerk40t/gui/bufferview.py +77 -71
  184. meerk40t/gui/busy.py +170 -133
  185. meerk40t/gui/choicepropertypanel.py +1673 -1469
  186. meerk40t/gui/consolepanel.py +706 -542
  187. meerk40t/gui/devicepanel.py +687 -581
  188. meerk40t/gui/dialogoptions.py +110 -107
  189. meerk40t/gui/executejob.py +316 -306
  190. meerk40t/gui/fonts.py +90 -90
  191. meerk40t/gui/functionwrapper.py +252 -0
  192. meerk40t/gui/gui_mixins.py +729 -0
  193. meerk40t/gui/guicolors.py +205 -182
  194. meerk40t/gui/help_assets/help_assets.py +218 -201
  195. meerk40t/gui/helper.py +154 -0
  196. meerk40t/gui/hersheymanager.py +1430 -846
  197. meerk40t/gui/icons.py +3422 -2747
  198. meerk40t/gui/imagesplitter.py +555 -508
  199. meerk40t/gui/keymap.py +354 -344
  200. meerk40t/gui/laserpanel.py +892 -806
  201. meerk40t/gui/laserrender.py +1470 -1232
  202. meerk40t/gui/lasertoolpanel.py +805 -793
  203. meerk40t/gui/magnetoptions.py +436 -0
  204. meerk40t/gui/materialmanager.py +2917 -0
  205. meerk40t/gui/materialtest.py +1722 -1694
  206. meerk40t/gui/mkdebug.py +646 -359
  207. meerk40t/gui/mwindow.py +163 -140
  208. meerk40t/gui/navigationpanels.py +2605 -2467
  209. meerk40t/gui/notes.py +143 -142
  210. meerk40t/gui/opassignment.py +414 -410
  211. meerk40t/gui/operation_info.py +310 -299
  212. meerk40t/gui/plugin.py +494 -328
  213. meerk40t/gui/position.py +714 -669
  214. meerk40t/gui/preferences.py +901 -650
  215. meerk40t/gui/propertypanels/attributes.py +1461 -1131
  216. meerk40t/gui/propertypanels/blobproperty.py +117 -114
  217. meerk40t/gui/propertypanels/consoleproperty.py +83 -80
  218. meerk40t/gui/propertypanels/gotoproperty.py +77 -0
  219. meerk40t/gui/propertypanels/groupproperties.py +223 -217
  220. meerk40t/gui/propertypanels/hatchproperty.py +489 -469
  221. meerk40t/gui/propertypanels/imageproperty.py +2244 -1384
  222. meerk40t/gui/propertypanels/inputproperty.py +59 -58
  223. meerk40t/gui/propertypanels/opbranchproperties.py +82 -80
  224. meerk40t/gui/propertypanels/operationpropertymain.py +1890 -1638
  225. meerk40t/gui/propertypanels/outputproperty.py +59 -58
  226. meerk40t/gui/propertypanels/pathproperty.py +389 -380
  227. meerk40t/gui/propertypanels/placementproperty.py +1214 -383
  228. meerk40t/gui/propertypanels/pointproperty.py +140 -136
  229. meerk40t/gui/propertypanels/propertywindow.py +313 -181
  230. meerk40t/gui/propertypanels/rasterwizardpanels.py +996 -912
  231. meerk40t/gui/propertypanels/regbranchproperties.py +76 -0
  232. meerk40t/gui/propertypanels/textproperty.py +770 -755
  233. meerk40t/gui/propertypanels/waitproperty.py +56 -55
  234. meerk40t/gui/propertypanels/warpproperty.py +121 -0
  235. meerk40t/gui/propertypanels/wobbleproperty.py +255 -204
  236. meerk40t/gui/ribbon.py +2468 -2210
  237. meerk40t/gui/scene/scene.py +1100 -1051
  238. meerk40t/gui/scene/sceneconst.py +22 -22
  239. meerk40t/gui/scene/scenepanel.py +439 -349
  240. meerk40t/gui/scene/scenespacewidget.py +365 -365
  241. meerk40t/gui/scene/widget.py +518 -505
  242. meerk40t/gui/scenewidgets/affinemover.py +215 -215
  243. meerk40t/gui/scenewidgets/attractionwidget.py +315 -309
  244. meerk40t/gui/scenewidgets/bedwidget.py +120 -97
  245. meerk40t/gui/scenewidgets/elementswidget.py +137 -107
  246. meerk40t/gui/scenewidgets/gridwidget.py +785 -745
  247. meerk40t/gui/scenewidgets/guidewidget.py +765 -765
  248. meerk40t/gui/scenewidgets/laserpathwidget.py +66 -66
  249. meerk40t/gui/scenewidgets/machineoriginwidget.py +86 -86
  250. meerk40t/gui/scenewidgets/nodeselector.py +28 -28
  251. meerk40t/gui/scenewidgets/rectselectwidget.py +589 -346
  252. meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
  253. meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
  254. meerk40t/gui/scenewidgets/selectionwidget.py +2952 -2756
  255. meerk40t/gui/simpleui.py +357 -333
  256. meerk40t/gui/simulation.py +2431 -2094
  257. meerk40t/gui/snapoptions.py +208 -203
  258. meerk40t/gui/spoolerpanel.py +1227 -1180
  259. meerk40t/gui/statusbarwidgets/defaultoperations.py +480 -353
  260. meerk40t/gui/statusbarwidgets/infowidget.py +520 -483
  261. meerk40t/gui/statusbarwidgets/opassignwidget.py +356 -355
  262. meerk40t/gui/statusbarwidgets/selectionwidget.py +172 -171
  263. meerk40t/gui/statusbarwidgets/shapepropwidget.py +754 -236
  264. meerk40t/gui/statusbarwidgets/statusbar.py +272 -260
  265. meerk40t/gui/statusbarwidgets/statusbarwidget.py +268 -270
  266. meerk40t/gui/statusbarwidgets/strokewidget.py +267 -251
  267. meerk40t/gui/themes.py +200 -78
  268. meerk40t/gui/tips.py +591 -0
  269. meerk40t/gui/toolwidgets/circlebrush.py +35 -35
  270. meerk40t/gui/toolwidgets/toolcircle.py +248 -242
  271. meerk40t/gui/toolwidgets/toolcontainer.py +82 -77
  272. meerk40t/gui/toolwidgets/tooldraw.py +97 -90
  273. meerk40t/gui/toolwidgets/toolellipse.py +219 -212
  274. meerk40t/gui/toolwidgets/toolimagecut.py +25 -132
  275. meerk40t/gui/toolwidgets/toolline.py +39 -144
  276. meerk40t/gui/toolwidgets/toollinetext.py +79 -236
  277. meerk40t/gui/toolwidgets/toollinetext_inline.py +296 -0
  278. meerk40t/gui/toolwidgets/toolmeasure.py +160 -216
  279. meerk40t/gui/toolwidgets/toolnodeedit.py +2088 -2074
  280. meerk40t/gui/toolwidgets/toolnodemove.py +92 -94
  281. meerk40t/gui/toolwidgets/toolparameter.py +754 -668
  282. meerk40t/gui/toolwidgets/toolplacement.py +108 -108
  283. meerk40t/gui/toolwidgets/toolpoint.py +68 -59
  284. meerk40t/gui/toolwidgets/toolpointlistbuilder.py +294 -0
  285. meerk40t/gui/toolwidgets/toolpointmove.py +183 -0
  286. meerk40t/gui/toolwidgets/toolpolygon.py +288 -403
  287. meerk40t/gui/toolwidgets/toolpolyline.py +38 -196
  288. meerk40t/gui/toolwidgets/toolrect.py +211 -207
  289. meerk40t/gui/toolwidgets/toolrelocate.py +72 -72
  290. meerk40t/gui/toolwidgets/toolribbon.py +598 -113
  291. meerk40t/gui/toolwidgets/tooltabedit.py +546 -0
  292. meerk40t/gui/toolwidgets/tooltext.py +98 -89
  293. meerk40t/gui/toolwidgets/toolvector.py +213 -204
  294. meerk40t/gui/toolwidgets/toolwidget.py +39 -39
  295. meerk40t/gui/usbconnect.py +98 -91
  296. meerk40t/gui/utilitywidgets/buttonwidget.py +18 -18
  297. meerk40t/gui/utilitywidgets/checkboxwidget.py +90 -90
  298. meerk40t/gui/utilitywidgets/controlwidget.py +14 -14
  299. meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +343 -340
  300. meerk40t/gui/utilitywidgets/debugwidgets.py +148 -0
  301. meerk40t/gui/utilitywidgets/handlewidget.py +27 -27
  302. meerk40t/gui/utilitywidgets/harmonograph.py +450 -447
  303. meerk40t/gui/utilitywidgets/openclosewidget.py +40 -40
  304. meerk40t/gui/utilitywidgets/rotationwidget.py +54 -54
  305. meerk40t/gui/utilitywidgets/scalewidget.py +75 -75
  306. meerk40t/gui/utilitywidgets/seekbarwidget.py +183 -183
  307. meerk40t/gui/utilitywidgets/togglewidget.py +142 -142
  308. meerk40t/gui/utilitywidgets/toolbarwidget.py +8 -8
  309. meerk40t/gui/wordlisteditor.py +985 -931
  310. meerk40t/gui/wxmeerk40t.py +1444 -1169
  311. meerk40t/gui/wxmmain.py +5578 -4112
  312. meerk40t/gui/wxmribbon.py +1591 -1076
  313. meerk40t/gui/wxmscene.py +1635 -1453
  314. meerk40t/gui/wxmtree.py +2410 -2089
  315. meerk40t/gui/wxutils.py +1769 -1099
  316. meerk40t/gui/zmatrix.py +102 -102
  317. meerk40t/image/__init__.py +1 -1
  318. meerk40t/image/dither.py +429 -0
  319. meerk40t/image/imagetools.py +2778 -2269
  320. meerk40t/internal_plugins.py +150 -130
  321. meerk40t/kernel/__init__.py +63 -12
  322. meerk40t/kernel/channel.py +259 -212
  323. meerk40t/kernel/context.py +538 -538
  324. meerk40t/kernel/exceptions.py +41 -41
  325. meerk40t/kernel/functions.py +463 -414
  326. meerk40t/kernel/jobs.py +100 -100
  327. meerk40t/kernel/kernel.py +3809 -3571
  328. meerk40t/kernel/lifecycles.py +71 -71
  329. meerk40t/kernel/module.py +49 -49
  330. meerk40t/kernel/service.py +147 -147
  331. meerk40t/kernel/settings.py +383 -343
  332. meerk40t/lihuiyu/controller.py +883 -876
  333. meerk40t/lihuiyu/device.py +1181 -1069
  334. meerk40t/lihuiyu/driver.py +1466 -1372
  335. meerk40t/lihuiyu/gui/gui.py +127 -106
  336. meerk40t/lihuiyu/gui/lhyaccelgui.py +377 -363
  337. meerk40t/lihuiyu/gui/lhycontrollergui.py +741 -651
  338. meerk40t/lihuiyu/gui/lhydrivergui.py +470 -446
  339. meerk40t/lihuiyu/gui/lhyoperationproperties.py +238 -237
  340. meerk40t/lihuiyu/gui/tcpcontroller.py +226 -190
  341. meerk40t/lihuiyu/interpreter.py +53 -53
  342. meerk40t/lihuiyu/laserspeed.py +450 -450
  343. meerk40t/lihuiyu/loader.py +90 -90
  344. meerk40t/lihuiyu/parser.py +404 -404
  345. meerk40t/lihuiyu/plugin.py +101 -102
  346. meerk40t/lihuiyu/tcp_connection.py +111 -109
  347. meerk40t/main.py +231 -165
  348. meerk40t/moshi/builder.py +788 -781
  349. meerk40t/moshi/controller.py +505 -499
  350. meerk40t/moshi/device.py +495 -442
  351. meerk40t/moshi/driver.py +862 -696
  352. meerk40t/moshi/gui/gui.py +78 -76
  353. meerk40t/moshi/gui/moshicontrollergui.py +538 -522
  354. meerk40t/moshi/gui/moshidrivergui.py +87 -75
  355. meerk40t/moshi/plugin.py +43 -43
  356. meerk40t/network/console_server.py +102 -57
  357. meerk40t/network/kernelserver.py +10 -9
  358. meerk40t/network/tcp_server.py +142 -140
  359. meerk40t/network/udp_server.py +103 -77
  360. meerk40t/network/web_server.py +390 -0
  361. meerk40t/newly/controller.py +1158 -1144
  362. meerk40t/newly/device.py +874 -732
  363. meerk40t/newly/driver.py +540 -412
  364. meerk40t/newly/gui/gui.py +219 -188
  365. meerk40t/newly/gui/newlyconfig.py +116 -101
  366. meerk40t/newly/gui/newlycontroller.py +193 -186
  367. meerk40t/newly/gui/operationproperties.py +51 -51
  368. meerk40t/newly/mock_connection.py +82 -82
  369. meerk40t/newly/newly_params.py +56 -56
  370. meerk40t/newly/plugin.py +1214 -1246
  371. meerk40t/newly/usb_connection.py +322 -322
  372. meerk40t/rotary/gui/gui.py +52 -46
  373. meerk40t/rotary/gui/rotarysettings.py +240 -232
  374. meerk40t/rotary/rotary.py +202 -98
  375. meerk40t/ruida/control.py +291 -91
  376. meerk40t/ruida/controller.py +138 -1088
  377. meerk40t/ruida/device.py +672 -231
  378. meerk40t/ruida/driver.py +534 -472
  379. meerk40t/ruida/emulator.py +1494 -1491
  380. meerk40t/ruida/exceptions.py +4 -4
  381. meerk40t/ruida/gui/gui.py +71 -76
  382. meerk40t/ruida/gui/ruidaconfig.py +239 -72
  383. meerk40t/ruida/gui/ruidacontroller.py +187 -184
  384. meerk40t/ruida/gui/ruidaoperationproperties.py +48 -47
  385. meerk40t/ruida/loader.py +54 -52
  386. meerk40t/ruida/mock_connection.py +57 -109
  387. meerk40t/ruida/plugin.py +124 -87
  388. meerk40t/ruida/rdjob.py +2084 -945
  389. meerk40t/ruida/serial_connection.py +116 -0
  390. meerk40t/ruida/tcp_connection.py +146 -0
  391. meerk40t/ruida/udp_connection.py +73 -0
  392. meerk40t/svgelements.py +9671 -9669
  393. meerk40t/tools/driver_to_path.py +584 -579
  394. meerk40t/tools/geomstr.py +5583 -4680
  395. meerk40t/tools/jhfparser.py +357 -292
  396. meerk40t/tools/kerftest.py +904 -890
  397. meerk40t/tools/livinghinges.py +1168 -1033
  398. meerk40t/tools/pathtools.py +987 -949
  399. meerk40t/tools/pmatrix.py +234 -0
  400. meerk40t/tools/pointfinder.py +942 -942
  401. meerk40t/tools/polybool.py +940 -940
  402. meerk40t/tools/rasterplotter.py +1660 -547
  403. meerk40t/tools/shxparser.py +989 -901
  404. meerk40t/tools/ttfparser.py +726 -446
  405. meerk40t/tools/zinglplotter.py +595 -593
  406. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/LICENSE +21 -21
  407. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/METADATA +150 -139
  408. meerk40t-0.9.7010.dist-info/RECORD +445 -0
  409. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/WHEEL +1 -1
  410. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/top_level.txt +0 -1
  411. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/zip-safe +1 -1
  412. meerk40t/balormk/elementlightjob.py +0 -159
  413. meerk40t-0.9.3001.dist-info/RECORD +0 -437
  414. test/bootstrap.py +0 -63
  415. test/test_cli.py +0 -12
  416. test/test_core_cutcode.py +0 -418
  417. test/test_core_elements.py +0 -144
  418. test/test_core_plotplanner.py +0 -397
  419. test/test_core_viewports.py +0 -312
  420. test/test_drivers_grbl.py +0 -108
  421. test/test_drivers_lihuiyu.py +0 -443
  422. test/test_drivers_newly.py +0 -113
  423. test/test_element_degenerate_points.py +0 -43
  424. test/test_elements_classify.py +0 -97
  425. test/test_elements_penbox.py +0 -22
  426. test/test_file_svg.py +0 -176
  427. test/test_fill.py +0 -155
  428. test/test_geomstr.py +0 -1523
  429. test/test_geomstr_nodes.py +0 -18
  430. test/test_imagetools_actualize.py +0 -306
  431. test/test_imagetools_wizard.py +0 -258
  432. test/test_kernel.py +0 -200
  433. test/test_laser_speeds.py +0 -3303
  434. test/test_length.py +0 -57
  435. test/test_lifecycle.py +0 -66
  436. test/test_operations.py +0 -251
  437. test/test_operations_hatch.py +0 -57
  438. test/test_ruida.py +0 -19
  439. test/test_spooler.py +0 -22
  440. test/test_tools_rasterplotter.py +0 -29
  441. test/test_wobble.py +0 -133
  442. test/test_zingl.py +0 -124
  443. {test → meerk40t/cylinder}/__init__.py +0 -0
  444. /meerk40t/{core/element_commands.py → cylinder/gui/__init__.py} +0 -0
  445. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/entry_points.txt +0 -0
@@ -1,457 +1,457 @@
1
- """
2
- This code initializes the FPGA on cloned boards.
3
- """
4
- import hashlib
5
- import struct
6
-
7
- import usb.core
8
- from usb.util import (
9
- CTRL_OUT,
10
- CTRL_RECIPIENT_DEVICE,
11
- CTRL_TYPE_VENDOR,
12
- build_request_type,
13
- )
14
-
15
- VENDER_ID = 0x9588
16
- PRODUCT_ID = 0x9980
17
-
18
- request = build_request_type(CTRL_OUT, CTRL_TYPE_VENDOR, CTRL_RECIPIENT_DEVICE)
19
-
20
-
21
- init = [
22
- (3654, b"\x00\x01\x02\x02\x03\x03\x04\x04\x05\x05"),
23
- (818, b"\xe4\xf5,\xf5+\xf5*\xf5)\xc2\x03\xc2\x00\xd2\x02\xc2"),
24
- (834, b"\x01\x12\x07\xf7~\x0c\x7f\x00\x8e\n\x8f\x0bu\x12\x0cu"),
25
- (850, b"\x13\x12u\x08\x0cu\t\x1cu\x10\x0cu\x11Ju\x14"),
26
- (866, b"\x0cu\x15\x86\xeeT\xc0p\x03\x02\x045u-\x00u"),
27
- (882, b".\x80\x8e/\x8f0\xc3t\xa8\x9f\xfft\x0c\x9e\xcf$"),
28
- (898, b"\x02\xcf4\x00\xfe\xe4\x8f(\x8e'\xf5&\xf5%\xf5$"),
29
- (914, b"\xf5#\xf5\"\xf5!\xaf(\xae'\xad&\xac%\xab$"),
30
- (930, b'\xaa#\xa9"\xa8!\xc3\x12\r\xa9P5\xae#\xaf$'),
31
- (946, b"\xe50/\xf5\x82\xe5/>\xf5\x83\xe0\xfd\xe5./\xf5"),
32
- (962, b"\x82\xe5->\xf5\x83\xed\xf0\xe4\xfa\xf9\xf8\xef$\x01\xf5"),
33
- (978, b'$\xea>\xf5#\xe95"\xf5"\xe85!\xf5!\x80'),
34
- (994, b"\xb5\x85-\n\x85.\x0bt\x00$\x80\xfft\x0c4\xff"),
35
- (1010, b"\xfe\xc3\xe5\x13\x9f\xf5\x13\xe5\x12\x9e\xf5\x12\xc3\xe5\r\x9f"),
36
- (1026, b"\xf5\r\xe5\x0c\x9e\xf5\x0c\xc3\xe5\x0f\x9f\xf5\x0f\xe5\x0e\x9e"),
37
- (1042, b"\xf5\x0e\xc3\xe5\t\x9f\xf5\t\xe5\x08\x9e\xf5\x08\xc3\xe5\x11"),
38
- (1058, b"\x9f\xf5\x11\xe5\x10\x9e\xf5\x10\xc3\xe5\x15\x9f\xf5\x15\xe5\x14"),
39
- (1074, b"\x9e\xf5\x14\xd2\xe8C\xd8 \x90\xe6h\xe0D\t\xf0\x90"),
40
- (1090, b"\xe6\x82\xe0D\x10\xf0\x90\xe6\\\xe0D=\xf0\xd2\xaf\xd2"),
41
- (1106, b"\x07\x12\x0c\xe0S\x8e\xf8\xc2\x03\x12\x04\x950\x01\x05\x12"),
42
- (1122, b"\x00\x80\xc2\x010\x03\xf2\x12\x08\xfdP\xed\xc2\x03\x12\r"),
43
- (1138, b"\xba \x00\x16\x90\xe6\x82\xe00\xe7\x04\xe0 \xe1\xef\x90"),
44
- (1154, b"\xe6\x82\xe00\xe6\x04\xe0 \xe0\xe4\x12\r<\x12\x0e\\"),
45
- (1170, b"\x80\xc7"),
46
- (1172, b'"'),
47
- (3643, b'\x90\xe5\r\xe00\xe4\x02\xc3"\xd3"'),
48
- (128, b"\x90\xe6\xb9\xe0p\x03\x02\x01j\x14p\x03\x02\x02\x13$"),
49
- (144, b"\xfep\x03\x02\x02\xa9$\xfbp\x03\x02\x01d\x14p\x03"),
50
- (160, b"\x02\x01^\x14p\x03\x02\x01R\x14p\x03\x02\x01X$"),
51
- (176, b"\x05`\x03\x02\x03\x1e\x12\x0e^@\x03\x02\x03*\x90\xe6"),
52
- (192, b"\xbb\xe0$\xfe`;\x14`V$\xfd`\x16\x14`@"),
53
- (208, b"$\x06pt\xe5\n\x90\xe6\xb3\xf0\xe5\x0b\x90\xe6\xb4\xf0"),
54
- (224, b"\x02\x03*\x12\x0e;P\x0f\xe5\x12\x90\xe6\xb3\xf0\xe5\x13"),
55
- (240, b"\x90\xe6\xb4\xf0\x02\x03*\x90\xe6\xa0\xe0D\x01\xf0\x02\x03"),
56
- (256, b"*\xe5\x0c\x90\xe6\xb3\xf0\xe5\r\x90\xe6\xb4\xf0\x02\x03*"),
57
- (272, b"\xe5\x0e\x90\xe6\xb3\xf0\xe5\x0f\x90\xe6\xb4\xf0\x02\x03*\x90"),
58
- (288, b"\xe6\xba\xe0\xff\x12\rh\xaa\x06\xa9\x07{\x01\xeaI`"),
59
- (304, b"\r\xee\x90\xe6\xb3\xf0\xef\x90\xe6\xb4\xf0\x02\x03*\x90\xe6"),
60
- (320, b"\xa0\xe0D\x01\xf0\x02\x03*\x90\xe6\xa0\xe0D\x01\xf0\x02"),
61
- (336, b"\x03*\x12\x0e\x1d\x02\x03*\x12\x0eP\x02\x03*\x12\x0b"),
62
- (352, b"\xf8\x02\x03*\x12\x0e\x0b\x02\x03*\x12\x0e`@\x03\x02"),
63
- (368, b"\x03*\x90\xe6\xb8\xe0$\x7f`+\x14`<$\x02`"),
64
- (384, b"\x03\x02\x02\t\xa2\x00\xe43\xff%\xe0\xff\xa2\x02\xe43"),
65
- (400, b"O\x90\xe7@\xf0\xe4\xa3\xf0\x90\xe6\x8a\xf0\x90\xe6\x8bt"),
66
- (416, b"\x02\xf0\x02\x03*\xe4\x90\xe7@\xf0\xa3\xf0\x90\xe6\x8a\xf0"),
67
- (432, b"\x90\xe6\x8bt\x02\xf0\x02\x03*\x90\xe6\xbc\xe0T~\xff"),
68
- (448, b"~\x00\xe0\xd3\x94\x80@\x06|\x00}\x01\x80\x04|\x00"),
69
- (464, b"}\x00\xecN\xfe\xedO$F\xf5\x82t\x0e>\xf5\x83"),
70
- (480, b"\xe4\x93\xff3\x95\xe0\xfe\xef$\xa1\xff\xee4\xe6\x8f\x82"),
71
- (496, b"\xf5\x83\xe0T\x01\x90\xe7@\xf0\xe4\xa3\xf0\x90\xe6\x8a\xf0"),
72
- (512, b"\x90\xe6\x8bt\x02\xf0\x02\x03*\x90\xe6\xa0\xe0D\x01\xf0"),
73
- (528, b"\x02\x03*\x12\x0eb@\x03\x02\x03*\x90\xe6\xb8\xe0$"),
74
- (544, b"\xfe`\x1d$\x02`\x03\x02\x03*\x90\xe6\xba\xe0\xb4\x01"),
75
- (560, b"\x05\xc2\x00\x02\x03*\x90\xe6\xa0\xe0D\x01\xf0\x02\x03*"),
76
- (576, b"\x90\xe6\xba\xe0pY\x90\xe6\xbc\xe0T~\xff~\x00\xe0"),
77
- (592, b"\xd3\x94\x80@\x06|\x00}\x01\x80\x04|\x00}\x00\xec"),
78
- (608, b"N\xfe\xedO$F\xf5\x82t\x0e>\xf5\x83\xe4\x93\xff"),
79
- (624, b"3\x95\xe0\xfe\xef$\xa1\xff\xee4\xe6\x8f\x82\xf5\x83\xe0"),
80
- (640, b"T\xfe\xf0\x90\xe6\xbc\xe0T\x80\xff\x13\x13\x13T\x1f\xff"),
81
- (656, b"\xe0T\x0f/\x90\xe6\x83\xf0\xe0D \xf0\x02\x03*\x90"),
82
- (672, b"\xe6\xa0\xe0D\x01\xf0\x02\x03*\x12\x0edP|\x90\xe6"),
83
- (688, b"\xb8\xe0$\xfe` $\x02p[\x90\xe6\xba\xe0\xb4\x01"),
84
- (704, b"\x04\xd2\x00\x80e\x90\xe6\xba\xe0d\x02`]\x90\xe6\xa0"),
85
- (720, b"\xe0D\x01\xf0\x80T\x90\xe6\xbc\xe0T~\xff~\x00\xe0"),
86
- (736, b"\xd3\x94\x80@\x06|\x00}\x01\x80\x04|\x00}\x00\xec"),
87
- (752, b"N\xfe\xedO$F\xf5\x82t\x0e>\xf5\x83\xe4\x93\xff"),
88
- (768, b"3\x95\xe0\xfe\xef$\xa1\xff\xee4\xe6\x8f\x82\xf5\x83\xe0"),
89
- (784, b"D\x01\xf0\x80\x15\x90\xe6\xa0\xe0D\x01\xf0\x80\x0c\x12\r"),
90
- (800, b"\x0fP\x07\x90\xe6\xa0\xe0D\x01\xf0\x90\xe6\xa0\xe0D\x80"),
91
- (816, b"\xf0"),
92
- (817, b'"'),
93
- (51, b"\x02\x0eX"),
94
- (3672, b"S\xd8\xef2"),
95
- (3072, b"\x12\x01\x00\x02\x00\x00\x00@\x88\x95\x99\x98\x00\x00\x01\x02"),
96
- (3088, b"\x00\x01\n\x06\x00\x02\x00\x00\x00@\x01\x00\t\x02.\x00"),
97
- (3104, b"\x01\x01\x00@\x05\t\x04\x00\x00\x04\xff\x00\x00\x00\x07\x05"),
98
- (3120, b"\x01\x02\x00\x02\x00\x07\x05\x81\x02\x00\x02\x00\x07\x05\x02\x02"),
99
- (3136, b"\x00\x02\x00\x07\x05\x88\x02\x00\x02\x00\t\x02<\x00\x01\x01"),
100
- (3152, b"\x00@\x05\t\x04\x00\x00\x06\xff\x00\x00\x00\x07\x05\x01\x02"),
101
- (3168, b"@\x00\x00\x07\x05\x81\x02@\x00\x00\x07\x05\x02\x02@\x00"),
102
- (3184, b"\x00\x07\x05\x04\x02@\x00\x00\x07\x05\x06\x02@\x00\x00\x07"),
103
- (3200, b"\x05\x88\x02@\x00\x00\x04\x03\t\x04\x0c\x03B\x00J\x00"),
104
- (3216, b"J\x00C\x00Z\x00\x12\x03U\x00S\x00B\x00L\x00"),
105
- (3232, b"M\x00C\x00V\x002\x00\x00\x00"),
106
- (3388, b"\x90\xe6\x82\xe00\xe0\x04\xe0 \xe6\x0b\x90\xe6\x82\xe00"),
107
- (3404, b"\xe1\x19\xe00\xe7\x15\x90\xe6\x80\xe0D\x01\xf0\x7f\x14~"),
108
- (3420, b'\x00\x12\x0b\x18\x90\xe6\x80\xe0T\xfe\xf0"'),
109
- (3296, b"0\x07\t\x90\xe6\x80\xe0D\n\xf0\x80\x07\x90\xe6\x80\xe0"),
110
- (3312, b"D\x08\xf0\x7f\xdc~\x05\x12\x0b\x18\x90\xe6]t\xff\xf0"),
111
- (3328, b'\x90\xe6_\xf0S\x91\xef\x90\xe6\x80\xe0T\xf7\xf0"'),
112
- (3432, b"\xa9\x07"),
113
- (3434, b"\xae\x14\xaf\x15\x8f\x82\x8e\x83\xa3\xe0d\x03p\x17\xad\x01"),
114
- (3450, b'\x19\xedp\x01"\x8f\x82\x8e\x83\xe0|\x00/\xfd\xec>'),
115
- (3466, b"\xfe\xaf\x05\x80\xdf\xe4\xfe\xff"),
116
- (3474, b'"'),
117
- (3514, b"\x90\xe6\x82\xe0D\xc0\xf0\x90\xe6\x81\xf0C\x87\x01\x00\x00"),
118
- (3530, b'\x00\x00\x00"'),
119
- (2840, b"\x8e1\x8f2\x90\xe6\x00\xe0T\x18p\x12\xe52$\x01"),
120
- (2856, b"\xff\xe451\xc3\x13\xf51\xef\x13\xf52\x80\x15\x90\xe6"),
121
- (2872, b"\x00\xe0T\x18\xff\xbf\x10\x0b\xe52%\xe0\xf52\xe51"),
122
- (2888, b"3\xf51\xe52\x152\xae1p\x02\x151N`\x05"),
123
- (2904, b'\x12\r\xce\x80\xee"'),
124
- (3534, b"t\x00\xf5\x86\x90\xfd\xa5|\x05\xa3\xe5\x82E\x83p\xf9"),
125
- (3550, b'"'),
126
- (67, b"\x02\t\x00"),
127
- (83, b"\x02\t\x00"),
128
- (2304, b"\x02\x08\xe5\x00\x02\r\xf5\x00\x02\r\xdf\x00\x02\x0b\xe0\x00"),
129
- (2320, b"\x02\x0c\xaa\x00\x02\x0b\xa3\x00\x02\x08\xff\x00\x02\x0ef\x00"),
130
- (2336, b"\x02\x0eg\x00\x02\x0eh\x00\x02\x0ei\x00\x02\x0ej\x00"),
131
- (2352, b"\x02\x0ek\x00\x02\x0el\x00\x02\x0em\x00\x02\x0en\x00"),
132
- (2368, b"\x02\x0eo\x00\x02\x0ef\x00\x02\x0ep\x00\x02\x0eq\x00"),
133
- (2384, b"\x02\x0er\x00\x02\x0es\x00\x02\x0et\x00\x02\x0eu\x00"),
134
- (2400, b"\x02\x0ev\x00\x02\x0ef\x00\x02\x0ef\x00\x02\x0ef\x00"),
135
- (2416, b"\x02\x0ew\x00\x02\x0ex\x00\x02\x0ey\x00\x02\x0ez\x00"),
136
- (2432, b"\x02\x0e{\x00\x02\x0e|\x00\x02\x0e}\x00\x02\x0e~\x00"),
137
- (2448, b"\x02\x0e\x7f\x00\x02\x0e\x80\x00\x02\x0e\x81\x00\x02\x0e\x82\x00"),
138
- (2464, b"\x02\x0e\x83\x00\x02\x0e\x84\x00\x02\x0e\x85\x00\x02\x0e\x86\x00"),
139
- (2480, b"\x02\x0e\x87\x00\x02\x0e\x88\x00"),
140
- (2488, b"\xe4\xf59\xf5:\x90\xe6x\xe0 \xe0/\xae9\xaf:"),
141
- (2504, b"\xe4\xfc\xfd{\xe8z\xfd\xf9\xf8\xd3\x12\r\x93@\x1c\x00"),
142
- (2520, b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"),
143
- (2536, b"\x00\x05:\xe5:p\x02\x059\x80\xca\x90\xe6x\xe00"),
144
- (2552, b'\xe2\x03\x7f\x01"\xae9\xaf:\xe4\xfc\xfd{\xe8z\xfd'),
145
- (2568, b'\xf9\xf8\xd3\x12\r\x93P\x03\x7f\x04"0\x07Q\xe4\xf5'),
146
- (2584, b"9\xf5:\x90\xe6x\xe0 \xe1/\xae9\xaf:\xe4\xfc"),
147
- (2600, b"\xfd{Pz\xc3\xf9\xf8\xd3\x12\r\x93@\x1c\x00\x00\x00"),
148
- (2616, b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05"),
149
- (2632, b":\xe5:p\x02\x059\x80\xca\xae9\xaf:\xe4\xfc\xfd"),
150
- (2648, b'{Pz\xc3\xf9\xf8\xd3\x12\r\x93P\x03\x7f\x04"\x7f'),
151
- (2664, b"\x00"),
152
- (2665, b'"'),
153
- (2910, b"\xe4\xf59\xf5:\x90\xe6x\xe00\xe2#\xae9\xaf:"),
154
- (2926, b"\xe4\xfc\xfd{Pz\xc3\xf9\xf8\xd3\x12\r\x93@\x10\x00"),
155
- (2942, b"\x00\x00\x00\x00\x00\x05:\xe5:p\x02\x059\x80\xd6\xae"),
156
- (2958, b"9\xaf:\xe4\xfc\xfd{Pz\xc3\xf9\xf8\xd3\x12\r\x93"),
157
- (2974, b'P\x01"\xc3'),
158
- (2978, b'"'),
159
- (2666, b"\x8f2\x8d3\x8b4"),
160
- (2672, b"\xe4\xf55\xf56\xf57u8\x04\x90\xe6x\xe0D\x80"),
161
- (2688, b'\xf0\x12\x0b^P\x03\xaf8"\xe52T\xfe\x90\xe6y'),
162
- (2704, b"\xf0\xd2\x07\x12\t\xb8\x8f8\xe58\xd3\x94\x00@\x08\xe5"),
163
- (2720, b"8d\x01p:\x80\xd3\xe4\xf57\xe57\xc3\x954P"),
164
- (2736, b"+\xe53%7$\x80\xf5\x82\xe44\xe7\xf5\x83\xe0\x90"),
165
- (2752, b"\xe6y\xf0\xd2\x07\x12\t\xb8\x8f8\xe58\xd3\x94\x00@"),
166
- (2768, b"\x07\xe58\xb4\x01\x06\x80\xa2\x057\x80\xce\xe4\xf58\x90"),
167
- (2784, b"\xe6x\xe0D@\xf0\xe4\xf55\xf56\x90\xe6x\xe00"),
168
- (2800, b"\xe6#\xae5\xaf6\xe4\xfc\xfd{Pz\xc3\xf9\xf8\xd3"),
169
- (2816, b"\x12\r\x93@\x10\x00\x00\x00\x00\x00\x00\x056\xe56p"),
170
- (2832, b"\x02\x055\x80\xd6\xaf8"),
171
- (2839, b'"'),
172
- (1791, b"u6\x04\x90\xe6x\xe0D\x80\xf0\x12\x0b^P\x03\xaf"),
173
- (1807, b'6"\x90\xe6yt\xa0\xf0\xd2\x07\x12\t\xb8\x8f6\xe5'),
174
- (1823, b"6\xd3\x94\x00@\x0b\xe56d\x01`\x03\x02\x07\xf4\x80"),
175
- (1839, b"\xd2\xe4\x90\xe6y\xf0\xd2\x07\x12\t\xb8\x8f6\xe56\xd3"),
176
- (1855, b"\x94\x00@\x0b\xe56d\x01`\x03\x02\x07\xf4\x80\xb4\x90"),
177
- (1871, b"\xe6x\xe0D\x80\xf0\xd2\x07\x12\t\xb8\x8f6\xe56\xd3"),
178
- (1887, b"\x94\x00@\x0b\xe56d\x01`\x03\x02\x07\xf4\x80\x94\x90"),
179
- (1903, b"\xe6y\xe0\x90\xe7\xc0\xf0\xc2\x07\x12\t\xb8\x8f6\xe56"),
180
- (1919, b"\xd3\x94\x00@\t\xe56d\x01pj\x02\x07\x02\xe4\xf5"),
181
- (1935, b"4\xf55\xc3\xe55\x94?\xe54\x94\x00PA\xe55"),
182
- (1951, b"d>E4p\x07\x90\xe6x\xe0D \xf0\x90\xe6y"),
183
- (1967, b"\xe0\xfft\xc0%5\xf5\x82\xe44\xe7\xf5\x83\xef\xf0\xc2"),
184
- (1983, b"\x07\x12\t\xb8\x8f6\xe56\xd3\x94\x00@\x08\xe56\xb4"),
185
- (1999, b"\x01\r\x02\x07\x02\x055\xe55p\x02\x054\x80\xb4\x90"),
186
- (2015, b"\xe6x\xe0D@\xf0\x90\xe6y\xe0\x90\xe7\xff\xf0\xc2\x07"),
187
- (2031, b"\x12\t\xb8\x8f6\xaf6"),
188
- (2038, b'"'),
189
- (1485, b"u3\x04\x90\xe6x\xe0D\x80\xf0\x12\x0b^P\x03\xaf"),
190
- (1501, b'3"\x90\xe6x\xe0D\x80\xf0\x90\xe6yt\xef\xf0\xd2'),
191
- (1517, b"\x07\x12\t\xb8\x8f3\xe53\xd3\x94\x00@\x0b\xe53d"),
192
- (1533, b"\x01`\x03\x02\x06\xfc\x80\xcb\x90\xe6y\xe0\x90\xe7\xc0\xf0"),
193
- (1549, b"\xc2\x07\x12\t\xb8\x8f3\xe53\xd3\x94\x00@\x0b\xe53"),
194
- (1565, b"d\x01`\x03\x02\x06\xfc\x80\xaa\x90\xe6y\xe0\x90\xe7\xc0"),
195
- (1581, b"\xf0\xc2\x07\x12\t\xb8\x8f3\xe53\xd3\x94\x00@\x0b\xe5"),
196
- (1597, b"3d\x01`\x03\x02\x06\xfc\x80\x89\x90\xe6y\xe0\x90\xe7"),
197
- (1613, b"\xc1\xf0\xc2\x07\x12\t\xb8\x8f3\xe53\xd3\x94\x00@\x0c"),
198
- (1629, b"\xe53d\x01`\x03\x02\x06\xfc\x02\x05\xd0\x90\xe7\xc0\xe0"),
199
- (1645, b"\xd3\x94>P\x06\xa3\xe0\x94\x00@\x06\x90\xe7\xc0t>"),
200
- (1661, b"\xf0\x90\xe7\xc0\xe0\xd3\x94\x01@G\xe4\xf52\x90\xe7\xc0"),
201
- (1677, b"\xe0\x14\xff\xe52\xc3\x9fP8\xe0\x14\xb52\x07\x90\xe6"),
202
- (1693, b"x\xe0D \xf0\x90\xe6y\xe0\xfft\xc2%2\xf5\x82"),
203
- (1709, b"\xe44\xe7\xf5\x83\xef\xf0\xc2\x07\x12\t\xb8\x8f3\xe53"),
204
- (1725, b"\xd3\x94\x00@\x08\xe53\xb4\x01\x07\x02\x05\xd0\x052\x80"),
205
- (1741, b"\xbc\x90\xe6x\xe0D@\xf0\x90\xe7\xc0\xe0\xd3\x94\x00@"),
206
- (1757, b"\x1e\xe0$\x01\xff\xe43\x90\xe6y\xe0\xfdt\xc0/\xf5"),
207
- (1773, b"\x82\xe44\xe7\xf5\x83\xed\xf0\xc2\x07\x12\t\xb8\x8f3\xaf"),
208
- (1789, b"3"),
209
- (1790, b'"'),
210
- (2039, b"\x90\xe6\x00\xe0T\xe7D\x10\xf0\x00\x00\x00\x90\xe6\x01t"),
211
- (2055, b"\x8b\xf0\x00\x00\x00\x90\xe6\x10t\xa0\xf0\x90\xe6\x11\xf0\x00"),
212
- (2071, b"\x00\x00\x90\xe6\x0bt\x03\xf0\x00\x00\x00\x90\xe6\x12t\xab"),
213
- (2087, b"\xf0\x00\x00\x00\x90\xe6\x15t\xe2\xf0\x00\x00\x00\x90\xe6\x04"),
214
- (2103, b"t\x80\xf0\x00\x00\x00t\x02\xf0\x00\x00\x00t\x04\xf0\x00"),
215
- (2119, b"\x00\x00t\x06\xf0\x00\x00\x00t\x08\xf0\x00\x00\x00\xe4\xf0"),
216
- (2135, b"\x00\x00\x00\x90\xe6It\x82\xf0\x00\x00\x00\xf0\x00\x00\x00"),
217
- (2151, b"\xf0\x00\x00\x00\x90\xe6Ht\x88\xf0\x00\x00\x00\xf0\x00\x00"),
218
- (2167, b"\x00\x90\xe6\x18t\x11\xf0\x00\x00\x00\x90\xe6\x1bt\t\xf0"),
219
- (2183, b"\x00\x00\x00\xe4\x90\xe6&\xf0\x00\x00\x00\x90\xe6't\x08"),
220
- (2199, b"\xf0\x00\x00\x00\xe4\x90\xe6\x02\xf0\x00\x00\x00\x90\xe6\x03\xf0"),
221
- (2215, b"\x00\x00\x00\x90\xe6pt@\xf0\x00\x00\x00\xe4\x90\xe6\t"),
222
- (2231, b"\xf0\x00\x00\x00\x90\xe66t\x80\xf0\x00\x00\x00\xe4\x90\xe6"),
223
- (2247, b"7\xf0C\xb2\x03\x00\x00\x00\xc2\x80\x00\x00\x00\xd2\x81\x00"),
224
- (2263, b'\x00\x00\xc2\x06\xc2\x05\xc2\x04u\xaf\x07\xd2\x00"'),
225
- (1173, b" \x05\x030\x043\x90\xe6\xa2\xe00\xe1\x03\x02\x05\xcc"),
226
- (1189, b"0\x05\x17\x12\x06\xff\xefp\x08\x90\xe7\xfft\x04\xf0\x80"),
227
- (1205, b"\x05\xe4\x90\xe7\xff\xf0\xc2\x05\x80\x05\x12\x05\xcd\xc2\x04\x00"),
228
- (1221, b'\x00\x00\x90\xe6\x8ft@\xf0"0\x06<\x90\xe6\xa2\xe0'),
229
- (1237, b"0\xe1\x03\x02\x05\xcc\xe4\xff\xfet\x00/\xf5\x82\xe44"),
230
- (1253, b" \xf5\x83\xe0\xfdt\xc0/\xf5\x82\xe44\xe7\xf5\x83\xed"),
231
- (1269, b"\xf0\x0f\xbf\x00\x01\x0e\xefd\nNp\xdd\x00\x00\x00\x90"),
232
- (1285, b'\xe6\x8ft\x08\xf0\xc2\x06"\x90\xe6\xa1\xe00\xe1\x03\x02'),
233
- (1301, b"\x05\xcc\x90\xe6\x8d\xe0\xc3\x94\x02@\x06\x90\xe7\x81\xe0`"),
234
- (1317, b'\x06\xe4\x90\xe6\x8d\xf0"\x90\xe7\x80\xe0\x90 \x00\xf0\x90'),
235
- (1333, b"\xe7\x81\xe0\x90 \x01\xf0\x90\xe7\x82\xe0\x90 \x02\xf0\x90"),
236
- (1349, b"\xe7\x83\xe0\x90 \x03\xf0\xe4\xa3\xf0\xa3\xf0\x90\xe7\x80\xe0"),
237
- (1365, b"d\x07p$\x90\xe7\x82\xe0p\x12{\t}\x04\x7f\xa0"),
238
- (1381, b"\x12\nj\x90 \x04\xef\xf0\xd2\x06\x80V\x90\xe7\x82\xe0"),
239
- (1397, b"d\x01pN\xd2\x05\x80J\x90\xe7\x80\xe0\xb4\x08\x17\x90"),
240
- (1413, b"\xe6\x8d\xe0$\xfe\xfb}\x02\x7f\xee\x12\nj\x90 \x04"),
241
- (1429, b"\xef\xf0\xd2\x06\x80,\x90\xe7\x80\xe0\xb4\t\x04\xd2\x04\x80"),
242
- (1445, b"!\x90\xe7\x80\xe0d\np\x19\x90\xe7\x82\xe0p\x07\xc2"),
243
- (1461, b"\x81\x00\x00\x00\x80\n\xc2\x80\x00\x00\x00\xd2\x81\x00\x00\x00"),
244
- (1477, b"\xd2\x06\xe4\x90\xe6\x8d\xf0"),
245
- (1484, b'"'),
246
- (2301, b'\xd3"'),
247
- (3676, b'\xd3"'),
248
- (3678, b'\xd3"'),
249
- (3064, b'\x90\xe6\xba\xe0\xf5\x17\xd3"'),
250
- (3595, b"\x90\xe7@\xe5\x17\xf0\xe4\x90\xe6\x8a\xf0\x90\xe6\x8b\x04\xf0"),
251
- (3611, b'\xd3"'),
252
- (3664, b'\x90\xe6\xba\xe0\xf5\x16\xd3"'),
253
- (3613, b"\x90\xe7@\xe5\x16\xf0\xe4\x90\xe6\x8a\xf0\x90\xe6\x8b\x04\xf0"),
254
- (3629, b'\xd3"'),
255
- (3680, b'\xd3"'),
256
- (3682, b'\xd3"'),
257
- (3684, b'\xd3"'),
258
- (3343, b"\x90\xe6\xb9\xe0$/`\x12\x04p\x1e\x90\xe6\x04\xe0\xff"),
259
- (3359, b"C\x07\x80\x00\x00\x00\xef\xf0\x80\x11\x90\xe6\x04\xe0\xffS"),
260
- (3375, b'\x07\x7f\x00\x00\x00\xef\xf0\x80\x02\xd3"\xc3'),
261
- (3387, b'"'),
262
- (2277, b"\xc0\xe0\xc0\x83\xc0\x82\xd2\x01S\x91\xef\x90\xe6]t\x01"),
263
- (2293, b"\xf0\xd0\x82\xd0\x83\xd0\xe02"),
264
- (3551, b"\xc0\xe0\xc0\x83\xc0\x82S\x91\xef\x90\xe6]t\x04\xf0\xd0"),
265
- (3567, b"\x82\xd0\x83\xd0\xe02"),
266
- (3573, b"\xc0\xe0\xc0\x83\xc0\x82S\x91\xef\x90\xe6]t\x02\xf0\xd0"),
267
- (3589, b"\x82\xd0\x83\xd0\xe02"),
268
- (3242, b"\xc0\xe0\xc0\x83\xc0\x82\x85\x10\x0c\x85\x11\r\x85\r\x82\x85"),
269
- (3258, b"\x0c\x83\xa3t\x02\xf0\x85\x08\x0e\x85\t\x0f\x85\x0f\x82\x85"),
270
- (3274, b"\x0e\x83\xa3t\x07\xf0S\x91\xef\x90\xe6]t\x10\xf0\xd0"),
271
- (3290, b"\x82\xd0\x83\xd0\xe02"),
272
- (3040, b"\xc0\xe0\xc0\x83\xc0\x82\xd2\x03S\x91\xef\x90\xe6]t\x08"),
273
- (3056, b"\xf0\xd0\x82\xd0\x83\xd0\xe02"),
274
- (2979, b"\xc0\xe0\xc0\x83\xc0\x82\x90\xe6\x80\xe00\xe7 \x85\x08\x0c"),
275
- (2995, b"\x85\t\r\x85\r\x82\x85\x0c\x83\xa3t\x02\xf0\x85\x10\x0e"),
276
- (3011, b"\x85\x11\x0f\x85\x0f\x82\x85\x0e\x83\xa3t\x07\xf0S\x91\xef"),
277
- (3027, b"\x90\xe6]t \xf0\xd0\x82\xd0\x83\xd0\xe02"),
278
- (2303, b"2"),
279
- (3686, b"2"),
280
- (3687, b"2"),
281
- (3688, b"2"),
282
- (3689, b"2"),
283
- (3690, b"2"),
284
- (3691, b"2"),
285
- (3692, b"2"),
286
- (3693, b"2"),
287
- (3694, b"2"),
288
- (3695, b"2"),
289
- (3696, b"2"),
290
- (3697, b"2"),
291
- (3698, b"2"),
292
- (3699, b"2"),
293
- (3700, b"2"),
294
- (3701, b"2"),
295
- (3702, b"2"),
296
- (3703, b"2"),
297
- (3704, b"2"),
298
- (3705, b"2"),
299
- (3706, b"2"),
300
- (3707, b"2"),
301
- (3708, b"2"),
302
- (3709, b"2"),
303
- (3710, b"2"),
304
- (3711, b"2"),
305
- (3712, b"2"),
306
- (3713, b"2"),
307
- (3714, b"2"),
308
- (3715, b"2"),
309
- (3716, b"2"),
310
- (3717, b"2"),
311
- (3718, b"2"),
312
- (3719, b"2"),
313
- (3720, b"2"),
314
- (0, b"\x02\x0e/"),
315
- (3631, b"x\x7f\xe4\xf6\xd8\xfdu\x81:\x02\x032"),
316
- (3475, b"\xeb\x9f\xf5\xf0\xea\x9eB\xf0\xe9\x9dB\xf0\xecd\x80\xc8"),
317
- (3491, b'd\x80\x98E\xf0"'),
318
- (3497, b"\xeb\x9f\xf5\xf0\xea\x9eB\xf0\xe9\x9dB\xf0\xe8\x9cE\xf0"),
319
- (3513, b'"'),
320
- ]
321
-
322
-
323
- def _firmware(device, start):
324
- """
325
- Start and end packet sending data.
326
- @param device:
327
- @param start:
328
- @return:
329
- """
330
- device.ctrl_transfer(
331
- request,
332
- bRequest=0xA0,
333
- wValue=0xE600,
334
- wIndex=0x0,
335
- data_or_wLength=b"\x01" if start else b"\x00",
336
- )
337
-
338
-
339
- def _parse(f):
340
- """Parses the clone board sys file, for the FPGA code."""
341
- while True:
342
- data = f.read(22)
343
- if data is None or len(data) != 22:
344
- break
345
- length, _, value, end, payload, _ = struct.unpack("BBHB16sB", data)
346
- if end != 0:
347
- break
348
- yield value, payload[:length]
349
-
350
-
351
- def _write_chunks(device, chunks):
352
- """
353
- Write chunks to the FPGA.
354
-
355
- @param device:
356
- @param chunks:
357
- @return:
358
- """
359
- _firmware(device, start=True)
360
- for value, payload in chunks:
361
- device.ctrl_transfer(
362
- request, bRequest=0xA0, wValue=value, wIndex=0x0, data_or_wLength=payload
363
- )
364
- _firmware(device, start=False)
365
-
366
-
367
- def get_offset_by_hash(hash):
368
- if hash == "b86bc139a88592a4d71e64990133e86f":
369
- return 0x4440, "LMCV2U2"
370
- if hash == "f775f53d0cf8c9b3e7855837561a4e6c":
371
- return 0x11DE0, "LMCUSB2009"
372
- if hash == "cd408e29768af505d671fb5c216fcdcc":
373
- return 0x9F60, "LMCUSBdSYS"
374
- if hash == "2dd5017f569ac9efc292e6c085b08f36":
375
- return 0x4440, "LMCdotSYS"
376
- if hash == "48bcb097a38fdd84df43f6ee6e7f0195":
377
- return 0x5190, "LMCV2U2"
378
- if hash == "3a5e33b366f6a7af0f530a5ef68f137b":
379
- return 0x1390, "LMCV4"
380
- return 0x4440, "Unknown"
381
-
382
-
383
- def _send_device_sys(device, sys_file, channel=None):
384
- """
385
- Open the file, write the parsed chunks.
386
-
387
- @param device:
388
- @param sys_file:
389
- @param offset:
390
- @return:
391
- """
392
- if isinstance(sys_file, str):
393
- with open(sys_file, "rb") as f:
394
- contents = f.read()
395
- f.seek(0)
396
-
397
- h = hashlib.md5(contents)
398
- offset, name = get_offset_by_hash(h.hexdigest())
399
- if channel:
400
- channel(
401
- f"{sys_file} has hash:{h.hexdigest()} is {name} with offset {offset}"
402
- )
403
- f.seek(offset)
404
- _write_chunks(device, _parse(f))
405
- else:
406
- _write_chunks(device, _parse(sys_file))
407
-
408
-
409
- def load_sys(sys_file, channel=None):
410
- """
411
- Find devices, send sys_file to the needed boards.
412
-
413
- @param sys_file:
414
- @param channel:
415
- @return:
416
- """
417
- try:
418
- devices = list(
419
- usb.core.find(idVendor=VENDER_ID, idProduct=PRODUCT_ID, find_all=True)
420
- )
421
- if channel:
422
- channel(f"{len(devices)} devices need initializing.")
423
- for i, device in enumerate(devices):
424
- if channel:
425
- channel(f"Clone board #{i+1} detected. Sending Initialize.")
426
- _send_device_sys(device, sys_file, channel=channel)
427
- except usb.core.USBError as e:
428
- channel(str(e))
429
- raise ConnectionRefusedError
430
-
431
-
432
- def load_chunks(chunks=None, channel=None):
433
- """
434
- Find devices, send chunks to the needed boards.
435
- @param chunks:
436
- @param channel:
437
- @return:
438
- """
439
- if chunks is None:
440
- chunks = init
441
- try:
442
- devices = list(
443
- usb.core.find(idVendor=VENDER_ID, idProduct=PRODUCT_ID, find_all=True)
444
- )
445
- if channel:
446
- channel(f"{len(devices)} devices need initializing.")
447
- for i, device in enumerate(devices):
448
- if channel:
449
- channel(f"Clone board #{i+1} detected. Sending Initialize.")
450
- _write_chunks(device, chunks)
451
- except usb.core.USBError as e:
452
- channel(str(e))
453
- raise ConnectionRefusedError
454
-
455
-
456
- if __name__ == "__main__":
457
- load_sys("Lmcv2u.sys", channel=print)
1
+ """
2
+ This code initializes the FPGA on cloned boards.
3
+ """
4
+ import hashlib
5
+ import struct
6
+
7
+ import usb.core
8
+ from usb.util import (
9
+ CTRL_OUT,
10
+ CTRL_RECIPIENT_DEVICE,
11
+ CTRL_TYPE_VENDOR,
12
+ build_request_type,
13
+ )
14
+
15
+ VENDER_ID = 0x9588
16
+ PRODUCT_ID = 0x9980
17
+
18
+ request = build_request_type(CTRL_OUT, CTRL_TYPE_VENDOR, CTRL_RECIPIENT_DEVICE)
19
+
20
+
21
+ init = [
22
+ (3654, b"\x00\x01\x02\x02\x03\x03\x04\x04\x05\x05"),
23
+ (818, b"\xe4\xf5,\xf5+\xf5*\xf5)\xc2\x03\xc2\x00\xd2\x02\xc2"),
24
+ (834, b"\x01\x12\x07\xf7~\x0c\x7f\x00\x8e\n\x8f\x0bu\x12\x0cu"),
25
+ (850, b"\x13\x12u\x08\x0cu\t\x1cu\x10\x0cu\x11Ju\x14"),
26
+ (866, b"\x0cu\x15\x86\xeeT\xc0p\x03\x02\x045u-\x00u"),
27
+ (882, b".\x80\x8e/\x8f0\xc3t\xa8\x9f\xfft\x0c\x9e\xcf$"),
28
+ (898, b"\x02\xcf4\x00\xfe\xe4\x8f(\x8e'\xf5&\xf5%\xf5$"),
29
+ (914, b"\xf5#\xf5\"\xf5!\xaf(\xae'\xad&\xac%\xab$"),
30
+ (930, b'\xaa#\xa9"\xa8!\xc3\x12\r\xa9P5\xae#\xaf$'),
31
+ (946, b"\xe50/\xf5\x82\xe5/>\xf5\x83\xe0\xfd\xe5./\xf5"),
32
+ (962, b"\x82\xe5->\xf5\x83\xed\xf0\xe4\xfa\xf9\xf8\xef$\x01\xf5"),
33
+ (978, b'$\xea>\xf5#\xe95"\xf5"\xe85!\xf5!\x80'),
34
+ (994, b"\xb5\x85-\n\x85.\x0bt\x00$\x80\xfft\x0c4\xff"),
35
+ (1010, b"\xfe\xc3\xe5\x13\x9f\xf5\x13\xe5\x12\x9e\xf5\x12\xc3\xe5\r\x9f"),
36
+ (1026, b"\xf5\r\xe5\x0c\x9e\xf5\x0c\xc3\xe5\x0f\x9f\xf5\x0f\xe5\x0e\x9e"),
37
+ (1042, b"\xf5\x0e\xc3\xe5\t\x9f\xf5\t\xe5\x08\x9e\xf5\x08\xc3\xe5\x11"),
38
+ (1058, b"\x9f\xf5\x11\xe5\x10\x9e\xf5\x10\xc3\xe5\x15\x9f\xf5\x15\xe5\x14"),
39
+ (1074, b"\x9e\xf5\x14\xd2\xe8C\xd8 \x90\xe6h\xe0D\t\xf0\x90"),
40
+ (1090, b"\xe6\x82\xe0D\x10\xf0\x90\xe6\\\xe0D=\xf0\xd2\xaf\xd2"),
41
+ (1106, b"\x07\x12\x0c\xe0S\x8e\xf8\xc2\x03\x12\x04\x950\x01\x05\x12"),
42
+ (1122, b"\x00\x80\xc2\x010\x03\xf2\x12\x08\xfdP\xed\xc2\x03\x12\r"),
43
+ (1138, b"\xba \x00\x16\x90\xe6\x82\xe00\xe7\x04\xe0 \xe1\xef\x90"),
44
+ (1154, b"\xe6\x82\xe00\xe6\x04\xe0 \xe0\xe4\x12\r<\x12\x0e\\"),
45
+ (1170, b"\x80\xc7"),
46
+ (1172, b'"'),
47
+ (3643, b'\x90\xe5\r\xe00\xe4\x02\xc3"\xd3"'),
48
+ (128, b"\x90\xe6\xb9\xe0p\x03\x02\x01j\x14p\x03\x02\x02\x13$"),
49
+ (144, b"\xfep\x03\x02\x02\xa9$\xfbp\x03\x02\x01d\x14p\x03"),
50
+ (160, b"\x02\x01^\x14p\x03\x02\x01R\x14p\x03\x02\x01X$"),
51
+ (176, b"\x05`\x03\x02\x03\x1e\x12\x0e^@\x03\x02\x03*\x90\xe6"),
52
+ (192, b"\xbb\xe0$\xfe`;\x14`V$\xfd`\x16\x14`@"),
53
+ (208, b"$\x06pt\xe5\n\x90\xe6\xb3\xf0\xe5\x0b\x90\xe6\xb4\xf0"),
54
+ (224, b"\x02\x03*\x12\x0e;P\x0f\xe5\x12\x90\xe6\xb3\xf0\xe5\x13"),
55
+ (240, b"\x90\xe6\xb4\xf0\x02\x03*\x90\xe6\xa0\xe0D\x01\xf0\x02\x03"),
56
+ (256, b"*\xe5\x0c\x90\xe6\xb3\xf0\xe5\r\x90\xe6\xb4\xf0\x02\x03*"),
57
+ (272, b"\xe5\x0e\x90\xe6\xb3\xf0\xe5\x0f\x90\xe6\xb4\xf0\x02\x03*\x90"),
58
+ (288, b"\xe6\xba\xe0\xff\x12\rh\xaa\x06\xa9\x07{\x01\xeaI`"),
59
+ (304, b"\r\xee\x90\xe6\xb3\xf0\xef\x90\xe6\xb4\xf0\x02\x03*\x90\xe6"),
60
+ (320, b"\xa0\xe0D\x01\xf0\x02\x03*\x90\xe6\xa0\xe0D\x01\xf0\x02"),
61
+ (336, b"\x03*\x12\x0e\x1d\x02\x03*\x12\x0eP\x02\x03*\x12\x0b"),
62
+ (352, b"\xf8\x02\x03*\x12\x0e\x0b\x02\x03*\x12\x0e`@\x03\x02"),
63
+ (368, b"\x03*\x90\xe6\xb8\xe0$\x7f`+\x14`<$\x02`"),
64
+ (384, b"\x03\x02\x02\t\xa2\x00\xe43\xff%\xe0\xff\xa2\x02\xe43"),
65
+ (400, b"O\x90\xe7@\xf0\xe4\xa3\xf0\x90\xe6\x8a\xf0\x90\xe6\x8bt"),
66
+ (416, b"\x02\xf0\x02\x03*\xe4\x90\xe7@\xf0\xa3\xf0\x90\xe6\x8a\xf0"),
67
+ (432, b"\x90\xe6\x8bt\x02\xf0\x02\x03*\x90\xe6\xbc\xe0T~\xff"),
68
+ (448, b"~\x00\xe0\xd3\x94\x80@\x06|\x00}\x01\x80\x04|\x00"),
69
+ (464, b"}\x00\xecN\xfe\xedO$F\xf5\x82t\x0e>\xf5\x83"),
70
+ (480, b"\xe4\x93\xff3\x95\xe0\xfe\xef$\xa1\xff\xee4\xe6\x8f\x82"),
71
+ (496, b"\xf5\x83\xe0T\x01\x90\xe7@\xf0\xe4\xa3\xf0\x90\xe6\x8a\xf0"),
72
+ (512, b"\x90\xe6\x8bt\x02\xf0\x02\x03*\x90\xe6\xa0\xe0D\x01\xf0"),
73
+ (528, b"\x02\x03*\x12\x0eb@\x03\x02\x03*\x90\xe6\xb8\xe0$"),
74
+ (544, b"\xfe`\x1d$\x02`\x03\x02\x03*\x90\xe6\xba\xe0\xb4\x01"),
75
+ (560, b"\x05\xc2\x00\x02\x03*\x90\xe6\xa0\xe0D\x01\xf0\x02\x03*"),
76
+ (576, b"\x90\xe6\xba\xe0pY\x90\xe6\xbc\xe0T~\xff~\x00\xe0"),
77
+ (592, b"\xd3\x94\x80@\x06|\x00}\x01\x80\x04|\x00}\x00\xec"),
78
+ (608, b"N\xfe\xedO$F\xf5\x82t\x0e>\xf5\x83\xe4\x93\xff"),
79
+ (624, b"3\x95\xe0\xfe\xef$\xa1\xff\xee4\xe6\x8f\x82\xf5\x83\xe0"),
80
+ (640, b"T\xfe\xf0\x90\xe6\xbc\xe0T\x80\xff\x13\x13\x13T\x1f\xff"),
81
+ (656, b"\xe0T\x0f/\x90\xe6\x83\xf0\xe0D \xf0\x02\x03*\x90"),
82
+ (672, b"\xe6\xa0\xe0D\x01\xf0\x02\x03*\x12\x0edP|\x90\xe6"),
83
+ (688, b"\xb8\xe0$\xfe` $\x02p[\x90\xe6\xba\xe0\xb4\x01"),
84
+ (704, b"\x04\xd2\x00\x80e\x90\xe6\xba\xe0d\x02`]\x90\xe6\xa0"),
85
+ (720, b"\xe0D\x01\xf0\x80T\x90\xe6\xbc\xe0T~\xff~\x00\xe0"),
86
+ (736, b"\xd3\x94\x80@\x06|\x00}\x01\x80\x04|\x00}\x00\xec"),
87
+ (752, b"N\xfe\xedO$F\xf5\x82t\x0e>\xf5\x83\xe4\x93\xff"),
88
+ (768, b"3\x95\xe0\xfe\xef$\xa1\xff\xee4\xe6\x8f\x82\xf5\x83\xe0"),
89
+ (784, b"D\x01\xf0\x80\x15\x90\xe6\xa0\xe0D\x01\xf0\x80\x0c\x12\r"),
90
+ (800, b"\x0fP\x07\x90\xe6\xa0\xe0D\x01\xf0\x90\xe6\xa0\xe0D\x80"),
91
+ (816, b"\xf0"),
92
+ (817, b'"'),
93
+ (51, b"\x02\x0eX"),
94
+ (3672, b"S\xd8\xef2"),
95
+ (3072, b"\x12\x01\x00\x02\x00\x00\x00@\x88\x95\x99\x98\x00\x00\x01\x02"),
96
+ (3088, b"\x00\x01\n\x06\x00\x02\x00\x00\x00@\x01\x00\t\x02.\x00"),
97
+ (3104, b"\x01\x01\x00@\x05\t\x04\x00\x00\x04\xff\x00\x00\x00\x07\x05"),
98
+ (3120, b"\x01\x02\x00\x02\x00\x07\x05\x81\x02\x00\x02\x00\x07\x05\x02\x02"),
99
+ (3136, b"\x00\x02\x00\x07\x05\x88\x02\x00\x02\x00\t\x02<\x00\x01\x01"),
100
+ (3152, b"\x00@\x05\t\x04\x00\x00\x06\xff\x00\x00\x00\x07\x05\x01\x02"),
101
+ (3168, b"@\x00\x00\x07\x05\x81\x02@\x00\x00\x07\x05\x02\x02@\x00"),
102
+ (3184, b"\x00\x07\x05\x04\x02@\x00\x00\x07\x05\x06\x02@\x00\x00\x07"),
103
+ (3200, b"\x05\x88\x02@\x00\x00\x04\x03\t\x04\x0c\x03B\x00J\x00"),
104
+ (3216, b"J\x00C\x00Z\x00\x12\x03U\x00S\x00B\x00L\x00"),
105
+ (3232, b"M\x00C\x00V\x002\x00\x00\x00"),
106
+ (3388, b"\x90\xe6\x82\xe00\xe0\x04\xe0 \xe6\x0b\x90\xe6\x82\xe00"),
107
+ (3404, b"\xe1\x19\xe00\xe7\x15\x90\xe6\x80\xe0D\x01\xf0\x7f\x14~"),
108
+ (3420, b'\x00\x12\x0b\x18\x90\xe6\x80\xe0T\xfe\xf0"'),
109
+ (3296, b"0\x07\t\x90\xe6\x80\xe0D\n\xf0\x80\x07\x90\xe6\x80\xe0"),
110
+ (3312, b"D\x08\xf0\x7f\xdc~\x05\x12\x0b\x18\x90\xe6]t\xff\xf0"),
111
+ (3328, b'\x90\xe6_\xf0S\x91\xef\x90\xe6\x80\xe0T\xf7\xf0"'),
112
+ (3432, b"\xa9\x07"),
113
+ (3434, b"\xae\x14\xaf\x15\x8f\x82\x8e\x83\xa3\xe0d\x03p\x17\xad\x01"),
114
+ (3450, b'\x19\xedp\x01"\x8f\x82\x8e\x83\xe0|\x00/\xfd\xec>'),
115
+ (3466, b"\xfe\xaf\x05\x80\xdf\xe4\xfe\xff"),
116
+ (3474, b'"'),
117
+ (3514, b"\x90\xe6\x82\xe0D\xc0\xf0\x90\xe6\x81\xf0C\x87\x01\x00\x00"),
118
+ (3530, b'\x00\x00\x00"'),
119
+ (2840, b"\x8e1\x8f2\x90\xe6\x00\xe0T\x18p\x12\xe52$\x01"),
120
+ (2856, b"\xff\xe451\xc3\x13\xf51\xef\x13\xf52\x80\x15\x90\xe6"),
121
+ (2872, b"\x00\xe0T\x18\xff\xbf\x10\x0b\xe52%\xe0\xf52\xe51"),
122
+ (2888, b"3\xf51\xe52\x152\xae1p\x02\x151N`\x05"),
123
+ (2904, b'\x12\r\xce\x80\xee"'),
124
+ (3534, b"t\x00\xf5\x86\x90\xfd\xa5|\x05\xa3\xe5\x82E\x83p\xf9"),
125
+ (3550, b'"'),
126
+ (67, b"\x02\t\x00"),
127
+ (83, b"\x02\t\x00"),
128
+ (2304, b"\x02\x08\xe5\x00\x02\r\xf5\x00\x02\r\xdf\x00\x02\x0b\xe0\x00"),
129
+ (2320, b"\x02\x0c\xaa\x00\x02\x0b\xa3\x00\x02\x08\xff\x00\x02\x0ef\x00"),
130
+ (2336, b"\x02\x0eg\x00\x02\x0eh\x00\x02\x0ei\x00\x02\x0ej\x00"),
131
+ (2352, b"\x02\x0ek\x00\x02\x0el\x00\x02\x0em\x00\x02\x0en\x00"),
132
+ (2368, b"\x02\x0eo\x00\x02\x0ef\x00\x02\x0ep\x00\x02\x0eq\x00"),
133
+ (2384, b"\x02\x0er\x00\x02\x0es\x00\x02\x0et\x00\x02\x0eu\x00"),
134
+ (2400, b"\x02\x0ev\x00\x02\x0ef\x00\x02\x0ef\x00\x02\x0ef\x00"),
135
+ (2416, b"\x02\x0ew\x00\x02\x0ex\x00\x02\x0ey\x00\x02\x0ez\x00"),
136
+ (2432, b"\x02\x0e{\x00\x02\x0e|\x00\x02\x0e}\x00\x02\x0e~\x00"),
137
+ (2448, b"\x02\x0e\x7f\x00\x02\x0e\x80\x00\x02\x0e\x81\x00\x02\x0e\x82\x00"),
138
+ (2464, b"\x02\x0e\x83\x00\x02\x0e\x84\x00\x02\x0e\x85\x00\x02\x0e\x86\x00"),
139
+ (2480, b"\x02\x0e\x87\x00\x02\x0e\x88\x00"),
140
+ (2488, b"\xe4\xf59\xf5:\x90\xe6x\xe0 \xe0/\xae9\xaf:"),
141
+ (2504, b"\xe4\xfc\xfd{\xe8z\xfd\xf9\xf8\xd3\x12\r\x93@\x1c\x00"),
142
+ (2520, b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"),
143
+ (2536, b"\x00\x05:\xe5:p\x02\x059\x80\xca\x90\xe6x\xe00"),
144
+ (2552, b'\xe2\x03\x7f\x01"\xae9\xaf:\xe4\xfc\xfd{\xe8z\xfd'),
145
+ (2568, b'\xf9\xf8\xd3\x12\r\x93P\x03\x7f\x04"0\x07Q\xe4\xf5'),
146
+ (2584, b"9\xf5:\x90\xe6x\xe0 \xe1/\xae9\xaf:\xe4\xfc"),
147
+ (2600, b"\xfd{Pz\xc3\xf9\xf8\xd3\x12\r\x93@\x1c\x00\x00\x00"),
148
+ (2616, b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05"),
149
+ (2632, b":\xe5:p\x02\x059\x80\xca\xae9\xaf:\xe4\xfc\xfd"),
150
+ (2648, b'{Pz\xc3\xf9\xf8\xd3\x12\r\x93P\x03\x7f\x04"\x7f'),
151
+ (2664, b"\x00"),
152
+ (2665, b'"'),
153
+ (2910, b"\xe4\xf59\xf5:\x90\xe6x\xe00\xe2#\xae9\xaf:"),
154
+ (2926, b"\xe4\xfc\xfd{Pz\xc3\xf9\xf8\xd3\x12\r\x93@\x10\x00"),
155
+ (2942, b"\x00\x00\x00\x00\x00\x05:\xe5:p\x02\x059\x80\xd6\xae"),
156
+ (2958, b"9\xaf:\xe4\xfc\xfd{Pz\xc3\xf9\xf8\xd3\x12\r\x93"),
157
+ (2974, b'P\x01"\xc3'),
158
+ (2978, b'"'),
159
+ (2666, b"\x8f2\x8d3\x8b4"),
160
+ (2672, b"\xe4\xf55\xf56\xf57u8\x04\x90\xe6x\xe0D\x80"),
161
+ (2688, b'\xf0\x12\x0b^P\x03\xaf8"\xe52T\xfe\x90\xe6y'),
162
+ (2704, b"\xf0\xd2\x07\x12\t\xb8\x8f8\xe58\xd3\x94\x00@\x08\xe5"),
163
+ (2720, b"8d\x01p:\x80\xd3\xe4\xf57\xe57\xc3\x954P"),
164
+ (2736, b"+\xe53%7$\x80\xf5\x82\xe44\xe7\xf5\x83\xe0\x90"),
165
+ (2752, b"\xe6y\xf0\xd2\x07\x12\t\xb8\x8f8\xe58\xd3\x94\x00@"),
166
+ (2768, b"\x07\xe58\xb4\x01\x06\x80\xa2\x057\x80\xce\xe4\xf58\x90"),
167
+ (2784, b"\xe6x\xe0D@\xf0\xe4\xf55\xf56\x90\xe6x\xe00"),
168
+ (2800, b"\xe6#\xae5\xaf6\xe4\xfc\xfd{Pz\xc3\xf9\xf8\xd3"),
169
+ (2816, b"\x12\r\x93@\x10\x00\x00\x00\x00\x00\x00\x056\xe56p"),
170
+ (2832, b"\x02\x055\x80\xd6\xaf8"),
171
+ (2839, b'"'),
172
+ (1791, b"u6\x04\x90\xe6x\xe0D\x80\xf0\x12\x0b^P\x03\xaf"),
173
+ (1807, b'6"\x90\xe6yt\xa0\xf0\xd2\x07\x12\t\xb8\x8f6\xe5'),
174
+ (1823, b"6\xd3\x94\x00@\x0b\xe56d\x01`\x03\x02\x07\xf4\x80"),
175
+ (1839, b"\xd2\xe4\x90\xe6y\xf0\xd2\x07\x12\t\xb8\x8f6\xe56\xd3"),
176
+ (1855, b"\x94\x00@\x0b\xe56d\x01`\x03\x02\x07\xf4\x80\xb4\x90"),
177
+ (1871, b"\xe6x\xe0D\x80\xf0\xd2\x07\x12\t\xb8\x8f6\xe56\xd3"),
178
+ (1887, b"\x94\x00@\x0b\xe56d\x01`\x03\x02\x07\xf4\x80\x94\x90"),
179
+ (1903, b"\xe6y\xe0\x90\xe7\xc0\xf0\xc2\x07\x12\t\xb8\x8f6\xe56"),
180
+ (1919, b"\xd3\x94\x00@\t\xe56d\x01pj\x02\x07\x02\xe4\xf5"),
181
+ (1935, b"4\xf55\xc3\xe55\x94?\xe54\x94\x00PA\xe55"),
182
+ (1951, b"d>E4p\x07\x90\xe6x\xe0D \xf0\x90\xe6y"),
183
+ (1967, b"\xe0\xfft\xc0%5\xf5\x82\xe44\xe7\xf5\x83\xef\xf0\xc2"),
184
+ (1983, b"\x07\x12\t\xb8\x8f6\xe56\xd3\x94\x00@\x08\xe56\xb4"),
185
+ (1999, b"\x01\r\x02\x07\x02\x055\xe55p\x02\x054\x80\xb4\x90"),
186
+ (2015, b"\xe6x\xe0D@\xf0\x90\xe6y\xe0\x90\xe7\xff\xf0\xc2\x07"),
187
+ (2031, b"\x12\t\xb8\x8f6\xaf6"),
188
+ (2038, b'"'),
189
+ (1485, b"u3\x04\x90\xe6x\xe0D\x80\xf0\x12\x0b^P\x03\xaf"),
190
+ (1501, b'3"\x90\xe6x\xe0D\x80\xf0\x90\xe6yt\xef\xf0\xd2'),
191
+ (1517, b"\x07\x12\t\xb8\x8f3\xe53\xd3\x94\x00@\x0b\xe53d"),
192
+ (1533, b"\x01`\x03\x02\x06\xfc\x80\xcb\x90\xe6y\xe0\x90\xe7\xc0\xf0"),
193
+ (1549, b"\xc2\x07\x12\t\xb8\x8f3\xe53\xd3\x94\x00@\x0b\xe53"),
194
+ (1565, b"d\x01`\x03\x02\x06\xfc\x80\xaa\x90\xe6y\xe0\x90\xe7\xc0"),
195
+ (1581, b"\xf0\xc2\x07\x12\t\xb8\x8f3\xe53\xd3\x94\x00@\x0b\xe5"),
196
+ (1597, b"3d\x01`\x03\x02\x06\xfc\x80\x89\x90\xe6y\xe0\x90\xe7"),
197
+ (1613, b"\xc1\xf0\xc2\x07\x12\t\xb8\x8f3\xe53\xd3\x94\x00@\x0c"),
198
+ (1629, b"\xe53d\x01`\x03\x02\x06\xfc\x02\x05\xd0\x90\xe7\xc0\xe0"),
199
+ (1645, b"\xd3\x94>P\x06\xa3\xe0\x94\x00@\x06\x90\xe7\xc0t>"),
200
+ (1661, b"\xf0\x90\xe7\xc0\xe0\xd3\x94\x01@G\xe4\xf52\x90\xe7\xc0"),
201
+ (1677, b"\xe0\x14\xff\xe52\xc3\x9fP8\xe0\x14\xb52\x07\x90\xe6"),
202
+ (1693, b"x\xe0D \xf0\x90\xe6y\xe0\xfft\xc2%2\xf5\x82"),
203
+ (1709, b"\xe44\xe7\xf5\x83\xef\xf0\xc2\x07\x12\t\xb8\x8f3\xe53"),
204
+ (1725, b"\xd3\x94\x00@\x08\xe53\xb4\x01\x07\x02\x05\xd0\x052\x80"),
205
+ (1741, b"\xbc\x90\xe6x\xe0D@\xf0\x90\xe7\xc0\xe0\xd3\x94\x00@"),
206
+ (1757, b"\x1e\xe0$\x01\xff\xe43\x90\xe6y\xe0\xfdt\xc0/\xf5"),
207
+ (1773, b"\x82\xe44\xe7\xf5\x83\xed\xf0\xc2\x07\x12\t\xb8\x8f3\xaf"),
208
+ (1789, b"3"),
209
+ (1790, b'"'),
210
+ (2039, b"\x90\xe6\x00\xe0T\xe7D\x10\xf0\x00\x00\x00\x90\xe6\x01t"),
211
+ (2055, b"\x8b\xf0\x00\x00\x00\x90\xe6\x10t\xa0\xf0\x90\xe6\x11\xf0\x00"),
212
+ (2071, b"\x00\x00\x90\xe6\x0bt\x03\xf0\x00\x00\x00\x90\xe6\x12t\xab"),
213
+ (2087, b"\xf0\x00\x00\x00\x90\xe6\x15t\xe2\xf0\x00\x00\x00\x90\xe6\x04"),
214
+ (2103, b"t\x80\xf0\x00\x00\x00t\x02\xf0\x00\x00\x00t\x04\xf0\x00"),
215
+ (2119, b"\x00\x00t\x06\xf0\x00\x00\x00t\x08\xf0\x00\x00\x00\xe4\xf0"),
216
+ (2135, b"\x00\x00\x00\x90\xe6It\x82\xf0\x00\x00\x00\xf0\x00\x00\x00"),
217
+ (2151, b"\xf0\x00\x00\x00\x90\xe6Ht\x88\xf0\x00\x00\x00\xf0\x00\x00"),
218
+ (2167, b"\x00\x90\xe6\x18t\x11\xf0\x00\x00\x00\x90\xe6\x1bt\t\xf0"),
219
+ (2183, b"\x00\x00\x00\xe4\x90\xe6&\xf0\x00\x00\x00\x90\xe6't\x08"),
220
+ (2199, b"\xf0\x00\x00\x00\xe4\x90\xe6\x02\xf0\x00\x00\x00\x90\xe6\x03\xf0"),
221
+ (2215, b"\x00\x00\x00\x90\xe6pt@\xf0\x00\x00\x00\xe4\x90\xe6\t"),
222
+ (2231, b"\xf0\x00\x00\x00\x90\xe66t\x80\xf0\x00\x00\x00\xe4\x90\xe6"),
223
+ (2247, b"7\xf0C\xb2\x03\x00\x00\x00\xc2\x80\x00\x00\x00\xd2\x81\x00"),
224
+ (2263, b'\x00\x00\xc2\x06\xc2\x05\xc2\x04u\xaf\x07\xd2\x00"'),
225
+ (1173, b" \x05\x030\x043\x90\xe6\xa2\xe00\xe1\x03\x02\x05\xcc"),
226
+ (1189, b"0\x05\x17\x12\x06\xff\xefp\x08\x90\xe7\xfft\x04\xf0\x80"),
227
+ (1205, b"\x05\xe4\x90\xe7\xff\xf0\xc2\x05\x80\x05\x12\x05\xcd\xc2\x04\x00"),
228
+ (1221, b'\x00\x00\x90\xe6\x8ft@\xf0"0\x06<\x90\xe6\xa2\xe0'),
229
+ (1237, b"0\xe1\x03\x02\x05\xcc\xe4\xff\xfet\x00/\xf5\x82\xe44"),
230
+ (1253, b" \xf5\x83\xe0\xfdt\xc0/\xf5\x82\xe44\xe7\xf5\x83\xed"),
231
+ (1269, b"\xf0\x0f\xbf\x00\x01\x0e\xefd\nNp\xdd\x00\x00\x00\x90"),
232
+ (1285, b'\xe6\x8ft\x08\xf0\xc2\x06"\x90\xe6\xa1\xe00\xe1\x03\x02'),
233
+ (1301, b"\x05\xcc\x90\xe6\x8d\xe0\xc3\x94\x02@\x06\x90\xe7\x81\xe0`"),
234
+ (1317, b'\x06\xe4\x90\xe6\x8d\xf0"\x90\xe7\x80\xe0\x90 \x00\xf0\x90'),
235
+ (1333, b"\xe7\x81\xe0\x90 \x01\xf0\x90\xe7\x82\xe0\x90 \x02\xf0\x90"),
236
+ (1349, b"\xe7\x83\xe0\x90 \x03\xf0\xe4\xa3\xf0\xa3\xf0\x90\xe7\x80\xe0"),
237
+ (1365, b"d\x07p$\x90\xe7\x82\xe0p\x12{\t}\x04\x7f\xa0"),
238
+ (1381, b"\x12\nj\x90 \x04\xef\xf0\xd2\x06\x80V\x90\xe7\x82\xe0"),
239
+ (1397, b"d\x01pN\xd2\x05\x80J\x90\xe7\x80\xe0\xb4\x08\x17\x90"),
240
+ (1413, b"\xe6\x8d\xe0$\xfe\xfb}\x02\x7f\xee\x12\nj\x90 \x04"),
241
+ (1429, b"\xef\xf0\xd2\x06\x80,\x90\xe7\x80\xe0\xb4\t\x04\xd2\x04\x80"),
242
+ (1445, b"!\x90\xe7\x80\xe0d\np\x19\x90\xe7\x82\xe0p\x07\xc2"),
243
+ (1461, b"\x81\x00\x00\x00\x80\n\xc2\x80\x00\x00\x00\xd2\x81\x00\x00\x00"),
244
+ (1477, b"\xd2\x06\xe4\x90\xe6\x8d\xf0"),
245
+ (1484, b'"'),
246
+ (2301, b'\xd3"'),
247
+ (3676, b'\xd3"'),
248
+ (3678, b'\xd3"'),
249
+ (3064, b'\x90\xe6\xba\xe0\xf5\x17\xd3"'),
250
+ (3595, b"\x90\xe7@\xe5\x17\xf0\xe4\x90\xe6\x8a\xf0\x90\xe6\x8b\x04\xf0"),
251
+ (3611, b'\xd3"'),
252
+ (3664, b'\x90\xe6\xba\xe0\xf5\x16\xd3"'),
253
+ (3613, b"\x90\xe7@\xe5\x16\xf0\xe4\x90\xe6\x8a\xf0\x90\xe6\x8b\x04\xf0"),
254
+ (3629, b'\xd3"'),
255
+ (3680, b'\xd3"'),
256
+ (3682, b'\xd3"'),
257
+ (3684, b'\xd3"'),
258
+ (3343, b"\x90\xe6\xb9\xe0$/`\x12\x04p\x1e\x90\xe6\x04\xe0\xff"),
259
+ (3359, b"C\x07\x80\x00\x00\x00\xef\xf0\x80\x11\x90\xe6\x04\xe0\xffS"),
260
+ (3375, b'\x07\x7f\x00\x00\x00\xef\xf0\x80\x02\xd3"\xc3'),
261
+ (3387, b'"'),
262
+ (2277, b"\xc0\xe0\xc0\x83\xc0\x82\xd2\x01S\x91\xef\x90\xe6]t\x01"),
263
+ (2293, b"\xf0\xd0\x82\xd0\x83\xd0\xe02"),
264
+ (3551, b"\xc0\xe0\xc0\x83\xc0\x82S\x91\xef\x90\xe6]t\x04\xf0\xd0"),
265
+ (3567, b"\x82\xd0\x83\xd0\xe02"),
266
+ (3573, b"\xc0\xe0\xc0\x83\xc0\x82S\x91\xef\x90\xe6]t\x02\xf0\xd0"),
267
+ (3589, b"\x82\xd0\x83\xd0\xe02"),
268
+ (3242, b"\xc0\xe0\xc0\x83\xc0\x82\x85\x10\x0c\x85\x11\r\x85\r\x82\x85"),
269
+ (3258, b"\x0c\x83\xa3t\x02\xf0\x85\x08\x0e\x85\t\x0f\x85\x0f\x82\x85"),
270
+ (3274, b"\x0e\x83\xa3t\x07\xf0S\x91\xef\x90\xe6]t\x10\xf0\xd0"),
271
+ (3290, b"\x82\xd0\x83\xd0\xe02"),
272
+ (3040, b"\xc0\xe0\xc0\x83\xc0\x82\xd2\x03S\x91\xef\x90\xe6]t\x08"),
273
+ (3056, b"\xf0\xd0\x82\xd0\x83\xd0\xe02"),
274
+ (2979, b"\xc0\xe0\xc0\x83\xc0\x82\x90\xe6\x80\xe00\xe7 \x85\x08\x0c"),
275
+ (2995, b"\x85\t\r\x85\r\x82\x85\x0c\x83\xa3t\x02\xf0\x85\x10\x0e"),
276
+ (3011, b"\x85\x11\x0f\x85\x0f\x82\x85\x0e\x83\xa3t\x07\xf0S\x91\xef"),
277
+ (3027, b"\x90\xe6]t \xf0\xd0\x82\xd0\x83\xd0\xe02"),
278
+ (2303, b"2"),
279
+ (3686, b"2"),
280
+ (3687, b"2"),
281
+ (3688, b"2"),
282
+ (3689, b"2"),
283
+ (3690, b"2"),
284
+ (3691, b"2"),
285
+ (3692, b"2"),
286
+ (3693, b"2"),
287
+ (3694, b"2"),
288
+ (3695, b"2"),
289
+ (3696, b"2"),
290
+ (3697, b"2"),
291
+ (3698, b"2"),
292
+ (3699, b"2"),
293
+ (3700, b"2"),
294
+ (3701, b"2"),
295
+ (3702, b"2"),
296
+ (3703, b"2"),
297
+ (3704, b"2"),
298
+ (3705, b"2"),
299
+ (3706, b"2"),
300
+ (3707, b"2"),
301
+ (3708, b"2"),
302
+ (3709, b"2"),
303
+ (3710, b"2"),
304
+ (3711, b"2"),
305
+ (3712, b"2"),
306
+ (3713, b"2"),
307
+ (3714, b"2"),
308
+ (3715, b"2"),
309
+ (3716, b"2"),
310
+ (3717, b"2"),
311
+ (3718, b"2"),
312
+ (3719, b"2"),
313
+ (3720, b"2"),
314
+ (0, b"\x02\x0e/"),
315
+ (3631, b"x\x7f\xe4\xf6\xd8\xfdu\x81:\x02\x032"),
316
+ (3475, b"\xeb\x9f\xf5\xf0\xea\x9eB\xf0\xe9\x9dB\xf0\xecd\x80\xc8"),
317
+ (3491, b'd\x80\x98E\xf0"'),
318
+ (3497, b"\xeb\x9f\xf5\xf0\xea\x9eB\xf0\xe9\x9dB\xf0\xe8\x9cE\xf0"),
319
+ (3513, b'"'),
320
+ ]
321
+
322
+
323
+ def _firmware(device, start):
324
+ """
325
+ Start and end packet sending data.
326
+ @param device:
327
+ @param start:
328
+ @return:
329
+ """
330
+ device.ctrl_transfer(
331
+ request,
332
+ bRequest=0xA0,
333
+ wValue=0xE600,
334
+ wIndex=0x0,
335
+ data_or_wLength=b"\x01" if start else b"\x00",
336
+ )
337
+
338
+
339
+ def _parse(f):
340
+ """Parses the clone board sys file, for the FPGA code."""
341
+ while True:
342
+ data = f.read(22)
343
+ if data is None or len(data) != 22:
344
+ break
345
+ length, _, value, end, payload, _ = struct.unpack("BBHB16sB", data)
346
+ if end != 0:
347
+ break
348
+ yield value, payload[:length]
349
+
350
+
351
+ def _write_chunks(device, chunks):
352
+ """
353
+ Write chunks to the FPGA.
354
+
355
+ @param device:
356
+ @param chunks:
357
+ @return:
358
+ """
359
+ _firmware(device, start=True)
360
+ for value, payload in chunks:
361
+ device.ctrl_transfer(
362
+ request, bRequest=0xA0, wValue=value, wIndex=0x0, data_or_wLength=payload
363
+ )
364
+ _firmware(device, start=False)
365
+
366
+
367
+ def get_offset_by_hash(hash):
368
+ if hash == "b86bc139a88592a4d71e64990133e86f":
369
+ return 0x4440, "LMCV2U2"
370
+ if hash == "f775f53d0cf8c9b3e7855837561a4e6c":
371
+ return 0x11DE0, "LMCUSB2009"
372
+ if hash == "cd408e29768af505d671fb5c216fcdcc":
373
+ return 0x9F60, "LMCUSBdSYS"
374
+ if hash == "2dd5017f569ac9efc292e6c085b08f36":
375
+ return 0x4440, "LMCdotSYS"
376
+ if hash == "48bcb097a38fdd84df43f6ee6e7f0195":
377
+ return 0x5190, "LMCV2U2"
378
+ if hash == "3a5e33b366f6a7af0f530a5ef68f137b":
379
+ return 0x1390, "LMCV4"
380
+ return 0x4440, "Unknown"
381
+
382
+
383
+ def _send_device_sys(device, sys_file, channel=None):
384
+ """
385
+ Open the file, write the parsed chunks.
386
+
387
+ @param device:
388
+ @param sys_file:
389
+ @param offset:
390
+ @return:
391
+ """
392
+ if isinstance(sys_file, str):
393
+ with open(sys_file, "rb") as f:
394
+ contents = f.read()
395
+ f.seek(0)
396
+
397
+ h = hashlib.md5(contents)
398
+ offset, name = get_offset_by_hash(h.hexdigest())
399
+ if channel:
400
+ channel(
401
+ f"{sys_file} has hash:{h.hexdigest()} is {name} with offset {offset}"
402
+ )
403
+ f.seek(offset)
404
+ _write_chunks(device, _parse(f))
405
+ else:
406
+ _write_chunks(device, _parse(sys_file))
407
+
408
+
409
+ def load_sys(sys_file, channel=None):
410
+ """
411
+ Find devices, send sys_file to the needed boards.
412
+
413
+ @param sys_file:
414
+ @param channel:
415
+ @return:
416
+ """
417
+ try:
418
+ devices = list(
419
+ usb.core.find(idVendor=VENDER_ID, idProduct=PRODUCT_ID, find_all=True)
420
+ )
421
+ if channel:
422
+ channel(f"{len(devices)} devices need initializing.")
423
+ for i, device in enumerate(devices):
424
+ if channel:
425
+ channel(f"Clone board #{i+1} detected. Sending Initialize.")
426
+ _send_device_sys(device, sys_file, channel=channel)
427
+ except usb.core.USBError as e:
428
+ channel(str(e))
429
+ raise ConnectionRefusedError
430
+
431
+
432
+ def load_chunks(chunks=None, channel=None):
433
+ """
434
+ Find devices, send chunks to the needed boards.
435
+ @param chunks:
436
+ @param channel:
437
+ @return:
438
+ """
439
+ if chunks is None:
440
+ chunks = init
441
+ try:
442
+ devices = list(
443
+ usb.core.find(idVendor=VENDER_ID, idProduct=PRODUCT_ID, find_all=True)
444
+ )
445
+ if channel:
446
+ channel(f"{len(devices)} devices need initializing.")
447
+ for i, device in enumerate(devices):
448
+ if channel:
449
+ channel(f"Clone board #{i+1} detected. Sending Initialize.")
450
+ _write_chunks(device, chunks)
451
+ except usb.core.USBError as e:
452
+ channel(str(e))
453
+ raise ConnectionRefusedError
454
+
455
+
456
+ if __name__ == "__main__":
457
+ load_sys("Lmcv2u.sys", channel=print)