diff --git a/UrumbotXY-Fall2022/.gitkeep b/UrumbotXY-Fall2022/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/UrumbotXY-Fall2022/README.md b/UrumbotXY-Fall2022/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..617305c4a1bae7e8e3b927b5997530196b9a32eb
--- /dev/null
+++ b/UrumbotXY-Fall2022/README.md
@@ -0,0 +1,116 @@
+# UrumbotXY Fall 2022
+
+This project is a [corexy](https://corexy.com/theory.html) 2D motion system using serialstep. Modified from original files in UrumbotXY.
+
+<img src=img/corexy_pen.jpg width=100%><br>
+
+## CoreXY
+
+For a simple coreXY motion system, here is the list of parts you need to make:
+
+<img src=img/doc/corexy_kit.png width=100%><br>
+
+It is advised to 3D print `capstan_motor` and `capstan_pulley`, while all other parts can be machined or laser cut. 3D models files are available under [./files/3d](./files/3d), and dxf files under [./files/2d](./files/2d).
+
+For assembly, you will also need:
+
+- 2x NEMA 17 motors
+- 9x bearings
+- 8x V bearings
+- 4x small bearings
+- M5 screws (structure and bearings)
+- M5 nuts and washers
+- M3 screws (string tensioners)
+- M3 nuts and washers
+
+Complete Bill of Materials (BOM) [here](https://docs.google.com/spreadsheets/d/12hboCFKMO40W-K4HecSFnBYBTcj8XZnGsIHQOlsHlmI/edit?usp=sharing)
+
+Here is the main frame after assembly:
+
+<img src=img/corexy.jpg width=100%><br>
+
+Note how the string is inserted on the capstans. The string can be attached to temporary anchor points to provide enough tension during this step. Inside `capstan_pulley`, you should insert a small bearing at the top and bottom. Use appropriate washers to have the correct height; there are 4 levels on `capstan_pulley`, and they should be aligned between each levels of `capstan_motor`.
+
+<img src=img/capstan.jpg width=100%><br>
+
+
+Here is a video of the motion at constant speed:
+
+<img src=video/corexy_linear.mp4 width=100%><br>
+
+
+## Pen plotter
+
+Pen:
+
+<img src=img/corexy_pen.jpg width=100%><br>
+
+Drawing:
+
+<img src=video/corexy_spiral.mp4 width=100%><br>
+
+## Circuitboard Milling
+
+Dec. 17-19, 2021.  Set up CoreXY for milling, using a linear axis for z-travel and a spare Roland MDX-20 spindle.  Keep the original python code, removing the homing step and changing speed to 5 mm/s.  
+
+Run a text file for xy motion.  Start, -10.0,-10.0:-10.8,-10.0: -0.8,0.0: 0.0,0.0.
+
+Axis setup:
+
+<img src=img/milling_axes_setup.jpg width=50%><br>
+
+As constructed, end effector responded to sideways force with ~20N/mm.  This led to about 0.5 mm oscillation while milling - not stiff enough.  Added a clamp to stiffen, which allowed milling of traces.  Adjustment of z-axis for milling was accomplished by manual adjustment of bit in collet.  Z-axis motor was energized in order to constrain z-motion. Good enough to demonstrate.
+
+<img src=img/milling_axes_clamp.jpg width=50%><br>
+
+Movie:
+
+<img src=video/milling_movie.mp4 width=100%><br>
+
+Closeup of traces:  Using 1/64" bit and 0.8 mm horizontal separation of paths, at a 45 degree angle, the calculated trace width is 0.3 mm.  Looks pretty close to this.  
+
+<img src=img/traces.jpg width=50%><br>
+
+This machine is close to being able to mill circuitboards.  For the first try, the stiffness of the end effector wrt sideways force seems to be the limiting factor, rather than the xy stiffness.  Next step: a better arrangement of z-stage and full incorporation of the z-motion into the software.
+
+### Small-excursion z-axis design:
+
+A cam translates the spindle by flexing the beam a few mm.  Total excursion at the spindle is about +/- 2 mm.
+
+<img src=img/fixed_z.jpg width=50%><br>
+<img src=img/z-cam.jpg width=50%><br>
+
+
+#### Metrology - components and assembled parts.
+
+Initial results and setups are <a href="https://gitlab.cba.mit.edu/classes/865.21/projects/machinemetrology">here, temporarily.</a>
+
+Fishing line:  3.3 kN
+
+Seven-strand stainless:  11 kN
+
+#### Jan 14, 2022
+
+Using the limited z-excursion setup above, tested g-code parsing python code and ran PCB milling linetest.  Results below are comparable to Roland SRM20 using the same endmill.  Cutting was interrupted by a python write timeout error:  "serial.serialutil.SerialTimooutException: write timeout"  Code used  is urumbu_gcode_1.14.22.py .  Spindle speed in these tests is 16kRPM.
+
+<img src=img/linetest.jpg width=50%><br>
+
+#### Jan 15, 2022
+
+Added an ESC to control the BLDC motor.  We can use the same board used for servo control.  Like the servo, the ESC accepts positive pulses 1-2 ms wide, 20 ms period.  To arm, apply 1ms pulses for one second, and then apply pulse length for desired speed.  With 12V supply, no load speed is 17kRPM at 1.40 ms pulse length.  These pulses need to be applied continuously to run the motor. (this is typical ESC behavior, I think.) Details in Rob's documentation.
+
+<img src=img/bldc_resize.jpg width=50%><br>
+
+## Linear axis
+
+Assembly:
+
+<img src=img/axis.jpg width=100%><br>
+
+Constant speed:
+
+<img src=video/axis_linear.mp4 width=100%><br>
+
+Acceleration:
+
+<img src=video/axis_acceleration.mp4 width=100%><br>
diff --git a/UrumbotXY-Fall2022/code/examples/abc.xy b/UrumbotXY-Fall2022/code/examples/abc.xy
new file mode 100644
index 0000000000000000000000000000000000000000..35dba3e94d6637402805292d24a13e51909f226b
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/examples/abc.xy
@@ -0,0 +1,1675 @@
+UP
+60.62121578665207, 104.50139149653452
+DOWN
+60.62121578665207, 104.50139149653452
+60.62121578665207, 85.70139149653453
+60.7513178274684, 85.60139149653453
+62.9513178274684, 85.60139149653453
+63.081419868284726, 85.70139149653453
+63.081419868284726, 94.50139149653452
+63.151317827468404, 94.5712894557182
+63.35131782746841, 94.60139149653453
+72.7513178274684, 94.60139149653453
+72.9513178274684, 94.5712894557182
+73.02121578665208, 94.50139149653452
+73.02121578665208, 85.70139149653453
+73.1513178274684, 85.60139149653453
+75.3513178274684, 85.60139149653453
+75.48141986828473, 85.70139149653453
+75.48141986828473, 104.50139149653452
+75.3513178274684, 104.60139149653453
+73.1513178274684, 104.60139149653453
+73.02121578665208, 104.50139149653452
+73.02121578665208, 96.90139149653453
+72.9513178274684, 96.83149353735085
+72.7513178274684, 96.80139149653454
+63.35131782746841, 96.80139149653454
+63.151317827468404, 96.83149353735085
+63.081419868284726, 96.90139149653453
+63.081419868284726, 104.50139149653452
+62.9513178274684, 104.60139149653453
+60.7513178274684, 104.60139149653453
+60.62121578665207, 104.50139149653452
+UP
+94.28283297898355, 104.50139149653452
+DOWN
+94.28283297898355, 104.50139149653452
+94.28283297898355, 85.70139149653453
+94.35131782746839, 85.63997845305627
+94.55131782746841, 85.60139149653453
+96.35131782746839, 85.60139149653453
+96.54747167362225, 85.70139149653453
+96.54747167362225, 104.50139149653452
+96.35131782746839, 104.60139149653453
+94.55131782746841, 104.60139149653453
+94.35131782746839, 104.56280454001279
+94.28283297898355, 104.50139149653452
+UP
+100.19583002259034, 104.50139149653452
+DOWN
+100.19583002259034, 104.50139149653452
+100.19583002259034, 85.70139149653453
+100.35131782746839, 85.60139149653453
+102.1513178274684, 85.60139149653453
+102.35131782746839, 85.62398765038068
+102.44658409965774, 85.70139149653453
+102.44658409965774, 104.50139149653452
+102.35131782746839, 104.57879534268838
+102.1513178274684, 104.60139149653453
+100.35131782746839, 104.60139149653453
+100.19583002259034, 104.50139149653452
+UP
+171.35516398131455, 104.50139149653452
+DOWN
+171.35516398131455, 104.50139149653452
+171.35516398131455, 85.70139149653453
+171.5513178274684, 85.60139149653453
+173.3513178274684, 85.60139149653453
+173.5513178274684, 85.63997845305627
+173.61980267595328, 85.70139149653453
+173.61980267595328, 104.50139149653452
+173.5513178274684, 104.56280454001279
+173.3513178274684, 104.60139149653453
+171.5513178274684, 104.60139149653453
+171.35516398131455, 104.50139149653452
+UP
+186.08283297898356, 104.50139149653452
+DOWN
+186.08283297898356, 104.50139149653452
+186.08283297898356, 98.30139149653454
+186.07794120409176, 98.10139149653453
+185.95131782746842, 97.93182627914322
+185.5513178274684, 98.33330639015155
+184.75131782746843, 98.9435298613144
+184.3513178274684, 99.15514872196806
+183.75131782746843, 99.38410177690837
+183.3513178274684, 99.44794322067246
+182.95131782746842, 99.55972482986786
+182.5513178274684, 99.60139149653453
+181.95131782746842, 99.60139149653453
+181.5513178274684, 99.56355365869669
+180.5513178274684, 99.34398408912712
+180.3513178274684, 99.23922933437237
+180.1513178274684, 99.19829415140178
+179.3513178274684, 98.79216072730375
+178.75131782746843, 98.37967721082025
+178.1513178274684, 97.79870693277614
+177.89576227191284, 97.50139149653452
+177.50573959617589, 96.90139149653453
+177.10875025990083, 96.10139149653453
+176.89554859669917, 95.50139149653452
+176.6869006495543, 94.70139149653453
+176.51705209320266, 93.70139149653453
+176.45605155527903, 92.30139149653454
+176.52082137356768, 91.30139149653454
+176.62121578665207, 90.70139149653453
+176.69554859669915, 90.30139149653454
+176.92999429805667, 89.50139149653452
+177.26778124210256, 88.70139149653453
+177.48744685972645, 88.30139149653454
+177.7325208349872, 87.90139149653453
+178.20065993273158, 87.30139149653454
+178.6023382356317, 86.90139149653453
+179.1513178274684, 86.44080326124042
+179.75131782746843, 86.06253799334982
+179.95131782746842, 85.98746114827583
+180.1513178274684, 85.86278390159782
+180.5513178274684, 85.74398408912712
+180.75131782746843, 85.63702979440687
+181.1513178274684, 85.57639149653453
+181.5513178274684, 85.4617688550251
+182.1513178274684, 85.40139149653453
+182.75131782746843, 85.4089864332434
+183.1513178274684, 85.45408610731297
+183.5513178274684, 85.56788364313138
+183.95131782746842, 85.6328347955036
+184.5513178274684, 85.88889149653453
+185.1513178274684, 86.2450278601709
+185.6579403440247, 86.70139149653453
+186.1513178274684, 87.21182627914322
+186.23951227191284, 87.10139149653453
+186.25605155527904, 86.90139149653453
+186.25605155527904, 85.70139149653453
+186.3513178274684, 85.62398765038068
+186.5513178274684, 85.60139149653453
+188.1513178274684, 85.60139149653453
+188.34747167362227, 85.70139149653453
+188.34747167362227, 104.50139149653452
+188.1513178274684, 104.60139149653453
+186.3513178274684, 104.60139149653453
+186.1513178274684, 104.56280454001279
+186.08283297898356, 104.50139149653452
+UP
+192.68283297898355, 104.50139149653452
+DOWN
+192.68283297898355, 104.50139149653452
+192.68283297898355, 100.10139149653453
+192.75516398131455, 99.10139149653453
+192.79583002259037, 98.90139149653453
+192.9170520932027, 96.70139149653453
+192.95516398131457, 96.50139149653452
+193.02121578665208, 95.30139149653454
+193.05605155527905, 95.10139149653453
+193.0869006495543, 94.30139149653454
+193.19583002259037, 93.10139149653453
+193.3610193200057, 90.50139149653452
+193.39583002259036, 90.30139149653454
+193.5513178274684, 90.20139149653453
+194.5513178274684, 90.20139149653453
+194.75131782746843, 90.23775513289817
+194.82300457445638, 90.30139149653454
+194.84658409965778, 90.50139149653452
+195.30680563234645, 97.70139149653453
+195.38558356173414, 98.50139149653452
+195.48141986828475, 100.10139149653453
+195.48141986828475, 104.50139149653452
+195.3513178274684, 104.60139149653453
+192.95131782746842, 104.60139149653453
+192.75131782746843, 104.56280454001279
+192.68283297898355, 104.50139149653452
+UP
+84.05131782746841, 99.50139149653452
+DOWN
+84.05131782746841, 99.50139149653452
+83.3513178274684, 99.38371707792987
+82.9513178274684, 99.23216072730376
+82.7513178274684, 99.18992360662628
+82.1513178274684, 98.94024499971924
+81.55131782746841, 98.57940196773872
+80.7513178274684, 97.93376559725395
+80.32650579739321, 97.50139149653452
+79.88791913465795, 96.90139149653453
+79.64834163699221, 96.50139149653452
+79.45014823682513, 96.10139149653453
+79.12999429805664, 95.30139149653454
+78.92082137356769, 94.50139149653452
+78.75516398131455, 93.30139149653454
+78.71705209320267, 92.10139149653453
+78.75516398131455, 91.50139149653452
+78.92999429805664, 90.30139149653454
+79.0832196679592, 89.70139149653453
+79.2920821586786, 89.10139149653453
+79.69053351374292, 88.30139149653454
+80.09053351374291, 87.70139149653453
+80.64469531091211, 87.10139149653453
+80.9513178274684, 86.82174033374383
+81.7513178274684, 86.25925313175466
+82.55131782746841, 85.87847482986787
+82.9513178274684, 85.76788364313138
+83.1513178274684, 85.67725356550005
+84.3513178274684, 85.4430581632012
+84.9513178274684, 85.40139149653453
+85.7513178274684, 85.40676339736098
+86.1513178274684, 85.43922933437237
+86.7513178274684, 85.57515387277215
+87.1513178274684, 85.61906591513917
+87.55131782746841, 85.7706222657653
+87.7513178274684, 85.81285938644278
+88.3513178274684, 86.06253799334982
+88.9513178274684, 86.42041323566497
+89.76033422091103, 87.10139149653453
+90.41471652027886, 87.90139149653453
+90.75984495925135, 88.50139149653452
+91.03505276722744, 89.10139149653453
+91.23505276722744, 89.70139149653453
+91.1513178274684, 89.87959662473966
+90.9513178274684, 89.94101413804397
+90.55131782746841, 89.99601959570808
+89.7513178274684, 90.04794322067247
+89.1513178274684, 90.16994819756546
+88.9513178274684, 90.13897111436893
+88.44834163699221, 89.10139149653453
+88.02350325793198, 88.50139149653452
+87.55131782746841, 88.06076649653453
+87.1513178274684, 87.80278038542342
+86.9513178274684, 87.68617410523018
+86.55131782746841, 87.5477770387032
+86.3513178274684, 87.4454592931447
+86.1513178274684, 87.41372629829664
+85.55131782746841, 87.36355365869669
+85.1513178274684, 87.36355365869669
+84.3513178274684, 87.41625636139939
+84.1513178274684, 87.45879890394194
+83.9513178274684, 87.55567721082025
+83.55131782746841, 87.68353435367739
+82.9513178274684, 88.02652810855639
+82.55131782746841, 88.36827047742625
+82.04772501309715, 88.90139149653453
+81.67334163699222, 89.50139149653452
+81.3513178274684, 90.32460578224882
+81.17264135688016, 91.10139149653453
+81.08344217980002, 91.70139149653453
+81.08141986828473, 91.90139149653453
+81.1513178274684, 91.9712894557182
+81.3513178274684, 92.00139149653452
+91.1513178274684, 92.00139149653452
+91.3521052290432, 92.10139149653453
+91.38558356173414, 92.30139149653454
+91.34747167362225, 93.50139149653452
+91.17264135688016, 94.70139149653453
+91.0194159869776, 95.30139149653454
+90.81055349625821, 95.90139149653453
+90.41518879521034, 96.70139149653453
+90.1513178274684, 97.11139149653454
+89.67119360386592, 97.70139149653453
+89.3513178274684, 98.01696035880998
+88.9513178274684, 98.36825196165081
+88.3513178274684, 98.77940196773872
+87.55131782746841, 99.17066232986787
+86.9513178274684, 99.36857899653452
+86.55131782746841, 99.42457990233163
+85.9513178274684, 99.55972482986786
+85.55131782746841, 99.59601959570809
+84.7513178274684, 99.60139149653453
+84.05131782746841, 99.50139149653452
+UP
+110.68569282746842, 99.50139149653452
+DOWN
+110.68569282746842, 99.50139149653452
+109.95131782746842, 99.38371707792987
+109.55131782746841, 99.22825716817633
+109.35131782746839, 99.18992360662628
+108.7513178274684, 98.94024499971924
+108.1513178274684, 98.59216072730376
+107.55131782746841, 98.15915547168981
+107.06012285891495, 97.70139149653453
+106.55131782746841, 97.08176532831023
+106.3057395961759, 96.70139149653453
+105.90875025990084, 95.90139149653453
+105.70500910263618, 95.30139149653454
+105.47963108048046, 94.30139149653454
+105.35516398131455, 93.30139149653454
+105.35516398131455, 91.70139149653453
+105.42121578665208, 91.10139149653453
+105.51338679298564, 90.50139149653452
+105.70500910263618, 89.70139149653453
+105.90875025990084, 89.10139149653453
+106.09208215867861, 88.70139149653453
+106.3057395961759, 88.30139149653454
+106.72015840717856, 87.70139149653453
+107.06012285891495, 87.30139149653454
+107.7513178274684, 86.67110980639369
+108.35131782746839, 86.25925313175466
+108.7513178274684, 86.04732172909267
+109.35131782746839, 85.80448884166728
+109.55131782746841, 85.76788364313138
+109.95131782746842, 85.61445455959759
+110.35131782746839, 85.56994819756545
+110.95131782746842, 85.43922933437237
+111.35131782746839, 85.40139149653453
+112.1513178274684, 85.40139149653453
+112.55131782746841, 85.43922933437237
+112.95131782746842, 85.537929958073
+113.55131782746841, 85.62889149653454
+113.95131782746842, 85.77996292510596
+114.1513178274684, 85.82129440915588
+114.35131782746839, 85.92792210877943
+114.7513178274684, 86.07486088428963
+115.16610043616407, 86.30139149653454
+115.7513178274684, 86.67173632412073
+116.04086031112854, 86.90139149653453
+116.47119360386591, 87.30139149653454
+116.98247724775825, 87.90139149653453
+117.35525483534241, 88.50139149653452
+117.55525483534242, 88.90139149653453
+117.77668014630899, 89.50139149653452
+117.98181428136911, 90.30139149653454
+118.08141986828474, 90.90139149653453
+118.1818142813691, 91.90139149653453
+118.18558356173415, 93.30139149653454
+118.14747167362225, 93.70139149653453
+117.98924886195115, 94.70139149653453
+117.82828752443811, 95.30139149653454
+117.6105534962582, 95.90139149653453
+117.4280049440328, 96.30139149653454
+117.2121021411939, 96.70139149653453
+116.78247724775827, 97.30139149653454
+116.44251279602187, 97.70139149653453
+115.7513178274684, 98.33104666894832
+115.1513178274684, 98.7435298613144
+114.7513178274684, 98.95546126397639
+114.1513178274684, 99.19829415140178
+113.95131782746842, 99.23489934993768
+113.55131782746841, 99.38832843347147
+113.1513178274684, 99.43489934993767
+112.55131782746841, 99.56355365869669
+112.1513178274684, 99.60139149653453
+111.35131782746839, 99.60139149653453
+110.95131782746842, 99.56355365869669
+110.68569282746842, 99.50139149653452
+UP
+152.17576227191284, 99.50139149653452
+DOWN
+152.17576227191284, 99.50139149653452
+151.3513178274684, 99.35567721082025
+151.1513178274684, 99.25593695107999
+150.75131782746843, 99.15925666507385
+150.5513178274684, 99.04150138664443
+150.3513178274684, 98.98348104877334
+150.1513178274684, 98.85593695107998
+149.95131782746842, 98.7785935690734
+149.3513178274684, 98.38748775321902
+148.75131782746843, 97.88617410523018
+148.5513178274684, 97.68757035832314
+147.9230569579032, 96.90139149653453
+147.4920821586786, 96.10139149653453
+147.26758288770935, 95.50139149653452
+147.054259003939, 94.70139149653453
+146.88690064955432, 93.70139149653453
+146.85605155527907, 93.30139149653454
+146.85605155527907, 91.70139149653453
+146.88690064955432, 91.30139149653454
+147.0955485966992, 90.10139149653453
+147.42046068461127, 89.10139149653453
+147.69576227191286, 88.50139149653452
+148.06778124210257, 87.90139149653453
+148.56381782746843, 87.30139149653454
+149.22840116080175, 86.70139149653453
+149.5513178274684, 86.45296382357856
+150.3513178274684, 86.00948673462976
+150.5513178274684, 85.94684604198908
+150.75131782746843, 85.8321206632012
+151.1513178274684, 85.73139149653453
+151.3513178274684, 85.63702979440687
+151.95131782746842, 85.5548397723966
+152.3513178274684, 85.44710578224881
+152.95131782746842, 85.40139149653453
+153.5513178274684, 85.40139149653453
+154.1513178274684, 85.45408610731297
+154.5513178274684, 85.55972482986786
+154.95131782746842, 85.60740008022552
+155.75131782746843, 85.85977658970224
+156.5513178274684, 86.22418942399567
+156.75131782746843, 86.3650278601709
+156.95131782746842, 86.45925313175465
+157.53599524682323, 86.90139149653453
+157.95131782746842, 87.27023207624467
+158.61471652027888, 88.10139149653453
+158.95525483534243, 88.70139149653453
+159.21055349625823, 89.30139149653454
+159.3976265523006, 89.90139149653453
+159.58558356173415, 90.90139149653453
+159.68141986828473, 92.10139149653453
+159.68141986828473, 93.30139149653454
+159.61980267595325, 93.90139149653453
+159.38558356173417, 95.10139149653453
+159.19388539503598, 95.70139149653453
+158.82800494403284, 96.50139149653452
+158.44251279602187, 97.10139149653453
+157.93881782746843, 97.70139149653453
+157.1513178274684, 98.39604390295165
+156.5513178274684, 98.78901525891077
+156.1513178274684, 98.99329625843929
+155.95131782746842, 99.05593695107999
+155.75131782746843, 99.17066232986787
+155.3513178274684, 99.27139149653453
+155.1513178274684, 99.36575319866219
+154.5513178274684, 99.45593695107999
+154.1513178274684, 99.55567721082025
+153.75131782746843, 99.59379655982568
+152.95131782746842, 99.60139149653453
+152.3513178274684, 99.54869688575609
+152.17576227191284, 99.50139149653452
+UP
+166.9081079509252, 99.50139149653452
+DOWN
+166.9081079509252, 99.50139149653452
+166.5513178274684, 99.391158938395
+166.1513178274684, 99.17940196773873
+165.79865116080174, 98.90139149653453
+165.26778124210256, 98.30139149653454
+164.75131782746843, 97.49439149653453
+164.5513178274684, 97.39655278685711
+164.5106928274684, 97.50139149653452
+164.50680563234647, 99.30139149653454
+164.3513178274684, 99.40139149653453
+162.75131782746843, 99.40139149653453
+162.5513178274684, 99.36280454001279
+162.48283297898354, 99.30139149653454
+162.48283297898354, 85.70139149653453
+162.5513178274684, 85.63997845305627
+162.75131782746843, 85.60139149653453
+164.5513178274684, 85.60139149653453
+164.74747167362227, 85.70139149653453
+164.7521052290432, 93.30139149653454
+164.88841460166196, 94.50139149653452
+165.07645443949025, 95.30139149653454
+165.29871667139906, 95.90139149653453
+165.5513178274684, 96.30732369992435
+165.75131782746843, 96.54125163639466
+166.3513178274684, 96.97700125263209
+166.75131782746843, 97.14684604198908
+167.1513178274684, 97.19898185798031
+167.95131782746842, 97.18905669477242
+168.1513178274684, 97.15732369992436
+168.3513178274684, 97.05879890394193
+168.75131782746843, 96.94201649653454
+168.95131782746842, 96.8184769236702
+169.1513178274684, 96.869859965003
+169.84658409965778, 98.70139149653453
+169.80094745709806, 98.90139149653453
+169.75131782746843, 98.9435298613144
+169.3513178274684, 99.15546126397639
+168.75131782746843, 99.38992360662627
+168.1513178274684, 99.54869688575609
+167.75131782746843, 99.60139149653453
+167.3513178274684, 99.59601959570809
+166.9081079509252, 99.50139149653452
+UP
+126.80391898353776, 99.30139149653454
+DOWN
+126.80391898353776, 99.30139149653454
+130.49554859669917, 87.10139149653453
+130.95131782746842, 85.68096896132326
+131.1513178274684, 85.60139149653453
+133.1513178274684, 85.60139149653453
+133.3726413568802, 85.70139149653453
+135.88841460166196, 95.30139149653454
+136.06469810915854, 95.90139149653453
+136.1513178274684, 96.06539149653453
+136.24971782746843, 95.90139149653453
+136.38355466957367, 95.50139149653452
+136.6869006495543, 94.10139149653453
+138.9050091026362, 85.70139149653453
+138.95131782746842, 85.65879890394194
+139.1513178274684, 85.60139149653453
+141.1513178274684, 85.60139149653453
+141.33089529225714, 85.70139149653453
+145.57264135688018, 99.30139149653454
+145.5513178274684, 99.3218140317458
+145.3513178274684, 99.40139149653453
+143.5513178274684, 99.40139149653453
+143.37174036267967, 99.30139149653454
+140.41422105327484, 89.30139149653454
+140.3513178274684, 89.12139149653453
+140.1513178274684, 88.92939149653454
+140.07925078836226, 89.10139149653453
+139.70970292063612, 90.50139149653452
+137.44658409965774, 99.30139149653454
+137.3513178274684, 99.37879534268838
+137.1513178274684, 99.40139149653453
+135.3513178274684, 99.40139149653453
+135.1513178274684, 99.37194987216904
+135.06758288770936, 99.30139149653454
+134.8955485966992, 98.70139149653453
+133.0955485966992, 92.10139149653453
+132.39583002259036, 89.30139149653454
+132.2773178274684, 88.90139149653453
+132.1513178274684, 88.63504534268837
+132.0913178274684, 88.70139149653453
+131.93089529225716, 89.10139149653453
+129.13089529225715, 99.30139149653454
+128.95131782746842, 99.40139149653453
+126.95131782746842, 99.40139149653453
+126.80391898353776, 99.30139149653454
+UP
+83.9513178274684, 97.51526010967322
+DOWN
+83.9513178274684, 97.51526010967322
+84.1513178274684, 97.57639149653453
+84.9513178274684, 97.63922933437237
+85.55131782746841, 97.62953220005213
+86.1513178274684, 97.57639149653453
+86.55131782746841, 97.4220645734576
+86.7513178274684, 97.38053841596582
+87.26613264228322, 97.10139149653453
+87.55559133174191, 96.90139149653453
+88.00065993273157, 96.50139149653452
+88.44834163699221, 95.90139149653453
+88.63484055474113, 95.50139149653452
+88.77174036267968, 95.10139149653453
+88.86758288770937, 94.70139149653453
+88.9513178274684, 94.09521865702835
+88.7513178274684, 93.9635536586967
+81.3513178274684, 93.97449091173921
+81.21980267595325, 94.10139149653453
+81.30310354175411, 94.70139149653453
+81.48217497032554, 95.30139149653454
+81.67334163699222, 95.70139149653453
+81.91690224305282, 96.10139149653453
+82.3513178274684, 96.58645643159946
+82.7513178274684, 96.92909419923723
+83.1513178274684, 97.1821206632012
+83.55131782746841, 97.38053841596582
+83.9513178274684, 97.51526010967322
+UP
+110.7513178274684, 97.56788364313138
+DOWN
+110.7513178274684, 97.56788364313138
+111.55131782746841, 97.63922933437237
+112.1513178274684, 97.62953220005213
+112.7513178274684, 97.5712894557182
+113.35131782746839, 97.36575319866219
+113.55131782746841, 97.23930358444662
+113.7513178274684, 97.16429472234098
+114.36664040811357, 96.70139149653453
+114.76381782746842, 96.30139149653454
+115.05491064183965, 95.90139149653453
+115.38573341188399, 95.30139149653454
+115.59583002259035, 94.70139149653453
+115.6869006495543, 94.30139149653454
+115.79583002259037, 93.70139149653453
+115.85605155527907, 93.10139149653453
+115.85605155527907, 92.10139149653453
+115.7929327343007, 91.30139149653454
+115.63679268780359, 90.50139149653452
+115.3704667636386, 89.70139149653453
+115.17423449413508, 89.30139149653454
+114.7513178274684, 88.68889149653452
+114.35131782746839, 88.30061024653453
+113.7513178274684, 87.83848827072808
+113.55131782746841, 87.76347940862244
+113.35131782746839, 87.63702979440687
+112.7513178274684, 87.43149353735086
+112.1513178274684, 87.37325079301695
+111.55131782746841, 87.36355365869669
+110.7513178274684, 87.43489934993767
+110.55131782746841, 87.52673396228795
+110.1513178274684, 87.64150138664442
+109.7513178274684, 87.85593695107998
+109.40752220703044, 88.10139149653453
+108.9416163349311, 88.50139149653452
+108.4682875244381, 89.10139149653453
+108.06779510019567, 89.90139149653453
+107.9321688912982, 90.30139149653454
+107.84238925603984, 90.70139149653453
+107.70680563234646, 91.50139149653452
+107.68141986828473, 93.10139149653453
+107.70680563234646, 93.50139149653452
+107.83505276722744, 94.30139149653454
+108.06779510019567, 95.10139149653453
+108.2381441747738, 95.50139149653452
+108.46352712979399, 95.90139149653453
+108.95131782746842, 96.51389149653453
+109.1513178274684, 96.70217274653453
+109.7513178274684, 97.14684604198908
+110.1513178274684, 97.36128160642464
+110.55131782746841, 97.4760490307811
+110.7513178274684, 97.56788364313138
+UP
+152.1513178274684, 97.53139149653452
+DOWN
+152.1513178274684, 97.53139149653452
+152.3513178274684, 97.58652663166967
+152.95131782746842, 97.63560202285032
+153.5513178274684, 97.63775513289816
+154.1513178274684, 97.58652663166967
+154.3513178274684, 97.54398408912712
+154.5513178274684, 97.44710578224881
+154.75131782746843, 97.39586154261748
+155.33182630204468, 97.10139149653453
+155.62578591257477, 96.90139149653453
+155.95131782746842, 96.61413035003771
+156.26012285891494, 96.30139149653454
+156.5566613389188, 95.90139149653453
+156.785733411884, 95.50139149653452
+156.9566613389188, 95.10139149653453
+157.1995321131827, 94.30139149653454
+157.35516398131455, 93.10139149653453
+157.35516398131455, 92.10139149653453
+157.27963108048044, 91.30139149653454
+157.18355466957365, 90.70139149653453
+157.01422105327487, 90.10139149653453
+156.86449148016303, 89.70139149653453
+156.66778124210254, 89.30139149653454
+156.26012285891494, 88.70139149653453
+155.62578591257477, 88.10139149653453
+155.33182630204468, 87.90139149653453
+154.95131782746842, 87.69604798508415
+154.3513178274684, 87.45879890394194
+154.1513178274684, 87.41625636139939
+153.1513178274684, 87.36355365869669
+152.3513178274684, 87.41625636139939
+151.54861512476572, 87.70139149653453
+150.95131782746842, 88.05593695107999
+150.44426654541712, 88.50139149653452
+150.10197572220525, 88.90139149653453
+149.8542940179446, 89.30139149653454
+149.7416163349311, 89.50139149653452
+149.49538562407858, 90.10139149653453
+149.29538562407856, 90.90139149653453
+149.18558356173415, 91.90139149653453
+149.18558356173415, 93.10139149653453
+149.21980267595325, 93.50139149653452
+149.33089529225714, 94.30139149653454
+149.49538562407858, 94.90139149653453
+149.73216889129822, 95.50139149653452
+150.10197572220525, 96.10139149653453
+150.44251279602187, 96.50139149653452
+150.75131782746843, 96.78983080289291
+150.95131782746842, 96.95139149653453
+151.5513178274684, 97.30371707792987
+152.1513178274684, 97.53139149653452
+UP
+181.5513178274684, 97.56355365869669
+DOWN
+181.5513178274684, 97.56355365869669
+182.3513178274684, 97.63922933437237
+182.75131782746843, 97.63775513289816
+183.3513178274684, 97.57639149653453
+183.95131782746842, 97.36429472234099
+184.3513178274684, 97.13999909147124
+184.65748221103007, 96.90139149653453
+185.26012285891494, 96.30139149653454
+185.6483416369922, 95.70139149653453
+185.97174036267967, 94.90139149653453
+186.19583002259037, 93.90139149653453
+186.28283297898355, 92.90139149653453
+186.28283297898355, 91.70139149653453
+186.25605155527904, 91.30139149653454
+186.02618121544657, 90.10139149653453
+185.80391898353776, 89.50139149653452
+185.6108270299224, 89.10139149653453
+185.3513178274684, 88.73814363328667
+185.1513178274684, 88.48889149653454
+184.7390227455012, 88.10139149653453
+184.3513178274684, 87.82066232986787
+184.1298225003656, 87.70139149653453
+183.5513178274684, 87.45593695107999
+183.3513178274684, 87.41274520832492
+182.3513178274684, 87.36355365869669
+181.75131782746843, 87.42224457710326
+181.1513178274684, 87.63848827072808
+180.5513178274684, 88.0244252043997
+180.2290205301711, 88.30139149653454
+179.84251279602188, 88.70139149653453
+179.44658409965777, 89.30139149653454
+179.25248741811168, 89.70139149653453
+179.10680563234644, 90.10139149653453
+178.9097029206361, 90.90139149653453
+178.78558356173414, 92.30139149653454
+178.84658409965778, 93.70139149653453
+179.07645443949025, 94.90139149653453
+179.28217497032557, 95.50139149653452
+179.48445736235215, 95.90139149653453
+179.75131782746843, 96.3152126347459
+180.1513178274684, 96.74872482986787
+180.3513178274684, 96.92673396228795
+180.95131782746842, 97.31660888783888
+181.5513178274684, 97.56355365869669
+UP
+192.79583002259037, 88.10139149653453
+DOWN
+192.79583002259037, 88.10139149653453
+192.79583002259037, 85.70139149653453
+192.95131782746842, 85.60139149653453
+195.1513178274684, 85.60139149653453
+195.38558356173414, 85.70139149653453
+195.38558356173414, 88.10139149653453
+195.3513178274684, 88.1336283386398
+195.1513178274684, 88.20139149653453
+192.95131782746842, 88.20139149653453
+192.79583002259037, 88.10139149653453
+UP
+62.87999813084576, 52.235620216467325
+DOWN
+62.87999813084576, 52.235620216467325
+62.87999813084576, 40.43562021646732
+62.96700108723894, 39.235620216467325
+63.171068757809735, 38.03562021646732
+63.3891772108916, 37.235620216467325
+63.61012361688324, 36.63562021646732
+63.80122020145808, 36.235620216467325
+64.17470162199834, 35.63562021646732
+64.6354859357238, 35.099704723509575
+65.23548593572383, 34.557334502181604
+65.8354859357238, 34.15760974526313
+66.23548593572383, 33.94799645409108
+66.43548593572382, 33.876245216467325
+66.6354859357238, 33.75552312908868
+66.8354859357238, 33.71419164503875
+67.23548593572383, 33.54789294374005
+67.6354859357238, 33.467857058572584
+67.8354859357238, 33.38650779043182
+68.6354859357238, 33.293953549800655
+69.23548593572383, 33.17345805430516
+69.8354859357238, 33.13562021646732
+70.8354859357238, 33.13562021646732
+71.43548593572382, 33.17345805430516
+72.03548593572384, 33.293953549800655
+72.6354859357238, 33.353675772022875
+73.03548593572384, 33.49395354980066
+73.43548593572382, 33.57091433411438
+73.6354859357238, 33.668953549800655
+74.03548593572384, 33.79701262153061
+74.43548593572382, 33.99348185168745
+75.03548593572384, 34.36075682848918
+75.64450232916641, 34.83562021646732
+76.06664535601368, 35.235620216467325
+76.6810641670163, 36.03562021646732
+77.09472160451361, 36.83562021646732
+77.30358409523302, 37.43562021646732
+77.45680946513556, 38.03562021646732
+77.56558797654014, 38.63562021646732
+77.70397078420865, 39.63562021646732
+77.76558797654013, 40.83562021646732
+77.76558797654013, 52.235620216467325
+77.6354859357238, 52.33562021646732
+75.43548593572382, 52.33562021646732
+75.3053838949075, 52.235620216467325
+75.3053838949075, 40.43562021646732
+75.234698534149, 39.63562021646732
+75.07999813084575, 38.63562021646732
+74.92096079605903, 38.03562021646732
+74.7023464008401, 37.43562021646732
+74.34429096717037, 36.83562021646732
+73.98654976551103, 36.43562021646732
+73.43548593572382, 36.015197681256055
+73.03548593572384, 35.80791751376462
+72.6354859357238, 35.682005758635995
+72.43548593572382, 35.577286883133986
+71.43548593572382, 35.36912806987046
+69.8354859357238, 35.33562021646732
+69.03548593572384, 35.37271699066087
+68.6354859357238, 35.49316211590866
+68.23548593572383, 35.562485888109116
+67.6354859357238, 35.79701262153061
+67.23548593572383, 36.015197681256055
+66.6949264951644, 36.43562021646732
+66.30279362803151, 36.83562021646732
+66.02578444318647, 37.235620216467325
+65.81633699955358, 37.63562021646732
+65.61506340051255, 38.235620216467325
+65.52655736429523, 38.63562021646732
+65.39097374060185, 39.43562021646732
+65.33075220791318, 40.235620216467325
+65.30397078420867, 41.03562021646732
+65.30397078420867, 52.235620216467325
+65.23548593572383, 52.297033259945586
+65.03548593572384, 52.33562021646732
+63.03548593572384, 52.33562021646732
+62.87999813084576, 52.235620216467325
+UP
+127.70538389490747, 52.235620216467325
+DOWN
+127.70538389490747, 52.235620216467325
+127.70538389490747, 33.43562021646732
+127.8354859357238, 33.33562021646732
+129.6354859357238, 33.33562021646732
+129.79097374060188, 33.43562021646732
+129.79097374060188, 34.83562021646732
+129.80436010790925, 35.03562021646732
+129.8354859357238, 35.08169864783987
+130.03548593572384, 35.001220216467324
+130.52055087078878, 34.43562021646732
+131.03548593572384, 33.9785650017434
+131.6354859357238, 33.596766713282605
+132.23548593572383, 33.35290993609349
+132.6354859357238, 33.28906849232939
+133.03548593572384, 33.17345805430516
+133.43548593572382, 33.13562021646732
+134.03548593572384, 33.14099211729377
+134.43548593572382, 33.181334502181606
+134.8354859357238, 33.29627595417224
+135.23548593572383, 33.35290993609349
+135.6354859357238, 33.51646133796265
+135.8354859357238, 33.56634938313399
+136.03548593572384, 33.69395354980065
+136.23548593572383, 33.76449722181491
+136.8354859357238, 34.14812021646732
+137.43548593572382, 34.63640146646732
+138.03548593572384, 35.25093553178264
+138.46374680528902, 35.83562021646732
+138.69472160451363, 36.235620216467325
+139.0608482545644, 37.03562021646732
+139.25680946513558, 37.63562021646732
+139.43627333729864, 38.43562021646732
+139.56558797654014, 39.43562021646732
+139.59097374060184, 39.83562021646732
+139.57955373233398, 41.03562021646732
+139.47341697020659, 42.03562021646732
+139.30358409523302, 42.83562021646732
+138.87805350329137, 44.03562021646732
+138.43548593572382, 44.84599757495789
+138.03548593572384, 45.40641667664431
+137.6354859357238, 45.84435037519748
+137.16957684481474, 46.235620216467325
+136.8354859357238, 46.477758581247194
+136.03548593572384, 46.89348538500665
+135.6354859357238, 47.00562021646732
+135.43548593572382, 47.099981918594985
+134.8354859357238, 47.20676115606464
+134.6354859357238, 47.27524285797676
+134.03548593572384, 47.33562021646732
+133.43548593572382, 47.328025279758464
+133.03548593572384, 47.27524285797676
+132.23548593572383, 47.07422781140403
+132.03548593572384, 46.965722257283645
+131.8354859357238, 46.91087274171984
+131.43548593572382, 46.695503937397554
+130.8354859357238, 46.265901906608164
+130.23548593572383, 45.669213966467325
+130.03548593572384, 45.54593767678478
+129.97407289224554, 45.63562021646732
+129.96558797654012, 45.83562021646732
+129.96558797654012, 52.235620216467325
+129.8354859357238, 52.33562021646732
+127.8354859357238, 52.33562021646732
+127.70538389490747, 52.235620216467325
+UP
+215.93907875009506, 52.235620216467325
+DOWN
+215.93907875009506, 52.235620216467325
+222.08482804098696, 43.63562021646732
+222.32739345017467, 43.235620216467325
+221.91561015932632, 42.63562021646732
+221.00432651543395, 41.43562021646732
+220.88482804098703, 41.235620216467325
+220.40722506615862, 40.63562021646732
+220.284828040987, 40.43562021646732
+218.77208724291336, 38.43562021646732
+215.0790442179324, 33.43562021646732
+215.23548593572377, 33.33562021646732
+217.8354859357238, 33.33562021646732
+218.00107035130827, 33.43562021646732
+222.48106416701637, 39.63562021646732
+222.89888462853423, 40.235620216467325
+223.43548593572382, 41.101360957208065
+223.63548593572386, 41.328148952099504
+223.8354859357238, 41.198827763637134
+224.18990770443133, 40.63562021646732
+225.5799303801682, 38.63562021646732
+229.26990152013946, 33.43562021646732
+229.43548593572382, 33.33562021646732
+232.03548593572384, 33.33562021646732
+232.23548593572377, 33.380506580103685
+232.29888462853432, 33.43562021646732
+225.40107035130825, 43.03562021646732
+225.26664535601367, 43.235620216467325
+225.19192765351522, 43.43562021646732
+229.6962702494493, 49.43562021646732
+231.76048593572386, 52.235620216467325
+231.63548593572386, 52.324750651249936
+231.43548593572382, 52.33562021646732
+229.43548593572382, 52.33562021646732
+229.23548593572377, 52.321780930753036
+229.11561015932625, 52.235620216467325
+225.00722506615864, 46.83562021646732
+224.05840260239052, 45.43562021646732
+223.8354859357238, 45.17573010657721
+223.63548593572386, 45.33958061250693
+223.08106416701628, 46.235620216467325
+222.2637468052891, 47.43562021646732
+221.3861438304607, 48.63562021646732
+218.8354859357238, 52.26215082871222
+218.63548593572386, 52.33562021646732
+216.23548593572377, 52.33562021646732
+216.03548593572384, 52.31302406262117
+215.93907875009506, 52.235620216467325
+UP
+232.81668894324264, 52.235620216467325
+DOWN
+232.81668894324264, 52.235620216467325
+240.01668894324257, 41.43562021646732
+240.07999813084575, 41.235620216467325
+240.07999813084575, 33.43562021646732
+240.23548593572377, 33.33562021646732
+242.23548593572377, 33.33562021646732
+242.43548593572382, 33.35821637031348
+242.53075220791322, 33.43562021646732
+242.53075220791322, 41.235620216467325
+242.5919276535152, 41.43562021646732
+250.06664535601362, 52.235620216467325
+249.8354859357238, 52.33562021646732
+247.43548593572382, 52.33562021646732
+247.204326515434, 52.235620216467325
+243.19842299866093, 46.235620216467325
+242.17993038016823, 44.63562021646732
+241.63548593572386, 43.714323920171026
+241.43548593572382, 43.57345805430516
+241.2257844431865, 43.83562021646732
+240.89104149127934, 44.43562021646732
+239.65428292820502, 46.43562021646732
+235.80107035130823, 52.235620216467325
+235.63548593572386, 52.33562021646732
+233.03548593572384, 52.33562021646732
+232.81668894324264, 52.235620216467325
+UP
+86.19227605918059, 47.235620216467325
+DOWN
+86.19227605918059, 47.235620216467325
+85.8354859357238, 47.12538765832779
+85.43548593572382, 46.913630687671514
+85.08281926905715, 46.63562021646732
+84.55194935035797, 46.03562021646732
+84.03548593572384, 45.22862021646732
+83.8354859357238, 45.1307815067899
+83.79486093572382, 45.235620216467325
+83.79097374060188, 47.03562021646732
+83.6354859357238, 47.13562021646732
+82.03548593572384, 47.13562021646732
+81.8354859357238, 47.09703325994558
+81.76700108723895, 47.03562021646732
+81.76700108723895, 33.43562021646732
+81.8354859357238, 33.37420717298906
+82.03548593572384, 33.33562021646732
+83.8354859357238, 33.33562021646732
+84.03163978187763, 33.43562021646732
+84.03627333729861, 41.03562021646732
+84.17258270991738, 42.235620216467325
+84.36062254774566, 43.03562021646732
+84.58288477965448, 43.63562021646732
+84.8354859357238, 44.041552419857155
+85.03548593572384, 44.27548035632746
+85.6354859357238, 44.71122997256488
+86.03548593572384, 44.881074761921866
+86.43548593572382, 44.9332105779131
+87.23548593572383, 44.923285414705205
+87.43548593572382, 44.89155241985715
+87.6354859357238, 44.79302762387473
+88.03548593572384, 44.67624521646732
+88.23548593572383, 44.552705643603005
+88.43548593572382, 44.60408868493579
+89.13075220791313, 46.43562021646732
+89.08511556535342, 46.63562021646732
+89.03548593572384, 46.6777585812472
+88.6354859357238, 46.88968998390918
+88.03548593572384, 47.12415232655907
+87.43548593572382, 47.28292560568888
+87.03548593572384, 47.33562021646732
+86.6354859357238, 47.33024831564087
+86.19227605918059, 47.235620216467325
+UP
+110.81783887690028, 47.235620216467325
+DOWN
+110.81783887690028, 47.235620216467325
+110.23548593572383, 47.12255715340426
+109.6354859357238, 46.89770812855524
+109.23548593572383, 46.6777585812472
+108.43548593572382, 46.10043503128214
+107.97208724291335, 45.63562021646732
+107.6354859357238, 45.21907345387739
+107.50886255910041, 45.43562021646732
+107.50397078420866, 47.03562021646732
+107.43548593572382, 47.09703325994558
+107.23548593572383, 47.13562021646732
+105.6354859357238, 47.13562021646732
+105.50538389490748, 47.03562021646732
+105.50538389490748, 33.43562021646732
+105.6354859357238, 33.33562021646732
+107.6354859357238, 33.33562021646732
+107.76558797654013, 33.43562021646732
+107.76558797654013, 41.235620216467325
+107.83627333729862, 42.03562021646732
+107.97955373233401, 42.83562021646732
+108.23548593572383, 43.562364402513836
+108.51217305228823, 44.03562021646732
+108.84450232916646, 44.43562021646732
+109.43548593572382, 44.89925658010368
+109.6354859357238, 44.97353230437941
+109.8354859357238, 45.099981918594985
+110.43548593572382, 45.29627595417224
+111.43548593572382, 45.33562021646732
+111.8354859357238, 45.32075535160246
+112.03548593572384, 45.278212809059916
+112.43548593572382, 45.1265725974197
+112.8354859357238, 44.87215867800578
+113.08281926905715, 44.63562021646732
+113.31900866299657, 44.235620216467325
+113.4880870917932, 43.83562021646732
+113.57971670495459, 43.43562021646732
+113.67999813084577, 42.83562021646732
+113.67999813084577, 33.43562021646732
+113.8354859357238, 33.33562021646732
+115.8354859357238, 33.33562021646732
+115.96558797654012, 33.43562021646732
+115.96558797654012, 41.83562021646732
+115.99387102889153, 42.235620216467325
+116.16062254774567, 43.03562021646732
+116.38288477965443, 43.63562021646732
+116.6354859357238, 44.049441354678706
+116.96330050526024, 44.43562021646732
+117.23548593572383, 44.67624521646732
+117.8354859357238, 45.03794579786267
+118.43548593572382, 45.265620216467326
+118.8354859357238, 45.32847735932447
+119.43548593572382, 45.33562021646732
+120.03548593572384, 45.305518175650995
+120.6354859357238, 45.079178498675915
+120.99563631166365, 44.83562021646732
+121.23548593572383, 44.60149323234034
+121.51900866299655, 44.235620216467325
+121.6354859357238, 43.970805401652505
+121.73025337758429, 43.63562021646732
+121.83933208956995, 42.83562021646732
+121.83933208956995, 42.43562021646732
+121.87999813084576, 42.03562021646732
+121.87999813084576, 33.43562021646732
+122.03548593572384, 33.33562021646732
+123.8354859357238, 33.33562021646732
+124.03548593572384, 33.37420717298906
+124.10397078420868, 33.43562021646732
+124.09125516649306, 43.43562021646732
+123.88179466055601, 44.63562021646732
+123.66084825456437, 45.235620216467325
+123.31902252108966, 45.83562021646732
+123.03548593572384, 46.16343478600375
+122.43548593572382, 46.6777585812472
+122.03548593572384, 46.89770812855524
+121.43548593572382, 47.12334748919459
+120.6354859357238, 47.293953549800655
+120.23548593572383, 47.33562021646732
+119.6354859357238, 47.33562021646732
+119.23548593572383, 47.297782378629485
+118.8354859357238, 47.18217194060525
+118.43548593572382, 47.11833049684115
+117.8354859357238, 46.88968998390918
+117.43548593572382, 46.6777585812472
+116.6354859357238, 46.08192894129954
+116.37766280647213, 45.83562021646732
+115.8354859357238, 45.179650067213586
+115.6354859357238, 45.015197681256055
+115.1266809042773, 45.83562021646732
+114.78246580149562, 46.235620216467325
+114.23548593572383, 46.69130883922181
+113.8354859357238, 46.91087274171984
+113.23548593572383, 47.13042541127252
+112.43548593572382, 47.297782378629485
+112.03548593572384, 47.33562021646732
+111.43548593572382, 47.33562021646732
+111.03548593572384, 47.293953549800655
+110.81783887690028, 47.235620216467325
+UP
+169.29852941398468, 47.235620216467325
+DOWN
+169.29852941398468, 47.235620216467325
+168.43548593572382, 47.07624521646732
+168.23548593572383, 46.97728688313399
+167.8354859357238, 46.874227811404026
+167.03548593572384, 46.4938123068628
+166.43548593572382, 46.10171217049031
+165.91561015932632, 45.63562021646732
+165.54429096717035, 45.235620216467325
+165.1325097452476, 44.63562021646732
+164.81012361688323, 44.03562021646732
+164.57625026693404, 43.43562021646732
+164.3891772108916, 42.83562021646732
+164.18917721089161, 41.83562021646732
+164.1053838949075, 41.03562021646732
+164.07999813084575, 40.43562021646732
+164.1053838949075, 39.235620216467325
+164.17106875780973, 38.63562021646732
+164.42556227160168, 37.43562021646732
+164.79291836815628, 36.43562021646732
+165.00122020145807, 36.03562021646732
+165.40432651543398, 35.43562021646732
+165.74429096717034, 35.03562021646732
+166.43548593572382, 34.3785650017434
+167.03548593572384, 33.959209960057066
+167.23548593572383, 33.882005758636
+167.43548593572382, 33.753530664228514
+167.6354859357238, 33.69395354980065
+167.8354859357238, 33.57091433411438
+168.23548593572383, 33.46562021646732
+168.43548593572382, 33.371258514339665
+169.03548593572384, 33.28107476192187
+169.43548593572382, 33.181334502181606
+169.8354859357238, 33.143215153176186
+170.6354859357238, 33.13562021646732
+171.03548593572384, 33.17345805430516
+172.03548593572384, 33.36312021646732
+172.23548593572383, 33.45853688313399
+172.6354859357238, 33.577755047927994
+173.43548593572382, 33.99348185168745
+174.24450232916644, 34.63562021646732
+174.8354859357238, 35.29610408743506
+175.08106416701634, 35.63562021646732
+175.31217305228824, 36.03562021646732
+175.66975166998952, 36.83562021646732
+175.8568094651356, 37.43562021646732
+175.979553732334, 38.03562021646732
+175.8254859357238, 38.235620216467325
+175.6354859357238, 38.28990593075304
+174.6354859357238, 38.37271699066087
+174.03548593572384, 38.49925658010368
+173.8354859357238, 38.488221372536685
+173.77715260239052, 38.43562021646732
+173.6677227778291, 37.83562021646732
+173.47202439726226, 37.235620216467325
+173.30234640084007, 36.83562021646732
+173.05840260239052, 36.43562021646732
+172.8354859357238, 36.14145963252572
+172.51903856730274, 35.83562021646732
+172.23548593572383, 35.61907345387739
+171.8354859357238, 35.37728688313399
+171.23548593572383, 35.16248588810912
+170.6354859357238, 35.10417691749825
+170.03548593572384, 35.09778237862948
+169.23548593572383, 35.179688013077495
+169.03548593572384, 35.278212809059916
+168.6354859357238, 35.407917513764616
+168.03548593572384, 35.77274596497031
+167.73280137196542, 36.03562021646732
+167.36048593572383, 36.43562021646732
+166.99097374060187, 37.03562021646732
+166.81633699955358, 37.43562021646732
+166.58727165000954, 38.235620216467325
+166.39097374060185, 39.83562021646732
+166.39097374060185, 40.63562021646732
+166.43163978187766, 40.83562021646732
+166.46975166998953, 41.43562021646732
+166.5938710288915, 42.235620216467325
+166.76634307858097, 42.83562021646732
+166.9223122830292, 43.235620216467325
+167.23548593572383, 43.79580540165251
+167.58614383046063, 44.235620216467325
+167.8354859357238, 44.48496232173048
+168.43548593572382, 44.91634938313399
+168.8354859357238, 45.1147671358986
+169.43548593572382, 45.31062021646732
+170.03548593572384, 45.36706351543639
+170.6354859357238, 45.37345805430516
+171.23548593572383, 45.32127044068257
+171.43548593572382, 45.27624521646732
+171.6354859357238, 45.16634938313399
+171.8354859357238, 45.111229972564885
+172.23548593572383, 44.886497409449774
+172.43548593572382, 44.733308077739
+172.74429096717034, 44.43562021646732
+173.0699015201394, 44.03562021646732
+173.28808709179316, 43.63562021646732
+173.45463487189403, 43.235620216467325
+173.57419561314316, 42.83562021646732
+173.6354859357238, 42.78133450218161
+173.8354859357238, 42.77968801307749
+174.23548593572383, 42.88906849232939
+175.03548593572384, 42.96376091998491
+175.6354859357238, 43.10696853107406
+175.7606225477457, 43.235620216467325
+175.66975166998952, 43.63562021646732
+175.46084825456438, 44.235620216467325
+175.28106416701632, 44.63562021646732
+175.054282928205, 45.03562021646732
+174.9190225210897, 45.235620216467325
+174.40638145811187, 45.83562021646732
+173.94353962699898, 46.235620216467325
+173.6354859357238, 46.45240853763521
+173.23548593572383, 46.6938123068628
+172.8354859357238, 46.87723512329962
+172.43548593572382, 46.990165671012775
+172.23548593572383, 47.089905930753034
+171.6354859357238, 47.18217194060525
+171.23548593572383, 47.28990593075304
+170.6354859357238, 47.33562021646732
+170.03548593572384, 47.33562021646732
+169.43548593572382, 47.27524285797676
+169.29852941398468, 47.235620216467325
+UP
+182.6082132084511, 47.235620216467325
+DOWN
+182.6082132084511, 47.235620216467325
+181.8354859357238, 47.10812021646732
+181.43548593572382, 46.95533852632648
+181.23548593572383, 46.915717303845966
+180.6253007505386, 46.63562021646732
+180.03548593572384, 46.30967427052138
+179.43548593572382, 45.865901906608165
+179.03548593572384, 45.49901890927778
+178.34652888050908, 44.63562021646732
+178.01012361688322, 44.03562021646732
+177.7585162387541, 43.43562021646732
+177.56738777621462, 42.83562021646732
+177.36379918873587, 41.83562021646732
+177.2799981308458, 41.03562021646732
+177.2799981308458, 39.43562021646732
+177.36379918873587, 38.63562021646732
+177.62556227160167, 37.43562021646732
+177.8354859357238, 36.829209960057064
+178.01012361688322, 36.43562021646732
+178.35194935035798, 35.83562021646732
+178.80432651543396, 35.235620216467325
+179.23548593572383, 34.779699163835744
+179.64141813911363, 34.43562021646732
+180.03548593572384, 34.149523959782826
+180.6354859357238, 33.79676671328261
+181.23548593572383, 33.54708810637558
+181.43548593572382, 33.50875454482553
+181.8354859357238, 33.353294635071975
+182.23548593572383, 33.30938259270495
+182.8354859357238, 33.17345805430516
+183.23548593572383, 33.14099211729377
+184.03548593572384, 33.13562021646732
+184.43548593572382, 33.17345805430516
+185.03548593572384, 33.30417691749825
+185.43548593572382, 33.353294635071975
+185.8354859357238, 33.50485098569809
+186.03548593572384, 33.54708810637558
+186.63548593572386, 33.78895354980065
+187.03548593572384, 33.99348185168745
+187.63548593572386, 34.379256580103686
+187.95193330414486, 34.63562021646732
+188.3861438304607, 35.03562021646732
+188.89888462853423, 35.63562021646732
+189.2780535032914, 36.235620216467325
+189.47805350329133, 36.63562021646732
+189.69472160451357, 37.235620216467325
+189.89990311363795, 38.03562021646732
+190.09990311363788, 39.63562021646732
+190.10397078420863, 41.03562021646732
+190.0697516699895, 41.43562021646732
+189.9071726827118, 42.43562021646732
+189.68179466055608, 43.235620216467325
+189.23548593572377, 44.247078549800655
+188.8666453560137, 44.83562021646732
+188.3553617121213, 45.43562021646732
+187.63548593572386, 46.09198385283096
+187.03548593572384, 46.49447735932446
+186.8354859357238, 46.57271699066087
+186.63548593572386, 46.705620216467324
+186.43548593572382, 46.76572225728365
+186.23548593572377, 46.87723512329962
+185.8354859357238, 46.97728688313399
+185.63548593572386, 47.07821280905991
+185.43548593572382, 47.12961163277633
+185.03548593572384, 47.174964478762405
+184.63548593572386, 47.27524285797676
+184.03548593572384, 47.33562021646732
+183.23548593572383, 47.33024831564087
+182.8354859357238, 47.293953549800655
+182.6082132084511, 47.235620216467325
+UP
+197.33288853312638, 47.235620216467325
+DOWN
+197.33288853312638, 47.235620216467325
+196.8354859357238, 47.07422781140403
+196.23548593572377, 46.667535110084344
+195.8354859357238, 46.22179907825594
+195.40722506615862, 45.63562021646732
+195.23548593572377, 45.33958061250693
+195.03548593572384, 45.10733738818449
+194.94729149127943, 45.235620216467325
+194.9307522079132, 45.43562021646732
+194.9307522079132, 47.03562021646732
+194.8354859357238, 47.113024062621164
+194.63548593572386, 47.13562021646732
+193.03548593572384, 47.13562021646732
+192.90538389490746, 47.03562021646732
+192.90538389490746, 33.43562021646732
+193.03548593572384, 33.33562021646732
+195.03548593572384, 33.33562021646732
+195.1655879765401, 33.43562021646732
+195.1655879765401, 40.83562021646732
+195.19097374060186, 41.43562021646732
+195.3124556326935, 42.235620216467325
+195.43548593572382, 42.80538765832779
+195.56062254774565, 43.235620216467325
+195.8354859357238, 43.842223990052226
+196.13280137196546, 44.235620216467325
+196.43548593572382, 44.500914334114384
+196.8354859357238, 44.734231327578435
+197.23548593572377, 44.90211236306418
+197.63548593572386, 44.93482970263333
+198.43548593572382, 44.916461337962645
+199.03548593572384, 44.721270440682574
+199.43548593572382, 44.53182874727301
+199.57677625830445, 44.63562021646732
+199.66975166998952, 44.83562021646732
+200.26975166998955, 46.43562021646732
+200.20929545953334, 46.63562021646732
+199.8354859357238, 46.84812021646732
+199.23548593572377, 47.10885253969965
+198.8354859357238, 47.18831482724576
+198.63548593572386, 47.264479276870006
+198.23548593572377, 47.328025279758464
+197.8354859357238, 47.33562021646732
+197.43548593572382, 47.28292560568888
+197.33288853312638, 47.235620216467325
+UP
+206.38163978187765, 47.235620216467325
+DOWN
+206.38163978187765, 47.235620216467325
+205.63548593572386, 47.11183380870033
+205.23548593572377, 46.95704878789589
+205.03548593572384, 46.915717303845966
+204.42566450715242, 46.63562021646732
+203.8354859357238, 46.295503937397555
+203.26459041333578, 45.83562021646732
+202.63548593572386, 45.21882021646732
+202.204326515434, 44.63562021646732
+201.95879881915937, 44.235620216467325
+201.52096079605906, 43.235620216467325
+201.3891772108916, 42.83562021646732
+201.167001087239, 41.83562021646732
+201.03933208956994, 40.43562021646732
+201.03933208956994, 39.83562021646732
+201.12096079605897, 38.83562021646732
+201.20498948182308, 38.235620216467325
+201.40122020145805, 37.43562021646732
+201.61012361688324, 36.83562021646732
+202.00722506615864, 36.03562021646732
+202.40722506615862, 35.43562021646732
+202.95778323302113, 34.83562021646732
+203.23548593572377, 34.58148008907879
+204.03548593572384, 34.02302762387473
+204.43548593572382, 33.79676671328261
+205.03548593572384, 33.54789294374005
+205.23548593572377, 33.509382592704945
+205.63548593572386, 33.35940662423431
+206.23548593572377, 33.28107476192187
+206.63548593572386, 33.181334502181606
+207.23548593572377, 33.13562021646732
+208.03548593572384, 33.13562021646732
+208.43548593572382, 33.17345805430516
+209.03548593572384, 33.30417691749825
+209.43548593572382, 33.348683279530384
+210.23548593572377, 33.612703549800656
+211.03548593572384, 33.99348185168745
+211.8354859357238, 34.599068492329394
+212.0844221059366, 34.83562021646732
+212.72668090427726, 35.63562021646732
+213.08106416701628, 36.235620216467325
+213.2780535032914, 36.63562021646732
+213.55001107538862, 37.43562021646732
+213.43548593572382, 37.62543503128214
+213.23548593572377, 37.68292560568888
+212.8354859357238, 37.735620216467325
+212.03548593572384, 37.79016567101277
+211.43548593572382, 37.907479512949735
+211.23154892784976, 37.83562021646732
+210.87999813084582, 37.03562021646732
+210.63548593572386, 36.62968801307749
+210.3381704994822, 36.235620216467325
+209.8354859357238, 35.77032609882026
+209.23548593572377, 35.397012621530614
+208.63548593572386, 35.17345805430516
+208.43548593572382, 35.14459457544168
+207.43548593572382, 35.09778237862948
+206.63548593572386, 35.15477909497199
+206.03548593572384, 35.34996999225208
+205.63548593572386, 35.542449484760006
+205.23548593572377, 35.78562021646732
+204.8354859357238, 36.12681518502078
+204.36048593572377, 36.63562021646732
+203.99097374060182, 37.235620216467325
+203.73665552636714, 37.83562021646732
+203.5265573642953, 38.63562021646732
+203.39387102889157, 39.43562021646732
+203.3909737406019, 39.63562021646732
+203.43548593572382, 39.68013241158927
+203.63548593572386, 39.735620216467325
+213.43548593572382, 39.735620216467325
+213.67341697020663, 39.83562021646732
+213.70397078420865, 40.03562021646732
+213.66975166998952, 41.235620216467325
+213.49125516649303, 42.43562021646732
+213.2780535032914, 43.235620216467325
+213.12231228302926, 43.63562021646732
+212.8354859357238, 44.2473223441269
+212.48106416701637, 44.83562021646732
+211.78815260239048, 45.63562021646732
+211.03548593572384, 46.27495354980066
+210.23548593572377, 46.73607893206365
+209.8354859357238, 46.915717303845966
+209.63548593572386, 46.95704878789589
+209.23548593572377, 47.11183380870033
+208.8354859357238, 47.16376091998491
+208.23548593572377, 47.297782378629485
+207.8354859357238, 47.33562021646732
+207.03548593572384, 47.33562021646732
+206.63548593572386, 47.297782378629485
+206.38163978187765, 47.235620216467325
+UP
+90.63933208956996, 47.03562021646732
+DOWN
+90.63933208956996, 47.03562021646732
+90.63933208956996, 37.83562021646732
+90.67999813084577, 37.63562021646732
+90.68370022143807, 37.235620216467325
+90.78917721089158, 36.43562021646732
+90.9585162387541, 35.83562021646732
+91.21668894324262, 35.235620216467325
+91.60432651543397, 34.63562021646732
+92.03548593572384, 34.22416983478793
+92.43548593572382, 33.94485098569809
+93.03548593572384, 33.62312021646732
+93.43548593572382, 33.49155241985715
+93.6354859357238, 33.38133450218161
+94.23548593572383, 33.28107476192187
+94.6354859357238, 33.17345805430516
+95.03548593572384, 33.13562021646732
+95.6354859357238, 33.13562021646732
+96.03548593572384, 33.17728688313399
+96.43548593572382, 33.28906849232939
+96.8354859357238, 33.34789294374005
+97.43548593572382, 33.56036769121479
+97.6354859357238, 33.68562021646732
+97.8354859357238, 33.75841814392846
+98.23548593572383, 34.00636851578705
+98.6354859357238, 34.32470067623744
+99.6354859357238, 35.34605499907602
+99.72368038016828, 35.235620216467325
+99.74021966353445, 35.03562021646732
+99.74021966353445, 33.43562021646732
+99.8354859357238, 33.35821637031348
+100.03548593572384, 33.33562021646732
+101.6354859357238, 33.33562021646732
+101.76558797654013, 33.43562021646732
+101.76558797654013, 47.03562021646732
+101.6354859357238, 47.13562021646732
+99.6354859357238, 47.13562021646732
+99.47999813084573, 47.03562021646732
+99.47999813084573, 39.03562021646732
+99.32096079605901, 37.83562021646732
+99.27999813084574, 37.63562021646732
+99.07202439726228, 37.03562021646732
+98.71561015932627, 36.43562021646732
+98.53817049948219, 36.235620216467325
+98.03548593572384, 35.79701262153061
+97.6354859357238, 35.56123598001412
+97.43548593572382, 35.48968998390918
+97.23548593572383, 35.367744568798926
+96.8354859357238, 35.265620216467326
+96.6354859357238, 35.18217194060525
+96.23548593572383, 35.14055848807226
+95.6354859357238, 35.13562021646732
+95.03548593572384, 35.16572225728365
+94.43548593572382, 35.36706351543639
+94.03548593572384, 35.59701262153061
+93.55536171212134, 36.03562021646732
+93.41256926905714, 36.235620216467325
+93.19894747418533, 36.63562021646732
+93.01506340051253, 37.235620216467325
+92.93075220791314, 38.03562021646732
+92.90397078420864, 38.83562021646732
+92.90397078420864, 47.03562021646732
+92.8354859357238, 47.09703325994558
+92.6354859357238, 47.13562021646732
+90.8354859357238, 47.13562021646732
+90.63933208956996, 47.03562021646732
+UP
+142.4799981308458, 47.03562021646732
+DOWN
+142.4799981308458, 47.03562021646732
+142.4799981308458, 37.83562021646732
+142.5123676561539, 37.235620216467325
+142.5797167049546, 36.63562021646732
+142.78917721089158, 35.83562021646732
+142.94865958841842, 35.43562021646732
+143.15879881915941, 35.03562021646732
+143.4479859357238, 34.63562021646732
+143.86330548459603, 34.235620216467325
+144.23548593572383, 33.957609745263134
+145.03548593572384, 33.54585277460686
+145.23548593572383, 33.50211236306418
+145.43548593572382, 33.397012621530614
+145.6354859357238, 33.34162880015831
+146.03548593572384, 33.28906849232939
+146.43548593572382, 33.17728688313399
+146.8354859357238, 33.13562021646732
+147.43548593572382, 33.13562021646732
+147.8354859357238, 33.17345805430516
+148.8354859357238, 33.39302762387473
+149.6354859357238, 33.74799645409109
+150.03548593572384, 33.979931593712834
+150.5881526023905, 34.43562021646732
+151.43548593572382, 35.34287828098345
+151.54361601702465, 35.235620216467325
+151.56700108723896, 35.03562021646732
+151.56700108723896, 33.43562021646732
+151.6354859357238, 33.37420717298906
+151.8354859357238, 33.33562021646732
+153.43548593572382, 33.33562021646732
+153.59097374060184, 33.43562021646732
+153.59097374060184, 47.03562021646732
+153.43548593572382, 47.13562021646732
+151.43548593572382, 47.13562021646732
+151.3053838949075, 47.03562021646732
+151.3053838949075, 39.03562021646732
+151.2799981308458, 38.63562021646732
+151.1517509959648, 37.83562021646732
+151.05463487189405, 37.43562021646732
+150.90462879286667, 37.03562021646732
+150.684828040987, 36.63562021646732
+150.3650161370661, 36.235620216467325
+149.8354859357238, 35.77728688313399
+149.43548593572382, 35.54571637031348
+149.23548593572383, 35.47447371965204
+149.03548593572384, 35.35704878789589
+148.8354859357238, 35.31911078250506
+148.43548593572382, 35.174964478762405
+147.43548593572382, 35.13562021646732
+146.8354859357238, 35.17345805430516
+146.23548593572383, 35.37728688313399
+145.6354859357238, 35.78828688313399
+145.38614383046064, 36.03562021646732
+145.1307522079132, 36.43562021646732
+144.9519632084511, 36.83562021646732
+144.8568094651356, 37.235620216467325
+144.79097374060188, 37.63562021646732
+144.73075220791316, 38.83562021646732
+144.73075220791316, 47.03562021646732
+144.6354859357238, 47.113024062621164
+144.43548593572382, 47.13562021646732
+142.6354859357238, 47.13562021646732
+142.4799981308458, 47.03562021646732
+UP
+132.6354859357238, 45.281074761921865
+DOWN
+132.6354859357238, 45.281074761921865
+133.43548593572382, 45.37345805430516
+133.8354859357238, 45.37198385283096
+134.43548593572382, 45.30875454482553
+135.03548593572384, 45.08562021646732
+135.6354859357238, 44.70091433411438
+135.9288634191675, 44.43562021646732
+136.28482804098695, 44.03562021646732
+136.44082944717422, 43.83562021646732
+136.67999813084577, 43.43562021646732
+136.92096079605903, 42.83562021646732
+137.1384271121944, 42.03562021646732
+137.2799981308458, 40.83562021646732
+137.2799981308458, 39.63562021646732
+137.0771008425561, 38.235620216467325
+136.8354859357238, 37.50562021646732
+136.6354859357238, 37.06468998390918
+136.43548593572382, 36.73107476192187
+136.03548593572384, 36.22591872393001
+135.8354859357238, 36.03483896646732
+135.23548593572383, 35.5561465322568
+134.8354859357238, 35.35100483185194
+134.6354859357238, 35.29348538500665
+134.43548593572382, 35.19016567101278
+134.23548593572383, 35.146973928257715
+133.23548593572383, 35.09778237862948
+132.6354859357238, 35.15477909497199
+132.03548593572384, 35.36638944723656
+131.6354859357238, 35.59016567101278
+131.10058660686474, 36.03562021646732
+130.8354859357238, 36.31397842542255
+130.58614383046068, 36.63562021646732
+130.34769523804943, 37.03562021646732
+130.16634307858095, 37.43562021646732
+129.9500110753886, 38.235620216467325
+129.79097374060188, 39.43562021646732
+129.79097374060188, 41.03562021646732
+129.979553732334, 42.235620216467325
+130.16634307858095, 42.83562021646732
+130.56048593572382, 43.63562021646732
+131.03548593572384, 44.245321709004635
+131.46831036320475, 44.63562021646732
+131.8354859357238, 44.915093900677846
+132.23548593572383, 45.120235601082705
+132.43548593572382, 45.177755047927995
+132.6354859357238, 45.281074761921865
+UP
+182.6354859357238, 45.293953549800655
+DOWN
+182.6354859357238, 45.293953549800655
+183.43548593572382, 45.37345805430516
+184.03548593572384, 45.36706351543639
+184.63548593572386, 45.31062021646732
+185.23548593572377, 45.111229972564885
+185.7503007505386, 44.83562021646732
+186.23548593572377, 44.48496232173048
+186.63548593572386, 44.08664062463059
+187.03548593572384, 43.53165982042772
+187.30234640084007, 43.03562021646732
+187.4546348718941, 42.63562021646732
+187.64518742826112, 41.83562021646732
+187.7402196635345, 41.235620216467325
+187.767001087239, 40.83562021646732
+187.7402196635345, 39.43562021646732
+187.67710084255611, 38.83562021646732
+187.55175099596477, 38.235620216467325
+187.28808709179316, 37.43562021646732
+187.09499513817775, 37.03562021646732
+186.684828040987, 36.43562021646732
+186.23548593572377, 35.99576007660718
+185.63548593572386, 35.56001046036976
+185.23548593572377, 35.360010460369764
+184.63548593572386, 35.16062021646732
+183.8354859357238, 35.09778237862948
+182.8354859357238, 35.14553400957077
+182.6354859357238, 35.17728688313399
+182.43548593572382, 35.278212809059916
+182.03548593572384, 35.390165671012774
+181.6354859357238, 35.615197681256056
+181.31942754156324, 35.83562021646732
+180.8683326510523, 36.235620216467325
+180.3841872344251, 36.83562021646732
+180.15750974524764, 37.235620216467325
+179.98288477965446, 37.63562021646732
+179.7586042152937, 38.43562021646732
+179.59097374060184, 39.63562021646732
+179.59097374060184, 40.83562021646732
+179.7500110753886, 42.03562021646732
+179.98288477965446, 42.83562021646732
+180.1519632084511, 43.235620216467325
+180.37597673326985, 43.63562021646732
+180.8354859357238, 44.20149323234034
+181.0744565239591, 44.43562021646732
+181.43548593572382, 44.72445270377697
+182.03548593572384, 45.08107476192187
+182.43548593572382, 45.19302762387473
+182.6354859357238, 45.293953549800655
+UP
+206.43548593572382, 45.305518175650995
+DOWN
+206.43548593572382, 45.305518175650995
+207.23548593572377, 45.37345805430516
+207.8354859357238, 45.36706351543639
+208.43548593572382, 45.31646133796265
+209.03548593572384, 45.12127044068257
+209.43548593572382, 44.92657259741971
+209.8354859357238, 44.67422781140403
+210.23548593572377, 44.31574444006981
+210.48482804098694, 44.03562021646732
+210.64082944717416, 43.83562021646732
+210.86990152013936, 43.43562021646732
+211.14021966353448, 42.63562021646732
+211.2799981308458, 41.83562021646732
+211.23548593572377, 41.76802762387473
+211.03548593572384, 41.69778237862948
+203.8354859357238, 41.69778237862948
+203.63548593572386, 41.72142666808023
+203.53075220791322, 41.83562021646732
+203.55001107538862, 42.03562021646732
+203.6257844431865, 42.43562021646732
+203.7989474741854, 43.03562021646732
+203.99097374060182, 43.43562021646732
+204.3861438304607, 44.03562021646732
+204.8354859357238, 44.48496232173048
+205.43548593572382, 44.89925658010368
+205.8354859357238, 45.10417691749825
+206.43548593572382, 45.305518175650995
+UP
diff --git a/UrumbotXY-Fall2022/code/examples/being.xy b/UrumbotXY-Fall2022/code/examples/being.xy
new file mode 100644
index 0000000000000000000000000000000000000000..e3c062f323d3148941742a097f45f0a3cc38f642
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/examples/being.xy
@@ -0,0 +1,736 @@
+64.50128784,115.1430298
+DOWN
+63.6991394,114.5488403
+62.99569702,113.8438232
+62.0062561,113.8369995
+61.02735596,114.0431274
+60.04801636,114.246875
+60.16680298,113.5991333
+60.82615967,112.8468506
+61.51462402,112.1212402
+61.70858154,111.1842163
+61.66801758,110.184729
+61.54602661,109.1921875
+61.45678711,108.1972778
+61.42352905,107.1974243
+61.34185791,106.2015259
+61.27432861,105.2034058
+61.19049683,104.2065308
+60.96121216,103.2345276
+60.81772461,102.2454529
+60.58609619,101.2727966
+60.36594238,100.2995789
+60.14833984,99.32839966
+59.90574341,98.37460327
+59.74078979,97.39176025
+59.48048096,96.45043945
+59.22867432,95.48932495
+59.10870972,94.50062866
+58.94217529,93.51539307
+58.78334961,92.5401062
+58.70187378,91.59238281
+58.27241821,90.71746826
+57.93132935,89.80488892
+57.69803467,88.84338379
+57.32114868,87.92913818
+56.92855225,87.01851196
+56.45822754,86.13978271
+55.78312378,85.40495605
+55.2956665,84.59464111
+54.83184814,83.71542358
+54.25316772,82.91517944
+53.89766235,83.53178711
+53.79960938,84.52592773
+53.78209839,85.52525635
+53.83691406,86.52412109
+53.90066528,87.52154541
+53.93278809,88.52122192
+54.02285767,89.51696167
+54.06710815,90.51639404
+54.15552979,91.51205444
+54.23067017,92.50871582
+54.29088745,93.47800293
+54.34970703,94.47550659
+54.45175171,95.47056885
+54.34918823,96.45257568
+53.78954468,97.28157959
+53.20536499,98.09327393
+52.53023071,97.83944092
+52.29799805,96.86885376
+52.01047363,95.91092529
+51.7945282,94.9342041
+51.43877869,94.00385742
+51.25815125,93.0319397
+50.99374695,92.0706543
+50.73483276,91.10620728
+50.47553711,90.1413147
+50.22458801,89.17572632
+49.89829407,88.23164063
+49.70123291,87.25322266
+49.42381287,86.29447632
+49.21421204,85.31875
+48.83167725,84.39849243
+48.26104431,83.74507446
+48.15665283,84.73644409
+48.07641296,85.73330688
+47.97028198,86.72614746
+47.89754028,87.72391357
+47.8381012,88.7223877
+47.78776245,89.71807861
+47.17896423,89.50422363
+46.78980713,88.58792725
+46.49377136,87.63245239
+46.19282532,86.68282471
+45.97403259,85.71503906
+45.70950012,84.75301514
+45.39346008,83.80582886
+45.02994385,82.87388306
+44.69569092,81.9489502
+44.27583923,81.11505737
+43.84849854,81.8645813
+43.67518921,82.75004272
+43.32283936,83.68592529
+42.91621704,84.59980469
+42.51517944,85.5163208
+42.05328369,86.39960938
+41.52281494,85.80755615
+41.3053833,84.83299561
+41.14084473,83.84755859
+40.9813324,82.86434937
+40.92572937,81.865979
+40.81424255,80.87415161
+40.7544281,79.87583618
+40.70334473,78.87824097
+40.55293579,77.89370117
+39.63286133,77.92102661
+38.87147827,78.53738403
+38.2616333,79.33009033
+37.62339478,80.10038452
+36.98028259,80.86671143
+36.33774719,81.63349609
+35.69241943,82.39780884
+35.02651367,83.14298706
+34.32646484,83.85708008
+33.65128479,84.59529419
+32.99980164,85.35250244
+32.29576721,86.06315308
+31.62471008,86.80460205
+30.9239502,87.51856689
+30.23423462,88.24321899
+29.55631409,88.97888184
+28.88732605,89.72272949
+28.20385437,90.45322266
+27.55032806,91.21062012
+26.9730011,92.00631104
+27.25116882,92.96496582
+27.52415314,93.92669067
+27.82020264,94.88134155
+28.08822632,95.84483032
+28.34364624,96.81201782
+28.57809753,97.78457031
+28.83653564,98.75091553
+29.19003906,99.68637085
+29.58857117,100.6015869
+30.10218506,101.4596375
+30.62151794,102.3127136
+31.0849823,103.1974426
+31.53363953,104.0912537
+31.97104492,104.9908691
+32.36678467,105.9095825
+32.64717407,106.8642212
+32.53189087,107.8391113
+31.61553955,108.0844238
+31.45847473,109.0573242
+31.3326355,110.049585
+30.99040527,110.9766968
+30.553125,111.8462646
+29.9432312,112.6038818
+29.35355225,113.4099243
+28.3989563,113.6148438
+28.13988037,112.8656616
+28.42976074,111.9241211
+28.57087097,110.9373779
+28.07893677,110.7408569
+27.41442871,111.4871582
+26.75166473,112.2348267
+26.10766144,112.7311035
+25.2605072,113.2333008
+24.70575409,113.1097778
+25.0861145,112.2275513
+25.50958557,111.3232056
+25.93469238,110.4176514
+26.39616852,109.5302246
+26.8996048,108.6664551
+27.38750305,107.7959595
+27.89389343,106.9942383
+28.17566833,106.038147
+28.09808655,105.0412842
+27.74587708,104.109436
+27.19558258,103.2762878
+26.58288727,102.4856995
+26.05998383,101.6342346
+25.54515533,100.7767334
+25.18880005,99.84391479
+24.81599121,98.91605225
+24.55921783,97.95113525
+24.24908752,97.00457153
+24.00358124,96.03695679
+23.82232819,95.05369873
+23.61905518,94.07617188
+23.46439056,93.10234985
+23.17630615,92.15647583
+22.74612732,91.25810547
+22.37670288,90.36715088
+22.6754715,89.45881348
+23.11443329,88.56168823
+23.62662048,87.70388794
+24.17476501,86.87049561
+24.71786346,86.03056641
+25.25935059,85.19189453
+25.71808167,84.30687866
+26.25605927,83.4635437
+26.78301697,82.61891479
+27.4420105,81.87402344
+28.07306824,81.09881592
+28.67448425,80.30220337
+29.34551697,79.56051636
+30.0581543,78.86416626
+30.8280304,78.22576904
+31.65224915,77.65948486
+32.4861908,77.10874634
+33.28449402,76.50811768
+34.04795837,75.86426392
+34.73692322,75.13895264
+35.35122681,74.35263062
+36.02269592,73.61618042
+36.65030212,72.86160889
+36.83094482,72.0059082
+36.04460144,72.61928711
+35.23874512,73.21166992
+34.42591858,73.79464111
+33.5861969,74.33832397
+32.74507141,74.87818604
+31.8859314,75.39031372
+31.02217407,75.89369507
+30.13894043,76.36322632
+29.30050659,76.90738525
+28.3921814,77.32247925
+27.46295624,77.68967896
+26.49677429,77.94122925
+25.50984802,78.07926636
+24.51560059,78.18424683
+23.51884613,78.26623535
+22.54131165,78.14611816
+22.60717163,77.26677856
+23.46966095,76.76727905
+24.36018829,76.35358887
+25.26141052,75.92892456
+26.16875305,75.52853394
+27.00690155,75.08583374
+27.81263123,74.60770874
+28.5655426,73.96070557
+29.28020325,73.26118774
+30.05143127,72.63170166
+30.78927307,71.95682983
+31.50550842,71.25839233
+32.03083496,70.42026367
+32.50943909,69.54807129
+32.97476196,68.6647583
+33.4019989,67.76220093
+34.00897522,66.97391968
+34.72151184,66.27283325
+35.38710022,65.52862549
+36.11418152,64.84555054
+36.81974487,64.13643799
+37.51630859,63.41865234
+38.15610352,62.64992676
+38.81315002,61.92351074
+39.35105591,61.08222046
+39.8476532,60.23416748
+39.54293213,59.63196411
+38.72776794,59.89664917
+38.01474609,60.59387817
+37.30214233,61.29469604
+36.62177429,62.0281311
+35.90565796,62.72404175
+35.17427979,63.40663452
+34.41975708,64.06276245
+33.62666321,64.67251587
+32.84589539,65.29795532
+32.04181519,65.89302979
+31.25826721,66.51468506
+30.42625427,67.06680908
+29.61697693,67.65446777
+28.77883911,68.2003418
+27.91491089,68.70456543
+27.03266907,69.1737915
+26.10440674,69.53449097
+25.12462769,69.71951294
+24.18992157,69.90058594
+23.21216125,70.0644043
+22.26988831,70.01375122
+22.51332703,69.10777588
+22.81926117,68.1890625
+23.6194458,67.59603271
+24.34616547,67.01174316
+25.05149536,66.30692139
+25.81925354,65.69363403
+26.48847809,64.95780029
+26.95936584,64.0826416
+27.50442352,63.29984131
+28.15930786,62.59887695
+28.59685669,61.7111145
+29.11990967,60.85963745
+29.7561676,60.09025879
+30.47436523,59.3949707
+31.26805115,58.78618164
+32.02887573,58.13839722
+32.84619141,57.56416016
+33.63538818,56.95020142
+34.47345886,56.40446167
+35.341922,55.91310425
+36.16246338,55.38922119
+36.52108154,54.49335327
+36.45716858,53.49643555
+35.81607056,52.9803772
+34.90424194,53.30911865
+34.15867004,53.97606201
+33.36493225,54.584021
+32.4949585,55.07190552
+31.59289856,55.50288696
+30.69635925,55.94522705
+29.83986511,56.46154175
+29.02655945,57.04404297
+28.24884644,57.67235107
+27.46403656,58.29254761
+26.73475189,58.97720337
+26.02873993,59.68594971
+25.35908966,60.42865601
+24.72191162,61.19987183
+24.08712311,61.9729126
+23.46205139,62.75154419
+22.9005127,63.57352905
+22.40175323,63.10587769
+22.38907928,62.11312256
+22.54971771,61.20678101
+22.7940033,60.26203613
+23.19672394,59.36389771
+23.57086029,58.60958252
+23.73510895,57.73049927
+24.14798584,56.82654419
+24.56491089,55.92017822
+24.96439819,55.00336304
+25.44611359,54.15198975
+25.83025208,53.23826904
+26.3738205,52.40143433
+27.03322449,51.65008545
+27.6913269,50.89916077
+28.3892334,50.18262024
+29.12385254,49.50463257
+29.86109009,48.82915649
+30.61520081,48.17405701
+31.34407349,47.5138031
+32.05834656,46.81433105
+32.68956909,46.04024963
+33.31107483,45.26021118
+32.80792847,45.02742615
+31.92055054,45.48772278
+31.07371216,46.02034607
+30.24257507,46.57677307
+29.41624756,47.13933411
+28.59294434,47.70675964
+27.70643005,48.16990051
+26.84459076,48.63384399
+25.87325287,48.84850464
+24.87524567,48.85864563
+23.97325745,48.52232666
+24.56106262,47.75804138
+25.27369537,47.05591736
+26.00928955,46.37868042
+26.74334259,45.69921265
+27.49539642,45.04057007
+28.22887573,44.36023865
+28.96870728,43.68683472
+29.68586731,42.98938599
+30.40664368,42.29573975
+31.1454071,41.62132263
+31.86993103,40.93144531
+32.58844604,40.23533936
+33.30024109,39.5323822
+33.98462219,38.80578308
+34.63347473,38.04770508
+35.25845032,37.28939514
+35.78104858,36.44056702
+36.11394958,35.50867004
+35.26873474,35.83029785
+34.40450439,36.33423767
+33.55682373,36.86531982
+32.70530701,37.39034729
+31.8318512,37.87516479
+30.97536316,38.38858948
+30.07511902,38.8203125
+29.15890503,39.21163635
+28.20378418,39.50728149
+27.23683472,39.7627655
+26.26804047,40.00530701
+25.27837982,40.11933899
+24.28397675,40.21560669
+23.2854599,40.27635193
+22.31923676,40.19350586
+22.87122803,39.4428772
+23.58669739,38.74598694
+24.36057129,38.11216125
+25.20892334,37.58631897
+25.97357788,36.94560852
+26.72458496,36.28701782
+27.40371399,35.55411072
+28.08622131,34.83447571
+28.82341309,34.16934204
+29.47060852,33.41864014
+30.10231018,32.6454071
+30.46793518,31.80983887
+31.18381958,31.11134338
+31.84543457,30.36192932
+32.47244263,29.58389893
+33.06944885,28.78137817
+33.57307129,27.94152832
+33.92545776,27.01063385
+34.23526611,26.06046753
+34.29935608,25.13117371
+33.88875122,24.25080872
+33.48586426,23.37512054
+32.90020447,24.16507111
+32.50100403,25.08184814
+32.1490448,26.01821442
+31.82384033,26.96427917
+31.49719849,27.90981445
+31.20436707,28.86638184
+30.90411377,29.8196228
+30.45924683,30.71497192
+29.92118835,31.55806885
+29.36129456,32.3870697
+28.77271423,33.19595337
+28.15458069,33.98241882
+27.46299133,34.7048584
+26.72663727,35.38189392
+25.95018616,36.01227722
+25.14023132,36.5914856
+24.24519348,37.03829651
+23.32791595,37.43439026
+22.36890564,37.55603027
+22.52865906,36.64354248
+22.82745056,35.69120178
+23.17710266,34.75410156
+23.51740112,33.82228088
+23.90823059,32.91967468
+24.20722656,31.97437439
+24.54826965,31.03594971
+24.91146545,30.10696411
+25.23929291,29.16186523
+25.60879974,28.23296204
+25.93885956,27.29014282
+26.24554749,26.34046478
+26.50753479,25.37903595
+26.74814911,24.40928192
+26.98921661,23.43914795
+27.17551422,22.464534
+27.29458923,21.47464142
+27.32493591,20.47469482
+27.4442276,19.48865662
+27.55434265,18.49681091
+27.74612732,17.52274933
+28.11793213,16.59474182
+28.4940979,15.67023773
+28.9997467,14.80976105
+29.55621948,13.98292999
+30.14556885,13.18134384
+30.68276367,12.3641571
+31.54458923,11.85689545
+32.43497009,11.40085526
+33.34021606,10.97546616
+34.25748596,10.57736816
+35.17580872,10.19039078
+36.12718811,9.881942749
+37.10940552,9.717469025
+38.10978699,9.706604767
+39.11012573,9.695741272
+40.1105072,9.68487854
+41.0930481,9.812935638
+42.08390808,9.923117065
+43.07149658,10.01701202
+43.99197083,10.39595947
+44.89272766,10.82921219
+45.77586365,11.29762115
+46.67695618,11.70850067
+47.57138062,12.1566246
+48.45645752,12.62288055
+49.32690735,13.1155014
+50.21968689,13.56497269
+51.08359985,14.0682457
+51.927771,14.59518356
+52.76877747,15.13371277
+53.60957642,15.6633728
+54.43355103,16.22888489
+55.249646,16.79940338
+56.05394897,17.38857117
+56.86593628,17.9707962
+57.63665161,18.60841522
+58.39249878,19.26152802
+59.07349854,19.99380341
+59.65407104,20.80813599
+60.15739136,21.66878204
+60.56364136,22.58183136
+60.92749634,23.51332855
+61.31062012,24.43666534
+61.67876587,25.36684875
+62.05726929,26.29291687
+62.42781372,27.22215271
+62.80477295,28.14885864
+63.19865723,29.06805115
+63.64656372,29.96096802
+64.12016602,30.84148865
+64.6114563,31.7111145
+65.14447632,32.5532959
+65.16328125,33.31987305
+64.20991821,33.04107361
+63.28517456,32.66044922
+62.43227539,32.14008484
+61.62719116,31.54728699
+60.8800293,30.88216553
+60.14105225,30.20776367
+59.41013794,29.52466736
+58.67630615,28.84482422
+57.94868774,28.15813599
+57.20007935,27.49472351
+56.42722168,26.85966339
+55.6878479,26.19399872
+55.1,25.38468781
+54.49730835,24.58618622
+53.84146118,23.83217163
+53.07158508,23.21938477
+52.91525574,24.07128906
+53.18032837,25.03582611
+53.47782593,25.99039612
+53.77420044,26.94496765
+54.23812256,27.81721191
+54.49962769,28.76798401
+54.98161011,29.63736267
+55.56566162,30.44895325
+56.20646973,31.2171814
+56.87104492,31.96488342
+57.5586853,32.69141235
+58.21480103,33.44456177
+58.92403564,34.14891357
+59.60904541,34.87632751
+60.32045288,35.5796051
+61.06152344,36.25053406
+61.75761108,36.96886597
+62.5140625,37.62192993
+63.28933716,38.14004822
+63.93108521,38.82395325
+64.66065674,39.46896667
+64.34799194,40.04055176
+63.46174316,39.61708069
+62.53521118,39.25101318
+61.61195679,38.86594543
+60.69137573,38.47438965
+59.79949341,38.02519226
+58.89349976,37.60183411
+58.0062561,37.13963318
+57.11181641,36.69160461
+56.22340088,36.23162537
+55.35316162,35.73947449
+54.53835449,35.16733704
+53.70719604,34.61381531
+53.13395996,35.06647644
+53.01624146,36.05874634
+53.37687988,36.97841187
+53.96847534,37.78434448
+54.60976563,38.55215759
+55.3149353,39.26047668
+56.07545776,39.91025391
+56.87332764,40.51363831
+57.67979126,41.10555725
+58.50073853,41.67680969
+59.39102173,42.11292419
+60.15262451,42.74360046
+60.83382568,43.40693665
+59.94019775,43.60545654
+58.94642334,43.49115295
+57.95980225,43.33405457
+57.0322998,42.98474426
+56.18978882,42.46007385
+55.33956299,41.99437561
+54.44623413,41.56434937
+53.70286865,41.70678711
+54.02023315,42.64222107
+54.50476074,43.51513977
+55.04279175,44.35849915
+55.63676147,45.16271973
+56.30856934,45.90370483
+57.0397583,46.58587036
+57.79540405,47.24141846
+58.58707275,47.85279236
+59.38209839,48.45895691
+60.19324341,49.04233093
+60.89212036,49.69653931
+60.00186157,49.86534729
+59.10185547,49.44376526
+58.17828979,49.0598999
+57.27293091,48.64014282
+56.35081177,48.25352783
+55.45922852,47.80078735
+54.54320679,47.4034668
+53.66664429,46.92349548
+52.76079407,46.52183228
+51.8446167,46.15584106
+51.54939575,46.91057434
+52.07667236,47.75849915
+52.66876831,48.5646637
+53.28720093,49.34998779
+53.86817017,50.15715332
+54.54760132,50.89136658
+55.21908569,51.63299255
+55.89552612,52.37002258
+56.58051147,53.09906616
+57.31044312,53.78248901
+58.21055298,54.19724121
+59.13309937,54.57341309
+60.0453186,54.98106079
+60.97143555,55.35524902
+61.852948,55.82141113
+62.78208008,56.18509521
+63.69869385,56.58374023
+64.60892334,56.99659424
+65.46287231,57.48205566
+65.2362915,58.30805054
+64.31898193,58.13190918
+63.3211853,58.07067871
+62.32097778,58.05192871
+61.32058716,58.0399292
+60.32032471,58.04522095
+59.32023926,58.07182007
+58.32265625,58.13671875
+57.34361572,58.3175415
+56.62301636,58.95678711
+56.36546631,59.88009033
+56.60216064,60.84653931
+57.02113647,61.75367432
+57.44741211,62.65723267
+57.84521484,63.5742981
+58.27296753,64.47846069
+58.74888306,65.35772095
+59.16928711,66.25494995
+59.5942749,67.16054688
+60.05074463,68.05082397
+60.44717407,68.96702271
+60.87664185,69.87044067
+61.26028442,70.79274902
+61.63946533,71.7178894
+62.03635254,72.63579102
+62.3614502,73.58147583
+62.70595703,74.51900635
+63.03070679,75.46503906
+63.32089844,76.42237549
+63.64190063,77.36344604
+63.91520996,78.3229187
+64.19781494,79.28236084
+64.40303345,80.26040039
+64.42802734,81.26029053
+64.56242676,82.25102539
+64.75214233,83.23317261
+64.79188843,84.21501465
+63.87487183,84.21884766
+63.32279053,83.39643555
+62.92930908,82.4960083
+62.54445801,81.60299683
+62.15499878,80.68221436
+61.79046631,79.75666504
+61.32366943,78.87199097
+60.83338013,78.00197144
+60.34561157,77.12874756
+59.79111328,76.30029907
+59.26714478,75.44942627
+58.74321289,74.59789429
+58.30728149,73.69862061
+57.94348145,72.76786499
+57.51834717,71.86253662
+57.12093506,70.94507446
+56.728125,70.07206421
+56.69227905,71.05571899
+56.72126465,72.05571289
+56.80861816,73.05010986
+56.93699341,74.04094238
+57.16905518,75.00616455
+57.56276855,75.9255249
+57.99065552,76.82983398
+58.41623535,77.7348877
+58.84806519,78.63731689
+59.25881348,79.54943848
+59.66802368,80.46229248
+60.08279419,81.3723999
+60.49631958,82.28323364
+60.8800293,83.2069458
+61.3020813,84.11378784
+61.71734619,85.02380981
+62.12592163,85.93695679
+62.52728882,86.85305786
+62.90368652,87.77915649
+63.36265869,88.59055786
+63.59575806,89.5236145
+63.98897705,90.44326172
+64.33167725,91.38300781
+64.67717285,92.321521
+65.10473022,93.20204468
+65.21282959,94.11256714
+65.4789978,95.07664795
+65.48131714,96.07679443
+65.48787842,97.07713013
+65.56401978,98.07398071
+65.49071045,99.06842041
+65.48108521,100.06875
+65.56762695,100.9447021
+65.69934692,101.9246094
+65.49084473,102.8921875
+65.48189087,103.892511
+65.48092041,104.8929688
+65.49387817,105.8932373
+65.6003479,106.8870117
+65.66570435,107.8832031
+65.61110229,108.8820313
+65.57922363,109.8819702
+65.46995239,110.8747437
+65.50722656,111.8652954
+65.53835449,112.8163208
+65.49156494,113.8152344
+65.35814209,114.8029541
+64.68912964,115.2568604
+UP
+42.25263977,23.19663086
+DOWN
+41.52297974,22.7256546
+41.14078369,23.46480865
+39.8184021,23.52593689
+40.19893188,22.70548553
+39.42129822,22.13331909
+38.76174927,22.67233582
+39.30678711,23.48404999
+UP
+44.03705444,22.99941864
+DOWN
+43.79431458,22.11143799
+42.95405273,22.15094147
+42.99226685,23.07894745
+UP
+38.13984985,18.51739349
+DOWN
+38.14954224,17.62409363
+37.27527771,17.3182312
+36.85164185,18.1357254
+37.58720398,18.72620239
+UP
+44.71483765,17.25964355
+DOWN
+44.46679688,16.35887756
+43.63834839,16.59822083
+43.61328735,17.51537018
diff --git a/UrumbotXY-Fall2022/code/examples/being_flipped.xy b/UrumbotXY-Fall2022/code/examples/being_flipped.xy
new file mode 100644
index 0000000000000000000000000000000000000000..c36adf08ff154f6dfc40beac1d11ff45117a4410
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/examples/being_flipped.xy
@@ -0,0 +1,736 @@
+15.498712159999997, -55.143029799999994
+DOWN
+16.3008606, -54.548840299999995
+17.00430298, -53.8438232
+17.9937439, -53.836999500000005
+18.97264404, -54.0431274
+19.95198364, -54.246875
+19.83319702, -53.599133300000005
+19.173840329999997, -52.846850599999996
+18.48537598, -52.1212402
+18.291418460000003, -51.1842163
+18.331982420000003, -50.184729000000004
+18.45397339, -49.1921875
+18.54321289, -48.197277799999995
+18.57647095, -47.197424299999994
+18.65814209, -46.20152589999999
+18.725671390000002, -45.2034058
+18.80950317, -44.206530799999996
+19.038787839999998, -43.23452760000001
+19.18227539, -42.245452900000004
+19.41390381, -41.27279660000001
+19.63405762, -40.2995789
+19.85166016, -39.32839966
+20.09425659, -38.374603269999994
+20.25921021, -37.391760250000004
+20.51951904, -36.450439450000005
+20.771325679999997, -35.48932495
+20.89129028, -34.500628660000004
+21.05782471, -33.51539307
+21.216650389999998, -32.5401062
+21.29812622, -31.592382810000004
+21.727581790000002, -30.717468260000004
+22.06867065, -29.804888919999996
+22.30196533, -28.843383790000004
+22.67885132, -27.929138179999995
+23.071447749999997, -27.018511959999998
+23.541772459999997, -26.139782710000006
+24.216876220000003, -25.404956049999996
+24.704333499999997, -24.594641109999998
+25.168151860000002, -23.715423580000007
+25.74683228, -22.915179440000003
+26.102337650000003, -23.531787109999996
+26.20039062, -24.525927730000006
+26.21790161, -25.525256350000006
+26.163085940000002, -26.524121089999994
+26.09933472, -27.52154541
+26.067211909999997, -28.521221920000002
+25.97714233, -29.51696167
+25.932891849999997, -30.516394039999994
+25.844470209999997, -31.51205444
+25.769329829999997, -32.508715820000006
+25.70911255, -33.47800293
+25.650292970000002, -34.475506589999995
+25.548248289999997, -35.47056885000001
+25.650811769999997, -36.452575679999995
+26.21045532, -37.28157959000001
+26.79463501, -38.093273929999995
+27.469769290000002, -37.83944092
+27.702001950000003, -36.86885375999999
+27.98952637, -35.910925289999994
+28.205471799999998, -34.9342041
+28.56122131, -34.00385742
+28.741848750000003, -33.031939699999995
+29.006253049999998, -32.0706543
+29.265167239999997, -31.106207280000007
+29.524462890000002, -30.141314699999995
+29.775411990000002, -29.175726319999995
+30.10170593, -28.23164063
+30.29876709, -27.253222660000006
+30.57618713, -26.29447632
+30.78578796, -25.318749999999994
+31.16832275, -24.398492430000005
+31.738955689999997, -23.745074459999998
+31.84334717, -24.736444090000006
+31.92358704, -25.73330688
+32.02971802, -26.726147460000007
+32.10245972, -27.723913569999993
+32.1618988, -28.7223877
+32.21223755, -29.718078610000006
+32.82103577, -29.50422363
+33.21019287, -28.587927250000007
+33.50622864, -27.632452389999997
+33.80717468, -26.682824710000006
+34.02596741, -25.715039059999995
+34.29049988, -24.753015140000002
+34.60653992, -23.805828860000005
+34.97005615, -22.873883059999997
+35.30430908, -21.9489502
+35.72416077, -21.115057370000002
+36.15150146, -21.864581299999998
+36.32481079, -22.750042719999996
+36.67716064, -23.68592529
+37.08378296, -24.59980469
+37.48482056, -25.516320800000003
+37.94671631, -26.39960938
+38.47718506, -25.807556149999996
+38.6946167, -24.832995609999998
+38.85915527, -23.847558590000006
+39.0186676, -22.86434937
+39.07427063, -21.865978999999996
+39.18575745, -20.87415161
+39.2455719, -19.875836179999993
+39.29665527, -18.878240969999993
+39.44706421, -17.89370117
+40.36713867, -17.92102661
+41.12852173, -18.53738403
+41.7383667, -19.330090330000004
+42.37660522, -20.100384520000006
+43.01971741, -20.866711429999995
+43.66225281, -21.633496089999994
+44.30758057, -22.397808839999996
+44.97348633, -23.142987059999996
+45.67353516, -23.857080080000003
+46.34871521, -24.595294190000004
+47.00019836, -25.352502439999995
+47.70423279, -26.063153080000006
+48.37528992, -26.80460205
+49.0760498, -27.518566890000002
+49.765765380000005, -28.243218990000003
+50.44368591, -28.97888184
+51.11267395, -29.722729490000006
+51.79614563, -30.453222659999994
+52.44967194, -31.21062012
+53.026998899999995, -32.00631104
+52.748831179999996, -32.96496582
+52.475846860000004, -33.92669067
+52.179797359999995, -34.88134155
+51.911773679999996, -35.84483032
+51.65635376, -36.812017819999994
+51.42190247, -37.78457031000001
+51.16346436, -38.75091553
+50.809960939999996, -39.68637085
+50.41142883, -40.6015869
+49.89781494, -41.4596375
+49.378482059999996, -42.312713599999995
+48.9150177, -43.1974426
+48.46636047, -44.091253699999996
+48.02895508, -44.9908691
+47.63321533, -45.9095825
+47.35282593, -46.8642212
+47.46810913, -47.8391113
+48.38446045, -48.084423799999996
+48.54152527, -49.0573242
+48.667364500000005, -50.04958499999999
+49.00959473, -50.9766968
+49.446875, -51.8462646
+50.0567688, -52.603881799999996
+50.64644775, -53.4099243
+51.601043700000005, -53.6148438
+51.86011963, -52.865661599999996
+51.57023926, -51.924121099999994
+51.42912903, -50.9373779
+51.92106323, -50.7408569
+52.585571290000004, -51.487158199999996
+53.24833527, -52.2348267
+53.89233856, -52.7311035
+54.7394928, -53.233300799999995
+55.29424591, -53.1097778
+54.9138855, -52.2275513
+54.49041443, -51.323205599999994
+54.06530762, -50.4176514
+53.60383148, -49.5302246
+53.1003952, -48.66645509999999
+52.61249695, -47.795959499999995
+52.10610657, -46.994238300000006
+51.82433167, -46.038146999999995
+51.901913449999995, -45.04128420000001
+52.25412292, -44.109436
+52.80441742, -43.276287800000006
+53.41711273, -42.485699499999996
+53.94001617, -41.6342346
+54.45484467, -40.7767334
+54.81119995, -39.84391479
+55.18400879, -38.91605225000001
+55.44078217, -37.95113524999999
+55.75091248, -37.00457153000001
+55.99641876, -36.036956790000005
+56.17767181, -35.053698729999994
+56.380944819999996, -34.076171880000004
+56.53560944, -33.102349849999996
+56.82369385, -32.156475830000005
+57.25387268, -31.258105470000004
+57.623297120000004, -30.367150879999997
+57.3245285, -29.458813480000003
+56.88556671, -28.56168823
+56.37337952, -27.70388794
+55.82523499, -26.870495610000006
+55.282136539999996, -26.030566410000006
+54.74064941, -25.19189453
+54.281918329999996, -24.306878659999995
+53.74394073, -23.463543700000002
+53.21698303, -22.618914790000005
+52.557989500000005, -21.874023440000002
+51.92693176, -21.098815920000007
+51.32551575, -20.30220337
+50.65448303, -19.560516359999994
+49.9418457, -18.864166260000005
+49.1719696, -18.225769040000003
+48.34775085, -17.659484860000006
+47.5138092, -17.108746339999996
+46.71550598, -16.508117679999998
+45.95204163, -15.864263919999999
+45.26307678, -15.13895264
+44.64877319, -14.35263062
+43.97730408, -13.616180420000006
+43.34969788, -12.86160889
+43.16905518, -12.005908199999993
+43.95539856, -12.619287110000002
+44.76125488, -13.211669920000006
+45.57408142, -13.79464111
+46.4138031, -14.338323970000005
+47.25492859, -14.878186040000003
+48.114068599999996, -15.390313719999995
+48.97782593, -15.893695070000007
+49.861059569999995, -16.363226319999995
+50.69949341, -16.907385250000004
+51.6078186, -17.32247925
+52.53704376, -17.689678959999995
+53.503225709999995, -17.941229250000006
+54.49015198, -18.079266360000005
+55.48439941, -18.184246830000006
+56.48115387, -18.266235350000002
+57.45868835, -18.14611816
+57.392828370000004, -17.266778560000006
+56.530339049999995, -16.76727905
+55.639811710000004, -16.353588869999996
+54.73858948, -15.928924559999999
+53.83124695, -15.528533940000003
+52.993098450000005, -15.085833739999998
+52.18736877, -14.607708740000007
+51.4344574, -13.960705570000002
+50.71979675, -13.261187739999997
+49.948568730000005, -12.631701660000004
+49.21072693, -11.956829830000004
+48.49449158, -11.258392330000007
+47.96916504, -10.420263669999997
+47.49056091, -9.548071289999996
+47.02523804, -8.664758300000003
+46.5980011, -7.762200930000006
+45.99102478, -6.9739196799999945
+45.27848816, -6.272833250000005
+44.61289978, -5.528625489999996
+43.88581848, -4.845550540000005
+43.18025513, -4.136437990000005
+42.48369141, -3.4186523400000013
+41.84389648, -2.6499267599999996
+41.18684998, -1.9235107399999976
+40.64894409, -1.082220460000002
+40.1523468, -0.23416748000000354
+40.45706787, 0.3680358900000016
+41.27223206, 0.10335082999999656
+41.98525391, -0.5938781700000035
+42.69785767, -1.294696039999998
+43.37822571, -2.028131100000003
+44.09434204, -2.724041749999998
+44.82572021, -3.4066345199999972
+45.58024292, -4.062762449999994
+46.37333679, -4.672515869999998
+47.15410461, -5.29795532
+47.95818481, -5.89302979
+48.74173279, -6.514685060000005
+49.57374573, -7.066809079999999
+50.38302307, -7.654467769999997
+51.22116089, -8.200341800000004
+52.08508911, -8.704565430000002
+52.96733093, -9.173791499999993
+53.89559326, -9.534490969999993
+54.87537231, -9.719512940000001
+55.810078430000004, -9.90058594
+56.78783875, -10.064404300000007
+57.73011169, -10.013751220000003
+57.48667297, -9.107775880000005
+57.180738829999996, -8.189062500000006
+56.3805542, -7.596032710000003
+55.65383453, -7.011743159999995
+54.948504639999996, -6.306921389999999
+54.18074646, -5.693634029999998
+53.51152191, -4.9578002899999944
+53.040634159999996, -4.082641600000002
+52.49557648, -3.299841309999998
+51.84069214, -2.5988769499999975
+51.403143310000004, -1.7111145000000008
+50.88009033, -0.859637450000001
+50.2438324, -0.09025879000000003
+49.525634769999996, 0.6050292999999982
+48.731948849999995, 1.2138183599999977
+47.97112427, 1.8616027799999983
+47.15380859, 2.43583984
+46.36461182, 3.049798580000001
+45.52654114, 3.5955383299999966
+44.658078, 4.0868957499999965
+43.83753662, 4.610778809999999
+43.47891846, 5.50664673
+43.54283142, 6.503564449999999
+44.18392944, 7.0196228000000005
+45.09575806, 6.690881349999998
+45.84132996, 6.02393799
+46.63506775, 5.415979
+47.5050415, 4.928094479999999
+48.407101440000005, 4.497113040000002
+49.30364075, 4.05477295
+50.160134889999995, 3.538458249999998
+50.97344055, 2.9559570300000004
+51.75115356, 2.3276489300000023
+52.53596344, 1.7074523900000003
+53.26524811, 1.022796630000002
+53.97126007, 0.3140502899999973
+54.640910340000005, -0.4286560099999974
+55.27808838, -1.1998718299999993
+55.91287689, -1.9729126000000008
+56.53794861, -2.751544189999997
+57.0994873, -3.5735290499999977
+57.59824677, -3.10587769
+57.610920719999996, -2.1131225600000008
+57.450282290000004, -1.2067810100000003
+57.2059967, -0.2620361299999985
+56.80327606, 0.6361022899999966
+56.42913971, 1.3904174800000035
+56.26489105, 2.269500729999997
+55.852014159999996, 3.17345581
+55.43508911, 4.079821780000003
+55.03560181, 4.9966369599999965
+54.553886410000004, 5.8480102500000015
+54.16974792, 6.761730960000001
+53.6261795, 7.598565669999999
+52.966775510000005, 8.349914550000001
+52.3086731, 9.100839229999998
+51.610766600000005, 9.817379760000001
+50.87614746, 10.495367430000002
+50.138909909999995, 11.170843509999997
+49.384799189999995, 11.825942990000001
+48.65592651, 12.486196900000003
+47.94165344, 13.18566895
+47.31043091, 13.959750370000002
+46.68892517, 14.739788820000001
+47.19207153, 14.972573850000003
+48.07944946, 14.512277220000001
+48.92628784, 13.979653929999998
+49.75742493, 13.423226929999998
+50.58375244, 12.86066589
+51.40705566, 12.293240359999999
+52.29356995, 11.830099490000002
+53.15540924, 11.366156009999997
+54.12674713, 11.151495359999998
+55.12475433, 11.141354370000002
+56.02674255, 11.477673340000003
+55.43893738, 12.241958619999998
+54.72630463, 12.944082639999998
+53.99071045, 13.621319579999998
+53.25665741, 14.30078735
+52.50460358, 14.959429929999999
+51.77112427, 15.63976135
+51.031292719999996, 16.31316528
+50.31413269, 17.010614009999998
+49.59335632, 17.704260249999997
+48.8545929, 18.37867737
+48.130068969999996, 19.06855469
+47.41155396, 19.764660640000002
+46.69975891, 20.4676178
+46.01537781, 21.194216920000002
+45.36652527, 21.95229492
+44.74154968, 22.710604859999997
+44.21895142, 23.559432979999997
+43.88605042, 24.49132996
+44.73126526, 24.16970215
+45.59549561, 23.66576233
+46.44317627, 23.134680179999997
+47.29469299, 22.60965271
+48.1681488, 22.12483521
+49.02463684, 21.61141052
+49.92488098, 21.1796875
+50.84109497, 20.78836365
+51.79621582, 20.492718510000003
+52.763165279999996, 20.2372345
+53.73195953, 19.994692989999997
+54.72162018, 19.880661009999997
+55.71602325, 19.78439331
+56.7145401, 19.723648070000003
+57.680763240000005, 19.806494139999998
+57.12877197, 20.557122800000002
+56.41330261, 21.25401306
+55.639428710000004, 21.88783875
+54.79107666, 22.41368103
+54.02642212, 23.05439148
+53.27541504, 23.712982179999997
+52.59628601, 24.445889280000003
+51.91377869, 25.16552429
+51.17658691, 25.830657960000003
+50.52939148, 26.58135986
+49.89768982, 27.3545929
+49.53206482, 28.19016113
+48.816180419999995, 28.88865662
+48.154565430000005, 29.63807068
+47.52755737, 30.41610107
+46.93055115, 31.21862183
+46.42692871, 32.05847168
+46.07454224, 32.989366149999995
+45.76473389, 33.93953247
+45.70064392, 34.86882629
+46.11124878, 35.749191280000005
+46.51413574, 36.62487946
+47.09979553, 35.83492889
+47.49899597, 34.918151859999995
+47.8509552, 33.98178558
+48.176159670000004, 33.03572083
+48.50280151, 32.09018555
+48.79563293, 31.13361816
+49.095886230000005, 30.1803772
+49.54075317, 29.28502808
+50.07881165, 28.44193115
+50.638705439999995, 27.612930300000002
+51.22728577, 26.804046630000002
+51.84541931, 26.01758118
+52.53700867, 25.2951416
+53.27336273, 24.618106079999997
+54.04981384, 23.98772278
+54.85976868, 23.4085144
+55.75480652, 22.961703489999998
+56.672084049999995, 22.56560974
+57.63109436, 22.44396973
+57.471340940000005, 23.35645752
+57.17254944, 24.30879822
+56.82289734, 25.245898439999998
+56.48259888, 26.17771912
+56.09176941, 27.08032532
+55.792773440000005, 28.02562561
+55.45173035, 28.96405029
+55.08853455, 29.89303589
+54.76070709, 30.83813477
+54.391200260000005, 31.76703796
+54.06114044, 32.70985718
+53.75445251, 33.659535219999995
+53.49246521, 34.62096405
+53.25185089, 35.59071808
+53.01078339, 36.56085205
+52.82448578, 37.535466
+52.70541077, 38.52535858
+52.67506409, 39.525305180000004
+52.555772399999995, 40.51134338
+52.445657350000005, 41.50318909
+52.25387268, 42.477250670000004
+51.88206787, 43.405258180000004
+51.5059021, 44.32976227
+51.0002533, 45.19023895
+50.443780520000004, 46.01707001
+49.854431149999996, 46.81865616
+49.31723633, 47.6358429
+48.45541077, 48.143104550000004
+47.56502991, 48.59914474
+46.65978394, 49.024533840000004
+45.74251404, 49.42263184
+44.82419128, 49.80960922
+43.87281189, 50.118057250999996
+42.89059448, 50.282530975
+41.89021301, 50.293395233
+40.88987427, 50.304258728
+39.8894928, 50.31512146
+38.9069519, 50.187064362
+37.91609192, 50.076882935
+36.92850342, 49.982987980000004
+36.00802917, 49.60404053
+35.10727234, 49.17078781
+34.22413635, 48.70237885
+33.32304382, 48.29149933
+32.42861938, 47.8433754
+31.54354248, 47.37711945
+30.67309265, 46.8844986
+29.78031311, 46.43502731
+28.91640015, 45.9317543
+28.072229, 45.40481644
+27.231222529999997, 44.86628723
+26.390423579999997, 44.3366272
+25.566448970000003, 43.77111511
+24.750354, 43.20059662
+23.94605103, 42.61142883
+23.13406372, 42.029203800000005
+22.36334839, 41.39158478
+21.607501220000003, 40.73847198
+20.926501459999997, 40.00619659
+20.345928960000002, 39.19186401
+19.84260864, 38.331217960000004
+19.43635864, 37.418168640000005
+19.072503660000002, 36.48667145
+18.689379879999997, 35.563334659999995
+18.32123413, 34.63315125
+17.94273071, 33.70708313
+17.572186279999997, 32.77784729
+17.19522705, 31.85114136
+16.801342769999998, 30.93194885
+16.353436279999997, 30.03903198
+15.87983398, 29.15851135
+15.3885437, 28.2888855
+14.855523680000005, 27.446704099999998
+14.836718750000003, 26.680126950000002
+15.790081790000002, 26.958926390000002
+16.71482544, 27.339550780000003
+17.56772461, 27.85991516
+18.372808839999998, 28.45271301
+19.119970700000003, 29.11783447
+19.85894775, 29.79223633
+20.58986206, 30.47533264
+21.323693849999998, 31.15517578
+22.051312260000003, 31.84186401
+22.799920649999997, 32.50527649
+23.572778319999998, 33.14033661
+24.3121521, 33.806001280000004
+24.9, 34.61531219
+25.502691650000003, 35.41381378
+26.158538819999997, 36.167828369999995
+26.92841492, 36.780615229999995
+27.08474426, 35.92871094
+26.819671630000002, 34.96417389
+26.52217407, 34.00960388
+26.22579956, 33.055032350000005
+25.76187744, 32.18278809
+25.500372310000003, 31.23201599
+25.01838989, 30.36263733
+24.43433838, 29.55104675
+23.793530269999998, 28.7828186
+23.128955079999997, 28.03511658
+22.4413147, 27.30858765
+21.785198970000003, 26.55543823
+21.07596436, 25.851086430000002
+20.39095459, 25.123672489999997
+19.679547120000002, 24.420394899999998
+18.938476559999998, 23.74946594
+18.242388920000003, 23.031134029999997
+17.4859375, 22.37807007
+16.710662839999998, 21.859951780000003
+16.06891479, 21.176046749999998
+15.339343260000007, 20.53103333
+15.65200806, 19.95944824
+16.538256840000003, 20.38291931
+17.464788820000003, 20.74898682
+18.38804321, 21.134054570000004
+19.308624270000003, 21.52561035
+20.200506590000003, 21.974807740000003
+21.106500240000003, 22.39816589
+21.9937439, 22.860366820000003
+22.888183589999997, 23.30839539
+23.77659912, 23.768374629999997
+24.64683838, 24.26052551
+25.461645509999997, 24.83266296
+26.29280396, 25.38618469
+26.86604004, 24.933523559999998
+26.983758539999997, 23.94125366
+26.623120120000003, 23.021588129999998
+26.031524660000002, 22.21565552
+25.39023437, 21.44784241
+24.685064699999998, 20.739523320000004
+23.92454224, 20.08974609
+23.12667236, 19.486361690000003
+22.320208739999998, 18.894442750000003
+21.49926147, 18.32319031
+20.60897827, 17.88707581
+19.847375489999997, 17.256399539999997
+19.166174320000003, 16.59306335
+20.059802249999997, 16.39454346
+21.053576659999997, 16.50884705
+22.040197749999997, 16.66594543
+22.967700200000003, 17.01525574
+23.810211180000003, 17.53992615
+24.660437010000003, 18.00562439
+25.55376587, 18.435650629999998
+26.29713135, 18.29321289
+25.979766849999997, 17.357778930000002
+25.495239259999998, 16.484860230000002
+24.95720825, 15.64150085
+24.363238529999997, 14.83728027
+23.69143066, 14.096295169999998
+22.960241699999997, 13.414129639999999
+22.204595949999998, 12.758581540000002
+21.412927250000003, 12.147207639999998
+20.617901609999997, 11.541043090000002
+19.80675659, 10.957669070000001
+19.10787964, 10.303460690000001
+19.998138429999997, 10.134652709999997
+20.898144530000003, 10.55623474
+21.82171021, 10.940100100000002
+22.72706909, 11.359857179999999
+23.64918823, 11.746472169999997
+24.540771479999997, 12.19921265
+25.45679321, 12.596533200000003
+26.33335571, 13.07650452
+27.239205929999997, 13.478167720000002
+28.155383299999997, 13.84415894
+28.450604249999998, 13.089425660000003
+27.923327639999997, 12.241500850000001
+27.331231690000003, 11.435336300000003
+26.712799070000003, 10.65001221
+26.13182983, 9.842846680000001
+25.45239868, 9.108633419999997
+24.78091431, 8.367007450000003
+24.10447388, 7.629977420000003
+23.419488530000002, 6.90093384
+22.689556879999998, 6.217510990000001
+21.789447019999997, 5.802758789999999
+20.866900630000004, 5.4265869099999975
+19.9546814, 5.018939209999999
+19.028564449999998, 4.644750979999998
+18.147052000000002, 4.178588869999999
+17.21791992, 3.81490479
+16.301306150000002, 3.4162597700000035
+15.391076659999996, 3.0034057599999997
+14.537127690000005, 2.5179443399999997
+14.763708500000007, 1.6919494599999965
+15.681018069999993, 1.868090819999999
+16.678814699999997, 1.9293212899999972
+17.67902222, 1.9480712900000015
+18.679412839999998, 1.960070799999997
+19.67967529, 1.954779049999999
+20.67976074, 1.9281799299999989
+21.67734375, 1.86328125
+22.656384279999997, 1.6824585000000027
+23.37698364, 1.0432128899999995
+23.634533689999998, 0.11990966999999841
+23.39783936, -0.8465393099999972
+22.978863529999998, -1.7536743200000018
+22.552587889999998, -2.657232669999999
+22.154785160000003, -3.5742981
+21.727032469999997, -4.478460690000006
+21.251116940000003, -5.357720950000001
+20.83071289, -6.254949949999997
+20.405725099999998, -7.160546879999998
+19.949255370000003, -8.050823969999996
+19.552825929999997, -8.967022709999995
+19.12335815, -9.870440669999994
+18.739715580000002, -10.792749020000002
+18.36053467, -11.717889400000004
+17.963647459999997, -12.63579102
+17.6385498, -13.581475830000002
+17.29404297, -14.519006349999998
+16.969293209999996, -15.465039059999995
+16.67910156, -16.422375489999993
+16.358099369999998, -17.36344604
+16.08479004, -18.322918700000002
+15.80218506, -19.282360839999996
+15.596966550000005, -20.26040039
+15.57197266, -21.260290530000006
+15.437573240000006, -22.251025389999995
+15.247857670000002, -23.233172609999997
+15.20811157, -24.21501465
+16.125128170000004, -24.218847659999994
+16.67720947, -23.396435550000007
+17.070690919999997, -22.4960083
+17.45554199, -21.602996829999995
+17.84500122, -20.682214360000003
+18.20953369, -19.75666504
+18.676330569999998, -18.87199097
+19.166619869999998, -18.001971440000005
+19.654388429999997, -17.128747559999994
+20.208886720000002, -16.300299069999994
+20.732855219999998, -15.449426270000004
+21.256787109999998, -14.59789429
+21.69271851, -13.698620610000006
+22.05651855, -12.767864990000007
+22.48165283, -11.86253662
+22.87906494, -10.94507446
+23.271875, -10.072064209999994
+23.307720949999997, -11.055718990000003
+23.278735349999998, -12.055712889999995
+23.19138184, -13.050109860000006
+23.06300659, -14.040942380000004
+22.83094482, -15.006164549999994
+22.43723145, -15.9255249
+22.009344480000003, -16.829833980000004
+21.58376465, -17.7348877
+21.15193481, -18.637316889999994
+20.74118652, -19.549438480000006
+20.331976320000003, -20.462292480000002
+19.91720581, -21.372399900000005
+19.503680420000002, -22.283233640000006
+19.119970700000003, -23.2069458
+18.697918700000002, -24.11378784
+18.28265381, -25.023809810000003
+17.87407837, -25.936956789999996
+17.472711179999997, -26.853057860000007
+17.09631348, -27.779156490000005
+16.637341309999996, -28.590557860000004
+16.40424194, -29.523614499999994
+16.011022949999997, -30.443261719999995
+15.668322750000002, -31.383007809999995
+15.322827149999995, -32.321521000000004
+14.895269780000007, -33.20204468
+14.787170410000002, -34.112567139999996
+14.521002199999998, -35.076647949999995
+14.518682859999998, -36.07679443000001
+14.512121579999999, -37.07713013
+14.435980220000005, -38.07398071
+14.509289550000005, -39.06842041
+14.518914789999997, -40.068749999999994
+14.432373049999995, -40.9447021
+14.300653080000004, -41.924609399999994
+14.509155269999994, -42.892187500000006
+14.51810913, -43.892511
+14.519079590000004, -44.892968800000006
+14.506121829999998, -45.893237299999996
+14.399652099999997, -46.8870117
+14.334295650000001, -47.8832031
+14.388897709999995, -48.882031299999994
+14.420776369999999, -49.8819702
+14.530047609999997, -50.874743699999996
+14.492773439999993, -51.865295399999994
+14.461645509999997, -52.8163208
+14.508435059999996, -53.815234399999994
+14.641857909999999, -54.802954099999994
+15.310870359999996, -55.256860399999994
+UP
+37.74736023, 36.80336914
+DOWN
+38.47702026, 37.2743454
+38.85921631, 36.535191350000005
+40.1815979, 36.47406311
+39.80106812, 37.294514469999996
+40.57870178, 37.86668091
+41.23825073, 37.32766418
+40.69321289, 36.51595001
+UP
+35.96294556, 37.00058136
+DOWN
+36.20568542, 37.88856201
+37.04594727, 37.84905853
+37.00773315, 36.92105255
+UP
+41.86015015, 41.48260651
+DOWN
+41.85045776, 42.375906369999996
+42.72472229, 42.6817688
+43.14835815, 41.8642746
+42.41279602, 41.27379761
+UP
+35.28516235, 42.74035645
+DOWN
+35.53320312, 43.641122440000004
+36.36165161, 43.40177917
+36.38671265, 42.484629819999995
diff --git a/UrumbotXY-Fall2022/code/examples/flip.py b/UrumbotXY-Fall2022/code/examples/flip.py
new file mode 100644
index 0000000000000000000000000000000000000000..1c4355cb2c96a018cbee0ab81c592949c4a7c9d7
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/examples/flip.py
@@ -0,0 +1,26 @@
+
+
+def main():
+    filename_in = "being.xy"
+    filename_out = "being_flipped.xy"
+
+    f_out = open(filename_out, "w")
+
+    x_c = 80
+    y_c = 60
+
+    with open(filename_in, "r") as f_in:
+        for line in f_in.readlines():
+            if line.upper().startswith("UP") or line.upper().startswith("DOWN"):
+                f_out.write(line)
+            else:
+                x, y = [float(x) for x in line.split(",")]
+                x = x_c-x
+                y = y_c-y
+                f_out.write(f"{x}, {y}\n")
+
+    f_out.close()
+
+
+if __name__ == "__main__":
+    main()
diff --git a/UrumbotXY-Fall2022/code/examples/repeat_dots.xy b/UrumbotXY-Fall2022/code/examples/repeat_dots.xy
new file mode 100644
index 0000000000000000000000000000000000000000..de7354c657fae1a17cfa60cb86527918a7a0f861
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/examples/repeat_dots.xy
@@ -0,0 +1,66 @@
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
+0, 10
+DOWN
+UP
+200, 180
+DOWN
+UP
diff --git a/UrumbotXY-Fall2022/code/examples/spiral.xy b/UrumbotXY-Fall2022/code/examples/spiral.xy
new file mode 100644
index 0000000000000000000000000000000000000000..c166a0ceb3f1a582f3b8f0ccb9f5e5e061ad93d6
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/examples/spiral.xy
@@ -0,0 +1,112 @@
+UP
+100, 100
+DOWN
+99.98254759356271, 99.00015230484361
+97.98376593952453, 99.06995129824861
+98.14077380825336, 102.06583990251234
+102.13103000929266, 101.78681400753584
+101.69525129555436, 96.8058405170771
+95.72811992334472, 97.43301129668302
+96.58120532718075, 104.38083435817227
+104.50334987711331, 103.26744955049175
+103.09543969175124, 94.3782544851355
+93.24736216162916, 96.11473626180481
+95.34626111077115, 106.9126352797291
+107.08403231957683, 104.41769498991603
+104.15966861310662, 91.75088414770796
+90.57552844524265, 95.13779068610329
+94.45781412178044, 109.62667808043932
+109.83800125679356, 105.21648038736734
+104.86768227650703, 88.95929953599574
+87.74866498319425, 94.52160543474474
+93.93445991788025, 112.48645837113175
+112.72831233359844, 105.6460555046184
+105.20258539314707, 86.04086654817719
+84.80454059267775, 94.28221160332726
+93.79135654793097, 115.45382323273341
+115.71644753135345, 105.69214379891434
+105.15099098783602, 83.03444912299807
+81.78234578405761, 94.43209893951396
+94.04008927702536, 118.48927509259991
+118.76262187707536, 105.34407133459506
+104.70314288993158, 79.98009982755258
+78.72238077639838, 94.98009982755252
+94.68856109861011, 121.55228614931798
+121.82610017561576, 104.59486969385544
+103.85301202011998, 76.91874095165637
+75.66573455324857, 95.93129966966177
+95.74090982553489, 124.60162121977669
+124.86552162303312, 103.44135213724782
+102.59836576640738, 73.89183826549794
+72.65395712935201, 97.28697432787304
+97.19745238029543, 127.59566682469509
+127.83923010505464, 101.88416243723361
+100.94080991644404, 70.94106964809978
+69.72872724639362, 99.04455511517199
+99.05465672908068, 130.4927642847967
+130.70560794398136, 99.92779598460082
+98.88580279058684, 68.10799083120607
+66.93151774947273, 101.1976216467838
+101.3051417255739, 133.2515445697211
+133.42341083079953, 97.58059294680655
+96.44264139988374, 65.43370052627165
+64.30326091555662, 103.73592268222043
+103.93770494986236, 135.83126262576187
+135.952101666797, 94.85470343821264
+93.62441963429043, 62.95850721115414
+61.88401601049682, 106.64542490740126
+106.93737844639122, 138.192128906709
+138.25218104075338, 91.7660248436269
+90.44795866786455, 60.721599847769866
+59.71264134233871, 109.9083894248426
+110.28551208376328, 140.29563584453592
+140.28551208376354, 88.33411161746974
+86.93370994826061, 58.760724782442765
+57.82647305553557, 113.50347553969632
+113.95988407940277, 142.10487702328774
+142.01563747390384, 84.58205806014112
+83.10563131652137, 57.111871046996185
+56.261012873518055, 117.40587125140763
+117.93483805483126, 143.58485686018966
+143.40808640711327, 80.53635474964811
+78.99103697880642, 55.80896623102221
+55.049626946008296, 121.58744968603531
+122.18144581355992, 144.70278865249307
+144.43066940855692, 76.22671947924228
+74.62042222325533, 54.88358503448248
+54.223257892797164, 126.016950533918
+126.66769486447717, 145.4283789166075
+145.05375893005154, 71.68590371963168
+70.02726394158861, 54.36467253515319
+53.810152057802256, 130.6601853923898
+131.35869955016767, 145.73409602713713
+145.2505537635226, 66.94947578616056
+65.24779817531657, 54.2782841179011
+53.8356038965902, 135.48026575470973
+136.2169344828198, 145.59542125733822
+144.99732539730184, 62.05558204640319
+60.320776059503615, 54.64734391285045
+54.321719317506776, 140.43785223519518
+141.20248884115472, 144.99108042833117
+144.27364455097492, 57.04468765065076
+55.28719968205611, 55.491423477732134
+55.28719968205545, 145.49142347773213
+146.27333994128708, 143.90325449194026
+143.06258624465818, 51.959298406183414
+50.19003951248274, 56.826542336775695
+56.7471480444314, 150.5975630611991
+151.38564436314718, 142.317767500171
+141.35091188945484, 46.843665544816496
+45.07393518024659, 58.66499185511586
+58.71289907433278, 155.71126259178976
+156.4940447932515, 140.22425055280743
+139.12922702655928, 41.74347525158649
+39.984881498345004, 61.01518378461641
+61.19187396175789, 160.78623905946426
+161.5519906346375, 137.61628046204788
+136.39211349227406, 36.70552492934375
+34.969901731922036, 63.881524665109
+64.18746144852423, 165.77526443457072
+166.5120703365699, 134.49149202924082
+133.13823494407592, 31.777388269364124
+UP
diff --git a/UrumbotXY-Fall2022/code/examples/spiral2.xy b/UrumbotXY-Fall2022/code/examples/spiral2.xy
new file mode 100644
index 0000000000000000000000000000000000000000..3ec798e763b1a71012d5eeb2a2acf7a018846a98
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/examples/spiral2.xy
@@ -0,0 +1,112 @@
+UP
+100, 100
+DOWN
+99.51519037975366, 100.8746197071394
+98.45535185128726, 99.17852351482654
+101.45124045555097, 99.02151564609771
+99.69775586839465, 102.61669183129437
+96.82987368663943, 98.52093160984941
+102.79700505884907, 97.8937608302435
+100.06188715942415, 104.33729480441056
+95.1365953568189, 98.03320877555677
+104.02579042217515, 96.62529859019469
+100.60558898891843, 106.02222479805377
+93.38893967002284, 97.72041941560329
+105.1267108788285, 95.22547912579019
+101.32587871743289, 107.65744095330963
+91.60066153100698, 97.58668374856846
+106.08954892534304, 93.70439807203077
+102.2187985957482, 109.22912969244666
+89.78578566822227, 97.63515757138421
+106.90480296153505, 92.07285167263518
+103.27943204938063, 110.72376815814079
+87.95854318700115, 97.8680159644099
+107.56373214344245, 90.34228902395876
+104.50192392232108, 112.12818653627332
+86.13330719123334, 98.28644100377623
+108.05839817465576, 88.52476156995706
+105.87950460596421, 113.42962902225068
+84.32452771953322, 98.89061353201113
+108.38170387261927, 86.63287003904358
+107.40451796494892, 114.61581319557826
+82.54666624458787, 99.67970902318633
+108.52742835812127, 84.67970902318676
+109.06845295767648, 115.6749875730349
+80.81412998619115, 100.6518975638858
+108.49025872839056, 82.67880940839055
+110.8619788356909, 116.59598711722458
+79.14120628940815, 101.80434795630009
+108.26581808690631, 80.64407887377112
+112.77498379289658, 117.36828648450006
+77.54199731935877, 103.13323593469515
+107.85068981618087, 78.58974068375178
+114.79661692285761, 117.98205080424019
+76.03035532328582, 104.6337564714962
+107.24243799333685, 76.53027100442469
+116.91533333012342, 118.42818379018972
+74.61981870883731, 106.30014013424203
+106.43962386223181, 74.48033498084726
+119.11894222981385, 118.6983729940099
+73.3235491849078, 108.12567343984821
+105.44181829013311, 72.45472181693339
+121.39465785853353, 118.7851320213
+72.15427020792319, 110.10272313795309
+104.24961015146533, 70.46827910364792
+123.72915300909213, 118.68183954112111
+71.12420697210216, 112.22276434064749
+102.86461059589648, 68.53584664440089
+126.10861499163394, 118.3827749314171
+70.24502817708388, 114.47641240174482
+101.28945317294162, 66.67219002885643
+128.51880381452187, 117.88315041467494
+69.52778980029483, 116.85345843487346
+99.5277898002965, 64.8919342078081
+130.945112369808, 117.17913955063804
+68.98288109462398, 119.3429083461908
+97.58428257821765, 63.20949732232476
+133.37262840034322, 116.26790196584892
+68.6199730243795, 121.93302524444383
+95.46459146738515, 61.63902504003343
+135.78619801856973, 115.14760421320405
+68.44796934414302, 124.61137507848883
+93.17535786276856, 60.19432565018185
+138.17049054082634, 113.81743666851031
+68.47496051604216, 127.36487534024482
+90.7241841110387, 58.88880616699388
+140.5100643956007, 112.27762638519368
+68.70818065117678, 130.1798466595684
+88.11960903386671, 57.735409687888506
+142.78943385960343, 110.5294458427731
+69.15396765044932, 133.04206710642256
+85.37107953423602, 56.74655424918606
+144.99313637183388, 108.57521753943743
+69.81772670896055, 135.93682900548913
+82.48891837722138, 55.9340734172833
+147.1058001729711, 106.41831439398916
+70.70389733641755, 138.84899805859646
+79.48428825090328, 55.30915884766181
+149.1122120154658, 104.06315593750325
+71.81592403373813, 141.7630745613653
+76.36915222687288, 54.88230503771731
+150.997384688639, 101.51520029023837
+73.15623075323322, 144.66325649216319
+73.15623075323246, 54.66325649216319
+152.74662410291774, 98.7809319345794
+74.72619925652673, 147.53350424403453
+69.85895532593285, 54.66095751185915
+154.3455956780545, 95.86784531003255
+76.52615147060006, 150.35760676338163
+66.49141899690592, 54.88350480802733
+155.78038978179444, 92.78442427148258
+78.55533592833504, 153.11924885339624
+63.06832388934795, 55.33810313447827
+157.03758596793824, 89.54011746704664
+80.81191836544082, 155.8020793950908
+59.60492590203145, 56.03102412024218
+158.1043157662251, 86.14530970668076
+83.29297653100355, 158.38978023441456
+56.116976795235956, 56.967568474063164
+158.96832378049078, 82.61128940763109
+85.99449925380532, 160.86613548088405
+52.62066386131464, 58.152031721006296
+UP
\ No newline at end of file
diff --git a/UrumbotXY-Fall2022/code/test.py b/UrumbotXY-Fall2022/code/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..87ed5d84587148225c7c6ce306fc59e344b2825e
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/test.py
@@ -0,0 +1,8 @@
+class A(object):
+    def __init__(self, variable_A=1, variable_B=2):
+        self.variable_A = variableA
+        self.variable_B = variableB
+
+    def functionA(self, param):
+    return param + self.variable_A
+
diff --git a/UrumbotXY-Fall2022/code/urumbu_corexy.py b/UrumbotXY-Fall2022/code/urumbu_corexy.py
new file mode 100644
index 0000000000000000000000000000000000000000..99620dc2dc5e2edcae70f0b3a0347a36788f3c3c
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/urumbu_corexy.py
@@ -0,0 +1,325 @@
+import serial
+import time
+import multiprocessing
+import logging
+import argparse
+import numpy as np
+
+BAUDRATE_DEFAULT = 921600
+
+
+class Module:
+    def __init__(self, port, baudrate=BAUDRATE_DEFAULT):
+        self.port = None
+        self.baudrate = baudrate
+        try:
+            self.port = serial.Serial(port, baudrate)
+        except serial.SerialException:
+            logging.error(f"Cannot connect to {port}")
+
+    @property
+    def connected(self):
+        return self.port is not None
+
+    def write(self, txt):
+        self.port.write(txt)
+
+    def close(self):
+        self.port.close()
+
+    def pressed(self, nc=True):
+        self.write(b"?")
+        r = self.port.read(1)
+        if nc:
+            return r == b"1"
+        else:
+            return r == b"0"
+
+
+class Stepper(Module):
+    def __init__(self, steps_per_unit, port, baudrate=BAUDRATE_DEFAULT, reverse=False):
+        super().__init__(port, baudrate)
+        self.steps = 0
+        self.reverse = reverse
+        self.steps_per_unit = steps_per_unit
+
+    def step(self, forward):
+        self.steps += 1 if forward else -1
+        if self.reverse:
+            forward = not forward
+        self.write(b"f" if forward else b"r")
+
+
+class Servo(Module):
+    def __init__(self, pulse_min, pulse_max, port, baudrate=BAUDRATE_DEFAULT):
+        self.pulse_min = pulse_min
+        self.pulse_max = pulse_max
+        super().__init__(port, baudrate)
+        self.delay_us = 0
+
+    def pulse(self, delay_us):
+        self.write(delay_us.to_bytes(2, byteorder='little'))
+
+    def fraction(self, f):
+        p = int(self.pulse_min + (self.pulse_max - self.pulse_min) * f)
+        self.pulse(p)
+
+    def pressed(self, nc=True):
+        self.pulse(65535)
+        r = self.port.read(1)
+        if nc:
+            return r == b"1"
+        else:
+            return r == b"0"
+
+
+class Action:
+    pass
+
+
+class HomingAction(Action):
+    def __init__(self, axis, name, pos, feedrate, nc=True):
+        self.axis = axis
+        self.name = name
+        self.pos = np.array(pos)
+        self.feedrate = feedrate
+        self.nc = nc
+
+
+class PathAction(Action):
+    def __call__(self, t):
+        raise NotImplementedError()
+
+    def init(self, pos_start):
+        raise NotImplementedError()
+
+
+class WaitAction(Action):
+    def __init__(self, dt):
+        self.dt = dt
+
+    def __call__(self, dt):
+        return dt <= self.dt
+
+
+class ServoAction(Action):
+    def __init__(self, name, pulse, dt=0.01, wait=1.0):
+        self.name = name
+        self.pulse = pulse
+        self.dt = dt
+        self.wait = wait
+
+
+class Line(PathAction):
+    def __init__(self, pos_end, feedrate):
+        self.pos_start = np.zeros_like(pos_end)
+        self.pos_end = np.array(pos_end)
+        self.duration = -1
+        self.feedrate = feedrate
+
+    def init(self, pos_start):
+        self.pos_start = np.array(pos_start)
+        self.duration = np.linalg.norm(self.pos_end - self.pos_start) / self.feedrate
+
+    def __call__(self, t):
+        if t > self.duration:
+            # end move
+            return None
+        u = t / self.duration
+        return self.pos_start * (1 - u) + self.pos_end * u
+
+
+def transform_corexy(pos, pos_transform):
+    pos_transform[:] = pos[:]
+    pos_transform[0] = pos[0] + pos[1]
+    pos_transform[1] = pos[0] - pos[1]
+
+
+def modules_manager(action_queue, modules_config, pos_transformer=None):
+    logging.info("start loop")
+
+    modules = {}
+
+    modules_axis = {}
+
+    for name, config in modules_config.items():
+        if config["type"] == "stepper":
+            obj = Stepper(config["steps_per_unit"],
+                          config["port"],
+                          config["baudrate"],
+                          reverse=config.get("reverse", False))
+            modules[name] = obj
+            if "axis" in config:
+                modules_axis[config["axis"]] = obj
+        elif config["type"] == "servo":
+            modules[name] = Servo(config["pulse_min"],
+                                  config["pulse_max"],
+                                  config["port"],
+                                  config["baudrate"])
+
+    n_axis = len(modules_axis)
+    pos = np.zeros((n_axis,))
+    pos_motors = np.zeros((n_axis,))
+
+    def tick_motor():
+        if pos_transformer is None:
+            pos_motors[:] = pos[:]
+        else:
+            pos_transformer(pos, pos_motors)
+        for j in range(n_axis):
+            m = modules_axis[j]
+            s = int(pos_motors[j] * m.steps_per_unit)
+            if m.steps < s:
+                m.step(True)
+            elif m.steps > s:
+                m.step(False)
+
+    while True:
+        if not action_queue.empty():
+            action = action_queue.get()
+            t0 = time.perf_counter()
+
+            if isinstance(action, PathAction):
+                # time in s, ~us resolution
+                action.init(pos)
+
+                while True:
+                    t = time.perf_counter()
+
+                    # path is a time function
+                    pos_new = action(t - t0)
+
+                    if pos_new is None:
+                        # done
+                        break
+
+                    pos[:] = pos_new[:]
+                    tick_motor()
+            elif isinstance(action, WaitAction):
+                dt = 0
+                while action(dt):
+                    dt = time.perf_counter() - t0
+            elif isinstance(action, ServoAction):
+                dt1 = 0
+                t0_pwm = t0
+                action_wait = WaitAction(action.wait)
+                while action_wait(dt1):
+                    t1 = time.perf_counter()
+                    dt1 = t1 - t0
+                    dt2 = t1 - t0_pwm
+                    if dt2 >= action.dt:
+                        t0_pwm = t1
+                        modules[action.name].pulse(action.pulse)
+
+            elif isinstance(action, HomingAction):
+                line = Line(action.pos, action.feedrate)
+                line.init(pos)
+
+                while True:
+                    t = time.perf_counter()
+
+                    # path is a time function
+                    pos_new = line(t - t0)
+
+                    if pos_new is None:
+                        logging.error(f"Homing failed for axis {action.axis}")
+                        break
+
+                    pos[:] = pos_new[:]
+
+                    tick_motor()
+
+                    if modules[action.name].pressed(action.nc):
+                        logging.info(f"Homing axis {action.axis}")
+                        # homing success
+                        for i in range(n_axis):
+                            motor = modules_axis[i]
+                            motor.steps = 0
+                        pos[action.axis] = 0
+                        break
+
+
+def parse_arguments():
+    usage_text = (
+        "Usage:  python urumbu_corexy.py [options]"
+    )
+    parser = argparse.ArgumentParser(description=usage_text)
+    parser.add_argument("-f", "--filename", type=str, required=True,
+                        help="filename for .xy file")
+    parser.add_argument("--feedrate", type=float, default=15,
+                        help="feedrate for XY motion")
+    parser.add_argument("-a", type=str, default="COM18",
+                        help="COM port for A")
+    parser.add_argument("-b", type=str, default="COM25",
+                        help="COM port for B")
+    parser.add_argument("-s", default="COM24",
+                        help="COM port for servo")
+    parser.add_argument("-u", "--unit_scale", type=float, default=1.0,
+                        help="Scaling factor")
+    parser.add_argument("-d", "--dryrun", action="store_true",
+                        help="Perform a dryrun")
+    return parser.parse_known_args()
+
+
+def main():
+    multiprocessing.set_start_method('spawn')
+    action_queue = multiprocessing.Queue()
+
+    args, _ = parse_arguments()
+
+    modules_config = {
+        "a": {
+            "type": "stepper",
+            "port": args.a,
+            "baudrate": 921600,
+            "axis": 0,
+            "steps_per_unit": 6400 / 64,  # 64 mm / turn
+            "reverse": True
+        },
+        "b": {
+            "type": "stepper",
+            "port": args.b,
+            "baudrate": 921600,
+            "axis": 1,
+            "steps_per_unit": 6400 / 64,
+            "reverse": True
+        },
+        "servo": {
+            "type": "servo",
+            "port": args.s,
+            "pulse_min": 600,
+            "pulse_max": 2500,
+            "baudrate": 921600,
+        }
+    }
+
+    p1 = multiprocessing.Process(target=modules_manager, args=(action_queue, modules_config, transform_corexy))
+    p1.start()
+
+    feedrate = args.feedrate
+    feedrate_homing = 20
+
+    servo_up = ServoAction("servo", 1265, wait=0.5)
+    servo_down = ServoAction("servo", 800, wait=0.5)
+
+    action_queue.put(servo_up)
+    action_queue.put(HomingAction(0, "servo", [-200, 0], feedrate_homing))
+    action_queue.put(HomingAction(1, "b", [0, -200], feedrate_homing))
+
+    with open(args.filename, "r") as f:
+        for line in f.readlines():
+            if line.upper().startswith("UP"):
+                if not args.dryrun:
+                    action_queue.put(servo_up)
+            elif line.upper().startswith("DOWN"):
+                if not args.dryrun:
+                    action_queue.put(servo_down)
+            else:
+                action_queue.put(Line([float(x)*args.unit_scale for x in line.strip().split(",")], feedrate))
+
+    action_queue.put(servo_up)
+    action_queue.put(Line([0, 0], feedrate))
+
+
+if __name__ == "__main__":
+    main()
diff --git a/UrumbotXY-Fall2022/code/urumbu_gcode.py b/UrumbotXY-Fall2022/code/urumbu_gcode.py
new file mode 100644
index 0000000000000000000000000000000000000000..0a7f9fb5ca91a0a94125676f3143be43b44ef0c6
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/urumbu_gcode.py
@@ -0,0 +1,381 @@
+import serial
+import time
+import multiprocessing
+import logging
+import argparse
+import numpy as np
+import math
+import os
+
+BAUDRATE_DEFAULT = 921600
+
+
+class Module:
+    def __init__(self, port, baudrate=BAUDRATE_DEFAULT):
+        self.port = None
+        self.baudrate = baudrate
+        try:
+            self.port = serial.Serial(port, baudrate)
+        except serial.SerialException:
+            logging.error(f"Cannot connect to {port}")
+
+    @property
+    def connected(self):
+        return self.port is not None
+
+    def write(self, txt):
+        self.port.write(txt)
+
+    def close(self):
+        self.port.close()
+
+    def pressed(self, nc=True):
+        self.write(b"?")
+        r = self.port.read(1)
+        if nc:
+            return r == b"1"
+        else:
+            return r == b"0"
+
+
+class Stepper(Module):
+    def __init__(self, steps_per_unit, port, baudrate=BAUDRATE_DEFAULT, reverse=False):
+        super().__init__(port, baudrate)
+        self.steps = 0
+        self.reverse = reverse
+        self.steps_per_unit = steps_per_unit
+
+    def step(self, forward):
+        self.steps += 1 if forward else -1
+        if self.reverse:
+            forward = not forward
+        self.write(b"f" if forward else b"r")
+
+
+class Servo(Module):
+    def __init__(self, pulse_min, pulse_max, port, baudrate=BAUDRATE_DEFAULT):
+        self.pulse_min = pulse_min
+        self.pulse_max = pulse_max
+        super().__init__(port, baudrate)
+        self.delay_us = 0
+
+    def pulse(self, delay_us):
+        self.write(delay_us.to_bytes(2, byteorder='little'))
+
+    def fraction(self, f):
+        p = int(self.pulse_min + (self.pulse_max - self.pulse_min) * f)
+        self.pulse(p)
+
+    def pressed(self, nc=True):
+        self.pulse(65535)
+        r = self.port.read(1)
+        if nc:
+            return r == b"1"
+        else:
+            return r == b"0"
+
+
+class Action:
+    def __iter__(self):
+        return [self].__iter__()
+
+
+
+class HomingAction(Action):
+    def __init__(self, axis, name, pos, feedrate, nc=True):
+        self.axis = axis
+        self.name = name
+        self.pos = np.array(pos)
+        self.feedrate = feedrate
+        self.nc = nc
+
+
+class PathAction(Action):
+    def __call__(self, t):
+        raise NotImplementedError()
+
+    def init(self, pos_start):
+        raise NotImplementedError()
+
+
+class WaitAction(Action):
+    def __init__(self, dt):
+        self.dt = dt
+
+    def __call__(self, dt):
+        return dt <= self.dt
+
+
+class SequenceAction(Action):
+    def __init__(self, *sub_actions):
+        self.sub_actions = sub_actions
+
+    def __iter__(self):
+        return self.sub_actions.__iter__()
+
+
+class ServoAction(Action):
+    def __init__(self, name, pulse, dt=0.01, wait=1.0):
+        self.name = name
+        self.pulse = pulse
+        self.dt = dt
+        self.wait = wait
+
+
+class Line(PathAction):
+    def __init__(self, pos_end, feedrate):
+        self.pos_start = np.zeros_like(pos_end)
+        self.pos_end = np.array(pos_end)
+        self.duration = -1
+        self.feedrate = feedrate
+
+    def init(self, pos_start):
+        self.pos_start = np.array(pos_start)
+        mask_nan = np.isnan(self.pos_end)
+        self.pos_end[mask_nan] = self.pos_start[mask_nan]
+        self.duration = np.linalg.norm(self.pos_end - self.pos_start) / self.feedrate
+
+    def __call__(self, t):
+        if t > self.duration:
+            # end move
+            return None
+        u = t / self.duration
+        return self.pos_start * (1 - u) + self.pos_end * u
+
+
+def transform_corexy(pos, pos_transform):
+    pos_transform[:] = pos[:]
+    pos_transform[0] = pos[0] + pos[1]
+    pos_transform[1] = pos[0] - pos[1]
+
+
+def modules_manager(action_queue, modules_config, pos_transformer=None):
+    logging.info("start loop")
+
+    modules = {}
+
+    modules_axis = {}
+
+    for name, config in modules_config.items():
+        if config["type"] == "stepper":
+            obj = Stepper(config["steps_per_unit"],
+                          config["port"],
+                          config["baudrate"],
+                          reverse=config.get("reverse", False))
+            modules[name] = obj
+            if "axis" in config:
+                modules_axis[config["axis"]] = obj
+        elif config["type"] == "servo":
+            modules[name] = Servo(config["pulse_min"],
+                                  config["pulse_max"],
+                                  config["port"],
+                                  config["baudrate"])
+
+    n_axis = len(modules_axis)
+    pos = np.zeros((n_axis,))
+    pos_motors = np.zeros((n_axis,))
+
+    def tick_motor():
+        if pos_transformer is None:
+            pos_motors[:] = pos[:]
+        else:
+            pos_transformer(pos, pos_motors)
+        for j in range(n_axis):
+            m = modules_axis[j]
+            s = int(pos_motors[j] * m.steps_per_unit)
+            if m.steps < s:
+                m.step(True)
+            elif m.steps > s:
+                m.step(False)
+
+    while True:
+        if not action_queue.empty():
+            action = action_queue.get()
+            t0 = time.perf_counter()
+
+            for sub_action in action:
+                if isinstance(sub_action, PathAction):
+                    # time in s, ~us resolution
+                    sub_action.init(pos)
+
+                    while True:
+                        t = time.perf_counter()
+
+                        # path is a time function
+                        pos_new = sub_action(t - t0)
+
+                        if pos_new is None:
+                            # done
+                            break
+
+                        pos[:] = pos_new[:]
+                        tick_motor()
+                elif isinstance(sub_action, WaitAction):
+                    dt = 0
+                    while sub_action(dt):
+                        dt = time.perf_counter() - t0
+                elif isinstance(sub_action, ServoAction):
+                    dt1 = 0
+                    t0_pwm = t0
+                    action_wait = WaitAction(sub_action.wait)
+                    while action_wait(dt1):
+                        t1 = time.perf_counter()
+                        dt1 = t1 - t0
+                        dt2 = t1 - t0_pwm
+                        if dt2 >= sub_action.dt:
+                            t0_pwm = t1
+                            modules[sub_action.name].pulse(sub_action.pulse)
+
+                elif isinstance(sub_action, HomingAction):
+                    line = Line(sub_action.pos, sub_action.feedrate)
+                    line.init(pos)
+
+                    while True:
+                        t = time.perf_counter()
+
+                        # path is a time function
+                        pos_new = line(t - t0)
+
+                        if pos_new is None:
+                            logging.error(f"Homing failed for axis {sub_action.axis}")
+                            break
+
+                        pos[:] = pos_new[:]
+
+                        tick_motor()
+
+                        if modules[sub_action.name].pressed(sub_action.nc):
+                            logging.info(f"Homing axis {sub_action.axis}")
+                            # homing success
+                            for i in range(n_axis):
+                                motor = modules_axis[i]
+                                motor.steps = 0
+                            pos[sub_action.axis] = 0
+                            break
+
+
+def parse_arguments():
+    usage_text = (
+        "Usage:  python urumbu_corexy.py [options]"
+    )
+    parser = argparse.ArgumentParser(description=usage_text)
+    parser.add_argument("-f", "--filename", type=str, required=True,
+                        help="filename for .xy file")
+    parser.add_argument("--feedrate", type=float, default=15,
+                        help="feedrate for XY motion")
+    parser.add_argument("-a", type=str, default="COM18",
+                        help="COM port for A")
+    parser.add_argument("-b", type=str, default="COM25",
+                        help="COM port for B")
+    parser.add_argument("-s", default="COM24",
+                        help="COM port for servo")
+    parser.add_argument("-u", "--unit_scale", type=float, default=1.0,
+                        help="Scaling factor")
+    return parser.parse_known_args()
+
+
+def parse_xy(filename, action_queue,
+             feedrate,
+             homing_action,
+             servo_up_action=None,
+             servo_down_action=None):
+
+    action_queue.put(homing_action)
+
+    with open(filename, "r") as f:
+        for line in f.readlines():
+            if line.upper().startswith("UP"):
+                if servo_up_action is not None:
+                    action_queue.put(servo_up_action)
+            elif line.upper().startswith("DOWN"):
+                if servo_down_action is not None:
+                    action_queue.put(servo_down_action)
+            else:
+                action_queue.put(Line([float(x) for x in line.strip().split(",")], feedrate))
+
+
+def parse_gcode(filename, action_queue, homing_action, default_feedrate):
+    feedrate = default_feedrate
+
+    with open(filename, "r") as f:
+        for line in f.readlines():
+            if line.startswith("G1") or line.startswith("G0"):
+                params = line.split(" ")
+
+                params_parsed = {
+                    "X": np.nan,
+                    "Y": np.nan,
+                    "Z": np.nan,
+                    "F": np.nan
+                }
+
+                for p in params:
+                    name = p[0].upper()
+                    val = float(p[1:])
+                    if name in params_parsed:
+                        params_parsed[name] = val
+
+                if not math.isnan(params_parsed["F"]):
+                    feedrate = params_parsed["F"]
+
+                action_queue.put(Line([params_parsed["X"],
+                                       params_parsed["Y"],
+                                       params_parsed["Z"]], feedrate))
+
+            elif line.startswith("G28"):
+                action_queue.put(homing_action)
+
+
+def main():
+    multiprocessing.set_start_method('spawn')
+    action_queue = multiprocessing.Queue()
+
+    args, _ = parse_arguments()
+
+    modules_config = {
+        "a": {
+            "type": "stepper",
+            "port": args.a,
+            "baudrate": 921600,
+            "axis": 0,
+            "steps_per_unit": 6400 / 64,  # 64 mm / turn
+            "reverse": True
+        },
+        "b": {
+            "type": "stepper",
+            "port": args.b,
+            "baudrate": 921600,
+            "axis": 1,
+            "steps_per_unit": 6400 / 64,
+            "reverse": True
+        },
+        "servo": {
+            "type": "servo",
+            "port": args.s,
+            "pulse_min": 600,
+            "pulse_max": 2500,
+            "baudrate": 921600,
+        }
+    }
+
+    p1 = multiprocessing.Process(target=modules_manager, args=(action_queue, modules_config, transform_corexy))
+    p1.start()
+
+    feedrate = args.feedrate
+    feedrate_homing = 20
+
+    homing_action = SequenceAction(HomingAction(0, "servo", [-200, 0], feedrate_homing),
+                                   HomingAction(1, "b", [0, -200], feedrate_homing))
+
+    filename = args.filename
+    ext = os.path.splitext(filename)[-1]
+    if ext == "xy":
+        parse_xy(filename, action_queue, feedrate, homing_action)
+    elif ext in ("nc", "gcode"):
+        parse_gcode(filename, action_queue, homing_action, args.feedrate)
+    else:
+        print(f"Unrecognized file type: '{ext}'")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/UrumbotXY-Fall2022/code/urumbu_gcode_1.14.22.py b/UrumbotXY-Fall2022/code/urumbu_gcode_1.14.22.py
new file mode 100644
index 0000000000000000000000000000000000000000..fbabb7e4d895272bcc4a95f462732187d3f515c7
--- /dev/null
+++ b/UrumbotXY-Fall2022/code/urumbu_gcode_1.14.22.py
@@ -0,0 +1,427 @@
+
+# Modified version of Quentin Bolsee 'urumbu_gcode.py'.  
+# Modified by Robert Hart 1/13/22 - 1/14/22.  
+# Used 1/14/22 to run Urumbu machine with x,y, and a cam-driven z-axis.  
+# Supports g-code in a limited way.
+#
+#
+#
+
+
+import serial
+import time
+import multiprocessing
+import logging
+import argparse
+import numpy as np
+import math
+import os
+
+BAUDRATE_DEFAULT = 921600
+
+
+class Module:
+    def __init__(self, port, baudrate=BAUDRATE_DEFAULT):
+        self.port = None
+        self.baudrate = baudrate
+        try:
+            self.port = serial.Serial(port, baudrate)
+        except serial.SerialException:
+            logging.error(f"Cannot connect to {port}")
+
+    @property
+    def connected(self):
+        return self.port is not None
+
+    def write(self, txt):
+        self.port.write(txt)
+
+    def close(self):
+        self.port.close()
+
+    def pressed(self, nc=True):
+        self.write(b"?")
+        r = self.port.read(1)
+        if nc:
+            return r == b"1"
+        else:
+            return r == b"0"
+
+
+class Stepper(Module):
+    def __init__(self, steps_per_unit, port, baudrate=BAUDRATE_DEFAULT, reverse=False):
+        super().__init__(port, baudrate)
+        self.steps = 0
+        self.reverse = reverse
+        self.steps_per_unit = steps_per_unit
+
+    def step(self, forward):
+        self.steps += 1 if forward else -1
+        if self.reverse:
+            forward = not forward
+        self.write(b"f" if forward else b"r")
+
+
+class Servo(Module):
+    def __init__(self, pulse_min, pulse_max, port, baudrate=BAUDRATE_DEFAULT):
+        self.pulse_min = pulse_min
+        self.pulse_max = pulse_max
+        super().__init__(port, baudrate)
+        self.delay_us = 0
+
+    def pulse(self, delay_us):
+        self.write(delay_us.to_bytes(2, byteorder='little'))
+
+    def fraction(self, f):
+        p = int(self.pulse_min + (self.pulse_max - self.pulse_min) * f)
+        self.pulse(p)
+
+    def pressed(self, nc=True):
+        self.pulse(65535)
+        r = self.port.read(1)
+        if nc:
+            return r == b"1"
+        else:
+            return r == b"0"
+
+
+class Action:
+    def __iter__(self):
+        return [self].__iter__()
+
+
+
+class HomingAction(Action):
+    def __init__(self, axis, name, pos, feedrate, nc=True):
+        self.axis = axis
+        self.name = name
+        self.pos = np.array(pos)
+        self.feedrate = feedrate
+        self.nc = nc
+
+
+class PathAction(Action):
+    def __call__(self, t):
+        raise NotImplementedError()
+
+    def init(self, pos_start):
+        raise NotImplementedError()
+
+
+class WaitAction(Action):
+    def __init__(self, dt):
+        self.dt = dt
+
+    def __call__(self, dt):
+        return dt <= self.dt
+
+
+class SequenceAction(Action):
+    def __init__(self, *sub_actions):
+        self.sub_actions = sub_actions
+
+    def __iter__(self):
+        return self.sub_actions.__iter__()
+
+
+class ServoAction(Action):
+    def __init__(self, name, pulse, dt=0.01, wait=1.0):
+        self.name = name
+        self.pulse = pulse
+        self.dt = dt
+        self.wait = wait
+
+
+class Line(PathAction):
+    def __init__(self, pos_end, feedrate):
+        self.pos_start = np.zeros_like(pos_end)
+        self.pos_end = np.array(pos_end)
+        self.duration = -1
+        self.feedrate = feedrate
+
+    def init(self, pos_start):
+        self.pos_start = np.array(pos_start)
+        mask_nan = np.isnan(self.pos_end)
+        self.pos_end[mask_nan] = self.pos_start[mask_nan]
+        self.duration = np.linalg.norm(self.pos_end - self.pos_start) / self.feedrate
+
+    def __call__(self, t):
+        if t > self.duration:
+            # end move
+            return None
+        u = t / self.duration
+        return self.pos_start * (1 - u) + self.pos_end * u
+
+
+def transform_corexy(pos, pos_transform):
+    pos_transform[:] = pos[:]
+    pos_transform[0] = pos[0] + pos[1]
+    pos_transform[1] = pos[0] - pos[1]
+
+
+def modules_manager(action_queue, modules_config, pos_transformer=None):
+    logging.info("start loop")
+
+    modules = {}
+
+    modules_axis = {}
+
+    for name, config in modules_config.items():
+        if config["type"] == "stepper":
+            obj = Stepper(config["steps_per_unit"],
+                          config["port"],
+                          config["baudrate"],
+                          reverse=config.get("reverse", False))
+            modules[name] = obj
+            if "axis" in config:
+                modules_axis[config["axis"]] = obj
+        elif config["type"] == "servo":
+            modules[name] = Servo(config["pulse_min"],
+                                  config["pulse_max"],
+                                  config["port"],
+                                  config["baudrate"])
+
+    n_axis = len(modules_axis)
+    pos = np.zeros((n_axis,))
+    pos_motors = np.zeros((n_axis,))
+
+    def tick_motor():
+        if pos_transformer is None:
+            pos_motors[:] = pos[:]
+        else:
+            pos_transformer(pos, pos_motors)
+        for j in range(n_axis):
+            m = modules_axis[j]
+            s = int(pos_motors[j] * m.steps_per_unit)
+            if m.steps < s:
+                m.step(True)
+            elif m.steps > s:
+                m.step(False)
+
+    while True:
+        if not action_queue.empty():
+            action = action_queue.get()
+            t0 = time.perf_counter()
+
+            for sub_action in action:
+                if isinstance(sub_action, PathAction):
+                    # time in s, ~us resolution
+                    sub_action.init(pos)
+
+                    while True:
+                        t = time.perf_counter()
+
+                        # path is a time function
+                        pos_new = sub_action(t - t0)
+
+                        if pos_new is None:
+                            # done
+                            break
+
+                        pos[:] = pos_new[:]
+                        tick_motor()
+                elif isinstance(sub_action, WaitAction):
+                    dt = 0
+                    while sub_action(dt):
+                        dt = time.perf_counter() - t0
+                elif isinstance(sub_action, ServoAction):
+                    dt1 = 0
+                    t0_pwm = t0
+                    action_wait = WaitAction(sub_action.wait)
+                    while action_wait(dt1):
+                        t1 = time.perf_counter()
+                        dt1 = t1 - t0
+                        dt2 = t1 - t0_pwm
+                        if dt2 >= sub_action.dt:
+                            t0_pwm = t1
+                            modules[sub_action.name].pulse(sub_action.pulse)
+
+                elif isinstance(sub_action, HomingAction):
+                    line = Line(sub_action.pos, sub_action.feedrate)
+                    line.init(pos)
+
+                    while True:
+                        t = time.perf_counter()
+
+                        # path is a time function
+                        pos_new = line(t - t0)
+
+                        if pos_new is None:
+                            logging.error(f"Homing failed for axis {sub_action.axis}")
+                            break
+
+                        pos[:] = pos_new[:]
+
+                        tick_motor()
+
+                        if modules[sub_action.name].pressed(sub_action.nc):
+                            logging.info(f"Homing axis {sub_action.axis}")
+                            # homing success
+                            for i in range(n_axis):
+                                motor = modules_axis[i]
+                                motor.steps = 0
+                            pos[sub_action.axis] = 0
+                            break
+
+
+def parse_arguments():
+    usage_text = (
+        "Usage:  python urumbu_corexy.py [options]"
+    )
+    parser = argparse.ArgumentParser(description=usage_text)
+    parser.add_argument("-f", "--filename", type=str, required=True,
+                        help="filename for .xy file")
+    parser.add_argument("--feedrate", type=float, default=5,
+                        help="feedrate for XY motion")
+    parser.add_argument("-a", type=str, default="COM5",
+                        help="COM port for A")
+    parser.add_argument("-b", type=str, default="COM4",
+                        help="COM port for B")
+    parser.add_argument("-z", type=str, default="COM7",
+                        help="COM port for Z")
+    # parser.add_argument("-s", default="COM7",
+    #                     help="COM port for servo")
+    parser.add_argument("-u", "--unit_scale", type=float, default=1.0,
+                        help="Scaling factor")
+    return parser.parse_known_args()
+
+
+def parse_xy(filename, action_queue,
+             feedrate,
+             servo_up_action=None,
+             servo_down_action=None):
+
+   # action_queue.put(homing_action)
+
+    with open(filename, "r") as f:
+        for line in f.readlines():
+            if line.upper().startswith("UP"):
+                if servo_up_action is not None:
+                    action_queue.put(servo_up_action)
+            elif line.upper().startswith("DOWN"):
+                if servo_down_action is not None:
+                    action_queue.put(servo_down_action)
+            else:
+                action_queue.put(Line([float(x) for x in line.strip().split(",")], feedrate))
+
+
+def parse_gcode(filename, action_queue, default_feedrate):
+    feedrate = default_feedrate
+
+    with open(filename, "r") as f:
+        for line in f.readlines():
+            if line.startswith("G1") or line.startswith("G0"):
+
+
+                params_parsed = {
+                    "X": np.nan,
+                    "Y": np.nan,
+                    "Z": np.nan,
+                    "F": np.nan
+                }
+
+                fx = line.find('X')
+                fy = line.find('Y')
+                fz = line.find('Z')
+                ff = line.find('F')
+
+                if fx > 0:
+                    end = fx + 1
+                    while line[end].isdigit() or line[end] == '-' or line[end] == '.':
+                        end = end + 1
+
+                    params_parsed["X"] = float(line[fx + 1:end])
+
+                if fy > 0:
+                    end = fy + 1
+                    while line[end].isdigit() or line[end] == '-' or line[end] == '.':
+                        end = end + 1
+
+                    params_parsed["Y"] = float(line[fy + 1:end])
+
+                if fz > 0:
+                    end = fz + 1
+                    while line[end].isdigit() or line[end] == '-' or line[end] == '.':
+                        end = end + 1
+
+                    params_parsed["Z"] = float(line[fz + 1:end])
+
+                if ff > 0:
+                    end = ff + 1
+                    while line[end].isdigit() or line[end] == '-' or line[end] == '.':
+                        end = end + 1
+
+                    params_parsed["F"] = float(line[ff + 1:end])
+
+                # if not math.isnan(params_parsed["F"]):
+                #     feedrate = params_parsed["F"]
+
+                action_queue.put(Line([params_parsed["X"],
+                                       params_parsed["Y"],
+                                       params_parsed["Z"]], feedrate))
+
+            # elif line.startswith("G28"):
+            #     action_queue.put(homing_action)
+
+
+def main():
+    multiprocessing.set_start_method('spawn')
+    action_queue = multiprocessing.Queue()
+
+    args, _ = parse_arguments()
+
+    modules_config = {
+        "a": {
+            "type": "stepper",
+            "port": args.a,
+            "baudrate": 921600,
+            "axis": 0,
+            "steps_per_unit": 6400 / 64,  # 64 mm / turn
+            "reverse": True
+        },
+        "b": {
+            "type": "stepper",
+            "port": args.b,
+            "baudrate": 921600,
+            "axis": 1,
+            "steps_per_unit": 6400 / 64,
+            "reverse": False
+        },
+        "z": {
+            "type": "stepper",
+            "port": args.z,
+            "baudrate": 921600,
+            "axis": 2,
+            "steps_per_unit": 1600/(3.14)/0.5,  #uses slope at middle point of eccentric.  ~3.1 mm in 50 steps.  0.5 is geometry factor!
+            "reverse": False
+        }#,
+        # "servo": {
+        #     "type": "servo",
+        #     "port": args.s,
+        #     "pulse_min": 600,
+        #     "pulse_max": 2500,
+        #     "baudrate": 921600,
+        # }
+    }
+
+    p1 = multiprocessing.Process(target=modules_manager, args=(action_queue, modules_config, transform_corexy))
+    p1.start()
+
+    feedrate = args.feedrate
+    #feedrate_homing = 20
+
+    #homing_action = SequenceAction(HomingAction(0, "servo", [-200, 0], feedrate_homing),
+     #                              HomingAction(1, "b", [0, -200], feedrate_homing))
+
+    filename = args.filename
+    ext = os.path.splitext(filename)[-1]
+    if ext == ".xy":
+        parse_xy(filename, action_queue, feedrate)
+    elif ext in (".nc", ".gcode"):
+        parse_gcode(filename, action_queue, args.feedrate)
+    else:
+        print(f"Unrecognized file type: '{ext}'")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/UrumbotXY-Fall2022/files/3d/bearing_plate.stl b/UrumbotXY-Fall2022/files/3d/bearing_plate.stl
new file mode 100644
index 0000000000000000000000000000000000000000..3d3cd313c8772e3d294cf9752b23054fe79f749b
Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/bearing_plate.stl differ
diff --git a/UrumbotXY-Fall2022/files/3d/bearing_plate2.stl b/UrumbotXY-Fall2022/files/3d/bearing_plate2.stl
new file mode 100644
index 0000000000000000000000000000000000000000..f39ae9936a2069649060b801438ece02e37a7644
Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/bearing_plate2.stl differ
diff --git a/UrumbotXY-Fall2022/files/3d/capstan_motor.stl b/UrumbotXY-Fall2022/files/3d/capstan_motor.stl
new file mode 100644
index 0000000000000000000000000000000000000000..23bb86a4864e21aecbf162d9b4857311522ffc7b
Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/capstan_motor.stl differ
diff --git a/UrumbotXY-Fall2022/files/3d/capstan_pulley.stl b/UrumbotXY-Fall2022/files/3d/capstan_pulley.stl
new file mode 100644
index 0000000000000000000000000000000000000000..8f4566988b6b7e1d8db53662e0c8ecb5af9a6f89
Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/capstan_pulley.stl differ
diff --git a/UrumbotXY-Fall2022/files/3d/corner.stl b/UrumbotXY-Fall2022/files/3d/corner.stl
new file mode 100644
index 0000000000000000000000000000000000000000..1ef8cb1afd816be007e840e5b27c0f37dbe660e4
Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/corner.stl differ
diff --git a/UrumbotXY-Fall2022/files/3d/feet.stl b/UrumbotXY-Fall2022/files/3d/feet.stl
new file mode 100644
index 0000000000000000000000000000000000000000..971ebad8b9f531bafbec176dda1c2af4600f7ee0
Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/feet.stl differ
diff --git a/UrumbotXY-Fall2022/files/3d/feet_endstop.stl b/UrumbotXY-Fall2022/files/3d/feet_endstop.stl
new file mode 100644
index 0000000000000000000000000000000000000000..e9fa1013aab86efeba30c8ee44e2f476ca2dbcf6
Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/feet_endstop.stl differ
diff --git a/UrumbotXY-Fall2022/files/3d/motor_mount.stl b/UrumbotXY-Fall2022/files/3d/motor_mount.stl
new file mode 100644
index 0000000000000000000000000000000000000000..08fff4bbf5d54d4ee8413710d6df24e37d95e203
Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/motor_mount.stl differ
diff --git a/UrumbotXY-Fall2022/files/3d/servo_mount.stl b/UrumbotXY-Fall2022/files/3d/servo_mount.stl
new file mode 100644
index 0000000000000000000000000000000000000000..c0b698a3e0effcdf7fc7a6d9102f0ea6aa0a664b
Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/servo_mount.stl differ
diff --git a/UrumbotXY-Fall2022/files/fusion/bearing_plate v3.f3d b/UrumbotXY-Fall2022/files/fusion/bearing_plate v3.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..b985a5f933265a6ad1bff9853e58ecb5aa00df3a
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/bearing_plate v3.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/bearing_plate2 v2.f3d b/UrumbotXY-Fall2022/files/fusion/bearing_plate2 v2.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..e74487c046987d0607e551c5dc67d8157b5b3626
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/bearing_plate2 v2.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/cable_mount v1.f3d b/UrumbotXY-Fall2022/files/fusion/cable_mount v1.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..3d002ab4e807395019b7539bf7d896c7db003278
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/cable_mount v1.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/capstan_motor v2.f3d b/UrumbotXY-Fall2022/files/fusion/capstan_motor v2.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..a5ada2340015ca6856d689848e9b8584b8f2c2f1
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/capstan_motor v2.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/capstan_pulley v3.f3d b/UrumbotXY-Fall2022/files/fusion/capstan_pulley v3.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..37a36fa5297f869820ad71076b0770cba6b13d37
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/capstan_pulley v3.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/corner_clamp v1.f3d b/UrumbotXY-Fall2022/files/fusion/corner_clamp v1.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..8fa75d3ed7bb3856f894228fa5329f0c9e4b6219
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/corner_clamp v1.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/double_pulley_mount v3.f3d b/UrumbotXY-Fall2022/files/fusion/double_pulley_mount v3.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..b9ecb60ddebc3fea2e195ee06434f29d51f190ba
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/double_pulley_mount v3.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/feet v3.f3d b/UrumbotXY-Fall2022/files/fusion/feet v3.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..85d9b2bd88d2ce239852cb4e8aa0d231c9a62362
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/feet v3.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/feet_endstop v2.f3d b/UrumbotXY-Fall2022/files/fusion/feet_endstop v2.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..bb004b37124767f2168e388c9ccd70483b8391fb
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/feet_endstop v2.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/motor_mount v10.f3d b/UrumbotXY-Fall2022/files/fusion/motor_mount v10.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..43d4d87571ee9b8c135801bd7957ebfc5b629625
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/motor_mount v10.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/pen_arms v3.f3d b/UrumbotXY-Fall2022/files/fusion/pen_arms v3.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..67dc5240496eea6e8dba0f18cf06e80971543560
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/pen_arms v3.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/pulley_mount v2.f3d b/UrumbotXY-Fall2022/files/fusion/pulley_mount v2.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..2b953a0c53e006ed9730d6decc9db4442529fdaf
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/pulley_mount v2.f3d differ
diff --git a/UrumbotXY-Fall2022/files/fusion/servo_mount2 v1.f3d b/UrumbotXY-Fall2022/files/fusion/servo_mount2 v1.f3d
new file mode 100644
index 0000000000000000000000000000000000000000..6d4af70e40c0baebc74426c26ba9823438d4fae0
Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/servo_mount2 v1.f3d differ
diff --git a/UrumbotXY-Fall2022/img/axis.jpg b/UrumbotXY-Fall2022/img/axis.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fe3876696675af7a15cd9bc3a619badcf384f7c1
Binary files /dev/null and b/UrumbotXY-Fall2022/img/axis.jpg differ
diff --git a/UrumbotXY-Fall2022/img/bldc_resize.jpg b/UrumbotXY-Fall2022/img/bldc_resize.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..35c476e829da04d191a17b88426afd88076012ea
Binary files /dev/null and b/UrumbotXY-Fall2022/img/bldc_resize.jpg differ
diff --git a/UrumbotXY-Fall2022/img/capstan.jpg b/UrumbotXY-Fall2022/img/capstan.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..bfd2d283340bae70b7a96fd22a6be6482dfc75ea
Binary files /dev/null and b/UrumbotXY-Fall2022/img/capstan.jpg differ
diff --git a/UrumbotXY-Fall2022/img/corexy.jpg b/UrumbotXY-Fall2022/img/corexy.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..50c0fd8904997af14b1aa0a9a1bd64786691530e
Binary files /dev/null and b/UrumbotXY-Fall2022/img/corexy.jpg differ
diff --git a/UrumbotXY-Fall2022/img/corexy_pen.jpg b/UrumbotXY-Fall2022/img/corexy_pen.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4bb415af78ce37950f3540d3f0361a9f28df77cc
Binary files /dev/null and b/UrumbotXY-Fall2022/img/corexy_pen.jpg differ
diff --git a/UrumbotXY-Fall2022/img/doc/bearing_plate.png b/UrumbotXY-Fall2022/img/doc/bearing_plate.png
new file mode 100644
index 0000000000000000000000000000000000000000..df99971ad46c80d6b56f56881281538eef11a418
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/bearing_plate.png differ
diff --git a/UrumbotXY-Fall2022/img/doc/bearing_plate2.png b/UrumbotXY-Fall2022/img/doc/bearing_plate2.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7517026f64828e35ac52e28f109a9651da3e402
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/bearing_plate2.png differ
diff --git a/UrumbotXY-Fall2022/img/doc/capstan_motor.png b/UrumbotXY-Fall2022/img/doc/capstan_motor.png
new file mode 100644
index 0000000000000000000000000000000000000000..d90e28791100adc0179c5e0fccd95276cc1abaf2
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/capstan_motor.png differ
diff --git a/UrumbotXY-Fall2022/img/doc/capstan_pulley.png b/UrumbotXY-Fall2022/img/doc/capstan_pulley.png
new file mode 100644
index 0000000000000000000000000000000000000000..47fa38d1201c84d3acadb81d40ebf2c429045f0d
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/capstan_pulley.png differ
diff --git a/UrumbotXY-Fall2022/img/doc/corexy_kit.png b/UrumbotXY-Fall2022/img/doc/corexy_kit.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce5f2c5700516a926d1905d29b7e397a5140e3b3
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/corexy_kit.png differ
diff --git a/UrumbotXY-Fall2022/img/doc/feet.png b/UrumbotXY-Fall2022/img/doc/feet.png
new file mode 100644
index 0000000000000000000000000000000000000000..e9003f14d151d840b496719023f4b7405d87644a
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/feet.png differ
diff --git a/UrumbotXY-Fall2022/img/doc/feet_endstop.png b/UrumbotXY-Fall2022/img/doc/feet_endstop.png
new file mode 100644
index 0000000000000000000000000000000000000000..19b9a122dc4158ad3f870202dd9bc02bd84a365a
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/feet_endstop.png differ
diff --git a/UrumbotXY-Fall2022/img/doc/pen_arms.png b/UrumbotXY-Fall2022/img/doc/pen_arms.png
new file mode 100644
index 0000000000000000000000000000000000000000..2736932d4986156c0870f99e234ad774a585dff7
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/pen_arms.png differ
diff --git a/UrumbotXY-Fall2022/img/doc/pulley_mount.png b/UrumbotXY-Fall2022/img/doc/pulley_mount.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d2275945a7a8b78ce5dcb01d3b8bf23c2eec7a8
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/pulley_mount.png differ
diff --git a/UrumbotXY-Fall2022/img/doc/servo_mount.png b/UrumbotXY-Fall2022/img/doc/servo_mount.png
new file mode 100644
index 0000000000000000000000000000000000000000..81984ce2b24b4a1b8da24cead596e11857444089
Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/servo_mount.png differ
diff --git a/UrumbotXY-Fall2022/img/fixed_z.jpg b/UrumbotXY-Fall2022/img/fixed_z.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..10972ce14ef153ad1d038ebbc67556f7489d0c52
Binary files /dev/null and b/UrumbotXY-Fall2022/img/fixed_z.jpg differ
diff --git a/UrumbotXY-Fall2022/img/linetest.jpg b/UrumbotXY-Fall2022/img/linetest.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c3a5098d1db8ba3ec7ff56872d7d93e75388edf9
Binary files /dev/null and b/UrumbotXY-Fall2022/img/linetest.jpg differ
diff --git a/UrumbotXY-Fall2022/img/milling_axes_clamp.jpg b/UrumbotXY-Fall2022/img/milling_axes_clamp.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..25393db1e630e0dd4f0d7f03ec1a313aed13fa82
Binary files /dev/null and b/UrumbotXY-Fall2022/img/milling_axes_clamp.jpg differ
diff --git a/UrumbotXY-Fall2022/img/milling_axes_setup.jpg b/UrumbotXY-Fall2022/img/milling_axes_setup.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..04ca9c1b2794e67cbd48b91bfa3eb297817b1731
Binary files /dev/null and b/UrumbotXY-Fall2022/img/milling_axes_setup.jpg differ
diff --git a/UrumbotXY-Fall2022/img/traces.jpg b/UrumbotXY-Fall2022/img/traces.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b95560ce34d4c7ae8e691d2a163c16c03838ffd8
Binary files /dev/null and b/UrumbotXY-Fall2022/img/traces.jpg differ
diff --git a/UrumbotXY-Fall2022/img/z-cam.jpg b/UrumbotXY-Fall2022/img/z-cam.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..165e3a3003b77e504ae40f4d5ff147e81f47ef3f
Binary files /dev/null and b/UrumbotXY-Fall2022/img/z-cam.jpg differ
diff --git a/UrumbotXY-Fall2022/video/axis_acceleration.mp4 b/UrumbotXY-Fall2022/video/axis_acceleration.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..006f5fd7878ec0dc15cbd4a855e27fe6efb28732
Binary files /dev/null and b/UrumbotXY-Fall2022/video/axis_acceleration.mp4 differ
diff --git a/UrumbotXY-Fall2022/video/axis_linear.mp4 b/UrumbotXY-Fall2022/video/axis_linear.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..30ed01fde6b6dc32f3aa8aa1541253b5c38fd89e
Binary files /dev/null and b/UrumbotXY-Fall2022/video/axis_linear.mp4 differ
diff --git a/UrumbotXY-Fall2022/video/corexy_linear.mp4 b/UrumbotXY-Fall2022/video/corexy_linear.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..35cb6f7abbea88769dd974bd7c0261fb5f404c33
Binary files /dev/null and b/UrumbotXY-Fall2022/video/corexy_linear.mp4 differ
diff --git a/UrumbotXY-Fall2022/video/corexy_spiral.mp4 b/UrumbotXY-Fall2022/video/corexy_spiral.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..d1d00e2334dcae366715cdde14ab8cf3f5098aa9
Binary files /dev/null and b/UrumbotXY-Fall2022/video/corexy_spiral.mp4 differ
diff --git a/UrumbotXY-Fall2022/video/milling_movie.mp4 b/UrumbotXY-Fall2022/video/milling_movie.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..5851f0156a89fee40d94746d5889d42bfa20ce8a
Binary files /dev/null and b/UrumbotXY-Fall2022/video/milling_movie.mp4 differ